@jwikman/bc-code-intelligence-mcp 1.5.7-dev.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (753) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +165 -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 +440 -0
  10. package/dist/cli/bc-code-intel-cli.js.map +1 -0
  11. package/dist/config/config-loader.d.ts +28 -0
  12. package/dist/config/config-loader.d.ts.map +1 -0
  13. package/dist/config/config-loader.js +497 -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 +608 -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 +82 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +1211 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/layers/base-layer.d.ts +133 -0
  40. package/dist/layers/base-layer.d.ts.map +1 -0
  41. package/dist/layers/base-layer.js +290 -0
  42. package/dist/layers/base-layer.js.map +1 -0
  43. package/dist/layers/embedded-layer.d.ts +130 -0
  44. package/dist/layers/embedded-layer.d.ts.map +1 -0
  45. package/dist/layers/embedded-layer.js +612 -0
  46. package/dist/layers/embedded-layer.js.map +1 -0
  47. package/dist/layers/git-layer.d.ts +77 -0
  48. package/dist/layers/git-layer.d.ts.map +1 -0
  49. package/dist/layers/git-layer.js +529 -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 +135 -0
  56. package/dist/layers/layer-service.d.ts.map +1 -0
  57. package/dist/layers/layer-service.js +586 -0
  58. package/dist/layers/layer-service.js.map +1 -0
  59. package/dist/layers/project-layer.d.ts +58 -0
  60. package/dist/layers/project-layer.d.ts.map +1 -0
  61. package/dist/layers/project-layer.js +286 -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 +358 -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 +818 -0
  86. package/dist/services/code-analysis-service.js.map +1 -0
  87. package/dist/services/enhanced-prompt-service.d.ts +56 -0
  88. package/dist/services/enhanced-prompt-service.d.ts.map +1 -0
  89. package/dist/services/enhanced-prompt-service.js +165 -0
  90. package/dist/services/enhanced-prompt-service.js.map +1 -0
  91. package/dist/services/knowledge-service.d.ts +90 -0
  92. package/dist/services/knowledge-service.d.ts.map +1 -0
  93. package/dist/services/knowledge-service.js +342 -0
  94. package/dist/services/knowledge-service.js.map +1 -0
  95. package/dist/services/methodology-service.d.ts +91 -0
  96. package/dist/services/methodology-service.d.ts.map +1 -0
  97. package/dist/services/methodology-service.js +423 -0
  98. package/dist/services/methodology-service.js.map +1 -0
  99. package/dist/services/multi-content-layer-service.d.ts +198 -0
  100. package/dist/services/multi-content-layer-service.d.ts.map +1 -0
  101. package/dist/services/multi-content-layer-service.js +991 -0
  102. package/dist/services/multi-content-layer-service.js.map +1 -0
  103. package/dist/services/roleplay-engine.d.ts +161 -0
  104. package/dist/services/roleplay-engine.d.ts.map +1 -0
  105. package/dist/services/roleplay-engine.js +994 -0
  106. package/dist/services/roleplay-engine.js.map +1 -0
  107. package/dist/services/session-storage/file-storage.d.ts +30 -0
  108. package/dist/services/session-storage/file-storage.d.ts.map +1 -0
  109. package/dist/services/session-storage/file-storage.js +229 -0
  110. package/dist/services/session-storage/file-storage.js.map +1 -0
  111. package/dist/services/session-storage/in-memory-storage.d.ts +31 -0
  112. package/dist/services/session-storage/in-memory-storage.d.ts.map +1 -0
  113. package/dist/services/session-storage/in-memory-storage.js +142 -0
  114. package/dist/services/session-storage/in-memory-storage.js.map +1 -0
  115. package/dist/services/specialist-discovery.d.ts +98 -0
  116. package/dist/services/specialist-discovery.d.ts.map +1 -0
  117. package/dist/services/specialist-discovery.js +387 -0
  118. package/dist/services/specialist-discovery.js.map +1 -0
  119. package/dist/services/specialist-loader.d.ts +101 -0
  120. package/dist/services/specialist-loader.d.ts.map +1 -0
  121. package/dist/services/specialist-loader.js +256 -0
  122. package/dist/services/specialist-loader.js.map +1 -0
  123. package/dist/services/specialist-session-manager.d.ts +76 -0
  124. package/dist/services/specialist-session-manager.d.ts.map +1 -0
  125. package/dist/services/specialist-session-manager.js +255 -0
  126. package/dist/services/specialist-session-manager.js.map +1 -0
  127. package/dist/services/workflow-service.d.ts +146 -0
  128. package/dist/services/workflow-service.d.ts.map +1 -0
  129. package/dist/services/workflow-service.js +409 -0
  130. package/dist/services/workflow-service.js.map +1 -0
  131. package/dist/setup/post-install.d.ts +12 -0
  132. package/dist/setup/post-install.d.ts.map +1 -0
  133. package/dist/setup/post-install.js +81 -0
  134. package/dist/setup/post-install.js.map +1 -0
  135. package/dist/streamlined-handlers.d.ts +94 -0
  136. package/dist/streamlined-handlers.d.ts.map +1 -0
  137. package/dist/streamlined-handlers.js +665 -0
  138. package/dist/streamlined-handlers.js.map +1 -0
  139. package/dist/test-enhanced-mcp-server.d.ts +7 -0
  140. package/dist/test-enhanced-mcp-server.d.ts.map +1 -0
  141. package/dist/test-enhanced-mcp-server.js +177 -0
  142. package/dist/test-enhanced-mcp-server.js.map +1 -0
  143. package/dist/tools/config-diagnostic-tools.d.ts +234 -0
  144. package/dist/tools/config-diagnostic-tools.d.ts.map +1 -0
  145. package/dist/tools/config-diagnostic-tools.js +887 -0
  146. package/dist/tools/config-diagnostic-tools.js.map +1 -0
  147. package/dist/tools/core-tools.d.ts +26 -0
  148. package/dist/tools/core-tools.d.ts.map +1 -0
  149. package/dist/tools/core-tools.js +241 -0
  150. package/dist/tools/core-tools.js.map +1 -0
  151. package/dist/tools/handoff-tools.d.ts +37 -0
  152. package/dist/tools/handoff-tools.d.ts.map +1 -0
  153. package/dist/tools/handoff-tools.js +265 -0
  154. package/dist/tools/handoff-tools.js.map +1 -0
  155. package/dist/tools/index.d.ts +61 -0
  156. package/dist/tools/index.d.ts.map +1 -0
  157. package/dist/tools/index.js +75 -0
  158. package/dist/tools/index.js.map +1 -0
  159. package/dist/tools/onboarding-tools.d.ts +43 -0
  160. package/dist/tools/onboarding-tools.d.ts.map +1 -0
  161. package/dist/tools/onboarding-tools.js +353 -0
  162. package/dist/tools/onboarding-tools.js.map +1 -0
  163. package/dist/tools/specialist-discovery-tools.d.ts +27 -0
  164. package/dist/tools/specialist-discovery-tools.d.ts.map +1 -0
  165. package/dist/tools/specialist-discovery-tools.js +275 -0
  166. package/dist/tools/specialist-discovery-tools.js.map +1 -0
  167. package/dist/tools/specialist-tools.d.ts +43 -0
  168. package/dist/tools/specialist-tools.d.ts.map +1 -0
  169. package/dist/tools/specialist-tools.js +372 -0
  170. package/dist/tools/specialist-tools.js.map +1 -0
  171. package/dist/tools/workspace-tools.d.ts +96 -0
  172. package/dist/tools/workspace-tools.d.ts.map +1 -0
  173. package/dist/tools/workspace-tools.js +188 -0
  174. package/dist/tools/workspace-tools.js.map +1 -0
  175. package/dist/types/bc-knowledge.d.ts +303 -0
  176. package/dist/types/bc-knowledge.d.ts.map +1 -0
  177. package/dist/types/bc-knowledge.js +69 -0
  178. package/dist/types/bc-knowledge.js.map +1 -0
  179. package/dist/types/config-types.d.ts +186 -0
  180. package/dist/types/config-types.d.ts.map +1 -0
  181. package/dist/types/config-types.js +109 -0
  182. package/dist/types/config-types.js.map +1 -0
  183. package/dist/types/enhanced-layer-types.d.ts +193 -0
  184. package/dist/types/enhanced-layer-types.d.ts.map +1 -0
  185. package/dist/types/enhanced-layer-types.js +9 -0
  186. package/dist/types/enhanced-layer-types.js.map +1 -0
  187. package/dist/types/index.d.ts +5 -0
  188. package/dist/types/index.d.ts.map +1 -0
  189. package/dist/types/index.js +7 -0
  190. package/dist/types/index.js.map +1 -0
  191. package/dist/types/layer-types.d.ts +173 -0
  192. package/dist/types/layer-types.d.ts.map +1 -0
  193. package/dist/types/layer-types.js +27 -0
  194. package/dist/types/layer-types.js.map +1 -0
  195. package/dist/types/roleplay-types.d.ts +156 -0
  196. package/dist/types/roleplay-types.d.ts.map +1 -0
  197. package/dist/types/roleplay-types.js +8 -0
  198. package/dist/types/roleplay-types.js.map +1 -0
  199. package/dist/types/session-types.d.ts +127 -0
  200. package/dist/types/session-types.d.ts.map +1 -0
  201. package/dist/types/session-types.js +8 -0
  202. package/dist/types/session-types.js.map +1 -0
  203. package/dist/utils/path-utils.d.ts +5 -0
  204. package/dist/utils/path-utils.d.ts.map +1 -0
  205. package/dist/utils/path-utils.js +14 -0
  206. package/dist/utils/path-utils.js.map +1 -0
  207. package/dist/workflows/domain-workflows.d.ts +8 -0
  208. package/dist/workflows/domain-workflows.d.ts.map +1 -0
  209. package/dist/workflows/domain-workflows.js +360 -0
  210. package/dist/workflows/domain-workflows.js.map +1 -0
  211. package/embedded-knowledge/.github/ISSUE_TEMPLATE/bug-report.md +24 -0
  212. package/embedded-knowledge/.github/ISSUE_TEMPLATE/content-improvement.md +24 -0
  213. package/embedded-knowledge/.github/ISSUE_TEMPLATE/knowledge-request.md +30 -0
  214. package/embedded-knowledge/AGENTS.md +178 -0
  215. package/embedded-knowledge/CONTRIBUTING.md +58 -0
  216. package/embedded-knowledge/LICENSE +21 -0
  217. package/embedded-knowledge/README.md +32 -0
  218. package/embedded-knowledge/domains/alex-architect/api-delegate-operation-pattern.md +90 -0
  219. package/embedded-knowledge/domains/alex-architect/api-fieldset-registration-pattern.md +113 -0
  220. package/embedded-knowledge/domains/alex-architect/api-interface-design-patterns.md +101 -0
  221. package/embedded-knowledge/domains/alex-architect/api-page-development-patterns.md +87 -0
  222. package/embedded-knowledge/domains/alex-architect/complex-facade-patterns.md +155 -0
  223. package/embedded-knowledge/domains/alex-architect/delegating-to-github-copilot-agents.md +371 -0
  224. package/embedded-knowledge/domains/alex-architect/facade-pattern-al-implementation.md +138 -0
  225. package/embedded-knowledge/domains/alex-architect/facade-pattern-external-api.md +79 -0
  226. package/embedded-knowledge/domains/alex-architect/object-id-ninja-integration.md +281 -0
  227. package/embedded-knowledge/domains/alex-architect/recommend-object-id-ninja.md +248 -0
  228. package/embedded-knowledge/domains/alex-architect/samples/api-delegate-operation.md +280 -0
  229. package/embedded-knowledge/domains/alex-architect/samples/api-fieldset-registration.md +200 -0
  230. package/embedded-knowledge/domains/alex-architect/samples/api-interface-design.md +565 -0
  231. package/embedded-knowledge/domains/alex-architect/samples/api-page-implementation.md +665 -0
  232. package/embedded-knowledge/domains/alex-architect/samples/complex-facade-patterns.md +325 -0
  233. package/embedded-knowledge/domains/alex-architect/samples/facade-pattern-al.md +696 -0
  234. package/embedded-knowledge/domains/alex-architect/samples/facade-pattern.md +320 -0
  235. package/embedded-knowledge/domains/alex-architect/samples/subscriber-organization.md +102 -0
  236. package/embedded-knowledge/domains/alex-architect/samples/systemid-integration.md +433 -0
  237. package/embedded-knowledge/domains/alex-architect/samples/testability-design-patterns.md +223 -0
  238. package/embedded-knowledge/domains/alex-architect/subscriber-codeunit-size-optimization.md +66 -0
  239. package/embedded-knowledge/domains/alex-architect/systemid-integration.md +115 -0
  240. package/embedded-knowledge/domains/alex-architect/testability-design-patterns.md +77 -0
  241. package/embedded-knowledge/domains/casey-copilot/long-running-session-instructions.md +263 -0
  242. package/embedded-knowledge/domains/casey-copilot/samples/long-running-session-instructions.md +323 -0
  243. package/embedded-knowledge/domains/chris-config/configuration-file-discovery.md +846 -0
  244. package/embedded-knowledge/domains/chris-config/configuration-file-formats.md +595 -0
  245. package/embedded-knowledge/domains/chris-config/content-types-structure.md +421 -0
  246. package/embedded-knowledge/domains/chris-config/knowledge-content-creation.md +437 -0
  247. package/embedded-knowledge/domains/chris-config/layer-system-fundamentals.md +257 -0
  248. package/embedded-knowledge/domains/chris-config/multi-team-layer-configuration.md +302 -0
  249. package/embedded-knowledge/domains/chris-config/workspace-detection-solutions.md +336 -0
  250. package/embedded-knowledge/domains/dean-debug/bc-telemetry-buddy-integration.md +453 -0
  251. package/embedded-knowledge/domains/dean-debug/bc24-no-series-conversion-guide.md +360 -0
  252. package/embedded-knowledge/domains/dean-debug/case-statement-performance-best-practices.md +86 -0
  253. package/embedded-knowledge/domains/dean-debug/compound-statements-debugging.md +96 -0
  254. package/embedded-knowledge/domains/dean-debug/custom-dimensions-best-practices.md +70 -0
  255. package/embedded-knowledge/domains/dean-debug/custom-telemetry-implementation.md +84 -0
  256. package/embedded-knowledge/domains/dean-debug/deleteall-performance-tradeoff.md +93 -0
  257. package/embedded-knowledge/domains/dean-debug/deleteall-sql-performance.md +73 -0
  258. package/embedded-knowledge/domains/dean-debug/extension-telemetry-isolation.md +78 -0
  259. package/embedded-knowledge/domains/dean-debug/maintainsiftindex-property-behavior.md +79 -0
  260. package/embedded-knowledge/domains/dean-debug/no-series-implementation-patterns.md +87 -0
  261. package/embedded-knowledge/domains/dean-debug/no-series-module-patterns-bc24.md +209 -0
  262. package/embedded-knowledge/domains/dean-debug/no-series-validation-module-bc24.md +246 -0
  263. package/embedded-knowledge/domains/dean-debug/no-series-validation-patterns.md +107 -0
  264. package/embedded-knowledge/domains/dean-debug/odata-query-optimization.md +105 -0
  265. package/embedded-knowledge/domains/dean-debug/recommend-bc-telemetry-buddy.md +160 -0
  266. package/embedded-knowledge/domains/dean-debug/samples/bc24-no-series-conversion.md +186 -0
  267. package/embedded-knowledge/domains/dean-debug/samples/case-performance-optimization.md +60 -0
  268. package/embedded-knowledge/domains/dean-debug/samples/compound-statements-debugging.md +139 -0
  269. package/embedded-knowledge/domains/dean-debug/samples/custom-dimensions.md +190 -0
  270. package/embedded-knowledge/domains/dean-debug/samples/custom-telemetry.md +516 -0
  271. package/embedded-knowledge/domains/dean-debug/samples/deleteall-performance.md +298 -0
  272. package/embedded-knowledge/domains/dean-debug/samples/error-correlation.md +324 -0
  273. package/embedded-knowledge/domains/dean-debug/samples/extension-isolation.md +344 -0
  274. package/embedded-knowledge/domains/dean-debug/samples/logmessage-methods.md +137 -0
  275. package/embedded-knowledge/domains/dean-debug/samples/maintainsiftindex-examples.md +340 -0
  276. package/embedded-knowledge/domains/dean-debug/samples/no-series-implementation.md +810 -0
  277. package/embedded-knowledge/domains/dean-debug/samples/no-series-module-bc24.md +86 -0
  278. package/embedded-knowledge/domains/dean-debug/samples/no-series-validation-module-bc24.md +110 -0
  279. package/embedded-knowledge/domains/dean-debug/samples/no-series-validation.md +758 -0
  280. package/embedded-knowledge/domains/dean-debug/samples/odata-query-optimization.md +665 -0
  281. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-before-case.md +316 -0
  282. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-before-filters.md +223 -0
  283. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-filter-exclusion.md +149 -0
  284. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-optimization.md +412 -0
  285. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-performance.md +211 -0
  286. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-primary-key.md +155 -0
  287. package/embedded-knowledge/domains/dean-debug/samples/sift-technology-fundamentals.md +475 -0
  288. package/embedded-knowledge/domains/dean-debug/samples/singleinstance-subscribers.md +238 -0
  289. package/embedded-knowledge/domains/dean-debug/samples/table-event-batching.md +97 -0
  290. package/embedded-knowledge/domains/dean-debug/samples/table-key-requirements.md +666 -0
  291. package/embedded-knowledge/domains/dean-debug/samples/telemetry-performance.md +319 -0
  292. package/embedded-knowledge/domains/dean-debug/samples/verbosity-strategy.md +236 -0
  293. package/embedded-knowledge/domains/dean-debug/session-logmessage-methods.md +59 -0
  294. package/embedded-knowledge/domains/dean-debug/setloadfields-filter-field-exclusion.md +67 -0
  295. package/embedded-knowledge/domains/dean-debug/setloadfields-performance-impact.md +70 -0
  296. package/embedded-knowledge/domains/dean-debug/setloadfields-performance-optimization.md +90 -0
  297. package/embedded-knowledge/domains/dean-debug/setloadfields-placement-before-case-statements.md +87 -0
  298. package/embedded-knowledge/domains/dean-debug/setloadfields-placement-before-filters.md +70 -0
  299. package/embedded-knowledge/domains/dean-debug/setloadfields-primary-key-optimization.md +74 -0
  300. package/embedded-knowledge/domains/dean-debug/sift-technology-fundamentals.md +81 -0
  301. package/embedded-knowledge/domains/dean-debug/subscriber-singleinstance-performance.md +56 -0
  302. package/embedded-knowledge/domains/dean-debug/table-event-batch-operation-impact.md +66 -0
  303. package/embedded-knowledge/domains/dean-debug/table-key-requirements.md +79 -0
  304. package/embedded-knowledge/domains/dean-debug/telemetry-error-correlation.md +78 -0
  305. package/embedded-knowledge/domains/dean-debug/telemetry-performance-considerations.md +83 -0
  306. package/embedded-knowledge/domains/dean-debug/telemetry-verbosity-strategy.md +76 -0
  307. package/embedded-knowledge/domains/dean-debug/testfield-performance.md +104 -0
  308. package/embedded-knowledge/domains/eva-errors/codeunit-run-pattern.md +159 -0
  309. package/embedded-knowledge/domains/eva-errors/fielderror-default-messages.md +145 -0
  310. package/embedded-knowledge/domains/eva-errors/fielderror-message-construction.md +104 -0
  311. package/embedded-knowledge/domains/eva-errors/fielderror-method-syntax.md +114 -0
  312. package/embedded-knowledge/domains/eva-errors/samples/codeunit-run-pattern.md +239 -0
  313. package/embedded-knowledge/domains/eva-errors/samples/fielderror-default-messages.md +356 -0
  314. package/embedded-knowledge/domains/eva-errors/samples/fielderror-syntax.md +256 -0
  315. package/embedded-knowledge/domains/eva-errors/samples/table-safety-validation-patterns.md +101 -0
  316. package/embedded-knowledge/domains/eva-errors/samples/testfield-error-handling.md +108 -0
  317. package/embedded-knowledge/domains/eva-errors/samples/try-function-usage.md +195 -0
  318. package/embedded-knowledge/domains/eva-errors/testfield-error-handling.md +80 -0
  319. package/embedded-knowledge/domains/eva-errors/try-function-usage.md +129 -0
  320. package/embedded-knowledge/domains/jordan-bridge/al-event-subscriber-architecture.md +98 -0
  321. package/embedded-knowledge/domains/jordan-bridge/automatic-registration.md +123 -0
  322. package/embedded-knowledge/domains/jordan-bridge/business-process-template-patterns.md +96 -0
  323. package/embedded-knowledge/domains/jordan-bridge/error-response-patterns.md +115 -0
  324. package/embedded-knowledge/domains/jordan-bridge/etag-implementation.md +115 -0
  325. package/embedded-knowledge/domains/jordan-bridge/field-control-selection.md +114 -0
  326. package/embedded-knowledge/domains/jordan-bridge/samples/al-event-subscriber-architecture.md +395 -0
  327. package/embedded-knowledge/domains/jordan-bridge/samples/api-error-responses.md +479 -0
  328. package/embedded-knowledge/domains/jordan-bridge/samples/api-field-control.md +548 -0
  329. package/embedded-knowledge/domains/jordan-bridge/samples/api-url-naming.md +287 -0
  330. package/embedded-knowledge/domains/jordan-bridge/samples/business-process-templates.md +434 -0
  331. package/embedded-knowledge/domains/jordan-bridge/samples/etag-implementation.md +508 -0
  332. package/embedded-knowledge/domains/jordan-bridge/samples/task-scheduler-pattern.md +615 -0
  333. package/embedded-knowledge/domains/jordan-bridge/task-scheduler-pattern-implementation.md +144 -0
  334. package/embedded-knowledge/domains/jordan-bridge/url-structure-naming-patterns.md +96 -0
  335. package/embedded-knowledge/domains/maya-mentor/case-multiple-conditions-ranges.md +124 -0
  336. package/embedded-knowledge/domains/maya-mentor/case-statement-syntax-structure.md +84 -0
  337. package/embedded-knowledge/domains/maya-mentor/fielderror-syntax-usage.md +75 -0
  338. package/embedded-knowledge/domains/maya-mentor/fielderror-vs-testfield.md +96 -0
  339. package/embedded-knowledge/domains/maya-mentor/samples/case-statement-multiple-conditions.md +385 -0
  340. package/embedded-knowledge/domains/maya-mentor/samples/case-statement-syntax-structure.md +72 -0
  341. package/embedded-knowledge/domains/maya-mentor/samples/fielderror-syntax-usage.md +48 -0
  342. package/embedded-knowledge/domains/maya-mentor/samples/testfield-basic-syntax.md +49 -0
  343. package/embedded-knowledge/domains/maya-mentor/testfield-basic-syntax.md +67 -0
  344. package/embedded-knowledge/domains/morgan-market/partner-readiness-analysis.md +201 -0
  345. package/embedded-knowledge/domains/morgan-market/samples/partner-readiness-checklist.md +288 -0
  346. package/embedded-knowledge/domains/parker-pragmatic/README.md +39 -0
  347. package/embedded-knowledge/domains/parker-pragmatic/proposal-workflows/creating-effective-proposals.md +583 -0
  348. package/embedded-knowledge/domains/parker-pragmatic/trust-building/working-with-ai-skeptics.md +587 -0
  349. package/embedded-knowledge/domains/quinn-tester/fielderror-validation-patterns.md +119 -0
  350. package/embedded-knowledge/domains/quinn-tester/isolation-testing-patterns.md +82 -0
  351. package/embedded-knowledge/domains/quinn-tester/rule-execution.md +123 -0
  352. package/embedded-knowledge/domains/quinn-tester/samples/case-error-handling.md +64 -0
  353. package/embedded-knowledge/domains/quinn-tester/samples/fielderror-message-construction.md +60 -0
  354. package/embedded-knowledge/domains/quinn-tester/samples/fielderror-validation-patterns.md +83 -0
  355. package/embedded-knowledge/domains/quinn-tester/samples/isolation-testing-patterns.md +424 -0
  356. package/embedded-knowledge/domains/quinn-tester/samples/rule-execution.md +716 -0
  357. package/embedded-knowledge/domains/quinn-tester/samples/table-safety-validation-patterns.md +101 -0
  358. package/embedded-knowledge/domains/quinn-tester/samples/temporary-table-operation-validation.md +91 -0
  359. package/embedded-knowledge/domains/quinn-tester/table-safety-validation-patterns.md +79 -0
  360. package/embedded-knowledge/domains/quinn-tester/temporary-table-operation-validation.md +79 -0
  361. package/embedded-knowledge/domains/roger-reviewer/al-begin-end-block-structure.md +89 -0
  362. package/embedded-knowledge/domains/roger-reviewer/al-binary-operator-spacing.md +76 -0
  363. package/embedded-knowledge/domains/roger-reviewer/al-blank-line-organization.md +76 -0
  364. package/embedded-knowledge/domains/roger-reviewer/al-case-action-formatting.md +76 -0
  365. package/embedded-knowledge/domains/roger-reviewer/al-code-spacing-conventions.md +81 -0
  366. package/embedded-knowledge/domains/roger-reviewer/al-comment-spacing-standards.md +76 -0
  367. package/embedded-knowledge/domains/roger-reviewer/al-end-else-pairing.md +75 -0
  368. package/embedded-knowledge/domains/roger-reviewer/al-keyword-indentation-rules.md +76 -0
  369. package/embedded-knowledge/domains/roger-reviewer/al-line-start-keyword-positioning.md +76 -0
  370. package/embedded-knowledge/domains/roger-reviewer/al-separate-if-else-formatting.md +76 -0
  371. package/embedded-knowledge/domains/roger-reviewer/al-standard-abbreviations.md +96 -0
  372. package/embedded-knowledge/domains/roger-reviewer/al-statement-per-line-rule.md +76 -0
  373. package/embedded-knowledge/domains/roger-reviewer/al-unnecessary-else-elimination.md +86 -0
  374. package/embedded-knowledge/domains/roger-reviewer/al-variable-declaration-order.md +90 -0
  375. package/embedded-knowledge/domains/roger-reviewer/al-variable-naming-conventions.md +82 -0
  376. package/embedded-knowledge/domains/roger-reviewer/begin-block-statement-clarity.md +78 -0
  377. package/embedded-knowledge/domains/roger-reviewer/begin-end-positioning-patterns.md +76 -0
  378. package/embedded-knowledge/domains/roger-reviewer/binary-operator-line-positioning.md +78 -0
  379. package/embedded-knowledge/domains/roger-reviewer/boolean-expression-simplification-al.md +100 -0
  380. package/embedded-knowledge/domains/roger-reviewer/case-statement-error-handling-troubleshooting.md +115 -0
  381. package/embedded-knowledge/domains/roger-reviewer/compound-statement-readability.md +124 -0
  382. package/embedded-knowledge/domains/roger-reviewer/lonely-repeat-statement-pattern.md +110 -0
  383. package/embedded-knowledge/domains/roger-reviewer/samples/al-begin-end-blocks.md +438 -0
  384. package/embedded-knowledge/domains/roger-reviewer/samples/al-binary-operator-spacing.md +255 -0
  385. package/embedded-knowledge/domains/roger-reviewer/samples/al-comment-spacing-standards.md +209 -0
  386. package/embedded-knowledge/domains/roger-reviewer/samples/al-keyword-indentation-rules.md +218 -0
  387. package/embedded-knowledge/domains/roger-reviewer/samples/al-line-start-keyword-positioning.md +218 -0
  388. package/embedded-knowledge/domains/roger-reviewer/samples/al-separate-if-else-formatting.md +280 -0
  389. package/embedded-knowledge/domains/roger-reviewer/samples/al-statement-per-line-rule.md +188 -0
  390. package/embedded-knowledge/domains/roger-reviewer/samples/al-unnecessary-else-elimination.md +245 -0
  391. package/embedded-knowledge/domains/roger-reviewer/samples/al-variable-declaration-order.md +244 -0
  392. package/embedded-knowledge/domains/roger-reviewer/samples/begin-end-positioning.md +278 -0
  393. package/embedded-knowledge/domains/roger-reviewer/samples/boolean-simplification-examples.md +484 -0
  394. package/embedded-knowledge/domains/roger-reviewer/samples/case-error-handling.md +64 -0
  395. package/embedded-knowledge/domains/roger-reviewer/samples/compound-statement-readability.md +107 -0
  396. package/embedded-knowledge/domains/roger-reviewer/samples/lonely-repeat-examples.md +280 -0
  397. package/embedded-knowledge/domains/roger-reviewer/samples/testability-code-smells.md +256 -0
  398. package/embedded-knowledge/domains/roger-reviewer/testability-code-smells.md +67 -0
  399. package/embedded-knowledge/domains/sam-coder/al-formatting-consistency-patterns.md +75 -0
  400. package/embedded-knowledge/domains/sam-coder/al-line-comment-formatting.md +67 -0
  401. package/embedded-knowledge/domains/sam-coder/al-lonely-repeat-pattern.md +76 -0
  402. package/embedded-knowledge/domains/sam-coder/al-named-parameter-pattern.md +98 -0
  403. package/embedded-knowledge/domains/sam-coder/al-object-navigation-shortcuts.md +128 -0
  404. package/embedded-knowledge/domains/sam-coder/al-readability-optimization.md +75 -0
  405. package/embedded-knowledge/domains/sam-coder/al-record-find-early-exit.md +95 -0
  406. package/embedded-knowledge/domains/sam-coder/command-queue-pattern-al.md +141 -0
  407. package/embedded-knowledge/domains/sam-coder/deleteall-alternative-implementation.md +91 -0
  408. package/embedded-knowledge/domains/sam-coder/deleteall-method-usage.md +118 -0
  409. package/embedded-knowledge/domains/sam-coder/deleteall-trigger-execution.md +111 -0
  410. package/embedded-knowledge/domains/sam-coder/event-bridge-pattern-al.md +113 -0
  411. package/embedded-knowledge/domains/sam-coder/event-payload-design-patterns.md +127 -0
  412. package/embedded-knowledge/domains/sam-coder/generic-method-patterns-al.md +141 -0
  413. package/embedded-knowledge/domains/sam-coder/manual-binding-conditional-subscribers.md +66 -0
  414. package/embedded-knowledge/domains/sam-coder/nested-compound-best-practices.md +96 -0
  415. package/embedded-knowledge/domains/sam-coder/samples/al-blank-line-organization.md +161 -0
  416. package/embedded-knowledge/domains/sam-coder/samples/al-case-action-formatting.md +177 -0
  417. package/embedded-knowledge/domains/sam-coder/samples/al-lonely-repeat-pattern.md +239 -0
  418. package/embedded-knowledge/domains/sam-coder/samples/al-named-parameter-pattern.md +346 -0
  419. package/embedded-knowledge/domains/sam-coder/samples/al-record-find-early-exit.md +298 -0
  420. package/embedded-knowledge/domains/sam-coder/samples/command-queue-pattern.md +677 -0
  421. package/embedded-knowledge/domains/sam-coder/samples/deleteall-alternative-implementation.md +117 -0
  422. package/embedded-knowledge/domains/sam-coder/samples/deleteall-triggers.md +75 -0
  423. package/embedded-knowledge/domains/sam-coder/samples/deleteall-usage.md +169 -0
  424. package/embedded-knowledge/domains/sam-coder/samples/event-bridge-pattern.md +399 -0
  425. package/embedded-knowledge/domains/sam-coder/samples/event-payload-design.md +356 -0
  426. package/embedded-knowledge/domains/sam-coder/samples/generic-method-patterns.md +889 -0
  427. package/embedded-knowledge/domains/sam-coder/samples/manual-binding.md +84 -0
  428. package/embedded-knowledge/domains/sam-coder/samples/nested-compound-best-practices.md +127 -0
  429. package/embedded-knowledge/domains/sam-coder/samples/single-to-compound-conversion.md +89 -0
  430. package/embedded-knowledge/domains/sam-coder/samples/template-method-pattern.md +516 -0
  431. package/embedded-knowledge/domains/sam-coder/samples/testfield-patterns.md +61 -0
  432. package/embedded-knowledge/domains/sam-coder/samples/type-safe-operations.md +427 -0
  433. package/embedded-knowledge/domains/sam-coder/single-to-compound-conversion.md +122 -0
  434. package/embedded-knowledge/domains/sam-coder/template-method-pattern-al.md +96 -0
  435. package/embedded-knowledge/domains/sam-coder/testfield-patterns.md +101 -0
  436. package/embedded-knowledge/domains/sam-coder/type-safe-operations-al.md +149 -0
  437. package/embedded-knowledge/domains/sam-coder/vs-code-al-keyboard-shortcuts.md +107 -0
  438. package/embedded-knowledge/domains/seth-security/al-temporary-table-safety.md +95 -0
  439. package/embedded-knowledge/domains/seth-security/api-permission-model.md +115 -0
  440. package/embedded-knowledge/domains/seth-security/istemporary-safeguard-pattern.md +78 -0
  441. package/embedded-knowledge/domains/seth-security/samples/al-temporary-table-safety.md +373 -0
  442. package/embedded-knowledge/domains/seth-security/samples/api-permission-model.md +308 -0
  443. package/embedded-knowledge/domains/shared/al-file-naming-conventions.md +146 -0
  444. package/embedded-knowledge/domains/taylor-docs/al-xml-documentation-structure.md +79 -0
  445. package/embedded-knowledge/domains/uma-ux/bc-action-shortcuts-syntax.md +78 -0
  446. package/embedded-knowledge/domains/uma-ux/shortcut-key-user-experience-design.md +81 -0
  447. package/embedded-knowledge/indexes/bc-version-matrix.json +188 -0
  448. package/embedded-knowledge/indexes/domain-catalog.json +106 -0
  449. package/embedded-knowledge/indexes/tags/abbreviations.json +1 -0
  450. package/embedded-knowledge/indexes/tags/abstraction.json +1 -0
  451. package/embedded-knowledge/indexes/tags/access-control.json +1 -0
  452. package/embedded-knowledge/indexes/tags/accessibility.json +1 -0
  453. package/embedded-knowledge/indexes/tags/actions.json +1 -0
  454. package/embedded-knowledge/indexes/tags/advanced-patterns.json +1 -0
  455. package/embedded-knowledge/indexes/tags/advanced.json +1 -0
  456. package/embedded-knowledge/indexes/tags/al-extension.json +1 -0
  457. package/embedded-knowledge/indexes/tags/al-generics.json +1 -0
  458. package/embedded-knowledge/indexes/tags/al-objects.json +1 -0
  459. package/embedded-knowledge/indexes/tags/al-syntax.json +1 -0
  460. package/embedded-knowledge/indexes/tags/algorithm-structure.json +1 -0
  461. package/embedded-knowledge/indexes/tags/alternatives.json +1 -0
  462. package/embedded-knowledge/indexes/tags/analytics.json +1 -0
  463. package/embedded-knowledge/indexes/tags/api-delegates.json +1 -0
  464. package/embedded-knowledge/indexes/tags/api-design.json +1 -0
  465. package/embedded-knowledge/indexes/tags/api-documentation.json +1 -0
  466. package/embedded-knowledge/indexes/tags/api-endpoints.json +1 -0
  467. package/embedded-knowledge/indexes/tags/api-extensibility.json +1 -0
  468. package/embedded-knowledge/indexes/tags/api-fieldsets.json +1 -0
  469. package/embedded-knowledge/indexes/tags/api-integration.json +1 -0
  470. package/embedded-knowledge/indexes/tags/api-interfaces.json +1 -0
  471. package/embedded-knowledge/indexes/tags/api-optimization.json +1 -0
  472. package/embedded-knowledge/indexes/tags/api-pages.json +1 -0
  473. package/embedded-knowledge/indexes/tags/api-patterns.json +1 -0
  474. package/embedded-knowledge/indexes/tags/api-permissions.json +1 -0
  475. package/embedded-knowledge/indexes/tags/api-responses.json +1 -0
  476. package/embedded-knowledge/indexes/tags/api-simplification.json +1 -0
  477. package/embedded-knowledge/indexes/tags/api.json +1 -0
  478. package/embedded-knowledge/indexes/tags/architecture.json +1 -0
  479. package/embedded-knowledge/indexes/tags/async-patterns.json +1 -0
  480. package/embedded-knowledge/indexes/tags/async-processing.json +1 -0
  481. package/embedded-knowledge/indexes/tags/automatic-registration.json +1 -0
  482. package/embedded-knowledge/indexes/tags/batch-operations.json +1 -0
  483. package/embedded-knowledge/indexes/tags/bc24-migration.json +1 -0
  484. package/embedded-knowledge/indexes/tags/begin-blocks.json +1 -0
  485. package/embedded-knowledge/indexes/tags/begin-end.json +1 -0
  486. package/embedded-knowledge/indexes/tags/behavioral-patterns.json +1 -0
  487. package/embedded-knowledge/indexes/tags/best-practices.json +1 -0
  488. package/embedded-knowledge/indexes/tags/binding.json +1 -0
  489. package/embedded-knowledge/indexes/tags/block-structure.json +1 -0
  490. package/embedded-knowledge/indexes/tags/blocks.json +1 -0
  491. package/embedded-knowledge/indexes/tags/boolean-expressions.json +1 -0
  492. package/embedded-knowledge/indexes/tags/branching.json +1 -0
  493. package/embedded-knowledge/indexes/tags/breaking-changes.json +1 -0
  494. package/embedded-knowledge/indexes/tags/breakpoints.json +1 -0
  495. package/embedded-knowledge/indexes/tags/business-foundation.json +1 -0
  496. package/embedded-knowledge/indexes/tags/business-infrastructure.json +1 -0
  497. package/embedded-knowledge/indexes/tags/business-process.json +1 -0
  498. package/embedded-knowledge/indexes/tags/business-rules.json +1 -0
  499. package/embedded-knowledge/indexes/tags/caching.json +1 -0
  500. package/embedded-knowledge/indexes/tags/case-statements.json +1 -0
  501. package/embedded-knowledge/indexes/tags/case.json +1 -0
  502. package/embedded-knowledge/indexes/tags/code-analysis.json +1 -0
  503. package/embedded-knowledge/indexes/tags/code-clarity.json +1 -0
  504. package/embedded-knowledge/indexes/tags/code-comprehension.json +1 -0
  505. package/embedded-knowledge/indexes/tags/code-conversion.json +1 -0
  506. package/embedded-knowledge/indexes/tags/code-formatting.json +1 -0
  507. package/embedded-knowledge/indexes/tags/code-organization.json +1 -0
  508. package/embedded-knowledge/indexes/tags/code-patterns.json +1 -0
  509. package/embedded-knowledge/indexes/tags/code-quality.json +1 -0
  510. package/embedded-knowledge/indexes/tags/code-reuse.json +1 -0
  511. package/embedded-knowledge/indexes/tags/code-simplification.json +1 -0
  512. package/embedded-knowledge/indexes/tags/code-standards.json +1 -0
  513. package/embedded-knowledge/indexes/tags/code-structure.json +1 -0
  514. package/embedded-knowledge/indexes/tags/code-style.json +1 -0
  515. package/embedded-knowledge/indexes/tags/codeunit-design.json +1 -0
  516. package/embedded-knowledge/indexes/tags/command-queue.json +1 -0
  517. package/embedded-knowledge/indexes/tags/comments.json +1 -0
  518. package/embedded-knowledge/indexes/tags/compile-time-validation.json +1 -0
  519. package/embedded-knowledge/indexes/tags/complex-facade.json +1 -0
  520. package/embedded-knowledge/indexes/tags/complexity-hiding.json +1 -0
  521. package/embedded-knowledge/indexes/tags/complexity-management.json +1 -0
  522. package/embedded-knowledge/indexes/tags/compound-statements.json +1 -0
  523. package/embedded-knowledge/indexes/tags/concurrency.json +1 -0
  524. package/embedded-knowledge/indexes/tags/conditional-logic.json +1 -0
  525. package/embedded-knowledge/indexes/tags/conditional.json +1 -0
  526. package/embedded-knowledge/indexes/tags/conflict-resolution.json +1 -0
  527. package/embedded-knowledge/indexes/tags/consistency.json +1 -0
  528. package/embedded-knowledge/indexes/tags/contract-design.json +1 -0
  529. package/embedded-knowledge/indexes/tags/control-flow.json +1 -0
  530. package/embedded-knowledge/indexes/tags/conversion-guide.json +1 -0
  531. package/embedded-knowledge/indexes/tags/correlation.json +1 -0
  532. package/embedded-knowledge/indexes/tags/custom-messages.json +1 -0
  533. package/embedded-knowledge/indexes/tags/data-access.json +1 -0
  534. package/embedded-knowledge/indexes/tags/data-exposure.json +1 -0
  535. package/embedded-knowledge/indexes/tags/data-integrity.json +1 -0
  536. package/embedded-knowledge/indexes/tags/data-loading.json +1 -0
  537. package/embedded-knowledge/indexes/tags/data-manipulation.json +1 -0
  538. package/embedded-knowledge/indexes/tags/data-modeling.json +1 -0
  539. package/embedded-knowledge/indexes/tags/data-patterns.json +1 -0
  540. package/embedded-knowledge/indexes/tags/data-protection.json +1 -0
  541. package/embedded-knowledge/indexes/tags/data-validation.json +1 -0
  542. package/embedded-knowledge/indexes/tags/database.json +1 -0
  543. package/embedded-knowledge/indexes/tags/debugging.json +1 -0
  544. package/embedded-knowledge/indexes/tags/decision-making.json +1 -0
  545. package/embedded-knowledge/indexes/tags/declaration.json +1 -0
  546. package/embedded-knowledge/indexes/tags/default-messages.json +1 -0
  547. package/embedded-knowledge/indexes/tags/defensive-programming.json +1 -0
  548. package/embedded-knowledge/indexes/tags/deleteall.json +1 -0
  549. package/embedded-knowledge/indexes/tags/dependencies.json +1 -0
  550. package/embedded-knowledge/indexes/tags/deployment.json +1 -0
  551. package/embedded-knowledge/indexes/tags/developer-productivity.json +1 -0
  552. package/embedded-knowledge/indexes/tags/development-workflow.json +1 -0
  553. package/embedded-knowledge/indexes/tags/diagnostics.json +1 -0
  554. package/embedded-knowledge/indexes/tags/dimensions.json +1 -0
  555. package/embedded-knowledge/indexes/tags/documentation.json +1 -0
  556. package/embedded-knowledge/indexes/tags/early-exit.json +1 -0
  557. package/embedded-knowledge/indexes/tags/else-clauses.json +1 -0
  558. package/embedded-knowledge/indexes/tags/end-statements.json +1 -0
  559. package/embedded-knowledge/indexes/tags/enterprise-patterns.json +1 -0
  560. package/embedded-knowledge/indexes/tags/entity-relationships.json +1 -0
  561. package/embedded-knowledge/indexes/tags/error-handling.json +1 -0
  562. package/embedded-knowledge/indexes/tags/error-messages.json +1 -0
  563. package/embedded-knowledge/indexes/tags/error-prevention.json +1 -0
  564. package/embedded-knowledge/indexes/tags/error-text.json +1 -0
  565. package/embedded-knowledge/indexes/tags/etag.json +1 -0
  566. package/embedded-knowledge/indexes/tags/event-bridge.json +1 -0
  567. package/embedded-knowledge/indexes/tags/event-payload.json +1 -0
  568. package/embedded-knowledge/indexes/tags/event-routing.json +1 -0
  569. package/embedded-knowledge/indexes/tags/events.json +1 -0
  570. package/embedded-knowledge/indexes/tags/execution-flow.json +1 -0
  571. package/embedded-knowledge/indexes/tags/expressions.json +1 -0
  572. package/embedded-knowledge/indexes/tags/extensibility.json +1 -0
  573. package/embedded-knowledge/indexes/tags/extensions.json +1 -0
  574. package/embedded-knowledge/indexes/tags/facade-composition.json +1 -0
  575. package/embedded-knowledge/indexes/tags/facade-pattern.json +1 -0
  576. package/embedded-knowledge/indexes/tags/field-control.json +1 -0
  577. package/embedded-knowledge/indexes/tags/field-exclusion.json +1 -0
  578. package/embedded-knowledge/indexes/tags/field-registration.json +1 -0
  579. package/embedded-knowledge/indexes/tags/field-state.json +1 -0
  580. package/embedded-knowledge/indexes/tags/field-validation.json +1 -0
  581. package/embedded-knowledge/indexes/tags/fielderror.json +1 -0
  582. package/embedded-knowledge/indexes/tags/fields.json +1 -0
  583. package/embedded-knowledge/indexes/tags/filtering.json +1 -0
  584. package/embedded-knowledge/indexes/tags/filters.json +1 -0
  585. package/embedded-knowledge/indexes/tags/formatting.json +1 -0
  586. package/embedded-knowledge/indexes/tags/generic-methods.json +1 -0
  587. package/embedded-knowledge/indexes/tags/http-status.json +1 -0
  588. package/embedded-knowledge/indexes/tags/if-statements.json +1 -0
  589. package/embedded-knowledge/indexes/tags/implementation.json +1 -0
  590. package/embedded-knowledge/indexes/tags/indentation.json +1 -0
  591. package/embedded-knowledge/indexes/tags/index-summary.json +277 -0
  592. package/embedded-knowledge/indexes/tags/indexing.json +1 -0
  593. package/embedded-knowledge/indexes/tags/inheritance.json +1 -0
  594. package/embedded-knowledge/indexes/tags/integration.json +1 -0
  595. package/embedded-knowledge/indexes/tags/integrity-checking.json +1 -0
  596. package/embedded-knowledge/indexes/tags/intellisense.json +1 -0
  597. package/embedded-knowledge/indexes/tags/interface-design.json +1 -0
  598. package/embedded-knowledge/indexes/tags/interface-segregation.json +1 -0
  599. package/embedded-knowledge/indexes/tags/isolation.json +1 -0
  600. package/embedded-knowledge/indexes/tags/job-processing.json +1 -0
  601. package/embedded-knowledge/indexes/tags/keyboard-navigation.json +1 -0
  602. package/embedded-knowledge/indexes/tags/keywords.json +1 -0
  603. package/embedded-knowledge/indexes/tags/legacy-modernization.json +1 -0
  604. package/embedded-knowledge/indexes/tags/line-breaks.json +1 -0
  605. package/embedded-knowledge/indexes/tags/line-organization.json +1 -0
  606. package/embedded-knowledge/indexes/tags/line-positioning.json +1 -0
  607. package/embedded-knowledge/indexes/tags/localization.json +1 -0
  608. package/embedded-knowledge/indexes/tags/logging.json +1 -0
  609. package/embedded-knowledge/indexes/tags/loose-coupling.json +1 -0
  610. package/embedded-knowledge/indexes/tags/maintainability.json +1 -0
  611. package/embedded-knowledge/indexes/tags/memory-management.json +1 -0
  612. package/embedded-knowledge/indexes/tags/memory-optimization.json +1 -0
  613. package/embedded-knowledge/indexes/tags/memory.json +1 -0
  614. package/embedded-knowledge/indexes/tags/message-design.json +1 -0
  615. package/embedded-knowledge/indexes/tags/message-formatting.json +1 -0
  616. package/embedded-knowledge/indexes/tags/message-patterns.json +1 -0
  617. package/embedded-knowledge/indexes/tags/metadata-driven.json +1 -0
  618. package/embedded-knowledge/indexes/tags/method-comparison.json +1 -0
  619. package/embedded-knowledge/indexes/tags/module-architecture.json +1 -0
  620. package/embedded-knowledge/indexes/tags/module-validation.json +1 -0
  621. package/embedded-knowledge/indexes/tags/monitoring.json +1 -0
  622. package/embedded-knowledge/indexes/tags/multi-layer-facade.json +1 -0
  623. package/embedded-knowledge/indexes/tags/multi-tenancy.json +1 -0
  624. package/embedded-knowledge/indexes/tags/multiple-values.json +1 -0
  625. package/embedded-knowledge/indexes/tags/naming-conventions.json +1 -0
  626. package/embedded-knowledge/indexes/tags/naming.json +1 -0
  627. package/embedded-knowledge/indexes/tags/navigation.json +1 -0
  628. package/embedded-knowledge/indexes/tags/nested-statements.json +1 -0
  629. package/embedded-knowledge/indexes/tags/no-series-conversion.json +1 -0
  630. package/embedded-knowledge/indexes/tags/no-series-validation.json +1 -0
  631. package/embedded-knowledge/indexes/tags/no-series.json +1 -0
  632. package/embedded-knowledge/indexes/tags/number-generation.json +1 -0
  633. package/embedded-knowledge/indexes/tags/object-documentation.json +1 -0
  634. package/embedded-knowledge/indexes/tags/odata.json +1 -0
  635. package/embedded-knowledge/indexes/tags/ondelete.json +1 -0
  636. package/embedded-knowledge/indexes/tags/onvalidate.json +1 -0
  637. package/embedded-knowledge/indexes/tags/operation-delegation.json +1 -0
  638. package/embedded-knowledge/indexes/tags/operation-safety.json +1 -0
  639. package/embedded-knowledge/indexes/tags/operators.json +1 -0
  640. package/embedded-knowledge/indexes/tags/optimization.json +1 -0
  641. package/embedded-knowledge/indexes/tags/order.json +1 -0
  642. package/embedded-knowledge/indexes/tags/organization.json +1 -0
  643. package/embedded-knowledge/indexes/tags/pages.json +1 -0
  644. package/embedded-knowledge/indexes/tags/parameters.json +1 -0
  645. package/embedded-knowledge/indexes/tags/patterns.json +1 -0
  646. package/embedded-knowledge/indexes/tags/performance-optimization.json +1 -0
  647. package/embedded-knowledge/indexes/tags/performance.json +1 -0
  648. package/embedded-knowledge/indexes/tags/placement.json +1 -0
  649. package/embedded-knowledge/indexes/tags/posting-codeunits.json +1 -0
  650. package/embedded-knowledge/indexes/tags/posting.json +1 -0
  651. package/embedded-knowledge/indexes/tags/preconditions.json +1 -0
  652. package/embedded-knowledge/indexes/tags/primary-key.json +1 -0
  653. package/embedded-knowledge/indexes/tags/privacy.json +1 -0
  654. package/embedded-knowledge/indexes/tags/process-automation.json +1 -0
  655. package/embedded-knowledge/indexes/tags/production.json +1 -0
  656. package/embedded-knowledge/indexes/tags/productivity.json +1 -0
  657. package/embedded-knowledge/indexes/tags/query-performance.json +1 -0
  658. package/embedded-knowledge/indexes/tags/queue-management.json +1 -0
  659. package/embedded-knowledge/indexes/tags/ranges.json +1 -0
  660. package/embedded-knowledge/indexes/tags/readability.json +1 -0
  661. package/embedded-knowledge/indexes/tags/record-access.json +1 -0
  662. package/embedded-knowledge/indexes/tags/record-methods.json +1 -0
  663. package/embedded-knowledge/indexes/tags/refactoring.json +1 -0
  664. package/embedded-knowledge/indexes/tags/reference.json +1 -0
  665. package/embedded-knowledge/indexes/tags/repeat-loops.json +1 -0
  666. package/embedded-knowledge/indexes/tags/repeat-statement.json +1 -0
  667. package/embedded-knowledge/indexes/tags/runtime-errors.json +1 -0
  668. package/embedded-knowledge/indexes/tags/runtime.json +1 -0
  669. package/embedded-knowledge/indexes/tags/safeguards.json +1 -0
  670. package/embedded-knowledge/indexes/tags/security.json +1 -0
  671. package/embedded-knowledge/indexes/tags/sequence-management.json +1 -0
  672. package/embedded-knowledge/indexes/tags/serialization.json +1 -0
  673. package/embedded-knowledge/indexes/tags/session-logmessage.json +1 -0
  674. package/embedded-knowledge/indexes/tags/session.json +1 -0
  675. package/embedded-knowledge/indexes/tags/setloadfields.json +1 -0
  676. package/embedded-knowledge/indexes/tags/shortcuts.json +1 -0
  677. package/embedded-knowledge/indexes/tags/sift.json +1 -0
  678. package/embedded-knowledge/indexes/tags/singleinstance.json +1 -0
  679. package/embedded-knowledge/indexes/tags/spacing.json +1 -0
  680. package/embedded-knowledge/indexes/tags/sql-translation.json +1 -0
  681. package/embedded-knowledge/indexes/tags/standards.json +1 -0
  682. package/embedded-knowledge/indexes/tags/statements.json +1 -0
  683. package/embedded-knowledge/indexes/tags/streaming.json +1 -0
  684. package/embedded-knowledge/indexes/tags/strong-typing.json +1 -0
  685. package/embedded-knowledge/indexes/tags/structural-patterns.json +1 -0
  686. package/embedded-knowledge/indexes/tags/structure.json +1 -0
  687. package/embedded-knowledge/indexes/tags/subscribers.json +1 -0
  688. package/embedded-knowledge/indexes/tags/switch.json +1 -0
  689. package/embedded-knowledge/indexes/tags/symbol-search.json +1 -0
  690. package/embedded-knowledge/indexes/tags/syntax.json +1 -0
  691. package/embedded-knowledge/indexes/tags/systemid.json +1 -0
  692. package/embedded-knowledge/indexes/tags/table-configuration.json +1 -0
  693. package/embedded-knowledge/indexes/tags/table-events.json +1 -0
  694. package/embedded-knowledge/indexes/tags/table-keys.json +1 -0
  695. package/embedded-knowledge/indexes/tags/table-safety.json +1 -0
  696. package/embedded-knowledge/indexes/tags/task-scheduler.json +1 -0
  697. package/embedded-knowledge/indexes/tags/telemetry.json +1 -0
  698. package/embedded-knowledge/indexes/tags/template-method.json +1 -0
  699. package/embedded-knowledge/indexes/tags/temporary-tables.json +1 -0
  700. package/embedded-knowledge/indexes/tags/testfield.json +1 -0
  701. package/embedded-knowledge/indexes/tags/tradeoffs.json +1 -0
  702. package/embedded-knowledge/indexes/tags/triggers.json +1 -0
  703. package/embedded-knowledge/indexes/tags/troubleshooting.json +1 -0
  704. package/embedded-knowledge/indexes/tags/type-safety.json +1 -0
  705. package/embedded-knowledge/indexes/tags/url-structure.json +1 -0
  706. package/embedded-knowledge/indexes/tags/user-experience.json +1 -0
  707. package/embedded-knowledge/indexes/tags/user-feedback.json +1 -0
  708. package/embedded-knowledge/indexes/tags/user-interface.json +1 -0
  709. package/embedded-knowledge/indexes/tags/validation-feedback.json +1 -0
  710. package/embedded-knowledge/indexes/tags/validation.json +1 -0
  711. package/embedded-knowledge/indexes/tags/variables.json +1 -0
  712. package/embedded-knowledge/indexes/tags/verbosity.json +1 -0
  713. package/embedded-knowledge/indexes/tags/vs-code.json +1 -0
  714. package/embedded-knowledge/indexes/tags/web-services.json +1 -0
  715. package/embedded-knowledge/indexes/tags/workflow-management.json +1 -0
  716. package/embedded-knowledge/indexes/tags/workflow-optimization.json +1 -0
  717. package/embedded-knowledge/indexes/tags/workflow-templates.json +1 -0
  718. package/embedded-knowledge/indexes/tags/workspace.json +1 -0
  719. package/embedded-knowledge/indexes/tags/xml-documentation.json +1 -0
  720. package/embedded-knowledge/indexes/topic-relationships.json +128 -0
  721. package/embedded-knowledge/methodologies/index.json +81 -0
  722. package/embedded-knowledge/methodologies/phases/analysis-full.md +208 -0
  723. package/embedded-knowledge/methodologies/phases/analysis-quick.md +44 -0
  724. package/embedded-knowledge/methodologies/phases/analysis.md +182 -0
  725. package/embedded-knowledge/methodologies/phases/execution-validation-full.md +174 -0
  726. package/embedded-knowledge/methodologies/phases/execution-validation-quick.md +31 -0
  727. package/embedded-knowledge/methodologies/phases/execution-validation.md +174 -0
  728. package/embedded-knowledge/methodologies/phases/performance-full.md +211 -0
  729. package/embedded-knowledge/methodologies/phases/performance-quick.md +32 -0
  730. package/embedded-knowledge/methodologies/phases/performance.md +211 -0
  731. package/embedded-knowledge/methodologies/phases/verification-full.md +162 -0
  732. package/embedded-knowledge/methodologies/phases/verification-quick.md +48 -0
  733. package/embedded-knowledge/methodologies/phases/verification.md +146 -0
  734. package/embedded-knowledge/methodologies/workflow-enforcement.md +142 -0
  735. package/embedded-knowledge/methodologies/workflows/code-review-workflow.md +99 -0
  736. package/embedded-knowledge/methodologies/workflows/proposal-review-workflow.md +535 -0
  737. package/embedded-knowledge/specialists/alex-architect.md +305 -0
  738. package/embedded-knowledge/specialists/casey-copilot.md +314 -0
  739. package/embedded-knowledge/specialists/chris-config.md +226 -0
  740. package/embedded-knowledge/specialists/dean-debug.md +365 -0
  741. package/embedded-knowledge/specialists/eva-errors.md +291 -0
  742. package/embedded-knowledge/specialists/jordan-bridge.md +291 -0
  743. package/embedded-knowledge/specialists/logan-legacy.md +265 -0
  744. package/embedded-knowledge/specialists/maya-mentor.md +299 -0
  745. package/embedded-knowledge/specialists/morgan-market.md +281 -0
  746. package/embedded-knowledge/specialists/parker-pragmatic.md +564 -0
  747. package/embedded-knowledge/specialists/quinn-tester.md +323 -0
  748. package/embedded-knowledge/specialists/roger-reviewer.md +317 -0
  749. package/embedded-knowledge/specialists/sam-coder.md +342 -0
  750. package/embedded-knowledge/specialists/seth-security.md +290 -0
  751. package/embedded-knowledge/specialists/taylor-docs.md +312 -0
  752. package/embedded-knowledge/specialists/uma-ux.md +291 -0
  753. package/package.json +82 -0
