bc-code-intelligence-mcp 1.3.4 → 1.3.6

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 (522) hide show
  1. package/dist/layers/embedded-layer.d.ts.map +1 -1
  2. package/dist/layers/embedded-layer.js +40 -0
  3. package/dist/layers/embedded-layer.js.map +1 -1
  4. package/dist/services/enhanced-prompt-service.d.ts +1 -12
  5. package/dist/services/enhanced-prompt-service.d.ts.map +1 -1
  6. package/dist/services/enhanced-prompt-service.js +27 -38
  7. package/dist/services/enhanced-prompt-service.js.map +1 -1
  8. package/dist/services/methodology-service.d.ts.map +1 -1
  9. package/dist/services/methodology-service.js +15 -1
  10. package/dist/services/methodology-service.js.map +1 -1
  11. package/embedded-knowledge/.github/ISSUE_TEMPLATE/bug-report.md +24 -0
  12. package/embedded-knowledge/.github/ISSUE_TEMPLATE/content-improvement.md +24 -0
  13. package/embedded-knowledge/.github/ISSUE_TEMPLATE/knowledge-request.md +30 -0
  14. package/embedded-knowledge/AGENTS.md +178 -0
  15. package/embedded-knowledge/CONTRIBUTING.md +58 -0
  16. package/embedded-knowledge/LICENSE +21 -0
  17. package/embedded-knowledge/README.md +32 -0
  18. package/embedded-knowledge/domains/alex-architect/api-delegate-operation-pattern.md +90 -0
  19. package/embedded-knowledge/domains/alex-architect/api-fieldset-registration-pattern.md +113 -0
  20. package/embedded-knowledge/domains/alex-architect/api-interface-design-patterns.md +101 -0
  21. package/embedded-knowledge/domains/alex-architect/api-page-development-patterns.md +87 -0
  22. package/embedded-knowledge/domains/alex-architect/complex-facade-patterns.md +155 -0
  23. package/embedded-knowledge/domains/alex-architect/facade-pattern-al-implementation.md +138 -0
  24. package/embedded-knowledge/domains/alex-architect/facade-pattern-external-api.md +79 -0
  25. package/embedded-knowledge/domains/alex-architect/samples/api-delegate-operation.md +280 -0
  26. package/embedded-knowledge/domains/alex-architect/samples/api-fieldset-registration.md +200 -0
  27. package/embedded-knowledge/domains/alex-architect/samples/api-interface-design.md +565 -0
  28. package/embedded-knowledge/domains/alex-architect/samples/api-page-implementation.md +665 -0
  29. package/embedded-knowledge/domains/alex-architect/samples/complex-facade-patterns.md +325 -0
  30. package/embedded-knowledge/domains/alex-architect/samples/facade-pattern-al.md +696 -0
  31. package/embedded-knowledge/domains/alex-architect/samples/facade-pattern.md +320 -0
  32. package/embedded-knowledge/domains/alex-architect/samples/subscriber-organization.md +102 -0
  33. package/embedded-knowledge/domains/alex-architect/samples/systemid-integration.md +433 -0
  34. package/embedded-knowledge/domains/alex-architect/subscriber-codeunit-size-optimization.md +66 -0
  35. package/embedded-knowledge/domains/alex-architect/systemid-integration.md +115 -0
  36. package/embedded-knowledge/domains/dean-debug/bc24-no-series-conversion-guide.md +360 -0
  37. package/embedded-knowledge/domains/dean-debug/case-statement-performance-best-practices.md +86 -0
  38. package/embedded-knowledge/domains/dean-debug/compound-statements-debugging.md +96 -0
  39. package/embedded-knowledge/domains/dean-debug/custom-dimensions-best-practices.md +70 -0
  40. package/embedded-knowledge/domains/dean-debug/custom-telemetry-implementation.md +84 -0
  41. package/embedded-knowledge/domains/dean-debug/deleteall-performance-tradeoff.md +93 -0
  42. package/embedded-knowledge/domains/dean-debug/deleteall-sql-performance.md +73 -0
  43. package/embedded-knowledge/domains/dean-debug/extension-telemetry-isolation.md +78 -0
  44. package/embedded-knowledge/domains/dean-debug/maintainsiftindex-property-behavior.md +79 -0
  45. package/embedded-knowledge/domains/dean-debug/no-series-implementation-patterns.md +87 -0
  46. package/embedded-knowledge/domains/dean-debug/no-series-module-patterns-bc24.md +209 -0
  47. package/embedded-knowledge/domains/dean-debug/no-series-validation-module-bc24.md +246 -0
  48. package/embedded-knowledge/domains/dean-debug/no-series-validation-patterns.md +107 -0
  49. package/embedded-knowledge/domains/dean-debug/odata-query-optimization.md +105 -0
  50. package/embedded-knowledge/domains/dean-debug/samples/bc24-no-series-conversion.md +186 -0
  51. package/embedded-knowledge/domains/dean-debug/samples/case-performance-optimization.md +60 -0
  52. package/embedded-knowledge/domains/dean-debug/samples/compound-statements-debugging.md +139 -0
  53. package/embedded-knowledge/domains/dean-debug/samples/custom-dimensions.md +190 -0
  54. package/embedded-knowledge/domains/dean-debug/samples/custom-telemetry.md +516 -0
  55. package/embedded-knowledge/domains/dean-debug/samples/deleteall-performance.md +298 -0
  56. package/embedded-knowledge/domains/dean-debug/samples/error-correlation.md +324 -0
  57. package/embedded-knowledge/domains/dean-debug/samples/extension-isolation.md +344 -0
  58. package/embedded-knowledge/domains/dean-debug/samples/logmessage-methods.md +137 -0
  59. package/embedded-knowledge/domains/dean-debug/samples/maintainsiftindex-examples.md +340 -0
  60. package/embedded-knowledge/domains/dean-debug/samples/no-series-implementation.md +810 -0
  61. package/embedded-knowledge/domains/dean-debug/samples/no-series-module-bc24.md +86 -0
  62. package/embedded-knowledge/domains/dean-debug/samples/no-series-validation-module-bc24.md +110 -0
  63. package/embedded-knowledge/domains/dean-debug/samples/no-series-validation.md +758 -0
  64. package/embedded-knowledge/domains/dean-debug/samples/odata-query-optimization.md +665 -0
  65. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-before-case.md +316 -0
  66. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-before-filters.md +223 -0
  67. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-filter-exclusion.md +149 -0
  68. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-optimization.md +412 -0
  69. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-performance.md +211 -0
  70. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-primary-key.md +155 -0
  71. package/embedded-knowledge/domains/dean-debug/samples/sift-technology-fundamentals.md +475 -0
  72. package/embedded-knowledge/domains/dean-debug/samples/singleinstance-subscribers.md +238 -0
  73. package/embedded-knowledge/domains/dean-debug/samples/table-event-batching.md +97 -0
  74. package/embedded-knowledge/domains/dean-debug/samples/table-key-requirements.md +666 -0
  75. package/embedded-knowledge/domains/dean-debug/samples/telemetry-performance.md +319 -0
  76. package/embedded-knowledge/domains/dean-debug/samples/verbosity-strategy.md +236 -0
  77. package/embedded-knowledge/domains/dean-debug/session-logmessage-methods.md +59 -0
  78. package/embedded-knowledge/domains/dean-debug/setloadfields-filter-field-exclusion.md +67 -0
  79. package/embedded-knowledge/domains/dean-debug/setloadfields-performance-impact.md +70 -0
  80. package/embedded-knowledge/domains/dean-debug/setloadfields-performance-optimization.md +90 -0
  81. package/embedded-knowledge/domains/dean-debug/setloadfields-placement-before-case-statements.md +87 -0
  82. package/embedded-knowledge/domains/dean-debug/setloadfields-placement-before-filters.md +70 -0
  83. package/embedded-knowledge/domains/dean-debug/setloadfields-primary-key-optimization.md +74 -0
  84. package/embedded-knowledge/domains/dean-debug/sift-technology-fundamentals.md +81 -0
  85. package/embedded-knowledge/domains/dean-debug/subscriber-singleinstance-performance.md +56 -0
  86. package/embedded-knowledge/domains/dean-debug/table-event-batch-operation-impact.md +66 -0
  87. package/embedded-knowledge/domains/dean-debug/table-key-requirements.md +79 -0
  88. package/embedded-knowledge/domains/dean-debug/telemetry-error-correlation.md +78 -0
  89. package/embedded-knowledge/domains/dean-debug/telemetry-performance-considerations.md +83 -0
  90. package/embedded-knowledge/domains/dean-debug/telemetry-verbosity-strategy.md +76 -0
  91. package/embedded-knowledge/domains/dean-debug/testfield-performance.md +104 -0
  92. package/embedded-knowledge/domains/eva-errors/fielderror-default-messages.md +145 -0
  93. package/embedded-knowledge/domains/eva-errors/fielderror-message-construction.md +104 -0
  94. package/embedded-knowledge/domains/eva-errors/fielderror-method-syntax.md +114 -0
  95. package/embedded-knowledge/domains/eva-errors/samples/fielderror-default-messages.md +356 -0
  96. package/embedded-knowledge/domains/eva-errors/samples/fielderror-syntax.md +256 -0
  97. package/embedded-knowledge/domains/eva-errors/samples/table-safety-validation-patterns.md +101 -0
  98. package/embedded-knowledge/domains/eva-errors/samples/testfield-error-handling.md +108 -0
  99. package/embedded-knowledge/domains/eva-errors/testfield-error-handling.md +80 -0
  100. package/embedded-knowledge/domains/jordan-bridge/al-event-subscriber-architecture.md +98 -0
  101. package/embedded-knowledge/domains/jordan-bridge/automatic-registration.md +123 -0
  102. package/embedded-knowledge/domains/jordan-bridge/business-process-template-patterns.md +96 -0
  103. package/embedded-knowledge/domains/jordan-bridge/error-response-patterns.md +115 -0
  104. package/embedded-knowledge/domains/jordan-bridge/etag-implementation.md +115 -0
  105. package/embedded-knowledge/domains/jordan-bridge/field-control-selection.md +114 -0
  106. package/embedded-knowledge/domains/jordan-bridge/samples/al-event-subscriber-architecture.md +395 -0
  107. package/embedded-knowledge/domains/jordan-bridge/samples/api-error-responses.md +479 -0
  108. package/embedded-knowledge/domains/jordan-bridge/samples/api-field-control.md +548 -0
  109. package/embedded-knowledge/domains/jordan-bridge/samples/api-url-naming.md +287 -0
  110. package/embedded-knowledge/domains/jordan-bridge/samples/business-process-templates.md +434 -0
  111. package/embedded-knowledge/domains/jordan-bridge/samples/etag-implementation.md +508 -0
  112. package/embedded-knowledge/domains/jordan-bridge/samples/task-scheduler-pattern.md +615 -0
  113. package/embedded-knowledge/domains/jordan-bridge/task-scheduler-pattern-implementation.md +144 -0
  114. package/embedded-knowledge/domains/jordan-bridge/url-structure-naming-patterns.md +96 -0
  115. package/embedded-knowledge/domains/maya-mentor/case-multiple-conditions-ranges.md +124 -0
  116. package/embedded-knowledge/domains/maya-mentor/case-statement-syntax-structure.md +84 -0
  117. package/embedded-knowledge/domains/maya-mentor/fielderror-syntax-usage.md +75 -0
  118. package/embedded-knowledge/domains/maya-mentor/fielderror-vs-testfield.md +96 -0
  119. package/embedded-knowledge/domains/maya-mentor/samples/case-statement-multiple-conditions.md +385 -0
  120. package/embedded-knowledge/domains/maya-mentor/samples/case-statement-syntax-structure.md +72 -0
  121. package/embedded-knowledge/domains/maya-mentor/samples/fielderror-syntax-usage.md +48 -0
  122. package/embedded-knowledge/domains/maya-mentor/samples/testfield-basic-syntax.md +49 -0
  123. package/embedded-knowledge/domains/maya-mentor/testfield-basic-syntax.md +67 -0
  124. package/embedded-knowledge/domains/quinn-tester/fielderror-validation-patterns.md +119 -0
  125. package/embedded-knowledge/domains/quinn-tester/rule-execution.md +123 -0
  126. package/embedded-knowledge/domains/quinn-tester/samples/case-error-handling.md +64 -0
  127. package/embedded-knowledge/domains/quinn-tester/samples/fielderror-message-construction.md +60 -0
  128. package/embedded-knowledge/domains/quinn-tester/samples/fielderror-validation-patterns.md +83 -0
  129. package/embedded-knowledge/domains/quinn-tester/samples/rule-execution.md +716 -0
  130. package/embedded-knowledge/domains/quinn-tester/samples/table-safety-validation-patterns.md +101 -0
  131. package/embedded-knowledge/domains/quinn-tester/samples/temporary-table-operation-validation.md +91 -0
  132. package/embedded-knowledge/domains/quinn-tester/table-safety-validation-patterns.md +79 -0
  133. package/embedded-knowledge/domains/quinn-tester/temporary-table-operation-validation.md +79 -0
  134. package/embedded-knowledge/domains/roger-reviewer/al-begin-end-block-structure.md +89 -0
  135. package/embedded-knowledge/domains/roger-reviewer/al-binary-operator-spacing.md +76 -0
  136. package/embedded-knowledge/domains/roger-reviewer/al-blank-line-organization.md +76 -0
  137. package/embedded-knowledge/domains/roger-reviewer/al-case-action-formatting.md +76 -0
  138. package/embedded-knowledge/domains/roger-reviewer/al-code-spacing-conventions.md +81 -0
  139. package/embedded-knowledge/domains/roger-reviewer/al-comment-spacing-standards.md +76 -0
  140. package/embedded-knowledge/domains/roger-reviewer/al-end-else-pairing.md +75 -0
  141. package/embedded-knowledge/domains/roger-reviewer/al-keyword-indentation-rules.md +76 -0
  142. package/embedded-knowledge/domains/roger-reviewer/al-line-start-keyword-positioning.md +76 -0
  143. package/embedded-knowledge/domains/roger-reviewer/al-separate-if-else-formatting.md +76 -0
  144. package/embedded-knowledge/domains/roger-reviewer/al-standard-abbreviations.md +96 -0
  145. package/embedded-knowledge/domains/roger-reviewer/al-statement-per-line-rule.md +76 -0
  146. package/embedded-knowledge/domains/roger-reviewer/al-unnecessary-else-elimination.md +86 -0
  147. package/embedded-knowledge/domains/roger-reviewer/al-variable-declaration-order.md +90 -0
  148. package/embedded-knowledge/domains/roger-reviewer/al-variable-naming-conventions.md +82 -0
  149. package/embedded-knowledge/domains/roger-reviewer/begin-block-statement-clarity.md +78 -0
  150. package/embedded-knowledge/domains/roger-reviewer/begin-end-positioning-patterns.md +76 -0
  151. package/embedded-knowledge/domains/roger-reviewer/binary-operator-line-positioning.md +78 -0
  152. package/embedded-knowledge/domains/roger-reviewer/boolean-expression-simplification-al.md +100 -0
  153. package/embedded-knowledge/domains/roger-reviewer/case-statement-error-handling-troubleshooting.md +115 -0
  154. package/embedded-knowledge/domains/roger-reviewer/compound-statement-readability.md +124 -0
  155. package/embedded-knowledge/domains/roger-reviewer/lonely-repeat-statement-pattern.md +110 -0
  156. package/embedded-knowledge/domains/roger-reviewer/samples/al-begin-end-blocks.md +438 -0
  157. package/embedded-knowledge/domains/roger-reviewer/samples/al-binary-operator-spacing.md +255 -0
  158. package/embedded-knowledge/domains/roger-reviewer/samples/al-comment-spacing-standards.md +209 -0
  159. package/embedded-knowledge/domains/roger-reviewer/samples/al-keyword-indentation-rules.md +218 -0
  160. package/embedded-knowledge/domains/roger-reviewer/samples/al-line-start-keyword-positioning.md +218 -0
  161. package/embedded-knowledge/domains/roger-reviewer/samples/al-separate-if-else-formatting.md +280 -0
  162. package/embedded-knowledge/domains/roger-reviewer/samples/al-statement-per-line-rule.md +188 -0
  163. package/embedded-knowledge/domains/roger-reviewer/samples/al-unnecessary-else-elimination.md +245 -0
  164. package/embedded-knowledge/domains/roger-reviewer/samples/al-variable-declaration-order.md +244 -0
  165. package/embedded-knowledge/domains/roger-reviewer/samples/begin-end-positioning.md +278 -0
  166. package/embedded-knowledge/domains/roger-reviewer/samples/boolean-simplification-examples.md +484 -0
  167. package/embedded-knowledge/domains/roger-reviewer/samples/case-error-handling.md +64 -0
  168. package/embedded-knowledge/domains/roger-reviewer/samples/compound-statement-readability.md +107 -0
  169. package/embedded-knowledge/domains/roger-reviewer/samples/lonely-repeat-examples.md +280 -0
  170. package/embedded-knowledge/domains/sam-coder/al-formatting-consistency-patterns.md +75 -0
  171. package/embedded-knowledge/domains/sam-coder/al-line-comment-formatting.md +67 -0
  172. package/embedded-knowledge/domains/sam-coder/al-lonely-repeat-pattern.md +76 -0
  173. package/embedded-knowledge/domains/sam-coder/al-named-parameter-pattern.md +98 -0
  174. package/embedded-knowledge/domains/sam-coder/al-object-navigation-shortcuts.md +128 -0
  175. package/embedded-knowledge/domains/sam-coder/al-readability-optimization.md +75 -0
  176. package/embedded-knowledge/domains/sam-coder/al-record-find-early-exit.md +95 -0
  177. package/embedded-knowledge/domains/sam-coder/command-queue-pattern-al.md +141 -0
  178. package/embedded-knowledge/domains/sam-coder/deleteall-alternative-implementation.md +91 -0
  179. package/embedded-knowledge/domains/sam-coder/deleteall-method-usage.md +118 -0
  180. package/embedded-knowledge/domains/sam-coder/deleteall-trigger-execution.md +111 -0
  181. package/embedded-knowledge/domains/sam-coder/event-bridge-pattern-al.md +113 -0
  182. package/embedded-knowledge/domains/sam-coder/event-payload-design-patterns.md +127 -0
  183. package/embedded-knowledge/domains/sam-coder/generic-method-patterns-al.md +141 -0
  184. package/embedded-knowledge/domains/sam-coder/manual-binding-conditional-subscribers.md +66 -0
  185. package/embedded-knowledge/domains/sam-coder/nested-compound-best-practices.md +96 -0
  186. package/embedded-knowledge/domains/sam-coder/samples/al-blank-line-organization.md +161 -0
  187. package/embedded-knowledge/domains/sam-coder/samples/al-case-action-formatting.md +177 -0
  188. package/embedded-knowledge/domains/sam-coder/samples/al-lonely-repeat-pattern.md +239 -0
  189. package/embedded-knowledge/domains/sam-coder/samples/al-named-parameter-pattern.md +346 -0
  190. package/embedded-knowledge/domains/sam-coder/samples/al-record-find-early-exit.md +298 -0
  191. package/embedded-knowledge/domains/sam-coder/samples/command-queue-pattern.md +677 -0
  192. package/embedded-knowledge/domains/sam-coder/samples/deleteall-alternative-implementation.md +117 -0
  193. package/embedded-knowledge/domains/sam-coder/samples/deleteall-triggers.md +75 -0
  194. package/embedded-knowledge/domains/sam-coder/samples/deleteall-usage.md +169 -0
  195. package/embedded-knowledge/domains/sam-coder/samples/event-bridge-pattern.md +399 -0
  196. package/embedded-knowledge/domains/sam-coder/samples/event-payload-design.md +356 -0
  197. package/embedded-knowledge/domains/sam-coder/samples/generic-method-patterns.md +889 -0
  198. package/embedded-knowledge/domains/sam-coder/samples/manual-binding.md +84 -0
  199. package/embedded-knowledge/domains/sam-coder/samples/nested-compound-best-practices.md +127 -0
  200. package/embedded-knowledge/domains/sam-coder/samples/single-to-compound-conversion.md +89 -0
  201. package/embedded-knowledge/domains/sam-coder/samples/template-method-pattern.md +516 -0
  202. package/embedded-knowledge/domains/sam-coder/samples/testfield-patterns.md +61 -0
  203. package/embedded-knowledge/domains/sam-coder/samples/type-safe-operations.md +427 -0
  204. package/embedded-knowledge/domains/sam-coder/single-to-compound-conversion.md +122 -0
  205. package/embedded-knowledge/domains/sam-coder/template-method-pattern-al.md +96 -0
  206. package/embedded-knowledge/domains/sam-coder/testfield-patterns.md +101 -0
  207. package/embedded-knowledge/domains/sam-coder/type-safe-operations-al.md +149 -0
  208. package/embedded-knowledge/domains/sam-coder/vs-code-al-keyboard-shortcuts.md +107 -0
  209. package/embedded-knowledge/domains/seth-security/al-temporary-table-safety.md +95 -0
  210. package/embedded-knowledge/domains/seth-security/api-permission-model.md +115 -0
  211. package/embedded-knowledge/domains/seth-security/istemporary-safeguard-pattern.md +78 -0
  212. package/embedded-knowledge/domains/seth-security/samples/al-temporary-table-safety.md +373 -0
  213. package/embedded-knowledge/domains/seth-security/samples/api-permission-model.md +308 -0
  214. package/embedded-knowledge/domains/shared/al-file-naming-conventions.md +146 -0
  215. package/embedded-knowledge/domains/taylor-docs/al-xml-documentation-structure.md +79 -0
  216. package/embedded-knowledge/domains/uma-ux/bc-action-shortcuts-syntax.md +78 -0
  217. package/embedded-knowledge/domains/uma-ux/shortcut-key-user-experience-design.md +81 -0
  218. package/embedded-knowledge/indexes/bc-version-matrix.json +188 -0
  219. package/embedded-knowledge/indexes/domain-catalog.json +106 -0
  220. package/embedded-knowledge/indexes/tags/abbreviations.json +1 -0
  221. package/embedded-knowledge/indexes/tags/abstraction.json +1 -0
  222. package/embedded-knowledge/indexes/tags/access-control.json +1 -0
  223. package/embedded-knowledge/indexes/tags/accessibility.json +1 -0
  224. package/embedded-knowledge/indexes/tags/actions.json +1 -0
  225. package/embedded-knowledge/indexes/tags/advanced-patterns.json +1 -0
  226. package/embedded-knowledge/indexes/tags/advanced.json +1 -0
  227. package/embedded-knowledge/indexes/tags/al-extension.json +1 -0
  228. package/embedded-knowledge/indexes/tags/al-generics.json +1 -0
  229. package/embedded-knowledge/indexes/tags/al-objects.json +1 -0
  230. package/embedded-knowledge/indexes/tags/al-syntax.json +1 -0
  231. package/embedded-knowledge/indexes/tags/algorithm-structure.json +1 -0
  232. package/embedded-knowledge/indexes/tags/alternatives.json +1 -0
  233. package/embedded-knowledge/indexes/tags/analytics.json +1 -0
  234. package/embedded-knowledge/indexes/tags/api-delegates.json +1 -0
  235. package/embedded-knowledge/indexes/tags/api-design.json +1 -0
  236. package/embedded-knowledge/indexes/tags/api-documentation.json +1 -0
  237. package/embedded-knowledge/indexes/tags/api-endpoints.json +1 -0
  238. package/embedded-knowledge/indexes/tags/api-extensibility.json +1 -0
  239. package/embedded-knowledge/indexes/tags/api-fieldsets.json +1 -0
  240. package/embedded-knowledge/indexes/tags/api-integration.json +1 -0
  241. package/embedded-knowledge/indexes/tags/api-interfaces.json +1 -0
  242. package/embedded-knowledge/indexes/tags/api-optimization.json +1 -0
  243. package/embedded-knowledge/indexes/tags/api-pages.json +1 -0
  244. package/embedded-knowledge/indexes/tags/api-patterns.json +1 -0
  245. package/embedded-knowledge/indexes/tags/api-permissions.json +1 -0
  246. package/embedded-knowledge/indexes/tags/api-responses.json +1 -0
  247. package/embedded-knowledge/indexes/tags/api-simplification.json +1 -0
  248. package/embedded-knowledge/indexes/tags/api.json +1 -0
  249. package/embedded-knowledge/indexes/tags/architecture.json +1 -0
  250. package/embedded-knowledge/indexes/tags/async-patterns.json +1 -0
  251. package/embedded-knowledge/indexes/tags/async-processing.json +1 -0
  252. package/embedded-knowledge/indexes/tags/automatic-registration.json +1 -0
  253. package/embedded-knowledge/indexes/tags/batch-operations.json +1 -0
  254. package/embedded-knowledge/indexes/tags/bc24-migration.json +1 -0
  255. package/embedded-knowledge/indexes/tags/begin-blocks.json +1 -0
  256. package/embedded-knowledge/indexes/tags/begin-end.json +1 -0
  257. package/embedded-knowledge/indexes/tags/behavioral-patterns.json +1 -0
  258. package/embedded-knowledge/indexes/tags/best-practices.json +1 -0
  259. package/embedded-knowledge/indexes/tags/binding.json +1 -0
  260. package/embedded-knowledge/indexes/tags/block-structure.json +1 -0
  261. package/embedded-knowledge/indexes/tags/blocks.json +1 -0
  262. package/embedded-knowledge/indexes/tags/boolean-expressions.json +1 -0
  263. package/embedded-knowledge/indexes/tags/branching.json +1 -0
  264. package/embedded-knowledge/indexes/tags/breaking-changes.json +1 -0
  265. package/embedded-knowledge/indexes/tags/breakpoints.json +1 -0
  266. package/embedded-knowledge/indexes/tags/business-foundation.json +1 -0
  267. package/embedded-knowledge/indexes/tags/business-infrastructure.json +1 -0
  268. package/embedded-knowledge/indexes/tags/business-process.json +1 -0
  269. package/embedded-knowledge/indexes/tags/business-rules.json +1 -0
  270. package/embedded-knowledge/indexes/tags/caching.json +1 -0
  271. package/embedded-knowledge/indexes/tags/case-statements.json +1 -0
  272. package/embedded-knowledge/indexes/tags/case.json +1 -0
  273. package/embedded-knowledge/indexes/tags/code-analysis.json +1 -0
  274. package/embedded-knowledge/indexes/tags/code-clarity.json +1 -0
  275. package/embedded-knowledge/indexes/tags/code-comprehension.json +1 -0
  276. package/embedded-knowledge/indexes/tags/code-conversion.json +1 -0
  277. package/embedded-knowledge/indexes/tags/code-formatting.json +1 -0
  278. package/embedded-knowledge/indexes/tags/code-organization.json +1 -0
  279. package/embedded-knowledge/indexes/tags/code-patterns.json +1 -0
  280. package/embedded-knowledge/indexes/tags/code-quality.json +1 -0
  281. package/embedded-knowledge/indexes/tags/code-reuse.json +1 -0
  282. package/embedded-knowledge/indexes/tags/code-simplification.json +1 -0
  283. package/embedded-knowledge/indexes/tags/code-standards.json +1 -0
  284. package/embedded-knowledge/indexes/tags/code-structure.json +1 -0
  285. package/embedded-knowledge/indexes/tags/code-style.json +1 -0
  286. package/embedded-knowledge/indexes/tags/codeunit-design.json +1 -0
  287. package/embedded-knowledge/indexes/tags/command-queue.json +1 -0
  288. package/embedded-knowledge/indexes/tags/comments.json +1 -0
  289. package/embedded-knowledge/indexes/tags/compile-time-validation.json +1 -0
  290. package/embedded-knowledge/indexes/tags/complex-facade.json +1 -0
  291. package/embedded-knowledge/indexes/tags/complexity-hiding.json +1 -0
  292. package/embedded-knowledge/indexes/tags/complexity-management.json +1 -0
  293. package/embedded-knowledge/indexes/tags/compound-statements.json +1 -0
  294. package/embedded-knowledge/indexes/tags/concurrency.json +1 -0
  295. package/embedded-knowledge/indexes/tags/conditional-logic.json +1 -0
  296. package/embedded-knowledge/indexes/tags/conditional.json +1 -0
  297. package/embedded-knowledge/indexes/tags/conflict-resolution.json +1 -0
  298. package/embedded-knowledge/indexes/tags/consistency.json +1 -0
  299. package/embedded-knowledge/indexes/tags/contract-design.json +1 -0
  300. package/embedded-knowledge/indexes/tags/control-flow.json +1 -0
  301. package/embedded-knowledge/indexes/tags/conversion-guide.json +1 -0
  302. package/embedded-knowledge/indexes/tags/correlation.json +1 -0
  303. package/embedded-knowledge/indexes/tags/custom-messages.json +1 -0
  304. package/embedded-knowledge/indexes/tags/data-access.json +1 -0
  305. package/embedded-knowledge/indexes/tags/data-exposure.json +1 -0
  306. package/embedded-knowledge/indexes/tags/data-integrity.json +1 -0
  307. package/embedded-knowledge/indexes/tags/data-loading.json +1 -0
  308. package/embedded-knowledge/indexes/tags/data-manipulation.json +1 -0
  309. package/embedded-knowledge/indexes/tags/data-modeling.json +1 -0
  310. package/embedded-knowledge/indexes/tags/data-patterns.json +1 -0
  311. package/embedded-knowledge/indexes/tags/data-protection.json +1 -0
  312. package/embedded-knowledge/indexes/tags/data-validation.json +1 -0
  313. package/embedded-knowledge/indexes/tags/database.json +1 -0
  314. package/embedded-knowledge/indexes/tags/debugging.json +1 -0
  315. package/embedded-knowledge/indexes/tags/decision-making.json +1 -0
  316. package/embedded-knowledge/indexes/tags/declaration.json +1 -0
  317. package/embedded-knowledge/indexes/tags/default-messages.json +1 -0
  318. package/embedded-knowledge/indexes/tags/defensive-programming.json +1 -0
  319. package/embedded-knowledge/indexes/tags/deleteall.json +1 -0
  320. package/embedded-knowledge/indexes/tags/dependencies.json +1 -0
  321. package/embedded-knowledge/indexes/tags/deployment.json +1 -0
  322. package/embedded-knowledge/indexes/tags/developer-productivity.json +1 -0
  323. package/embedded-knowledge/indexes/tags/development-workflow.json +1 -0
  324. package/embedded-knowledge/indexes/tags/diagnostics.json +1 -0
  325. package/embedded-knowledge/indexes/tags/dimensions.json +1 -0
  326. package/embedded-knowledge/indexes/tags/documentation.json +1 -0
  327. package/embedded-knowledge/indexes/tags/early-exit.json +1 -0
  328. package/embedded-knowledge/indexes/tags/else-clauses.json +1 -0
  329. package/embedded-knowledge/indexes/tags/end-statements.json +1 -0
  330. package/embedded-knowledge/indexes/tags/enterprise-patterns.json +1 -0
  331. package/embedded-knowledge/indexes/tags/entity-relationships.json +1 -0
  332. package/embedded-knowledge/indexes/tags/error-handling.json +1 -0
  333. package/embedded-knowledge/indexes/tags/error-messages.json +1 -0
  334. package/embedded-knowledge/indexes/tags/error-prevention.json +1 -0
  335. package/embedded-knowledge/indexes/tags/error-text.json +1 -0
  336. package/embedded-knowledge/indexes/tags/etag.json +1 -0
  337. package/embedded-knowledge/indexes/tags/event-bridge.json +1 -0
  338. package/embedded-knowledge/indexes/tags/event-payload.json +1 -0
  339. package/embedded-knowledge/indexes/tags/event-routing.json +1 -0
  340. package/embedded-knowledge/indexes/tags/events.json +1 -0
  341. package/embedded-knowledge/indexes/tags/execution-flow.json +1 -0
  342. package/embedded-knowledge/indexes/tags/expressions.json +1 -0
  343. package/embedded-knowledge/indexes/tags/extensibility.json +1 -0
  344. package/embedded-knowledge/indexes/tags/extensions.json +1 -0
  345. package/embedded-knowledge/indexes/tags/facade-composition.json +1 -0
  346. package/embedded-knowledge/indexes/tags/facade-pattern.json +1 -0
  347. package/embedded-knowledge/indexes/tags/field-control.json +1 -0
  348. package/embedded-knowledge/indexes/tags/field-exclusion.json +1 -0
  349. package/embedded-knowledge/indexes/tags/field-registration.json +1 -0
  350. package/embedded-knowledge/indexes/tags/field-state.json +1 -0
  351. package/embedded-knowledge/indexes/tags/field-validation.json +1 -0
  352. package/embedded-knowledge/indexes/tags/fielderror.json +1 -0
  353. package/embedded-knowledge/indexes/tags/fields.json +1 -0
  354. package/embedded-knowledge/indexes/tags/filtering.json +1 -0
  355. package/embedded-knowledge/indexes/tags/filters.json +1 -0
  356. package/embedded-knowledge/indexes/tags/formatting.json +1 -0
  357. package/embedded-knowledge/indexes/tags/generic-methods.json +1 -0
  358. package/embedded-knowledge/indexes/tags/http-status.json +1 -0
  359. package/embedded-knowledge/indexes/tags/if-statements.json +1 -0
  360. package/embedded-knowledge/indexes/tags/implementation.json +1 -0
  361. package/embedded-knowledge/indexes/tags/indentation.json +1 -0
  362. package/embedded-knowledge/indexes/tags/index-summary.json +277 -0
  363. package/embedded-knowledge/indexes/tags/indexing.json +1 -0
  364. package/embedded-knowledge/indexes/tags/inheritance.json +1 -0
  365. package/embedded-knowledge/indexes/tags/integration.json +1 -0
  366. package/embedded-knowledge/indexes/tags/integrity-checking.json +1 -0
  367. package/embedded-knowledge/indexes/tags/intellisense.json +1 -0
  368. package/embedded-knowledge/indexes/tags/interface-design.json +1 -0
  369. package/embedded-knowledge/indexes/tags/interface-segregation.json +1 -0
  370. package/embedded-knowledge/indexes/tags/isolation.json +1 -0
  371. package/embedded-knowledge/indexes/tags/job-processing.json +1 -0
  372. package/embedded-knowledge/indexes/tags/keyboard-navigation.json +1 -0
  373. package/embedded-knowledge/indexes/tags/keywords.json +1 -0
  374. package/embedded-knowledge/indexes/tags/legacy-modernization.json +1 -0
  375. package/embedded-knowledge/indexes/tags/line-breaks.json +1 -0
  376. package/embedded-knowledge/indexes/tags/line-organization.json +1 -0
  377. package/embedded-knowledge/indexes/tags/line-positioning.json +1 -0
  378. package/embedded-knowledge/indexes/tags/localization.json +1 -0
  379. package/embedded-knowledge/indexes/tags/logging.json +1 -0
  380. package/embedded-knowledge/indexes/tags/loose-coupling.json +1 -0
  381. package/embedded-knowledge/indexes/tags/maintainability.json +1 -0
  382. package/embedded-knowledge/indexes/tags/memory-management.json +1 -0
  383. package/embedded-knowledge/indexes/tags/memory-optimization.json +1 -0
  384. package/embedded-knowledge/indexes/tags/memory.json +1 -0
  385. package/embedded-knowledge/indexes/tags/message-design.json +1 -0
  386. package/embedded-knowledge/indexes/tags/message-formatting.json +1 -0
  387. package/embedded-knowledge/indexes/tags/message-patterns.json +1 -0
  388. package/embedded-knowledge/indexes/tags/metadata-driven.json +1 -0
  389. package/embedded-knowledge/indexes/tags/method-comparison.json +1 -0
  390. package/embedded-knowledge/indexes/tags/module-architecture.json +1 -0
  391. package/embedded-knowledge/indexes/tags/module-validation.json +1 -0
  392. package/embedded-knowledge/indexes/tags/monitoring.json +1 -0
  393. package/embedded-knowledge/indexes/tags/multi-layer-facade.json +1 -0
  394. package/embedded-knowledge/indexes/tags/multi-tenancy.json +1 -0
  395. package/embedded-knowledge/indexes/tags/multiple-values.json +1 -0
  396. package/embedded-knowledge/indexes/tags/naming-conventions.json +1 -0
  397. package/embedded-knowledge/indexes/tags/naming.json +1 -0
  398. package/embedded-knowledge/indexes/tags/navigation.json +1 -0
  399. package/embedded-knowledge/indexes/tags/nested-statements.json +1 -0
  400. package/embedded-knowledge/indexes/tags/no-series-conversion.json +1 -0
  401. package/embedded-knowledge/indexes/tags/no-series-validation.json +1 -0
  402. package/embedded-knowledge/indexes/tags/no-series.json +1 -0
  403. package/embedded-knowledge/indexes/tags/number-generation.json +1 -0
  404. package/embedded-knowledge/indexes/tags/object-documentation.json +1 -0
  405. package/embedded-knowledge/indexes/tags/odata.json +1 -0
  406. package/embedded-knowledge/indexes/tags/ondelete.json +1 -0
  407. package/embedded-knowledge/indexes/tags/onvalidate.json +1 -0
  408. package/embedded-knowledge/indexes/tags/operation-delegation.json +1 -0
  409. package/embedded-knowledge/indexes/tags/operation-safety.json +1 -0
  410. package/embedded-knowledge/indexes/tags/operators.json +1 -0
  411. package/embedded-knowledge/indexes/tags/optimization.json +1 -0
  412. package/embedded-knowledge/indexes/tags/order.json +1 -0
  413. package/embedded-knowledge/indexes/tags/organization.json +1 -0
  414. package/embedded-knowledge/indexes/tags/pages.json +1 -0
  415. package/embedded-knowledge/indexes/tags/parameters.json +1 -0
  416. package/embedded-knowledge/indexes/tags/patterns.json +1 -0
  417. package/embedded-knowledge/indexes/tags/performance-optimization.json +1 -0
  418. package/embedded-knowledge/indexes/tags/performance.json +1 -0
  419. package/embedded-knowledge/indexes/tags/placement.json +1 -0
  420. package/embedded-knowledge/indexes/tags/posting-codeunits.json +1 -0
  421. package/embedded-knowledge/indexes/tags/posting.json +1 -0
  422. package/embedded-knowledge/indexes/tags/preconditions.json +1 -0
  423. package/embedded-knowledge/indexes/tags/primary-key.json +1 -0
  424. package/embedded-knowledge/indexes/tags/privacy.json +1 -0
  425. package/embedded-knowledge/indexes/tags/process-automation.json +1 -0
  426. package/embedded-knowledge/indexes/tags/production.json +1 -0
  427. package/embedded-knowledge/indexes/tags/productivity.json +1 -0
  428. package/embedded-knowledge/indexes/tags/query-performance.json +1 -0
  429. package/embedded-knowledge/indexes/tags/queue-management.json +1 -0
  430. package/embedded-knowledge/indexes/tags/ranges.json +1 -0
  431. package/embedded-knowledge/indexes/tags/readability.json +1 -0
  432. package/embedded-knowledge/indexes/tags/record-access.json +1 -0
  433. package/embedded-knowledge/indexes/tags/record-methods.json +1 -0
  434. package/embedded-knowledge/indexes/tags/refactoring.json +1 -0
  435. package/embedded-knowledge/indexes/tags/reference.json +1 -0
  436. package/embedded-knowledge/indexes/tags/repeat-loops.json +1 -0
  437. package/embedded-knowledge/indexes/tags/repeat-statement.json +1 -0
  438. package/embedded-knowledge/indexes/tags/runtime-errors.json +1 -0
  439. package/embedded-knowledge/indexes/tags/runtime.json +1 -0
  440. package/embedded-knowledge/indexes/tags/safeguards.json +1 -0
  441. package/embedded-knowledge/indexes/tags/security.json +1 -0
  442. package/embedded-knowledge/indexes/tags/sequence-management.json +1 -0
  443. package/embedded-knowledge/indexes/tags/serialization.json +1 -0
  444. package/embedded-knowledge/indexes/tags/session-logmessage.json +1 -0
  445. package/embedded-knowledge/indexes/tags/session.json +1 -0
  446. package/embedded-knowledge/indexes/tags/setloadfields.json +1 -0
  447. package/embedded-knowledge/indexes/tags/shortcuts.json +1 -0
  448. package/embedded-knowledge/indexes/tags/sift.json +1 -0
  449. package/embedded-knowledge/indexes/tags/singleinstance.json +1 -0
  450. package/embedded-knowledge/indexes/tags/spacing.json +1 -0
  451. package/embedded-knowledge/indexes/tags/sql-translation.json +1 -0
  452. package/embedded-knowledge/indexes/tags/standards.json +1 -0
  453. package/embedded-knowledge/indexes/tags/statements.json +1 -0
  454. package/embedded-knowledge/indexes/tags/streaming.json +1 -0
  455. package/embedded-knowledge/indexes/tags/strong-typing.json +1 -0
  456. package/embedded-knowledge/indexes/tags/structural-patterns.json +1 -0
  457. package/embedded-knowledge/indexes/tags/structure.json +1 -0
  458. package/embedded-knowledge/indexes/tags/subscribers.json +1 -0
  459. package/embedded-knowledge/indexes/tags/switch.json +1 -0
  460. package/embedded-knowledge/indexes/tags/symbol-search.json +1 -0
  461. package/embedded-knowledge/indexes/tags/syntax.json +1 -0
  462. package/embedded-knowledge/indexes/tags/systemid.json +1 -0
  463. package/embedded-knowledge/indexes/tags/table-configuration.json +1 -0
  464. package/embedded-knowledge/indexes/tags/table-events.json +1 -0
  465. package/embedded-knowledge/indexes/tags/table-keys.json +1 -0
  466. package/embedded-knowledge/indexes/tags/table-safety.json +1 -0
  467. package/embedded-knowledge/indexes/tags/task-scheduler.json +1 -0
  468. package/embedded-knowledge/indexes/tags/telemetry.json +1 -0
  469. package/embedded-knowledge/indexes/tags/template-method.json +1 -0
  470. package/embedded-knowledge/indexes/tags/temporary-tables.json +1 -0
  471. package/embedded-knowledge/indexes/tags/testfield.json +1 -0
  472. package/embedded-knowledge/indexes/tags/tradeoffs.json +1 -0
  473. package/embedded-knowledge/indexes/tags/triggers.json +1 -0
  474. package/embedded-knowledge/indexes/tags/troubleshooting.json +1 -0
  475. package/embedded-knowledge/indexes/tags/type-safety.json +1 -0
  476. package/embedded-knowledge/indexes/tags/url-structure.json +1 -0
  477. package/embedded-knowledge/indexes/tags/user-experience.json +1 -0
  478. package/embedded-knowledge/indexes/tags/user-feedback.json +1 -0
  479. package/embedded-knowledge/indexes/tags/user-interface.json +1 -0
  480. package/embedded-knowledge/indexes/tags/validation-feedback.json +1 -0
  481. package/embedded-knowledge/indexes/tags/validation.json +1 -0
  482. package/embedded-knowledge/indexes/tags/variables.json +1 -0
  483. package/embedded-knowledge/indexes/tags/verbosity.json +1 -0
  484. package/embedded-knowledge/indexes/tags/vs-code.json +1 -0
  485. package/embedded-knowledge/indexes/tags/web-services.json +1 -0
  486. package/embedded-knowledge/indexes/tags/workflow-management.json +1 -0
  487. package/embedded-knowledge/indexes/tags/workflow-optimization.json +1 -0
  488. package/embedded-knowledge/indexes/tags/workflow-templates.json +1 -0
  489. package/embedded-knowledge/indexes/tags/workspace.json +1 -0
  490. package/embedded-knowledge/indexes/tags/xml-documentation.json +1 -0
  491. package/embedded-knowledge/indexes/topic-relationships.json +128 -0
  492. package/embedded-knowledge/methodologies/index.json +81 -0
  493. package/embedded-knowledge/methodologies/phases/analysis-full.md +208 -0
  494. package/embedded-knowledge/methodologies/phases/analysis-quick.md +44 -0
  495. package/embedded-knowledge/methodologies/phases/analysis.md +182 -0
  496. package/embedded-knowledge/methodologies/phases/execution-validation-full.md +174 -0
  497. package/embedded-knowledge/methodologies/phases/execution-validation-quick.md +31 -0
  498. package/embedded-knowledge/methodologies/phases/execution-validation.md +174 -0
  499. package/embedded-knowledge/methodologies/phases/performance-full.md +211 -0
  500. package/embedded-knowledge/methodologies/phases/performance-quick.md +32 -0
  501. package/embedded-knowledge/methodologies/phases/performance.md +211 -0
  502. package/embedded-knowledge/methodologies/phases/verification-full.md +162 -0
  503. package/embedded-knowledge/methodologies/phases/verification-quick.md +48 -0
  504. package/embedded-knowledge/methodologies/phases/verification.md +146 -0
  505. package/embedded-knowledge/methodologies/workflow-enforcement.md +142 -0
  506. package/embedded-knowledge/methodologies/workflows/code-review-workflow.md +99 -0
  507. package/embedded-knowledge/specialists/alex-architect.md +216 -0
  508. package/embedded-knowledge/specialists/casey-copilot.md +226 -0
  509. package/embedded-knowledge/specialists/chris-config.md +267 -0
  510. package/embedded-knowledge/specialists/dean-debug.md +222 -0
  511. package/embedded-knowledge/specialists/eva-errors.md +235 -0
  512. package/embedded-knowledge/specialists/jordan-bridge.md +235 -0
  513. package/embedded-knowledge/specialists/logan-legacy.md +209 -0
  514. package/embedded-knowledge/specialists/maya-mentor.md +211 -0
  515. package/embedded-knowledge/specialists/morgan-market.md +226 -0
  516. package/embedded-knowledge/specialists/quinn-tester.md +235 -0
  517. package/embedded-knowledge/specialists/roger-reviewer.md +234 -0
  518. package/embedded-knowledge/specialists/sam-coder.md +359 -0
  519. package/embedded-knowledge/specialists/seth-security.md +235 -0
  520. package/embedded-knowledge/specialists/taylor-docs.md +257 -0
  521. package/embedded-knowledge/specialists/uma-ux.md +235 -0
  522. package/package.json +6 -6