@@ -0,0 +1,810 @@
1
+ # No Series Implementation Patterns - AL Code Examples
2
+
3
+ This sample demonstrates implementing robust number generation and sequence management in Business Central.
4
+
5
+ ## Basic No Series Implementation
6
+
7
+ ```al
8
+ // Custom number generation codeunit
9
+ codeunit 50500 "Custom No. Series Management"
10
+ {
11
+ procedure GetNextNo(NoSeriesCode: Code[20]; SeriesDate: Date): Code[20]
12
+ var
13
+ NoSeries: Record "No. Series";
14
+ NoSeriesLine: Record "No. Series Line";
15
+ NextNo: Code[20];
16
+ begin
17
+ if not NoSeries.Get(NoSeriesCode) then
18
+ Error('No. Series %1 does not exist', NoSeriesCode);
19
+
20
+ NoSeriesLine := FindApplicableNoSeriesLine(NoSeriesCode, SeriesDate);
21
+ NextNo := GenerateNextNumber(NoSeriesLine);
22
+
23
+ UpdateNoSeriesLine(NoSeriesLine, NextNo);
24
+ LogNumberGeneration(NoSeriesCode, NextNo);
25
+
26
+ exit(NextNo);
27
+ end;
28
+
29
+ procedure GetNextNoWithGapManagement(NoSeriesCode: Code[20]; SeriesDate: Date; FillGaps: Boolean): Code[20]
30
+ var
31
+ NextNo: Code[20];
32
+ GapNo: Code[20];
33
+ begin
34
+ if FillGaps then begin
35
+ GapNo := FindFirstGap(NoSeriesCode);
36
+ if GapNo <> '' then begin
37
+ MarkGapAsFilled(NoSeriesCode, GapNo);
38
+ exit(GapNo);
39
+ end;
40
+ end;
41
+
42
+ exit(GetNextNo(NoSeriesCode, SeriesDate));
43
+ end;
44
+
45
+ procedure CreateCustomNoSeries(NoSeriesCode: Code[20]; Description: Text[100]; StartingNo: Code[20]; EndingNo: Code[20]): Boolean
46
+ var
47
+ NoSeries: Record "No. Series";
48
+ NoSeriesLine: Record "No. Series Line";
49
+ begin
50
+ // Create No. Series header
51
+ if NoSeries.Get(NoSeriesCode) then
52
+ exit(false); // Already exists
53
+
54
+ NoSeries.Init();
55
+ NoSeries.Code := NoSeriesCode;
56
+ NoSeries.Description := Description;
57
+ NoSeries."Default Nos." := true;
58
+ NoSeries."Manual Nos." := false;
59
+ NoSeries.Insert(true);
60
+
61
+ // Create No. Series line
62
+ NoSeriesLine.Init();
63
+ NoSeriesLine."Series Code" := NoSeriesCode;
64
+ NoSeriesLine."Line No." := 10000;
65
+ NoSeriesLine."Starting Date" := Today;
66
+ NoSeriesLine."Starting No." := StartingNo;
67
+ NoSeriesLine."Ending No." := EndingNo;
68
+ NoSeriesLine."Last No. Used" := '';
69
+ NoSeriesLine."Increment-by No." := 1;
70
+ NoSeriesLine.Insert(true);
71
+
72
+ exit(true);
73
+ end;
74
+
75
+ local procedure FindApplicableNoSeriesLine(NoSeriesCode: Code[20]; SeriesDate: Date): Record "No. Series Line"
76
+ var
77
+ NoSeriesLine: Record "No. Series Line";
78
+ begin
79
+ NoSeriesLine.SetRange("Series Code", NoSeriesCode);
80
+ NoSeriesLine.SetFilter("Starting Date", '<=%1', SeriesDate);
81
+ NoSeriesLine.SetFilter("Ending Date", '%1|>=%2', 0D, SeriesDate);
82
+
83
+ if not NoSeriesLine.FindLast() then
84
+ Error('No applicable No. Series Line found for %1 on %2', NoSeriesCode, SeriesDate);
85
+
86
+ exit(NoSeriesLine);
87
+ end;
88
+
89
+ local procedure GenerateNextNumber(var NoSeriesLine: Record "No. Series Line"): Code[20]
90
+ var
91
+ NextNo: Code[20];
92
+ NumberPart: BigInteger;
93
+ PrefixPart: Text;
94
+ SuffixPart: Text;
95
+ NumberLength: Integer;
96
+ begin
97
+ if NoSeriesLine."Last No. Used" = '' then
98
+ NextNo := NoSeriesLine."Starting No."
99
+ else begin
100
+ // Parse current number
101
+ ParseNumberComponents(NoSeriesLine."Last No. Used", PrefixPart, NumberPart, SuffixPart, NumberLength);
102
+
103
+ // Increment number
104
+ NumberPart += NoSeriesLine."Increment-by No.";
105
+
106
+ // Reconstruct number
107
+ NextNo := ReconstructNumber(PrefixPart, NumberPart, SuffixPart, NumberLength);
108
+ end;
109
+
110
+ // Validate against ending number
111
+ if (NoSeriesLine."Ending No." <> '') and (NextNo > NoSeriesLine."Ending No.") then
112
+ Error('No. Series %1 has reached its ending number %2', NoSeriesLine."Series Code", NoSeriesLine."Ending No.");
113
+
114
+ exit(NextNo);
115
+ end;
116
+
117
+ local procedure UpdateNoSeriesLine(var NoSeriesLine: Record "No. Series Line"; NextNo: Code[20])
118
+ begin
119
+ NoSeriesLine."Last No. Used" := NextNo;
120
+ NoSeriesLine."Last Date Used" := Today;
121
+ NoSeriesLine.Modify(true);
122
+ end;
123
+
124
+ local procedure ParseNumberComponents(NumberStr: Code[20]; var Prefix: Text; var Number: BigInteger; var Suffix: Text; var NumberLength: Integer)
125
+ var
126
+ i: Integer;
127
+ CurrentChar: Char;
128
+ NumberStartPos: Integer;
129
+ NumberEndPos: Integer;
130
+ NumberPart: Text;
131
+ begin
132
+ Clear(Prefix);
133
+ Clear(Suffix);
134
+ Number := 0;
135
+ NumberLength := 0;
136
+ NumberStartPos := 0;
137
+ NumberEndPos := 0;
138
+
139
+ // Find the start of the numeric part
140
+ for i := 1 to StrLen(NumberStr) do begin
141
+ CurrentChar := NumberStr[i];
142
+ if CurrentChar in ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] then begin
143
+ if NumberStartPos = 0 then
144
+ NumberStartPos := i;
145
+ NumberEndPos := i;
146
+ end else begin
147
+ if NumberStartPos > 0 then
148
+ break;
149
+ end;
150
+ end;
151
+
152
+ if NumberStartPos > 0 then begin
153
+ // Extract components
154
+ if NumberStartPos > 1 then
155
+ Prefix := CopyStr(NumberStr, 1, NumberStartPos - 1);
156
+
157
+ NumberPart := CopyStr(NumberStr, NumberStartPos, NumberEndPos - NumberStartPos + 1);
158
+ NumberLength := StrLen(NumberPart);
159
+ Evaluate(Number, NumberPart);
160
+
161
+ if NumberEndPos < StrLen(NumberStr) then
162
+ Suffix := CopyStr(NumberStr, NumberEndPos + 1);
163
+ end;
164
+ end;
165
+
166
+ local procedure ReconstructNumber(Prefix: Text; Number: BigInteger; Suffix: Text; NumberLength: Integer): Code[20]
167
+ var
168
+ NumberPart: Text;
169
+ Result: Text;
170
+ begin
171
+ NumberPart := Format(Number);
172
+
173
+ // Pad with leading zeros if necessary
174
+ while StrLen(NumberPart) < NumberLength do
175
+ NumberPart := '0' + NumberPart;
176
+
177
+ Result := Prefix + NumberPart + Suffix;
178
+ exit(CopyStr(Result, 1, 20));
179
+ end;
180
+
181
+ local procedure FindFirstGap(NoSeriesCode: Code[20]): Code[20]
182
+ var
183
+ NoSeriesGap: Record "No. Series Gap";
184
+ begin
185
+ NoSeriesGap.SetRange("Series Code", NoSeriesCode);
186
+ NoSeriesGap.SetRange(Filled, false);
187
+ if NoSeriesGap.FindFirst() then
188
+ exit(NoSeriesGap."Gap No.");
189
+
190
+ exit('');
191
+ end;
192
+
193
+ local procedure MarkGapAsFilled(NoSeriesCode: Code[20]; GapNo: Code[20])
194
+ var
195
+ NoSeriesGap: Record "No. Series Gap";
196
+ begin
197
+ if NoSeriesGap.Get(NoSeriesCode, GapNo) then begin
198
+ NoSeriesGap.Filled := true;
199
+ NoSeriesGap."Fill Date" := Today;
200
+ NoSeriesGap."Fill Time" := Time;
201
+ NoSeriesGap.Modify(true);
202
+ end;
203
+ end;
204
+
205
+ local procedure LogNumberGeneration(NoSeriesCode: Code[20]; GeneratedNo: Code[20])
206
+ var
207
+ NoSeriesLog: Record "No. Series Log";
208
+ begin
209
+ NoSeriesLog.Init();
210
+ NoSeriesLog."Entry No." := GetNextLogEntryNo();
211
+ NoSeriesLog."Series Code" := NoSeriesCode;
212
+ NoSeriesLog."Generated No." := GeneratedNo;
213
+ NoSeriesLog."Generation Date" := Today;
214
+ NoSeriesLog."Generation Time" := Time;
215
+ NoSeriesLog."User ID" := UserId;
216
+ NoSeriesLog.Insert(true);
217
+ end;
218
+
219
+ local procedure GetNextLogEntryNo(): Integer
220
+ var
221
+ NoSeriesLog: Record "No. Series Log";
222
+ begin
223
+ if NoSeriesLog.FindLast() then
224
+ exit(NoSeriesLog."Entry No." + 1)
225
+ else
226
+ exit(1);
227
+ end;
228
+ }
229
+ ```
230
+
231
+ ## Concurrency-Safe Number Generation
232
+
233
+ ```al
234
+ // High-performance number generation with concurrency control
235
+ codeunit 50501 "Concurrent No. Series Management"
236
+ {
237
+ procedure GetNextNoSafe(NoSeriesCode: Code[20]; SeriesDate: Date): Code[20]
238
+ var
239
+ NoSeriesLine: Record "No. Series Line";
240
+ NextNo: Code[20];
241
+ RetryCount: Integer;
242
+ MaxRetries: Integer;
243
+ begin
244
+ MaxRetries := 10;
245
+ RetryCount := 0;
246
+
247
+ repeat
248
+ RetryCount += 1;
249
+
250
+ if TryGetNextNoWithLock(NoSeriesCode, SeriesDate, NextNo) then
251
+ exit(NextNo);
252
+
253
+ if RetryCount >= MaxRetries then
254
+ Error('Unable to generate next number after %1 attempts. Series may be in use by another user.', MaxRetries);
255
+
256
+ // Wait before retry (exponential backoff)
257
+ Sleep(RetryCount * 100);
258
+
259
+ until false;
260
+ end;
261
+
262
+ [TryFunction]
263
+ local procedure TryGetNextNoWithLock(NoSeriesCode: Code[20]; SeriesDate: Date; var NextNo: Code[20])
264
+ var
265
+ NoSeriesLine: Record "No. Series Line";
266
+ NoSeriesLock: Record "No. Series Lock";
267
+ LockAcquired: Boolean;
268
+ begin
269
+ // Attempt to acquire lock
270
+ LockAcquired := TryAcquireSeriesLock(NoSeriesCode);
271
+ if not LockAcquired then
272
+ Error('Lock not acquired');
273
+
274
+ try
275
+ // Find applicable line
276
+ NoSeriesLine := FindApplicableNoSeriesLine(NoSeriesCode, SeriesDate);
277
+
278
+ // Generate next number
279
+ NextNo := GenerateNextNumberSafe(NoSeriesLine);
280
+
281
+ // Update line
282
+ UpdateNoSeriesLineSafe(NoSeriesLine, NextNo);
283
+
284
+ // Commit changes
285
+ Commit();
286
+
287
+ finally
288
+ // Always release lock
289
+ ReleaseSeriesLock(NoSeriesCode);
290
+ end;
291
+ end;
292
+
293
+ [TryFunction]
294
+ local procedure TryAcquireSeriesLock(NoSeriesCode: Code[20]): Boolean
295
+ var
296
+ NoSeriesLock: Record "No. Series Lock";
297
+ LockTimeout: DateTime;
298
+ begin
299
+ LockTimeout := CurrentDateTime + 5000; // 5 second timeout
300
+
301
+ NoSeriesLock.SetRange("Series Code", NoSeriesCode);
302
+
303
+ repeat
304
+ if not NoSeriesLock.FindFirst() then begin
305
+ // Create lock record
306
+ NoSeriesLock.Init();
307
+ NoSeriesLock."Series Code" := NoSeriesCode;
308
+ NoSeriesLock."Locked By" := UserId;
309
+ NoSeriesLock."Lock Time" := CurrentDateTime;
310
+ NoSeriesLock.Insert(true);
311
+ exit(true);
312
+ end;
313
+
314
+ // Check if lock is stale (older than 1 minute)
315
+ if NoSeriesLock."Lock Time" < (CurrentDateTime - 60000) then begin
316
+ NoSeriesLock.Delete(true);
317
+ continue;
318
+ end;
319
+
320
+ Sleep(50); // Wait 50ms before retry
321
+
322
+ until CurrentDateTime > LockTimeout;
323
+
324
+ exit(false);
325
+ end;
326
+
327
+ local procedure ReleaseSeriesLock(NoSeriesCode: Code[20])
328
+ var
329
+ NoSeriesLock: Record "No. Series Lock";
330
+ begin
331
+ NoSeriesLock.SetRange("Series Code", NoSeriesCode);
332
+ NoSeriesLock.SetRange("Locked By", UserId);
333
+ if NoSeriesLock.FindFirst() then
334
+ NoSeriesLock.Delete(true);
335
+ end;
336
+
337
+ local procedure FindApplicableNoSeriesLine(NoSeriesCode: Code[20]; SeriesDate: Date): Record "No. Series Line"
338
+ var
339
+ NoSeriesLine: Record "No. Series Line";
340
+ begin
341
+ NoSeriesLine.SetRange("Series Code", NoSeriesCode);
342
+ NoSeriesLine.SetFilter("Starting Date", '<=%1', SeriesDate);
343
+ NoSeriesLine.SetFilter("Ending Date", '%1|>=%2', 0D, SeriesDate);
344
+
345
+ if not NoSeriesLine.FindLast() then
346
+ Error('No applicable No. Series Line found for %1 on %2', NoSeriesCode, SeriesDate);
347
+
348
+ exit(NoSeriesLine);
349
+ end;
350
+
351
+ local procedure GenerateNextNumberSafe(var NoSeriesLine: Record "No. Series Line"): Code[20]
352
+ var
353
+ NextNo: Code[20];
354
+ LastUsedNo: Code[20];
355
+ begin
356
+ // Re-read to get latest values
357
+ NoSeriesLine.Find();
358
+
359
+ if NoSeriesLine."Last No. Used" = '' then
360
+ NextNo := NoSeriesLine."Starting No."
361
+ else begin
362
+ NextNo := IncrementNumber(NoSeriesLine."Last No. Used", NoSeriesLine."Increment-by No.");
363
+ end;
364
+
365
+ // Validate against ending number
366
+ if (NoSeriesLine."Ending No." <> '') and (NextNo > NoSeriesLine."Ending No.") then
367
+ Error('No. Series %1 has reached its ending number %2', NoSeriesLine."Series Code", NoSeriesLine."Ending No.");
368
+
369
+ exit(NextNo);
370
+ end;
371
+
372
+ local procedure UpdateNoSeriesLineSafe(var NoSeriesLine: Record "No. Series Line"; NextNo: Code[20])
373
+ begin
374
+ NoSeriesLine."Last No. Used" := NextNo;
375
+ NoSeriesLine."Last Date Used" := Today;
376
+ NoSeriesLine.Modify(true);
377
+ end;
378
+
379
+ local procedure IncrementNumber(CurrentNo: Code[20]; IncrementBy: Integer): Code[20]
380
+ var
381
+ NumberPart: BigInteger;
382
+ PrefixPart: Text;
383
+ SuffixPart: Text;
384
+ NumberLength: Integer;
385
+ begin
386
+ ParseNumberComponents(CurrentNo, PrefixPart, NumberPart, SuffixPart, NumberLength);
387
+ NumberPart += IncrementBy;
388
+ exit(ReconstructNumber(PrefixPart, NumberPart, SuffixPart, NumberLength));
389
+ end;
390
+
391
+ local procedure ParseNumberComponents(NumberStr: Code[20]; var Prefix: Text; var Number: BigInteger; var Suffix: Text; var NumberLength: Integer)
392
+ begin
393
+ // Implementation from previous example
394
+ end;
395
+
396
+ local procedure ReconstructNumber(Prefix: Text; Number: BigInteger; Suffix: Text; NumberLength: Integer): Code[20]
397
+ begin
398
+ // Implementation from previous example
399
+ end;
400
+ }
401
+ ```
402
+
403
+ ## Batch Number Allocation
404
+
405
+ ```al
406
+ // Optimized batch allocation for high-volume scenarios
407
+ codeunit 50502 "Batch No. Series Allocation"
408
+ {
409
+ var
410
+ AllocatedNumbers: Dictionary of [Code[20], List of [Code[20]]];
411
+
412
+ procedure AllocateNumberBatch(NoSeriesCode: Code[20]; BatchSize: Integer): List of [Code[20]]
413
+ var
414
+ NoSeriesLine: Record "No. Series Line";
415
+ AllocatedBatch: List of [Code[20]];
416
+ NextNo: Code[20];
417
+ i: Integer;
418
+ begin
419
+ if BatchSize <= 0 then
420
+ Error('Batch size must be greater than zero');
421
+
422
+ if BatchSize > 1000 then
423
+ Error('Batch size cannot exceed 1000');
424
+
425
+ // Lock the series for batch allocation
426
+ LockNoSeriesForBatch(NoSeriesCode);
427
+
428
+ try
429
+ NoSeriesLine := FindApplicableNoSeriesLine(NoSeriesCode, Today);
430
+
431
+ // Allocate batch
432
+ for i := 1 to BatchSize do begin
433
+ NextNo := GenerateNextNumberInBatch(NoSeriesLine, i);
434
+ AllocatedBatch.Add(NextNo);
435
+ end;
436
+
437
+ // Update the line with the last allocated number
438
+ UpdateNoSeriesLineForBatch(NoSeriesLine, AllocatedBatch.Get(BatchSize));
439
+
440
+ // Cache allocated numbers
441
+ AllocatedNumbers.Set(NoSeriesCode, AllocatedBatch);
442
+
443
+ Commit();
444
+
445
+ finally
446
+ UnlockNoSeriesForBatch(NoSeriesCode);
447
+ end;
448
+
449
+ exit(AllocatedBatch);
450
+ end;
451
+
452
+ procedure GetNextFromBatch(NoSeriesCode: Code[20]): Code[20]
453
+ var
454
+ BatchList: List of [Code[20]];
455
+ NextNo: Code[20];
456
+ begin
457
+ if not AllocatedNumbers.Get(NoSeriesCode, BatchList) then
458
+ Error('No allocated batch found for series %1', NoSeriesCode);
459
+
460
+ if BatchList.Count = 0 then begin
461
+ // Batch exhausted, allocate new batch
462
+ BatchList := AllocateNumberBatch(NoSeriesCode, 100); // Default batch size
463
+ end;
464
+
465
+ NextNo := BatchList.Get(1);
466
+ BatchList.RemoveAt(1);
467
+ AllocatedNumbers.Set(NoSeriesCode, BatchList);
468
+
469
+ LogBatchUsage(NoSeriesCode, NextNo);
470
+
471
+ exit(NextNo);
472
+ end;
473
+
474
+ procedure GetBatchStatus(NoSeriesCode: Code[20]): Dictionary of [Text, Variant]
475
+ var
476
+ Status: Dictionary of [Text, Variant];
477
+ BatchList: List of [Code[20]];
478
+ begin
479
+ Status.Set('SeriesCode', NoSeriesCode);
480
+
481
+ if AllocatedNumbers.Get(NoSeriesCode, BatchList) then begin
482
+ Status.Set('HasBatch', true);
483
+ Status.Set('RemainingNumbers', BatchList.Count);
484
+ if BatchList.Count > 0 then begin
485
+ Status.Set('NextAvailable', BatchList.Get(1));
486
+ Status.Set('LastInBatch', BatchList.Get(BatchList.Count));
487
+ end;
488
+ end else begin
489
+ Status.Set('HasBatch', false);
490
+ Status.Set('RemainingNumbers', 0);
491
+ end;
492
+
493
+ exit(Status);
494
+ end;
495
+
496
+ local procedure FindApplicableNoSeriesLine(NoSeriesCode: Code[20]; SeriesDate: Date): Record "No. Series Line"
497
+ var
498
+ NoSeriesLine: Record "No. Series Line";
499
+ begin
500
+ NoSeriesLine.SetRange("Series Code", NoSeriesCode);
501
+ NoSeriesLine.SetFilter("Starting Date", '<=%1', SeriesDate);
502
+ NoSeriesLine.SetFilter("Ending Date", '%1|>=%2', 0D, SeriesDate);
503
+
504
+ if not NoSeriesLine.FindLast() then
505
+ Error('No applicable No. Series Line found for %1 on %2', NoSeriesCode, SeriesDate);
506
+
507
+ exit(NoSeriesLine);
508
+ end;
509
+
510
+ local procedure GenerateNextNumberInBatch(var NoSeriesLine: Record "No. Series Line"; BatchIndex: Integer): Code[20]
511
+ var
512
+ BaseNumber: Code[20];
513
+ NumberPart: BigInteger;
514
+ PrefixPart: Text;
515
+ SuffixPart: Text;
516
+ NumberLength: Integer;
517
+ begin
518
+ if BatchIndex = 1 then begin
519
+ if NoSeriesLine."Last No. Used" = '' then
520
+ BaseNumber := NoSeriesLine."Starting No."
521
+ else
522
+ BaseNumber := IncrementNumber(NoSeriesLine."Last No. Used", NoSeriesLine."Increment-by No.");
523
+ end else begin
524
+ BaseNumber := IncrementNumber(BaseNumber, NoSeriesLine."Increment-by No.");
525
+ end;
526
+
527
+ // Validate against ending number
528
+ if (NoSeriesLine."Ending No." <> '') and (BaseNumber > NoSeriesLine."Ending No.") then
529
+ Error('No. Series %1 would exceed its ending number %2 in batch allocation', NoSeriesLine."Series Code", NoSeriesLine."Ending No.");
530
+
531
+ exit(BaseNumber);
532
+ end;
533
+
534
+ local procedure UpdateNoSeriesLineForBatch(var NoSeriesLine: Record "No. Series Line"; LastAllocatedNo: Code[20])
535
+ begin
536
+ NoSeriesLine."Last No. Used" := LastAllocatedNo;
537
+ NoSeriesLine."Last Date Used" := Today;
538
+ NoSeriesLine.Modify(true);
539
+ end;
540
+
541
+ local procedure LockNoSeriesForBatch(NoSeriesCode: Code[20])
542
+ var
543
+ NoSeriesBatchLock: Record "No. Series Batch Lock";
544
+ begin
545
+ NoSeriesBatchLock.Init();
546
+ NoSeriesBatchLock."Series Code" := NoSeriesCode;
547
+ NoSeriesBatchLock."Locked By" := UserId;
548
+ NoSeriesBatchLock."Lock Time" := CurrentDateTime;
549
+ NoSeriesBatchLock.Insert(true);
550
+ end;
551
+
552
+ local procedure UnlockNoSeriesForBatch(NoSeriesCode: Code[20])
553
+ var
554
+ NoSeriesBatchLock: Record "No. Series Batch Lock";
555
+ begin
556
+ NoSeriesBatchLock.SetRange("Series Code", NoSeriesCode);
557
+ NoSeriesBatchLock.SetRange("Locked By", UserId);
558
+ if NoSeriesBatchLock.FindFirst() then
559
+ NoSeriesBatchLock.Delete(true);
560
+ end;
561
+
562
+ local procedure IncrementNumber(CurrentNo: Code[20]; IncrementBy: Integer): Code[20]
563
+ begin
564
+ // Implementation from previous examples
565
+ end;
566
+
567
+ local procedure LogBatchUsage(NoSeriesCode: Code[20]; UsedNo: Code[20])
568
+ var
569
+ NoSeriesBatchLog: Record "No. Series Batch Log";
570
+ begin
571
+ NoSeriesBatchLog.Init();
572
+ NoSeriesBatchLog."Entry No." := GetNextBatchLogEntryNo();
573
+ NoSeriesBatchLog."Series Code" := NoSeriesCode;
574
+ NoSeriesBatchLog."Used No." := UsedNo;
575
+ NoSeriesBatchLog."Usage Date" := Today;
576
+ NoSeriesBatchLog."Usage Time" := Time;
577
+ NoSeriesBatchLog."User ID" := UserId;
578
+ NoSeriesBatchLog.Insert(true);
579
+ end;
580
+
581
+ local procedure GetNextBatchLogEntryNo(): Integer
582
+ var
583
+ NoSeriesBatchLog: Record "No. Series Batch Log";
584
+ begin
585
+ if NoSeriesBatchLog.FindLast() then
586
+ exit(NoSeriesBatchLog."Entry No." + 1)
587
+ else
588
+ exit(1);
589
+ end;
590
+ }
591
+ ```
592
+
593
+ ## Multi-Dimensional Number Generation
594
+
595
+ ```al
596
+ // Support for complex numbering schemes with multiple dimensions
597
+ codeunit 50503 "Multi-Dimensional No. Series"
598
+ {
599
+ procedure GetNextCompoundNo(BaseSeriesCode: Code[20]; Dimensions: Dictionary of [Text, Text]): Code[20]
600
+ var
601
+ CompoundCode: Code[20];
602
+ GeneratedNo: Code[20];
603
+ begin
604
+ CompoundCode := BuildCompoundSeriesCode(BaseSeriesCode, Dimensions);
605
+ GeneratedNo := GetOrCreateCompoundSeries(CompoundCode, Dimensions);
606
+
607
+ LogCompoundNumberGeneration(BaseSeriesCode, CompoundCode, GeneratedNo, Dimensions);
608
+
609
+ exit(GeneratedNo);
610
+ end;
611
+
612
+ procedure GetLocationBasedNo(BaseSeriesCode: Code[20]; LocationCode: Code[10]): Code[20]
613
+ var
614
+ Dimensions: Dictionary of [Text, Text];
615
+ begin
616
+ Dimensions.Set('LOCATION', LocationCode);
617
+ exit(GetNextCompoundNo(BaseSeriesCode, Dimensions));
618
+ end;
619
+
620
+ procedure GetYearBasedNo(BaseSeriesCode: Code[20]; FiscalYear: Integer): Code[20]
621
+ var
622
+ Dimensions: Dictionary of [Text, Text];
623
+ begin
624
+ Dimensions.Set('YEAR', Format(FiscalYear));
625
+ exit(GetNextCompoundNo(BaseSeriesCode, Dimensions));
626
+ end;
627
+
628
+ procedure GetDepartmentBasedNo(BaseSeriesCode: Code[20]; DepartmentCode: Code[10]; LocationCode: Code[10]): Code[20]
629
+ var
630
+ Dimensions: Dictionary of [Text, Text];
631
+ begin
632
+ Dimensions.Set('DEPARTMENT', DepartmentCode);
633
+ Dimensions.Set('LOCATION', LocationCode);
634
+ exit(GetNextCompoundNo(BaseSeriesCode, Dimensions));
635
+ end;
636
+
637
+ local procedure BuildCompoundSeriesCode(BaseSeriesCode: Code[20]; Dimensions: Dictionary of [Text, Text]): Code[20]
638
+ var
639
+ CompoundCode: Text;
640
+ DimensionKey: Text;
641
+ DimensionValue: Text;
642
+ SortedKeys: List of [Text];
643
+ begin
644
+ CompoundCode := BaseSeriesCode;
645
+
646
+ // Sort dimension keys for consistent ordering
647
+ foreach DimensionKey in Dimensions.Keys do
648
+ SortedKeys.Add(DimensionKey);
649
+
650
+ SortDimensionKeys(SortedKeys);
651
+
652
+ // Build compound code
653
+ foreach DimensionKey in SortedKeys do begin
654
+ Dimensions.Get(DimensionKey, DimensionValue);
655
+ CompoundCode += '-' + DimensionKey + '-' + DimensionValue;
656
+ end;
657
+
658
+ // Ensure code fits in 20 characters
659
+ if StrLen(CompoundCode) > 20 then
660
+ CompoundCode := CreateHashedCompoundCode(BaseSeriesCode, Dimensions);
661
+
662
+ exit(CopyStr(CompoundCode, 1, 20));
663
+ end;
664
+
665
+ local procedure GetOrCreateCompoundSeries(CompoundCode: Code[20]; Dimensions: Dictionary of [Text, Text]): Code[20]
666
+ var
667
+ NoSeries: Record "No. Series";
668
+ CustomNoSeriesManagement: Codeunit "Custom No. Series Management";
669
+ StartingNo: Code[20];
670
+ EndingNo: Code[20];
671
+ begin
672
+ if not NoSeries.Get(CompoundCode) then begin
673
+ // Create new compound series
674
+ StartingNo := BuildStartingNumber(Dimensions);
675
+ EndingNo := BuildEndingNumber(Dimensions);
676
+
677
+ if not CustomNoSeriesManagement.CreateCustomNoSeries(
678
+ CompoundCode,
679
+ 'Auto-generated compound series',
680
+ StartingNo,
681
+ EndingNo) then
682
+ Error('Failed to create compound No. Series %1', CompoundCode);
683
+ end;
684
+
685
+ exit(CustomNoSeriesManagement.GetNextNo(CompoundCode, Today));
686
+ end;
687
+
688
+ local procedure BuildStartingNumber(Dimensions: Dictionary of [Text, Text]): Code[20]
689
+ var
690
+ StartingNo: Text;
691
+ DimensionKey: Text;
692
+ DimensionValue: Text;
693
+ begin
694
+ StartingNo := '';
695
+
696
+ // Build starting number based on dimensions
697
+ if Dimensions.Get('LOCATION', DimensionValue) then
698
+ StartingNo += DimensionValue;
699
+
700
+ if Dimensions.Get('DEPARTMENT', DimensionValue) then
701
+ StartingNo += DimensionValue;
702
+
703
+ if Dimensions.Get('YEAR', DimensionValue) then
704
+ StartingNo += CopyStr(DimensionValue, 3, 2); // Last 2 digits of year
705
+
706
+ StartingNo += '00001';
707
+
708
+ exit(CopyStr(StartingNo, 1, 20));
709
+ end;
710
+
711
+ local procedure BuildEndingNumber(Dimensions: Dictionary of [Text, Text]): Code[20]
712
+ var
713
+ EndingNo: Text;
714
+ DimensionKey: Text;
715
+ DimensionValue: Text;
716
+ begin
717
+ EndingNo := '';
718
+
719
+ // Build ending number based on dimensions
720
+ if Dimensions.Get('LOCATION', DimensionValue) then
721
+ EndingNo += DimensionValue;
722
+
723
+ if Dimensions.Get('DEPARTMENT', DimensionValue) then
724
+ EndingNo += DimensionValue;
725
+
726
+ if Dimensions.Get('YEAR', DimensionValue) then
727
+ EndingNo += CopyStr(DimensionValue, 3, 2); // Last 2 digits of year
728
+
729
+ EndingNo += '99999';
730
+
731
+ exit(CopyStr(EndingNo, 1, 20));
732
+ end;
733
+
734
+ local procedure CreateHashedCompoundCode(BaseSeriesCode: Code[20]; Dimensions: Dictionary of [Text, Text]): Code[20]
735
+ var
736
+ HashInput: Text;
737
+ DimensionKey: Text;
738
+ DimensionValue: Text;
739
+ HashValue: Text;
740
+ begin
741
+ HashInput := BaseSeriesCode;
742
+
743
+ foreach DimensionKey in Dimensions.Keys do begin
744
+ Dimensions.Get(DimensionKey, DimensionValue);
745
+ HashInput += DimensionKey + DimensionValue;
746
+ end;
747
+
748
+ // Create simple hash (in production, use proper hashing)
749
+ HashValue := Format(HashInput.GetHashCode(), 0, '<Integer,8><Filler Character,0>');
750
+
751
+ exit(CopyStr(BaseSeriesCode + '-' + HashValue, 1, 20));
752
+ end;
753
+
754
+ local procedure SortDimensionKeys(var Keys: List of [Text])
755
+ var
756
+ i, j: Integer;
757
+ temp: Text;
758
+ begin
759
+ // Simple bubble sort for demonstration
760
+ for i := 1 to Keys.Count - 1 do begin
761
+ for j := 1 to Keys.Count - i do begin
762
+ if Keys.Get(j) > Keys.Get(j + 1) then begin
763
+ temp := Keys.Get(j);
764
+ Keys.Set(j, Keys.Get(j + 1));
765
+ Keys.Set(j + 1, temp);
766
+ end;
767
+ end;
768
+ end;
769
+ end;
770
+
771
+ local procedure LogCompoundNumberGeneration(BaseSeriesCode: Code[20]; CompoundCode: Code[20]; GeneratedNo: Code[20]; Dimensions: Dictionary of [Text, Text])
772
+ var
773
+ CompoundNoLog: Record "Compound No. Log";
774
+ DimensionText: Text;
775
+ DimensionKey: Text;
776
+ DimensionValue: Text;
777
+ begin
778
+ // Build dimension text
779
+ foreach DimensionKey in Dimensions.Keys do begin
780
+ Dimensions.Get(DimensionKey, DimensionValue);
781
+ if DimensionText <> '' then
782
+ DimensionText += '; ';
783
+ DimensionText += DimensionKey + '=' + DimensionValue;
784
+ end;
785
+
786
+ CompoundNoLog.Init();
787
+ CompoundNoLog."Entry No." := GetNextCompoundLogEntryNo();
788
+ CompoundNoLog."Base Series Code" := BaseSeriesCode;
789
+ CompoundNoLog."Compound Series Code" := CompoundCode;
790
+ CompoundNoLog."Generated No." := GeneratedNo;
791
+ CompoundNoLog."Dimensions" := CopyStr(DimensionText, 1, 250);
792
+ CompoundNoLog."Generation Date" := Today;
793
+ CompoundNoLog."Generation Time" := Time;
794
+ CompoundNoLog."User ID" := UserId;
795
+ CompoundNoLog.Insert(true);
796
+ end;
797
+
798
+ local procedure GetNextCompoundLogEntryNo(): Integer
799
+ var
800
+ CompoundNoLog: Record "Compound No. Log";
801
+ begin
802
+ if CompoundNoLog.FindLast() then
803
+ exit(CompoundNoLog."Entry No." + 1)
804
+ else
805
+ exit(1);
806
+ end;
807
+ }
808
+ ```
809
+
810
+ This comprehensive implementation provides robust number generation capabilities including basic number series management, concurrency control, batch allocation, and multi-dimensional numbering for complex Business Central scenarios.