@@ -0,0 +1,508 @@
1
+ # ETag Implementation for Optimistic Concurrency - AL Code Sample
2
+
3
+ ## Basic ETag Implementation
4
+
5
+ ```al
6
+ page 50300 "Customer ETag API"
7
+ {
8
+ PageType = API;
9
+ APIPublisher = 'contoso';
10
+ APIGroup = 'customers';
11
+ APIVersion = 'v1.0';
12
+ EntityName = 'customer';
13
+ EntitySetName = 'customers';
14
+ SourceTable = Customer;
15
+ DelayedInsert = true;
16
+ ODataKeyFields = SystemId;
17
+
18
+ layout
19
+ {
20
+ area(Content)
21
+ {
22
+ repeater(GroupName)
23
+ {
24
+ field(id; Rec.SystemId)
25
+ {
26
+ Caption = 'Id';
27
+ Editable = false;
28
+ }
29
+ field(number; Rec."No.")
30
+ {
31
+ Caption = 'Number';
32
+ }
33
+ field(displayName; Rec.Name)
34
+ {
35
+ Caption = 'Display Name';
36
+ }
37
+ field(lastModifiedDateTime; Rec.SystemModifiedAt)
38
+ {
39
+ Caption = 'Last Modified Date Time';
40
+ Editable = false;
41
+ // Used for ETag generation
42
+ }
43
+ // ETag field for optimistic concurrency control
44
+ field(etag; ETagValue)
45
+ {
46
+ Caption = 'ETag';
47
+ Editable = false;
48
+ }
49
+ }
50
+ }
51
+ }
52
+
53
+ var
54
+ ETagValue: Text;
55
+ OriginalETagValue: Text;
56
+
57
+ trigger OnAfterGetRecord()
58
+ begin
59
+ // Generate ETag based on SystemModifiedAt
60
+ ETagValue := GenerateETag(Rec.SystemModifiedAt, Rec.SystemId);
61
+ end;
62
+
63
+ trigger OnModifyRecord(): Boolean
64
+ var
65
+ CurrentRecord: Record Customer;
66
+ CurrentETag: Text;
67
+ begin
68
+ // Validate ETag for optimistic concurrency
69
+ if CurrentRecord.GetBySystemId(Rec.SystemId) then begin
70
+ CurrentETag := GenerateETag(CurrentRecord.SystemModifiedAt, CurrentRecord.SystemId);
71
+
72
+ // Check if record was modified by another user
73
+ if CurrentETag <> OriginalETagValue then
74
+ Error('The record has been modified by another user. Please refresh and try again.');
75
+ end;
76
+
77
+ exit(true);
78
+ end;
79
+
80
+ local procedure GenerateETag(ModifiedDateTime: DateTime; RecordSystemId: Guid): Text
81
+ var
82
+ TypeHelper: Codeunit "Type Helper";
83
+ ETagSource: Text;
84
+ begin
85
+ // Combine timestamp and SystemId for unique ETag
86
+ ETagSource := Format(ModifiedDateTime, 0, 9) + Format(RecordSystemId);
87
+ exit(TypeHelper.GetMD5Hash(ETagSource));
88
+ end;
89
+ }
90
+ ```
91
+
92
+ ## Advanced ETag with Custom Versioning
93
+
94
+ ```al
95
+ // Custom versioning table for ETag management
96
+ table 50300 "Record Version Control"
97
+ {
98
+ Caption = 'Record Version Control';
99
+ DataClassification = SystemMetadata;
100
+
101
+ fields
102
+ {
103
+ field(1; "Table ID"; Integer)
104
+ {
105
+ Caption = 'Table ID';
106
+ }
107
+ field(2; "Record SystemId"; Guid)
108
+ {
109
+ Caption = 'Record SystemId';
110
+ }
111
+ field(3; "Version Number"; Integer)
112
+ {
113
+ Caption = 'Version Number';
114
+ InitValue = 1;
115
+ }
116
+ field(4; "Last Modified DateTime"; DateTime)
117
+ {
118
+ Caption = 'Last Modified DateTime';
119
+ }
120
+ field(5; "Modified By User"; Text[100])
121
+ {
122
+ Caption = 'Modified By User';
123
+ }
124
+ field(6; "ETag Value"; Text[100])
125
+ {
126
+ Caption = 'ETag Value';
127
+ }
128
+ }
129
+
130
+ keys
131
+ {
132
+ key(PK; "Table ID", "Record SystemId")
133
+ {
134
+ Clustered = true;
135
+ }
136
+ key(ETag; "ETag Value")
137
+ {
138
+ // Index for fast ETag lookups
139
+ }
140
+ }
141
+ }
142
+
143
+ // ETag management codeunit
144
+ codeunit 50300 "ETag Manager"
145
+ {
146
+ // Generate and store ETag for record
147
+ procedure GenerateETag(TableID: Integer; RecordSystemId: Guid): Text
148
+ var
149
+ VersionControl: Record "Record Version Control";
150
+ ETagValue: Text;
151
+ VersionNumber: Integer;
152
+ begin
153
+ // Get or create version record
154
+ if VersionControl.Get(TableID, RecordSystemId) then begin
155
+ VersionNumber := VersionControl."Version Number" + 1;
156
+ end else begin
157
+ VersionControl.Init();
158
+ VersionControl."Table ID" := TableID;
159
+ VersionControl."Record SystemId" := RecordSystemId;
160
+ VersionNumber := 1;
161
+ end;
162
+
163
+ // Generate ETag from version and timestamp
164
+ ETagValue := StrSubstNo('%1-%2-%3',
165
+ TableID,
166
+ VersionNumber,
167
+ Format(CurrentDateTime, 0, 9));
168
+
169
+ // Update version control record
170
+ VersionControl."Version Number" := VersionNumber;
171
+ VersionControl."Last Modified DateTime" := CurrentDateTime;
172
+ VersionControl."Modified By User" := UserId;
173
+ VersionControl."ETag Value" := ETagValue;
174
+
175
+ if VersionControl."Version Number" = 1 then
176
+ VersionControl.Insert()
177
+ else
178
+ VersionControl.Modify();
179
+
180
+ exit(ETagValue);
181
+ end;
182
+
183
+ // Validate ETag for concurrency control
184
+ procedure ValidateETag(TableID: Integer; RecordSystemId: Guid; ProvidedETag: Text): Boolean
185
+ var
186
+ VersionControl: Record "Record Version Control";
187
+ begin
188
+ if not VersionControl.Get(TableID, RecordSystemId) then
189
+ exit(false); // No version record exists
190
+
191
+ exit(VersionControl."ETag Value" = ProvidedETag);
192
+ end;
193
+
194
+ // Get current ETag for record
195
+ procedure GetCurrentETag(TableID: Integer; RecordSystemId: Guid): Text
196
+ var
197
+ VersionControl: Record "Record Version Control";
198
+ begin
199
+ if VersionControl.Get(TableID, RecordSystemId) then
200
+ exit(VersionControl."ETag Value");
201
+ exit('');
202
+ end;
203
+ }
204
+
205
+ // API page with advanced ETag implementation
206
+ page 50301 "Item Advanced ETag API"
207
+ {
208
+ PageType = API;
209
+ APIPublisher = 'contoso';
210
+ APIGroup = 'inventory';
211
+ APIVersion = 'v1.0';
212
+ EntityName = 'item';
213
+ EntitySetName = 'items';
214
+ SourceTable = Item;
215
+ DelayedInsert = true;
216
+ ODataKeyFields = SystemId;
217
+
218
+ layout
219
+ {
220
+ area(Content)
221
+ {
222
+ repeater(GroupName)
223
+ {
224
+ field(id; Rec.SystemId)
225
+ {
226
+ Caption = 'Id';
227
+ Editable = false;
228
+ }
229
+ field(number; Rec."No.")
230
+ {
231
+ Caption = 'Number';
232
+ }
233
+ field(displayName; Rec.Description)
234
+ {
235
+ Caption = 'Display Name';
236
+ }
237
+ field(unitPrice; Rec."Unit Price")
238
+ {
239
+ Caption = 'Unit Price';
240
+ }
241
+ field(inventory; Rec.Inventory)
242
+ {
243
+ Caption = 'Inventory';
244
+ Editable = false;
245
+ }
246
+ field(etag; ETagValue)
247
+ {
248
+ Caption = 'ETag';
249
+ Editable = false;
250
+ }
251
+ field(version; VersionNumber)
252
+ {
253
+ Caption = 'Version';
254
+ Editable = false;
255
+ }
256
+ }
257
+ }
258
+ }
259
+
260
+ var
261
+ ETagValue: Text;
262
+ VersionNumber: Integer;
263
+ ETagManager: Codeunit "ETag Manager";
264
+ ProvidedETag: Text;
265
+
266
+ trigger OnAfterGetRecord()
267
+ var
268
+ VersionControl: Record "Record Version Control";
269
+ begin
270
+ // Get current ETag and version
271
+ ETagValue := ETagManager.GetCurrentETag(Database::Item, Rec.SystemId);
272
+
273
+ if VersionControl.Get(Database::Item, Rec.SystemId) then
274
+ VersionNumber := VersionControl."Version Number"
275
+ else
276
+ VersionNumber := 0;
277
+
278
+ // Generate ETag if not exists
279
+ if ETagValue = '' then
280
+ ETagValue := ETagManager.GenerateETag(Database::Item, Rec.SystemId);
281
+ end;
282
+
283
+ trigger OnInsertRecord(BelowxRec: Boolean): Boolean
284
+ begin
285
+ // Generate initial ETag for new record
286
+ ETagValue := ETagManager.GenerateETag(Database::Item, Rec.SystemId);
287
+ exit(true);
288
+ end;
289
+
290
+ trigger OnModifyRecord(): Boolean
291
+ begin
292
+ // Validate provided ETag before modification
293
+ if ProvidedETag <> '' then begin
294
+ if not ETagManager.ValidateETag(Database::Item, Rec.SystemId, ProvidedETag) then
295
+ Error('Concurrency conflict detected. The record has been modified by another user. ETag: %1', ProvidedETag);
296
+ end;
297
+
298
+ // Generate new ETag after successful modification
299
+ ETagValue := ETagManager.GenerateETag(Database::Item, Rec.SystemId);
300
+ exit(true);
301
+ end;
302
+
303
+ trigger OnDeleteRecord(): Boolean
304
+ var
305
+ VersionControl: Record "Record Version Control";
306
+ begin
307
+ // Validate ETag before deletion
308
+ if ProvidedETag <> '' then begin
309
+ if not ETagManager.ValidateETag(Database::Item, Rec.SystemId, ProvidedETag) then
310
+ Error('Concurrency conflict detected. Cannot delete record that has been modified.');
311
+ end;
312
+
313
+ // Clean up version control record
314
+ if VersionControl.Get(Database::Item, Rec.SystemId) then
315
+ VersionControl.Delete();
316
+
317
+ exit(true);
318
+ end;
319
+ }
320
+ ```
321
+
322
+ ## HTTP Header ETag Processing
323
+
324
+ ```al
325
+ // Codeunit for processing ETag HTTP headers
326
+ codeunit 50301 "HTTP ETag Processor"
327
+ {
328
+ // Extract ETag from If-Match header
329
+ procedure ExtractETagFromHeader(HttpHeaders: Dictionary of [Text, Text]): Text
330
+ var
331
+ ETagHeader: Text;
332
+ ETagValue: Text;
333
+ begin
334
+ // Check If-Match header for ETag value
335
+ if HttpHeaders.Get('If-Match', ETagHeader) then begin
336
+ // Remove quotes from ETag value
337
+ ETagValue := ETagHeader.Replace('"', '');
338
+ exit(ETagValue);
339
+ end;
340
+
341
+ // Check If-None-Match header
342
+ if HttpHeaders.Get('If-None-Match', ETagHeader) then begin
343
+ ETagValue := ETagHeader.Replace('"', '');
344
+ exit(ETagValue);
345
+ end;
346
+
347
+ exit('');
348
+ end;
349
+
350
+ // Set ETag in response headers
351
+ procedure SetETagResponseHeader(var HttpHeaders: Dictionary of [Text, Text]; ETagValue: Text)
352
+ begin
353
+ if ETagValue <> '' then
354
+ HttpHeaders.Set('ETag', '"' + ETagValue + '"');
355
+ end;
356
+
357
+ // Process conditional request based on ETag
358
+ procedure ProcessConditionalRequest(ProvidedETag: Text; CurrentETag: Text; RequestMethod: Text): Boolean
359
+ begin
360
+ case RequestMethod of
361
+ 'GET':
362
+ // If-None-Match: return 304 if ETags match
363
+ exit(ProvidedETag <> CurrentETag);
364
+ 'PUT', 'PATCH', 'DELETE':
365
+ // If-Match: proceed only if ETags match
366
+ exit(ProvidedETag = CurrentETag);
367
+ else
368
+ exit(true);
369
+ end;
370
+ end;
371
+ }
372
+
373
+ // API page with HTTP ETag header processing
374
+ page 50302 "Sales Order ETag API"
375
+ {
376
+ PageType = API;
377
+ APIPublisher = 'contoso';
378
+ APIGroup = 'sales';
379
+ APIVersion = 'v1.0';
380
+ EntityName = 'salesOrder';
381
+ EntitySetName = 'salesOrders';
382
+ SourceTable = "Sales Header";
383
+ DelayedInsert = true;
384
+ ODataKeyFields = SystemId;
385
+ SourceTableView = WHERE("Document Type" = CONST(Order));
386
+
387
+ layout
388
+ {
389
+ area(Content)
390
+ {
391
+ repeater(GroupName)
392
+ {
393
+ field(id; Rec.SystemId)
394
+ {
395
+ Caption = 'Id';
396
+ Editable = false;
397
+ }
398
+ field(number; Rec."No.")
399
+ {
400
+ Caption = 'Number';
401
+ }
402
+ field(customerNumber; Rec."Sell-to Customer No.")
403
+ {
404
+ Caption = 'Customer Number';
405
+ }
406
+ field(orderDate; Rec."Order Date")
407
+ {
408
+ Caption = 'Order Date';
409
+ }
410
+ field(totalAmount; TotalAmount)
411
+ {
412
+ Caption = 'Total Amount';
413
+ Editable = false;
414
+ }
415
+ field(etag; ETagValue)
416
+ {
417
+ Caption = 'ETag';
418
+ Editable = false;
419
+ }
420
+ }
421
+ }
422
+ }
423
+
424
+ var
425
+ ETagValue: Text;
426
+ TotalAmount: Decimal;
427
+ ETagManager: Codeunit "ETag Manager";
428
+ HttpETagProcessor: Codeunit "HTTP ETag Processor";
429
+ RequestETag: Text;
430
+
431
+ trigger OnAfterGetRecord()
432
+ begin
433
+ // Calculate totals
434
+ Rec.CalcFields("Amount Including VAT");
435
+ TotalAmount := Rec."Amount Including VAT";
436
+
437
+ // Generate ETag based on header and line modifications
438
+ ETagValue := GenerateOrderETag();
439
+ end;
440
+
441
+ trigger OnModifyRecord(): Boolean
442
+ var
443
+ CurrentETag: Text;
444
+ begin
445
+ // Get current ETag for comparison
446
+ CurrentETag := GenerateOrderETag();
447
+
448
+ // Validate provided ETag matches current state
449
+ if (RequestETag <> '') and (RequestETag <> CurrentETag) then
450
+ Error('Concurrency conflict: Order has been modified by another user. Current ETag: %1, Provided ETag: %2', CurrentETag, RequestETag);
451
+
452
+ exit(true);
453
+ end;
454
+
455
+ local procedure GenerateOrderETag(): Text
456
+ var
457
+ SalesLine: Record "Sales Line";
458
+ ETagSource: Text;
459
+ TypeHelper: Codeunit "Type Helper";
460
+ LineModificationTime: DateTime;
461
+ begin
462
+ // Build ETag from header and all related lines
463
+ ETagSource := Format(Rec.SystemModifiedAt, 0, 9);
464
+
465
+ // Include line modifications in ETag
466
+ SalesLine.SetRange("Document Type", Rec."Document Type");
467
+ SalesLine.SetRange("Document No.", Rec."No.");
468
+ if SalesLine.FindLast() then
469
+ LineModificationTime := SalesLine.SystemModifiedAt
470
+ else
471
+ LineModificationTime := Rec.SystemModifiedAt;
472
+
473
+ ETagSource += Format(LineModificationTime, 0, 9);
474
+ ETagSource += Format(Rec.SystemId);
475
+
476
+ // Generate hash-based ETag
477
+ exit(TypeHelper.GetMD5Hash(ETagSource));
478
+ end;
479
+ }
480
+ ```
481
+
482
+ ## Implementation Notes
483
+
484
+ **ETag Implementation Best Practices:**
485
+
486
+ 1. **ETag Generation Strategies:**
487
+ - Use SystemModifiedAt for simple timestamp-based ETags
488
+ - Combine multiple factors (timestamp + SystemId + version) for robust ETags
489
+ - Include related record modifications for composite entities
490
+ - Use consistent hashing algorithms (MD5, SHA-256) for ETag values
491
+
492
+ 2. **Concurrency Control:**
493
+ - Validate ETags on all modification operations (PUT, PATCH, DELETE)
494
+ - Return appropriate HTTP status codes (409 Conflict, 412 Precondition Failed)
495
+ - Implement version tracking for detailed conflict resolution
496
+ - Provide clear error messages for concurrency conflicts
497
+
498
+ 3. **Performance Optimization:**
499
+ - Index ETag fields for fast lookups
500
+ - Cache ETag values to avoid recalculation
501
+ - Use efficient ETag generation algorithms
502
+ - Minimize database queries during ETag validation
503
+
504
+ 4. **HTTP Integration:**
505
+ - Process If-Match and If-None-Match headers correctly
506
+ - Set ETag response headers for all API responses
507
+ - Support conditional requests (304 Not Modified responses)
508
+ - Handle weak vs strong ETag semantics appropriately