@salesforce/afv-skills 1.8.0 → 1.9.0

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 (488) hide show
  1. package/package.json +1 -1
  2. package/skills/activating-datacloud/CREDITS.md +5 -0
  3. package/skills/activating-datacloud/README.md +39 -0
  4. package/skills/activating-datacloud/SKILL.md +118 -0
  5. package/skills/analyzing-omnistudio-dependencies/CREDITS.md +5 -0
  6. package/skills/analyzing-omnistudio-dependencies/SKILL.md +477 -0
  7. package/skills/analyzing-omnistudio-dependencies/references/dependency-patterns.md +508 -0
  8. package/skills/analyzing-omnistudio-dependencies/references/namespace-guide.md +300 -0
  9. package/skills/building-omnistudio-callable-apex/CREDITS.md +9 -0
  10. package/skills/building-omnistudio-callable-apex/README.md +80 -0
  11. package/skills/building-omnistudio-callable-apex/SKILL.md +276 -0
  12. package/skills/building-omnistudio-callable-apex/assets/pattern_callable_openinterface.cls +40 -0
  13. package/skills/building-omnistudio-callable-apex/assets/pattern_callable_vanilla.cls +32 -0
  14. package/skills/building-omnistudio-callable-apex/assets/pattern_migration.cls +54 -0
  15. package/skills/building-omnistudio-callable-apex/assets/pattern_openinterface.cls +45 -0
  16. package/skills/building-omnistudio-callable-apex/assets/pattern_test_class.cls +65 -0
  17. package/skills/building-omnistudio-callable-apex/examples/Test_QuoteByProductCallable/IndustriesCallableException.cls +7 -0
  18. package/skills/building-omnistudio-callable-apex/examples/Test_QuoteByProductCallable/Industries_QuoteByProductCallable.cls +115 -0
  19. package/skills/building-omnistudio-callable-apex/examples/Test_QuoteByProductCallable/Industries_QuoteByProductCallableTest.cls +189 -0
  20. package/skills/building-omnistudio-callable-apex/examples/Test_QuoteByProductCallable/TRANSCRIPT.md +115 -0
  21. package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/IndustriesCallableException.cls +7 -0
  22. package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/MyCustomCallable.cls +74 -0
  23. package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/MyCustomCallableTest.cls +146 -0
  24. package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/MyCustomRemoteClass.cls +16 -0
  25. package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/TRANSCRIPT.md +120 -0
  26. package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/IndustriesCallableException.cls +7 -0
  27. package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/MyCustomCallable.cls +73 -0
  28. package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/MyCustomCallableTest.cls +128 -0
  29. package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/MyCustomVlocityOpenInterface2.cls +23 -0
  30. package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/TRANSCRIPT.md +75 -0
  31. package/skills/building-omnistudio-datamapper/CREDITS.md +5 -0
  32. package/skills/building-omnistudio-datamapper/SKILL.md +270 -0
  33. package/skills/building-omnistudio-datamapper/assets/completion-summary-template.md +28 -0
  34. package/skills/building-omnistudio-datamapper/assets/omni-data-transform-extract.json +6 -0
  35. package/skills/building-omnistudio-datamapper/assets/omni-data-transform-item.json +12 -0
  36. package/skills/building-omnistudio-datamapper/assets/omni-data-transform-load.json +6 -0
  37. package/skills/building-omnistudio-datamapper/assets/omni-data-transform-transform.json +6 -0
  38. package/skills/building-omnistudio-datamapper/references/best-practices.md +277 -0
  39. package/skills/building-omnistudio-datamapper/references/naming-conventions.md +145 -0
  40. package/skills/building-omnistudio-flexcard/CREDITS.md +5 -0
  41. package/skills/building-omnistudio-flexcard/SKILL.md +325 -0
  42. package/skills/building-omnistudio-flexcard/assets/omni-ui-card.json +10 -0
  43. package/skills/building-omnistudio-flexcard/references/best-practices.md +291 -0
  44. package/skills/building-omnistudio-flexcard/references/data-binding-guide.md +311 -0
  45. package/skills/building-omnistudio-flexcard/references/scoring-rubric.md +66 -0
  46. package/skills/building-omnistudio-flexcard/scripts/flexcard-commands.sh +24 -0
  47. package/skills/building-omnistudio-integration-procedure/CREDITS.md +5 -0
  48. package/skills/building-omnistudio-integration-procedure/SKILL.md +275 -0
  49. package/skills/building-omnistudio-integration-procedure/assets/omni-process-element-dr-extract.json +10 -0
  50. package/skills/building-omnistudio-integration-procedure/assets/omni-process-element-set-values.json +10 -0
  51. package/skills/building-omnistudio-integration-procedure/assets/omni-process-ip.json +12 -0
  52. package/skills/building-omnistudio-integration-procedure/assets/scoring-report-format.txt +14 -0
  53. package/skills/building-omnistudio-integration-procedure/references/best-practices.md +388 -0
  54. package/skills/building-omnistudio-integration-procedure/references/element-types.md +588 -0
  55. package/skills/building-omnistudio-integration-procedure/scripts/cli-commands.sh +18 -0
  56. package/skills/building-omnistudio-omniscript/CREDITS.md +5 -0
  57. package/skills/building-omnistudio-omniscript/SKILL.md +367 -0
  58. package/skills/building-omnistudio-omniscript/assets/omni-process-element-step.json +10 -0
  59. package/skills/building-omnistudio-omniscript/assets/omni-process-element-text-block.json +11 -0
  60. package/skills/building-omnistudio-omniscript/assets/omni-process-omniscript.json +12 -0
  61. package/skills/building-omnistudio-omniscript/references/best-practices.md +480 -0
  62. package/skills/building-omnistudio-omniscript/references/element-types.md +1172 -0
  63. package/skills/building-omnistudio-omniscript/scripts/check-duplicate-omniscript.sh +13 -0
  64. package/skills/building-omnistudio-omniscript/scripts/cli-reference.sh +21 -0
  65. package/skills/building-omnistudio-omniscript/scripts/deploy-omniscript.sh +29 -0
  66. package/skills/building-sf-integrations/CREDITS.md +5 -0
  67. package/skills/building-sf-integrations/README.md +95 -0
  68. package/skills/building-sf-integrations/SKILL.md +192 -0
  69. package/skills/building-sf-integrations/assets/callouts/callout-retry-handler.cls +167 -0
  70. package/skills/building-sf-integrations/assets/callouts/http-response-handler.cls +257 -0
  71. package/skills/building-sf-integrations/assets/callouts/rest-queueable-callout.cls +262 -0
  72. package/skills/building-sf-integrations/assets/callouts/rest-sync-callout.cls +211 -0
  73. package/skills/building-sf-integrations/assets/cdc/cdc-handler.cls +246 -0
  74. package/skills/building-sf-integrations/assets/cdc/cdc-subscriber-trigger.trigger +139 -0
  75. package/skills/building-sf-integrations/assets/endpoint-security/example.cspTrustedSite-meta.xml +58 -0
  76. package/skills/building-sf-integrations/assets/endpoint-security/example.remoteSite-meta.xml +39 -0
  77. package/skills/building-sf-integrations/assets/external-credentials/jwt-external-credential.externalCredential-meta.xml +90 -0
  78. package/skills/building-sf-integrations/assets/external-credentials/oauth-external-credential.externalCredential-meta.xml +87 -0
  79. package/skills/building-sf-integrations/assets/external-services/external-service-operations.md +221 -0
  80. package/skills/building-sf-integrations/assets/external-services/openapi-registration.externalServiceRegistration-meta.xml +193 -0
  81. package/skills/building-sf-integrations/assets/named-credentials/certificate-auth.namedCredential-meta.xml +62 -0
  82. package/skills/building-sf-integrations/assets/named-credentials/custom-auth.namedCredential-meta.xml +71 -0
  83. package/skills/building-sf-integrations/assets/named-credentials/oauth-client-credentials.namedCredential-meta.xml +51 -0
  84. package/skills/building-sf-integrations/assets/named-credentials/oauth-jwt-bearer.namedCredential-meta.xml +67 -0
  85. package/skills/building-sf-integrations/assets/platform-events/event-publisher.cls +191 -0
  86. package/skills/building-sf-integrations/assets/platform-events/event-subscriber-action.cls +295 -0
  87. package/skills/building-sf-integrations/assets/platform-events/event-subscriber-trigger.trigger +108 -0
  88. package/skills/building-sf-integrations/assets/platform-events/platform-event-definition.object-meta.xml +124 -0
  89. package/skills/building-sf-integrations/assets/soap/soap-callout-service.cls +186 -0
  90. package/skills/building-sf-integrations/assets/soap/wsdl2apex-guide.md +213 -0
  91. package/skills/building-sf-integrations/hooks/scripts/suggest_credential_setup.py +271 -0
  92. package/skills/building-sf-integrations/hooks/scripts/validate_integration.py +363 -0
  93. package/skills/building-sf-integrations/references/callout-patterns.md +719 -0
  94. package/skills/building-sf-integrations/references/cdc-guide.md +288 -0
  95. package/skills/building-sf-integrations/references/cli-reference.md +94 -0
  96. package/skills/building-sf-integrations/references/event-driven-architecture-guide.md +266 -0
  97. package/skills/building-sf-integrations/references/event-patterns.md +838 -0
  98. package/skills/building-sf-integrations/references/external-services-guide.md +303 -0
  99. package/skills/building-sf-integrations/references/messaging-api-v2.md +609 -0
  100. package/skills/building-sf-integrations/references/named-credentials-automation.md +201 -0
  101. package/skills/building-sf-integrations/references/named-credentials-guide.md +173 -0
  102. package/skills/building-sf-integrations/references/platform-events-guide.md +288 -0
  103. package/skills/building-sf-integrations/references/rest-callout-patterns.md +288 -0
  104. package/skills/building-sf-integrations/references/scoring-rubric.md +59 -0
  105. package/skills/building-sf-integrations/references/security-best-practices.md +248 -0
  106. package/skills/building-sf-integrations/scripts/README.md +100 -0
  107. package/skills/building-sf-integrations/scripts/configure-named-credential.sh +236 -0
  108. package/skills/building-sf-integrations/scripts/set-api-credential.sh +146 -0
  109. package/skills/building-sf-integrations/scripts/templates/setup-credentials-with-csp.sh +158 -0
  110. package/skills/configuring-connected-apps/CREDITS.md +3 -0
  111. package/skills/configuring-connected-apps/README.md +99 -0
  112. package/skills/configuring-connected-apps/SKILL.md +224 -0
  113. package/skills/configuring-connected-apps/assets/connected-app-basic.xml +29 -0
  114. package/skills/configuring-connected-apps/assets/connected-app-canvas.xml +62 -0
  115. package/skills/configuring-connected-apps/assets/connected-app-jwt.xml +49 -0
  116. package/skills/configuring-connected-apps/assets/connected-app-oauth.xml +65 -0
  117. package/skills/configuring-connected-apps/assets/eca-global-oauth.xml +36 -0
  118. package/skills/configuring-connected-apps/assets/eca-oauth-settings.xml +36 -0
  119. package/skills/configuring-connected-apps/assets/eca-policies.xml +36 -0
  120. package/skills/configuring-connected-apps/assets/external-client-app.xml +35 -0
  121. package/skills/configuring-connected-apps/references/example-usage.md +256 -0
  122. package/skills/configuring-connected-apps/references/migration-guide.md +328 -0
  123. package/skills/configuring-connected-apps/references/oauth-flows-reference.md +660 -0
  124. package/skills/configuring-connected-apps/references/security-checklist.md +209 -0
  125. package/skills/configuring-connected-apps/references/testing-validation-guide.md +275 -0
  126. package/skills/connecting-datacloud/CREDITS.md +5 -0
  127. package/skills/connecting-datacloud/README.md +59 -0
  128. package/skills/connecting-datacloud/SKILL.md +155 -0
  129. package/skills/connecting-datacloud/examples/connections/heroku-postgres.json +15 -0
  130. package/skills/connecting-datacloud/examples/connections/ingest-api-connection.json +5 -0
  131. package/skills/connecting-datacloud/examples/connections/ingest-api-schema.json +31 -0
  132. package/skills/connecting-datacloud/examples/connections/redshift.json +16 -0
  133. package/skills/connecting-datacloud/examples/connections/sharepoint-unstructured.json +20 -0
  134. package/skills/connecting-datacloud/examples/connections/snowflake-connection.json +42 -0
  135. package/skills/debugging-apex-logs/CREDITS.md +22 -0
  136. package/skills/debugging-apex-logs/README.md +74 -0
  137. package/skills/debugging-apex-logs/SKILL.md +172 -0
  138. package/skills/debugging-apex-logs/assets/benchmarking-template.cls +327 -0
  139. package/skills/debugging-apex-logs/assets/cpu-heap-optimization.cls +307 -0
  140. package/skills/debugging-apex-logs/assets/dml-in-loop-fix.cls +219 -0
  141. package/skills/debugging-apex-logs/assets/null-pointer-fix.cls +252 -0
  142. package/skills/debugging-apex-logs/assets/soql-in-loop-fix.cls +157 -0
  143. package/skills/debugging-apex-logs/references/analysis-playbook.md +53 -0
  144. package/skills/debugging-apex-logs/references/benchmarking-guide.md +287 -0
  145. package/skills/debugging-apex-logs/references/cli-commands.md +368 -0
  146. package/skills/debugging-apex-logs/references/common-issues.md +68 -0
  147. package/skills/debugging-apex-logs/references/debug-log-reference.md +328 -0
  148. package/skills/debugging-apex-logs/references/log-analysis-tools.md +248 -0
  149. package/skills/debugging-apex-logs/references/scoring-rubric.md +21 -0
  150. package/skills/deploying-metadata/CREDITS.md +25 -0
  151. package/skills/deploying-metadata/README.md +104 -0
  152. package/skills/deploying-metadata/SKILL.md +214 -0
  153. package/skills/deploying-metadata/assets/destructiveChanges.xml +143 -0
  154. package/skills/deploying-metadata/assets/package.xml +121 -0
  155. package/skills/deploying-metadata/references/agent-deployment-guide.md +628 -0
  156. package/skills/deploying-metadata/references/deploy.sh +73 -0
  157. package/skills/deploying-metadata/references/deployment-report-template.md +89 -0
  158. package/skills/deploying-metadata/references/deployment-workflows.md +395 -0
  159. package/skills/deploying-metadata/references/orchestration.md +183 -0
  160. package/skills/deploying-metadata/references/trigger-deployment-safety.md +376 -0
  161. package/skills/deploying-omnistudio-datapacks/CREDITS.md +5 -0
  162. package/skills/deploying-omnistudio-datapacks/README.md +88 -0
  163. package/skills/deploying-omnistudio-datapacks/SKILL.md +174 -0
  164. package/skills/deploying-omnistudio-datapacks/examples/business-internet-plus-bundle/TRANSCRIPT.md +124 -0
  165. package/skills/deploying-omnistudio-datapacks/examples/business-internet-plus-bundle/deploy-business-internet-plus-bundle.yaml +11 -0
  166. package/skills/deploying-omnistudio-datapacks/examples/business-internet-plus-bundle-deploy/TRANSCRIPT.md +142 -0
  167. package/skills/deploying-omnistudio-datapacks/examples/business-internet-plus-bundle-deploy/deploy-business-internet-plus-bundle.yaml +10 -0
  168. package/skills/deploying-omnistudio-datapacks/references/job-file-template.md +42 -0
  169. package/skills/deploying-omnistudio-datapacks/references/troubleshooting-matrix.md +24 -0
  170. package/skills/developing-agentforce/assets/metadata/http-callout-flow.flow-meta.xml +1 -1
  171. package/skills/developing-agentforce/references/actions-reference.md +8 -8
  172. package/skills/fetching-salesforce-docs/README.md +66 -0
  173. package/skills/fetching-salesforce-docs/SKILL.md +209 -0
  174. package/skills/fetching-salesforce-docs/requirements.txt +2 -0
  175. package/skills/fetching-salesforce-docs/scripts/extract_help_salesforce.py +497 -0
  176. package/skills/fetching-salesforce-docs/scripts/extract_salesforce_doc.py +357 -0
  177. package/skills/fetching-salesforce-docs/scripts/runtime_bootstrap.py +58 -0
  178. package/skills/generating-apex/CREDITS.md +1 -26
  179. package/skills/generating-apex-test/CREDITS.md +2 -27
  180. package/skills/generating-lwc-components/CREDITS.md +5 -0
  181. package/skills/generating-lwc-components/README.md +126 -0
  182. package/skills/generating-lwc-components/SKILL.md +191 -0
  183. package/skills/generating-lwc-components/assets/apex-controller/LwcController.cls +327 -0
  184. package/skills/generating-lwc-components/assets/basic-component/basicComponent.css +72 -0
  185. package/skills/generating-lwc-components/assets/basic-component/basicComponent.html +111 -0
  186. package/skills/generating-lwc-components/assets/basic-component/basicComponent.js +163 -0
  187. package/skills/generating-lwc-components/assets/basic-component/basicComponent.js-meta.xml +137 -0
  188. package/skills/generating-lwc-components/assets/datatable-component/datatableComponent.html +111 -0
  189. package/skills/generating-lwc-components/assets/datatable-component/datatableComponent.js +367 -0
  190. package/skills/generating-lwc-components/assets/flow-screen-component/flowScreenComponent.css +63 -0
  191. package/skills/generating-lwc-components/assets/flow-screen-component/flowScreenComponent.html +154 -0
  192. package/skills/generating-lwc-components/assets/flow-screen-component/flowScreenComponent.js +348 -0
  193. package/skills/generating-lwc-components/assets/flow-screen-component/flowScreenComponent.js-meta.xml +87 -0
  194. package/skills/generating-lwc-components/assets/form-component/formComponent.html +165 -0
  195. package/skills/generating-lwc-components/assets/form-component/formComponent.js +275 -0
  196. package/skills/generating-lwc-components/assets/graphql-component/graphqlComponent.html +100 -0
  197. package/skills/generating-lwc-components/assets/graphql-component/graphqlComponent.js +336 -0
  198. package/skills/generating-lwc-components/assets/jest-test/componentName.test.js.example +371 -0
  199. package/skills/generating-lwc-components/assets/message-channel/RecordSelected.messageChannel-meta.xml +71 -0
  200. package/skills/generating-lwc-components/assets/message-channel/lmsPublisher.js +103 -0
  201. package/skills/generating-lwc-components/assets/message-channel/lmsSubscriber.js +181 -0
  202. package/skills/generating-lwc-components/assets/modal-component/modalComponent.html +85 -0
  203. package/skills/generating-lwc-components/assets/modal-component/modalComponent.js +199 -0
  204. package/skills/generating-lwc-components/assets/record-picker/recordPicker.html +55 -0
  205. package/skills/generating-lwc-components/assets/record-picker/recordPicker.js +199 -0
  206. package/skills/generating-lwc-components/assets/state-store/store.js +282 -0
  207. package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.css +65 -0
  208. package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.html +95 -0
  209. package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.js-meta.xml +75 -0
  210. package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.test.ts.example +301 -0
  211. package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.ts +295 -0
  212. package/skills/generating-lwc-components/assets/workspace-api/workspaceComponent.html +71 -0
  213. package/skills/generating-lwc-components/assets/workspace-api/workspaceComponent.js +316 -0
  214. package/skills/generating-lwc-components/hooks/scripts/lwc-lsp-validate.py +295 -0
  215. package/skills/generating-lwc-components/hooks/scripts/post-tool-validate.py +347 -0
  216. package/skills/generating-lwc-components/hooks/scripts/slds_data/deprecated_patterns.json +74 -0
  217. package/skills/generating-lwc-components/hooks/scripts/slds_data/styling_hooks.json +111 -0
  218. package/skills/generating-lwc-components/hooks/scripts/slds_data/valid_slds_classes.json +127 -0
  219. package/skills/generating-lwc-components/hooks/scripts/slds_linter_wrapper.py +294 -0
  220. package/skills/generating-lwc-components/hooks/scripts/slds_rules/__init__.py +22 -0
  221. package/skills/generating-lwc-components/hooks/scripts/template_validator.py +332 -0
  222. package/skills/generating-lwc-components/hooks/scripts/validate_slds.py +595 -0
  223. package/skills/generating-lwc-components/references/accessibility-guide.md +843 -0
  224. package/skills/generating-lwc-components/references/advanced-features.md +108 -0
  225. package/skills/generating-lwc-components/references/async-notification-patterns.md +661 -0
  226. package/skills/generating-lwc-components/references/cli-commands.md +545 -0
  227. package/skills/generating-lwc-components/references/component-patterns.md +1476 -0
  228. package/skills/generating-lwc-components/references/flow-integration-guide.md +675 -0
  229. package/skills/generating-lwc-components/references/jest-testing.md +1011 -0
  230. package/skills/generating-lwc-components/references/lms-guide.md +860 -0
  231. package/skills/generating-lwc-components/references/lwc-best-practices.md +1310 -0
  232. package/skills/generating-lwc-components/references/performance-guide.md +861 -0
  233. package/skills/generating-lwc-components/references/scoring-and-testing.md +116 -0
  234. package/skills/generating-lwc-components/references/slds-blueprints.json +14389 -0
  235. package/skills/generating-lwc-components/references/slds-design-guide.md +166 -0
  236. package/skills/generating-lwc-components/references/state-management.md +642 -0
  237. package/skills/generating-lwc-components/references/template-anti-patterns.md +948 -0
  238. package/skills/generating-lwc-components/references/triangle-pattern.md +365 -0
  239. package/skills/generating-lwc-components/scripts/local-dev-preview.sh +34 -0
  240. package/skills/generating-mermaid-diagrams/CREDITS.md +46 -0
  241. package/skills/generating-mermaid-diagrams/README.md +114 -0
  242. package/skills/generating-mermaid-diagrams/SKILL.md +218 -0
  243. package/skills/generating-mermaid-diagrams/assets/agentforce/agent-flow.md +313 -0
  244. package/skills/generating-mermaid-diagrams/assets/architecture/system-landscape.md +351 -0
  245. package/skills/generating-mermaid-diagrams/assets/datamodel/b2b-commerce-erd.md +317 -0
  246. package/skills/generating-mermaid-diagrams/assets/datamodel/campaigns-erd.md +195 -0
  247. package/skills/generating-mermaid-diagrams/assets/datamodel/consent-erd.md +262 -0
  248. package/skills/generating-mermaid-diagrams/assets/datamodel/files-erd.md +266 -0
  249. package/skills/generating-mermaid-diagrams/assets/datamodel/forecasting-erd.md +261 -0
  250. package/skills/generating-mermaid-diagrams/assets/datamodel/fsl-erd.md +332 -0
  251. package/skills/generating-mermaid-diagrams/assets/datamodel/party-model-erd.md +237 -0
  252. package/skills/generating-mermaid-diagrams/assets/datamodel/quote-order-erd.md +277 -0
  253. package/skills/generating-mermaid-diagrams/assets/datamodel/revenue-cloud-erd.md +343 -0
  254. package/skills/generating-mermaid-diagrams/assets/datamodel/sales-cloud-erd.md +192 -0
  255. package/skills/generating-mermaid-diagrams/assets/datamodel/salesforce-erd.md +209 -0
  256. package/skills/generating-mermaid-diagrams/assets/datamodel/scheduler-erd.md +276 -0
  257. package/skills/generating-mermaid-diagrams/assets/datamodel/service-cloud-erd.md +217 -0
  258. package/skills/generating-mermaid-diagrams/assets/datamodel/territory-management-erd.md +241 -0
  259. package/skills/generating-mermaid-diagrams/assets/integration/api-sequence.md +387 -0
  260. package/skills/generating-mermaid-diagrams/assets/oauth/authorization-code-pkce.md +197 -0
  261. package/skills/generating-mermaid-diagrams/assets/oauth/authorization-code.md +152 -0
  262. package/skills/generating-mermaid-diagrams/assets/oauth/client-credentials.md +233 -0
  263. package/skills/generating-mermaid-diagrams/assets/oauth/device-authorization.md +295 -0
  264. package/skills/generating-mermaid-diagrams/assets/oauth/jwt-bearer.md +256 -0
  265. package/skills/generating-mermaid-diagrams/assets/oauth/refresh-token.md +281 -0
  266. package/skills/generating-mermaid-diagrams/assets/oauth/user-agent-social-sign-on.md +281 -0
  267. package/skills/generating-mermaid-diagrams/assets/role-hierarchy/user-hierarchy.md +322 -0
  268. package/skills/generating-mermaid-diagrams/references/color-palette.md +464 -0
  269. package/skills/generating-mermaid-diagrams/references/diagram-conventions.md +313 -0
  270. package/skills/generating-mermaid-diagrams/references/erd-conventions.md +320 -0
  271. package/skills/generating-mermaid-diagrams/references/mermaid-reference.md +434 -0
  272. package/skills/generating-mermaid-diagrams/references/mermaid-styling.md +81 -0
  273. package/skills/generating-mermaid-diagrams/references/preview-guide.md +49 -0
  274. package/skills/generating-mermaid-diagrams/references/usage-examples.md +340 -0
  275. package/skills/generating-mermaid-diagrams/scripts/README.md +160 -0
  276. package/skills/generating-mermaid-diagrams/scripts/mermaid_preview.py +654 -0
  277. package/skills/generating-mermaid-diagrams/scripts/query-org-metadata.py +293 -0
  278. package/skills/generating-visual-diagrams/CREDITS.md +80 -0
  279. package/skills/generating-visual-diagrams/README.md +83 -0
  280. package/skills/generating-visual-diagrams/SKILL.md +208 -0
  281. package/skills/generating-visual-diagrams/assets/architecture/integration-flow.md +55 -0
  282. package/skills/generating-visual-diagrams/assets/erd/core-objects.md +131 -0
  283. package/skills/generating-visual-diagrams/assets/erd/custom-objects.md +60 -0
  284. package/skills/generating-visual-diagrams/assets/lwc/dashboard-card.md +45 -0
  285. package/skills/generating-visual-diagrams/assets/lwc/data-table.md +57 -0
  286. package/skills/generating-visual-diagrams/assets/lwc/record-form.md +60 -0
  287. package/skills/generating-visual-diagrams/assets/review/apex-review.md +57 -0
  288. package/skills/generating-visual-diagrams/assets/review/lwc-review.md +48 -0
  289. package/skills/generating-visual-diagrams/references/architect-aesthetic-guide.md +257 -0
  290. package/skills/generating-visual-diagrams/references/examples-index.md +35 -0
  291. package/skills/generating-visual-diagrams/references/gemini-cli-setup.md +65 -0
  292. package/skills/generating-visual-diagrams/references/interview-questions.md +529 -0
  293. package/skills/generating-visual-diagrams/references/iteration-workflow.md +173 -0
  294. package/skills/generating-visual-diagrams/scripts/check-prerequisites.sh +101 -0
  295. package/skills/generating-visual-diagrams/scripts/generate_image.py +243 -0
  296. package/skills/handling-sf-data/CREDITS.md +5 -0
  297. package/skills/handling-sf-data/README.md +112 -0
  298. package/skills/handling-sf-data/SKILL.md +235 -0
  299. package/skills/handling-sf-data/assets/bulk/bulk-insert-10000.apex +293 -0
  300. package/skills/handling-sf-data/assets/bulk/bulk-insert-200.apex +208 -0
  301. package/skills/handling-sf-data/assets/bulk/bulk-insert-500.apex +219 -0
  302. package/skills/handling-sf-data/assets/bulk/bulk-upsert-external-id.apex +324 -0
  303. package/skills/handling-sf-data/assets/cleanup/delete-by-created-date.apex +319 -0
  304. package/skills/handling-sf-data/assets/cleanup/delete-by-name.apex +240 -0
  305. package/skills/handling-sf-data/assets/cleanup/delete-test-data.apex +311 -0
  306. package/skills/handling-sf-data/assets/cleanup/rollback-transaction.apex +266 -0
  307. package/skills/handling-sf-data/assets/csv/account-import.csv +11 -0
  308. package/skills/handling-sf-data/assets/csv/contact-import.csv +11 -0
  309. package/skills/handling-sf-data/assets/csv/custom-object-import.csv +11 -0
  310. package/skills/handling-sf-data/assets/csv/opportunity-import.csv +11 -0
  311. package/skills/handling-sf-data/assets/factories/account-factory.apex +165 -0
  312. package/skills/handling-sf-data/assets/factories/case-factory.apex +237 -0
  313. package/skills/handling-sf-data/assets/factories/contact-factory.apex +168 -0
  314. package/skills/handling-sf-data/assets/factories/custom-object-factory.apex +260 -0
  315. package/skills/handling-sf-data/assets/factories/event-factory.apex +275 -0
  316. package/skills/handling-sf-data/assets/factories/hierarchy-factory.apex +372 -0
  317. package/skills/handling-sf-data/assets/factories/lead-factory.apex +190 -0
  318. package/skills/handling-sf-data/assets/factories/opportunity-factory.apex +206 -0
  319. package/skills/handling-sf-data/assets/factories/task-factory.apex +246 -0
  320. package/skills/handling-sf-data/assets/factories/user-factory.apex +278 -0
  321. package/skills/handling-sf-data/assets/json/account-contact-tree.json +130 -0
  322. package/skills/handling-sf-data/assets/json/account-opportunity-tree.json +110 -0
  323. package/skills/handling-sf-data/assets/json/full-hierarchy-tree.json +188 -0
  324. package/skills/handling-sf-data/assets/soql/aggregate.soql +226 -0
  325. package/skills/handling-sf-data/assets/soql/child-to-parent.soql +162 -0
  326. package/skills/handling-sf-data/assets/soql/parent-to-child.soql +153 -0
  327. package/skills/handling-sf-data/assets/soql/polymorphic.soql +198 -0
  328. package/skills/handling-sf-data/assets/soql/subquery.soql +287 -0
  329. package/skills/handling-sf-data/references/anonymous-apex-guide.md +98 -0
  330. package/skills/handling-sf-data/references/bulk-operations-guide.md +94 -0
  331. package/skills/handling-sf-data/references/bulk-testing-example.md +194 -0
  332. package/skills/handling-sf-data/references/cleanup-rollback-example.md +322 -0
  333. package/skills/handling-sf-data/references/cleanup-rollback-guide.md +84 -0
  334. package/skills/handling-sf-data/references/crud-workflow-example.md +183 -0
  335. package/skills/handling-sf-data/references/governor-limits-reference.md +74 -0
  336. package/skills/handling-sf-data/references/orchestration.md +174 -0
  337. package/skills/handling-sf-data/references/relationship-query-examples.md +249 -0
  338. package/skills/handling-sf-data/references/sf-cli-data-commands.md +158 -0
  339. package/skills/handling-sf-data/references/soql-relationship-guide.md +84 -0
  340. package/skills/handling-sf-data/references/test-data-best-practices.md +104 -0
  341. package/skills/handling-sf-data/references/test-data-factory-usage.md +290 -0
  342. package/skills/handling-sf-data/references/test-data-patterns.md +98 -0
  343. package/skills/handling-sf-data/scripts/soql_validator.py +292 -0
  344. package/skills/handling-sf-data/scripts/validate_data_operation.py +379 -0
  345. package/skills/harmonizing-datacloud/CREDITS.md +3 -0
  346. package/skills/harmonizing-datacloud/README.md +31 -0
  347. package/skills/harmonizing-datacloud/SKILL.md +117 -0
  348. package/skills/modeling-omnistudio-epc-catalog/CREDITS.md +14 -0
  349. package/skills/modeling-omnistudio-epc-catalog/README.md +89 -0
  350. package/skills/modeling-omnistudio-epc-catalog/SKILL.md +395 -0
  351. package/skills/modeling-omnistudio-epc-catalog/assets/attribute-assignment-template.json +402 -0
  352. package/skills/modeling-omnistudio-epc-catalog/assets/compiled-attribute-overrides-template.json +43 -0
  353. package/skills/modeling-omnistudio-epc-catalog/assets/completion-block-template.txt +8 -0
  354. package/skills/modeling-omnistudio-epc-catalog/assets/decomposition-relationships-template.json +233 -0
  355. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_AttributeAssignments.json +514 -0
  356. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_CompiledAttributeOverrides.json +21 -0
  357. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_DataPack.json +649 -0
  358. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_DecompositionRelationships.json +200 -0
  359. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_ObjectFieldAttributes.json +138 -0
  360. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_OrchestrationScenarios.json +54 -0
  361. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_OverrideDefinitions.json +266 -0
  362. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_ParentKeys.json +23 -0
  363. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_PriceListEntries.json +54 -0
  364. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_PricebookEntries.json +35 -0
  365. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_ProductChildItems.json +34 -0
  366. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_RuleAssignments.json +21 -0
  367. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_AttributeAssignments.json +410 -0
  368. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_DataPack.json +535 -0
  369. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_DecompositionRelationships.json +35 -0
  370. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_ObjectFieldAttributes.json +138 -0
  371. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_OrchestrationScenarios.json +28 -0
  372. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_ParentKeys.json +23 -0
  373. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_PriceListEntries.json +220 -0
  374. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_PricebookEntries.json +35 -0
  375. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_ProductChildItems.json +414 -0
  376. package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_AttributeAssignments.json +382 -0
  377. package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_DataPack.json +565 -0
  378. package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_DecompositionRelationships.json +35 -0
  379. package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_ObjectFieldAttributes.json +104 -0
  380. package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_OrchestrationScenarios.json +28 -0
  381. package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_ParentKeys.json +13 -0
  382. package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_PriceListEntries.json +106 -0
  383. package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_PricebookEntries.json +35 -0
  384. package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_ProductChildItems.json +72 -0
  385. package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_AttributeAssignments.json +142 -0
  386. package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_DataPack.json +377 -0
  387. package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_DecompositionRelationships.json +35 -0
  388. package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_ObjectFieldAttributes.json +36 -0
  389. package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_ParentKeys.json +8 -0
  390. package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_PriceListEntries.json +54 -0
  391. package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_PricebookEntries.json +35 -0
  392. package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_ProductChildItems.json +34 -0
  393. package/skills/modeling-omnistudio-epc-catalog/assets/object-field-attributes-template.json +138 -0
  394. package/skills/modeling-omnistudio-epc-catalog/assets/orchestration-scenarios-template.json +54 -0
  395. package/skills/modeling-omnistudio-epc-catalog/assets/override-definitions-template.json +134 -0
  396. package/skills/modeling-omnistudio-epc-catalog/assets/parent-keys-template.json +29 -0
  397. package/skills/modeling-omnistudio-epc-catalog/assets/price-list-entries-template.json +158 -0
  398. package/skills/modeling-omnistudio-epc-catalog/assets/pricebook-entries-template.json +35 -0
  399. package/skills/modeling-omnistudio-epc-catalog/assets/product-child-item-template.json +338 -0
  400. package/skills/modeling-omnistudio-epc-catalog/assets/product2-offer-template.json +527 -0
  401. package/skills/modeling-omnistudio-epc-catalog/examples/.gitkeep +1 -0
  402. package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_AttributeAssignments.json +95 -0
  403. package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_CompiledAttributeOverrides.json +1 -0
  404. package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_DataPack.json +214 -0
  405. package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_DecompositionRelationships.json +28 -0
  406. package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_ObjectFieldAttributes.json +98 -0
  407. package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_OrchestrationScenarios.json +22 -0
  408. package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_OverrideDefinitions.json +1 -0
  409. package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_ParentKeys.json +13 -0
  410. package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_PriceListEntries.json +35 -0
  411. package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_PricebookEntries.json +28 -0
  412. package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_ProductChildItems.json +110 -0
  413. package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/TRANSCRIPT.md +58 -0
  414. package/skills/modeling-omnistudio-epc-catalog/references/epc-field-guide.md +90 -0
  415. package/skills/modeling-omnistudio-epc-catalog/references/naming-conventions.md +80 -0
  416. package/skills/modeling-omnistudio-epc-catalog/references/scoring-model.md +57 -0
  417. package/skills/modeling-omnistudio-epc-catalog/scripts/cli-validation-commands.sh +19 -0
  418. package/skills/modeling-omnistudio-epc-catalog/scripts/sample-invocations.sh +18 -0
  419. package/skills/orchestrating-datacloud/CREDITS.md +15 -0
  420. package/skills/orchestrating-datacloud/README.md +129 -0
  421. package/skills/orchestrating-datacloud/SKILL.md +236 -0
  422. package/skills/orchestrating-datacloud/UPSTREAM.md +45 -0
  423. package/skills/orchestrating-datacloud/assets/definitions/activation-target.template.json +5 -0
  424. package/skills/orchestrating-datacloud/assets/definitions/activation.template.json +7 -0
  425. package/skills/orchestrating-datacloud/assets/definitions/calculated-insight.template.json +7 -0
  426. package/skills/orchestrating-datacloud/assets/definitions/data-action-target.template.json +5 -0
  427. package/skills/orchestrating-datacloud/assets/definitions/data-action.template.json +5 -0
  428. package/skills/orchestrating-datacloud/assets/definitions/data-graph.template.json +21 -0
  429. package/skills/orchestrating-datacloud/assets/definitions/data-stream.template.json +55 -0
  430. package/skills/orchestrating-datacloud/assets/definitions/dmo.template.json +17 -0
  431. package/skills/orchestrating-datacloud/assets/definitions/identity-resolution.template.json +30 -0
  432. package/skills/orchestrating-datacloud/assets/definitions/mapping.template.json +14 -0
  433. package/skills/orchestrating-datacloud/assets/definitions/relationship.template.json +12 -0
  434. package/skills/orchestrating-datacloud/assets/definitions/search-index.template.json +9 -0
  435. package/skills/orchestrating-datacloud/assets/definitions/segment.template.json +16 -0
  436. package/skills/orchestrating-datacloud/references/feature-readiness.md +157 -0
  437. package/skills/orchestrating-datacloud/references/plugin-setup.md +140 -0
  438. package/skills/orchestrating-datacloud/scripts/bootstrap-plugin.sh +53 -0
  439. package/skills/orchestrating-datacloud/scripts/diagnose-org.mjs +511 -0
  440. package/skills/orchestrating-datacloud/scripts/generate-manifest.mjs +68 -0
  441. package/skills/orchestrating-datacloud/scripts/verify-plugin.sh +58 -0
  442. package/skills/preparing-datacloud/CREDITS.md +7 -0
  443. package/skills/preparing-datacloud/README.md +51 -0
  444. package/skills/preparing-datacloud/SKILL.md +191 -0
  445. package/skills/preparing-datacloud/examples/ingestion-api/.env.example +8 -0
  446. package/skills/preparing-datacloud/examples/ingestion-api/README.md +48 -0
  447. package/skills/preparing-datacloud/examples/ingestion-api/send-data.py +144 -0
  448. package/skills/querying-soql/CREDITS.md +21 -0
  449. package/skills/querying-soql/README.md +41 -0
  450. package/skills/querying-soql/SKILL.md +143 -0
  451. package/skills/querying-soql/assets/aggregate-queries.soql +242 -0
  452. package/skills/querying-soql/assets/basic-queries.soql +188 -0
  453. package/skills/querying-soql/assets/bulkified-query-pattern.cls +280 -0
  454. package/skills/querying-soql/assets/optimization-patterns.soql +259 -0
  455. package/skills/querying-soql/assets/relationship-queries.soql +203 -0
  456. package/skills/querying-soql/assets/selector-class.cls +219 -0
  457. package/skills/querying-soql/references/anti-patterns.md +348 -0
  458. package/skills/querying-soql/references/cli-commands.md +358 -0
  459. package/skills/querying-soql/references/field-coverage-rules.md +514 -0
  460. package/skills/querying-soql/references/query-optimization.md +142 -0
  461. package/skills/querying-soql/references/selector-patterns.md +479 -0
  462. package/skills/querying-soql/references/soql-reference.md +227 -0
  463. package/skills/querying-soql/references/soql-syntax-reference.md +208 -0
  464. package/skills/querying-soql/scripts/post-tool-validate.py +322 -0
  465. package/skills/retrieving-datacloud/CREDITS.md +7 -0
  466. package/skills/retrieving-datacloud/README.md +44 -0
  467. package/skills/retrieving-datacloud/SKILL.md +120 -0
  468. package/skills/retrieving-datacloud/examples/search-indexes/hybrid-structured.json +44 -0
  469. package/skills/retrieving-datacloud/examples/search-indexes/vector-knowledge.json +43 -0
  470. package/skills/running-apex-tests/CREDITS.md +22 -0
  471. package/skills/running-apex-tests/README.md +94 -0
  472. package/skills/running-apex-tests/SKILL.md +158 -0
  473. package/skills/running-apex-tests/assets/basic-test.cls +169 -0
  474. package/skills/running-apex-tests/assets/bulk-test.cls +255 -0
  475. package/skills/running-apex-tests/assets/dml-mock.cls +339 -0
  476. package/skills/running-apex-tests/assets/mock-callout-test.cls +353 -0
  477. package/skills/running-apex-tests/assets/stub-provider-example.cls +364 -0
  478. package/skills/running-apex-tests/assets/test-data-factory.cls +328 -0
  479. package/skills/running-apex-tests/hooks/scripts/parse-test-results.py +364 -0
  480. package/skills/running-apex-tests/references/cli-commands.md +289 -0
  481. package/skills/running-apex-tests/references/mocking-patterns.md +500 -0
  482. package/skills/running-apex-tests/references/performance-optimization.md +283 -0
  483. package/skills/running-apex-tests/references/test-fix-loop.md +49 -0
  484. package/skills/running-apex-tests/references/test-patterns.md +154 -0
  485. package/skills/running-apex-tests/references/testing-best-practices.md +509 -0
  486. package/skills/segmenting-datacloud/CREDITS.md +3 -0
  487. package/skills/segmenting-datacloud/README.md +36 -0
  488. package/skills/segmenting-datacloud/SKILL.md +115 -0
@@ -0,0 +1,275 @@
1
+ /**
2
+ * Test Data Factory for Event records
3
+ * Supports bulk creation with polymorphic Who/What relationships and scheduling
4
+ *
5
+ * Usage:
6
+ * List<Event> events = TestDataFactory_Event.create(200);
7
+ * List<Event> eventsForContact = TestDataFactory_Event.createForWho(50, contactId);
8
+ * List<Event> allDayEvents = TestDataFactory_Event.createAllDay(50);
9
+ */
10
+ public class TestDataFactory_Event {
11
+
12
+ private static final String DEFAULT_SUBJECT_PREFIX = 'Test Event ';
13
+ private static final Integer DEFAULT_DURATION_MINUTES = 60;
14
+
15
+ /**
16
+ * Create and insert Event records (creates related Contact automatically)
17
+ * @param count Number of records to create
18
+ * @return List of inserted Event records with IDs
19
+ */
20
+ public static List<Event> create(Integer count) {
21
+ return create(count, true);
22
+ }
23
+
24
+ /**
25
+ * Create Event records with insert option
26
+ * @param count Number of records to create
27
+ * @param doInsert Whether to insert records
28
+ * @return List of Event records
29
+ */
30
+ public static List<Event> create(Integer count, Boolean doInsert) {
31
+ // Create parent Account and Contact for Who field
32
+ Account parentAccount = new Account(Name = 'Test Parent Account for Events');
33
+ insert parentAccount;
34
+
35
+ Contact parentContact = new Contact(
36
+ FirstName = 'Test',
37
+ LastName = 'EventContact',
38
+ AccountId = parentAccount.Id
39
+ );
40
+ insert parentContact;
41
+
42
+ List<Event> records = new List<Event>();
43
+ for (Integer i = 0; i < count; i++) {
44
+ records.add(buildRecord(i, parentContact.Id, parentAccount.Id));
45
+ }
46
+ if (doInsert && !records.isEmpty()) {
47
+ insert records;
48
+ }
49
+ return records;
50
+ }
51
+
52
+ /**
53
+ * Create Event records for a specific Who (Contact or Lead)
54
+ * @param count Number of records to create
55
+ * @param whoId Contact or Lead ID for the Who field
56
+ * @return List of inserted Event records
57
+ */
58
+ public static List<Event> createForWho(Integer count, Id whoId) {
59
+ return createForWho(count, whoId, true);
60
+ }
61
+
62
+ /**
63
+ * Create Event records for a specific Who with insert option
64
+ * @param count Number of records to create
65
+ * @param whoId Contact or Lead ID
66
+ * @param doInsert Whether to insert records
67
+ * @return List of Event records
68
+ */
69
+ public static List<Event> createForWho(Integer count, Id whoId, Boolean doInsert) {
70
+ List<Event> records = new List<Event>();
71
+ for (Integer i = 0; i < count; i++) {
72
+ records.add(buildRecord(i, whoId, null));
73
+ }
74
+ if (doInsert && !records.isEmpty()) {
75
+ insert records;
76
+ }
77
+ return records;
78
+ }
79
+
80
+ /**
81
+ * Create Event records for a specific What (Account, Opportunity, Case, etc.)
82
+ * @param count Number of records to create
83
+ * @param whatId Account, Opportunity, or Case ID
84
+ * @return List of inserted Event records
85
+ */
86
+ public static List<Event> createForWhat(Integer count, Id whatId) {
87
+ return createForWhat(count, whatId, true);
88
+ }
89
+
90
+ /**
91
+ * Create Event records for a specific What with insert option
92
+ * @param count Number of records to create
93
+ * @param whatId Account, Opportunity, or Case ID
94
+ * @param doInsert Whether to insert records
95
+ * @return List of Event records
96
+ */
97
+ public static List<Event> createForWhat(Integer count, Id whatId, Boolean doInsert) {
98
+ List<Event> records = new List<Event>();
99
+ for (Integer i = 0; i < count; i++) {
100
+ records.add(buildRecord(i, null, whatId));
101
+ }
102
+ if (doInsert && !records.isEmpty()) {
103
+ insert records;
104
+ }
105
+ return records;
106
+ }
107
+
108
+ /**
109
+ * Create all-day Event records
110
+ * @param count Number of records to create
111
+ * @return List of inserted all-day Event records
112
+ */
113
+ public static List<Event> createAllDay(Integer count) {
114
+ Account parentAccount = new Account(Name = 'Test Account for All-Day Events');
115
+ insert parentAccount;
116
+
117
+ List<Event> records = new List<Event>();
118
+ for (Integer i = 0; i < count; i++) {
119
+ Event e = new Event(
120
+ Subject = 'All Day Event ' + String.valueOf(i).leftPad(5, '0'),
121
+ WhatId = parentAccount.Id,
122
+ IsAllDayEvent = true,
123
+ ActivityDate = Date.today().addDays(i),
124
+ Description = 'Test all-day event created by TestDataFactory'
125
+ );
126
+ records.add(e);
127
+ }
128
+ if (!records.isEmpty()) {
129
+ insert records;
130
+ }
131
+ return records;
132
+ }
133
+
134
+ /**
135
+ * Create recurring Event records
136
+ * @param count Number of recurring event series to create
137
+ * @param recurrencePattern Recurrence pattern (Daily, Weekly, Monthly)
138
+ * @return List of inserted recurring Event records
139
+ */
140
+ public static List<Event> createRecurring(Integer count, String recurrencePattern) {
141
+ Account parentAccount = new Account(Name = 'Test Account for Recurring Events');
142
+ insert parentAccount;
143
+
144
+ List<Event> records = new List<Event>();
145
+ DateTime startTime = DateTime.now().addDays(1);
146
+
147
+ for (Integer i = 0; i < count; i++) {
148
+ Event e = new Event(
149
+ Subject = 'Recurring Event ' + String.valueOf(i).leftPad(5, '0'),
150
+ WhatId = parentAccount.Id,
151
+ StartDateTime = startTime.addHours(i),
152
+ EndDateTime = startTime.addHours(i + 1),
153
+ IsRecurrence = true,
154
+ RecurrenceType = recurrencePattern,
155
+ RecurrenceInterval = 1,
156
+ RecurrenceStartDateTime = startTime.addHours(i),
157
+ RecurrenceEndDateOnly = Date.today().addMonths(3),
158
+ Description = 'Test recurring event created by TestDataFactory'
159
+ );
160
+ records.add(e);
161
+ }
162
+ if (!records.isEmpty()) {
163
+ insert records;
164
+ }
165
+ return records;
166
+ }
167
+
168
+ /**
169
+ * Create Events with varied types for reporting testing
170
+ * @param count Number of records to create
171
+ * @return List of inserted Event records with varied types
172
+ */
173
+ public static List<Event> createWithVariedTypes(Integer count) {
174
+ List<String> types = new List<String>{
175
+ 'Meeting', 'Call', 'Email', 'Other', 'Webinar',
176
+ 'Conference', 'Demo', 'Training', 'Interview', 'Presentation'
177
+ };
178
+
179
+ Account parentAccount = new Account(Name = 'Test Account for Varied Events');
180
+ insert parentAccount;
181
+
182
+ List<Event> records = new List<Event>();
183
+ for (Integer i = 0; i < count; i++) {
184
+ Event e = buildRecord(i, null, parentAccount.Id);
185
+ e.Type = types[Math.mod(i, types.size())];
186
+ records.add(e);
187
+ }
188
+
189
+ if (!records.isEmpty()) {
190
+ insert records;
191
+ }
192
+ return records;
193
+ }
194
+
195
+ /**
196
+ * Create Events scheduled at different times for calendar testing
197
+ * @param count Number of records to create
198
+ * @param startDate First event date
199
+ * @return List of inserted Event records spread across dates
200
+ */
201
+ public static List<Event> createSpreadAcrossDates(Integer count, Date startDate) {
202
+ Account parentAccount = new Account(Name = 'Test Account for Calendar Events');
203
+ insert parentAccount;
204
+
205
+ List<Event> records = new List<Event>();
206
+ DateTime baseDateTime = DateTime.newInstance(startDate, Time.newInstance(9, 0, 0, 0));
207
+
208
+ for (Integer i = 0; i < count; i++) {
209
+ Event e = new Event(
210
+ Subject = 'Calendar Event ' + String.valueOf(i).leftPad(5, '0'),
211
+ WhatId = parentAccount.Id,
212
+ StartDateTime = baseDateTime.addDays(i),
213
+ EndDateTime = baseDateTime.addDays(i).addHours(1),
214
+ Description = 'Test calendar event created by TestDataFactory'
215
+ );
216
+ records.add(e);
217
+ }
218
+
219
+ if (!records.isEmpty()) {
220
+ insert records;
221
+ }
222
+ return records;
223
+ }
224
+
225
+ /**
226
+ * Build a single Event record with default values
227
+ * @param index Record index for unique naming
228
+ * @param whoId Contact or Lead ID (optional)
229
+ * @param whatId Account, Opportunity, or Case ID (optional)
230
+ * @return Event record (not inserted)
231
+ */
232
+ private static Event buildRecord(Integer index, Id whoId, Id whatId) {
233
+ String indexStr = String.valueOf(index).leftPad(5, '0');
234
+ DateTime startTime = DateTime.now().addDays(1).addHours(index);
235
+
236
+ return new Event(
237
+ Subject = DEFAULT_SUBJECT_PREFIX + indexStr,
238
+ WhoId = whoId,
239
+ WhatId = whatId,
240
+ StartDateTime = startTime,
241
+ EndDateTime = startTime.addMinutes(DEFAULT_DURATION_MINUTES),
242
+ Location = 'Test Location ' + index,
243
+ Description = 'Test event created by TestDataFactory for automated testing. Event index: ' + index,
244
+ Type = 'Meeting',
245
+ ShowAs = 'Busy',
246
+ IsPrivate = false,
247
+ IsReminderSet = false
248
+ );
249
+ }
250
+
251
+ /**
252
+ * Get IDs of created records for cleanup
253
+ * @param records List of Event records
254
+ * @return Set of Event IDs
255
+ */
256
+ public static Set<Id> getIds(List<Event> records) {
257
+ Set<Id> ids = new Set<Id>();
258
+ for (Event e : records) {
259
+ if (e.Id != null) {
260
+ ids.add(e.Id);
261
+ }
262
+ }
263
+ return ids;
264
+ }
265
+
266
+ /**
267
+ * Delete records by IDs (cleanup utility)
268
+ * @param recordIds Set of Event IDs to delete
269
+ */
270
+ public static void cleanup(Set<Id> recordIds) {
271
+ if (!recordIds.isEmpty()) {
272
+ delete [SELECT Id FROM Event WHERE Id IN :recordIds];
273
+ }
274
+ }
275
+ }
@@ -0,0 +1,372 @@
1
+ /**
2
+ * Test Data Factory for creating complete Account->Contact->Opportunity hierarchies
3
+ * Creates parent-child relationships in a single operation for comprehensive testing
4
+ *
5
+ * Usage:
6
+ * Map<String, List<SObject>> data = TestDataFactory_Hierarchy.createAccountHierarchy(5, 3, 2);
7
+ * List<Account> accounts = (List<Account>) data.get('accounts');
8
+ * List<Contact> contacts = (List<Contact>) data.get('contacts');
9
+ * List<Opportunity> opportunities = (List<Opportunity>) data.get('opportunities');
10
+ *
11
+ * // Full hierarchy with Cases and Tasks
12
+ * Map<String, List<SObject>> fullData = TestDataFactory_Hierarchy.createFullHierarchy(5, 3, 2, 2, 1);
13
+ */
14
+ public class TestDataFactory_Hierarchy {
15
+
16
+ /**
17
+ * Create Account->Contact->Opportunity hierarchy
18
+ *
19
+ * @param accountCount Number of parent Accounts to create
20
+ * @param contactsPerAccount Number of Contacts per Account
21
+ * @param oppsPerAccount Number of Opportunities per Account
22
+ * @return Map with keys: 'accounts', 'contacts', 'opportunities'
23
+ */
24
+ public static Map<String, List<SObject>> createAccountHierarchy(
25
+ Integer accountCount,
26
+ Integer contactsPerAccount,
27
+ Integer oppsPerAccount
28
+ ) {
29
+ // ═══════════════════════════════════════════════════════════════════
30
+ // Step 1: Create Accounts
31
+ // ═══════════════════════════════════════════════════════════════════
32
+ List<Account> accounts = new List<Account>();
33
+ for (Integer i = 0; i < accountCount; i++) {
34
+ accounts.add(new Account(
35
+ Name = 'Hierarchy Account ' + String.valueOf(i).leftPad(3, '0'),
36
+ Industry = getIndustryForIndex(i),
37
+ Type = 'Prospect',
38
+ BillingCity = 'San Francisco',
39
+ BillingState = 'CA',
40
+ BillingCountry = 'USA',
41
+ Description = 'Parent account for hierarchy testing'
42
+ ));
43
+ }
44
+ insert accounts;
45
+
46
+ // ═══════════════════════════════════════════════════════════════════
47
+ // Step 2: Create Contacts for each Account
48
+ // ═══════════════════════════════════════════════════════════════════
49
+ List<Contact> contacts = new List<Contact>();
50
+ Integer contactIndex = 0;
51
+
52
+ for (Account acc : accounts) {
53
+ for (Integer i = 0; i < contactsPerAccount; i++) {
54
+ String indexStr = String.valueOf(contactIndex++).leftPad(5, '0');
55
+ contacts.add(new Contact(
56
+ FirstName = 'Contact',
57
+ LastName = 'Hierarchy' + indexStr,
58
+ AccountId = acc.Id,
59
+ Email = 'contact.hierarchy' + indexStr + '@testfactory.example.com',
60
+ Phone = '(555) 100-' + String.valueOf(1000 + contactIndex),
61
+ Title = getTitleForIndex(i),
62
+ Description = 'Contact for ' + acc.Name
63
+ ));
64
+ }
65
+ }
66
+ if (!contacts.isEmpty()) {
67
+ insert contacts;
68
+ }
69
+
70
+ // ═══════════════════════════════════════════════════════════════════
71
+ // Step 3: Create Opportunities for each Account
72
+ // ═══════════════════════════════════════════════════════════════════
73
+ List<Opportunity> opportunities = new List<Opportunity>();
74
+ Integer oppIndex = 0;
75
+
76
+ for (Account acc : accounts) {
77
+ for (Integer i = 0; i < oppsPerAccount; i++) {
78
+ String indexStr = String.valueOf(oppIndex++).leftPad(5, '0');
79
+ opportunities.add(new Opportunity(
80
+ Name = 'Hierarchy Opportunity ' + indexStr,
81
+ AccountId = acc.Id,
82
+ StageName = getStageForIndex(i),
83
+ CloseDate = Date.today().addDays(30 + (i * 7)),
84
+ Amount = 10000 + (oppIndex * 5000),
85
+ Type = 'New Customer',
86
+ LeadSource = 'Web',
87
+ Description = 'Opportunity for ' + acc.Name
88
+ ));
89
+ }
90
+ }
91
+ if (!opportunities.isEmpty()) {
92
+ insert opportunities;
93
+ }
94
+
95
+ // Return all created records
96
+ return new Map<String, List<SObject>>{
97
+ 'accounts' => accounts,
98
+ 'contacts' => contacts,
99
+ 'opportunities' => opportunities
100
+ };
101
+ }
102
+
103
+ /**
104
+ * Create full hierarchy including Cases and Tasks
105
+ *
106
+ * @param accountCount Number of parent Accounts
107
+ * @param contactsPerAccount Number of Contacts per Account
108
+ * @param oppsPerAccount Number of Opportunities per Account
109
+ * @param casesPerAccount Number of Cases per Account
110
+ * @param tasksPerContact Number of Tasks per Contact
111
+ * @return Map with keys: 'accounts', 'contacts', 'opportunities', 'cases', 'tasks'
112
+ */
113
+ public static Map<String, List<SObject>> createFullHierarchy(
114
+ Integer accountCount,
115
+ Integer contactsPerAccount,
116
+ Integer oppsPerAccount,
117
+ Integer casesPerAccount,
118
+ Integer tasksPerContact
119
+ ) {
120
+ // Create base hierarchy
121
+ Map<String, List<SObject>> hierarchy = createAccountHierarchy(
122
+ accountCount, contactsPerAccount, oppsPerAccount
123
+ );
124
+
125
+ List<Account> accounts = (List<Account>) hierarchy.get('accounts');
126
+ List<Contact> contacts = (List<Contact>) hierarchy.get('contacts');
127
+
128
+ // ═══════════════════════════════════════════════════════════════════
129
+ // Step 4: Create Cases for each Account
130
+ // ═══════════════════════════════════════════════════════════════════
131
+ List<Case> cases = new List<Case>();
132
+ Integer caseIndex = 0;
133
+
134
+ // Get first contact per account for case contact
135
+ Map<Id, Contact> accountToContact = new Map<Id, Contact>();
136
+ for (Contact con : contacts) {
137
+ if (!accountToContact.containsKey(con.AccountId)) {
138
+ accountToContact.put(con.AccountId, con);
139
+ }
140
+ }
141
+
142
+ for (Account acc : accounts) {
143
+ Contact accountContact = accountToContact.get(acc.Id);
144
+ for (Integer i = 0; i < casesPerAccount; i++) {
145
+ String indexStr = String.valueOf(caseIndex++).leftPad(5, '0');
146
+ cases.add(new Case(
147
+ Subject = 'Hierarchy Case ' + indexStr,
148
+ AccountId = acc.Id,
149
+ ContactId = accountContact?.Id,
150
+ Status = 'New',
151
+ Priority = getPriorityForIndex(i),
152
+ Origin = 'Web',
153
+ Type = 'Problem',
154
+ Description = 'Case for ' + acc.Name
155
+ ));
156
+ }
157
+ }
158
+ if (!cases.isEmpty()) {
159
+ insert cases;
160
+ }
161
+
162
+ // ═══════════════════════════════════════════════════════════════════
163
+ // Step 5: Create Tasks for each Contact
164
+ // ═══════════════════════════════════════════════════════════════════
165
+ List<Task> tasks = new List<Task>();
166
+ Integer taskIndex = 0;
167
+
168
+ for (Contact con : contacts) {
169
+ for (Integer i = 0; i < tasksPerContact; i++) {
170
+ String indexStr = String.valueOf(taskIndex++).leftPad(5, '0');
171
+ tasks.add(new Task(
172
+ Subject = 'Hierarchy Task ' + indexStr,
173
+ WhoId = con.Id,
174
+ WhatId = con.AccountId,
175
+ Status = 'Not Started',
176
+ Priority = 'Normal',
177
+ ActivityDate = Date.today().addDays(7 + i),
178
+ Description = 'Task for ' + con.FirstName + ' ' + con.LastName
179
+ ));
180
+ }
181
+ }
182
+ if (!tasks.isEmpty()) {
183
+ insert tasks;
184
+ }
185
+
186
+ // Add new records to hierarchy map
187
+ hierarchy.put('cases', cases);
188
+ hierarchy.put('tasks', tasks);
189
+
190
+ return hierarchy;
191
+ }
192
+
193
+ /**
194
+ * Create nested Account hierarchy (parent-child accounts)
195
+ *
196
+ * @param rootCount Number of root (top-level) accounts
197
+ * @param levelsDeep Number of child levels (1-4 recommended)
198
+ * @param childrenPerLevel Number of child accounts per parent
199
+ * @return Map with keys: 'level0', 'level1', 'level2', etc.
200
+ */
201
+ public static Map<String, List<Account>> createNestedAccountHierarchy(
202
+ Integer rootCount,
203
+ Integer levelsDeep,
204
+ Integer childrenPerLevel
205
+ ) {
206
+ Map<String, List<Account>> hierarchy = new Map<String, List<Account>>();
207
+
208
+ // Create root accounts
209
+ List<Account> rootAccounts = new List<Account>();
210
+ for (Integer i = 0; i < rootCount; i++) {
211
+ rootAccounts.add(new Account(
212
+ Name = 'Root Account ' + String.valueOf(i).leftPad(3, '0'),
213
+ Industry = 'Technology',
214
+ Type = 'Customer',
215
+ Description = 'Root level account'
216
+ ));
217
+ }
218
+ insert rootAccounts;
219
+ hierarchy.put('level0', rootAccounts);
220
+
221
+ // Create child levels
222
+ List<Account> parentLevel = rootAccounts;
223
+
224
+ for (Integer level = 1; level <= levelsDeep; level++) {
225
+ List<Account> childLevel = new List<Account>();
226
+ Integer childIndex = 0;
227
+
228
+ for (Account parent : parentLevel) {
229
+ for (Integer i = 0; i < childrenPerLevel; i++) {
230
+ childLevel.add(new Account(
231
+ Name = 'Level' + level + ' Account ' + String.valueOf(childIndex++).leftPad(3, '0'),
232
+ ParentId = parent.Id,
233
+ Industry = parent.Industry,
234
+ Type = 'Customer',
235
+ Description = 'Child of ' + parent.Name
236
+ ));
237
+ }
238
+ }
239
+
240
+ if (!childLevel.isEmpty()) {
241
+ insert childLevel;
242
+ hierarchy.put('level' + level, childLevel);
243
+ parentLevel = childLevel;
244
+ }
245
+ }
246
+
247
+ return hierarchy;
248
+ }
249
+
250
+ /**
251
+ * Create bulk test hierarchy for performance/bulkification testing
252
+ * Creates 251+ records to test Salesforce batch boundaries
253
+ *
254
+ * @return Map with keys: 'accounts', 'contacts', 'opportunities'
255
+ */
256
+ public static Map<String, List<SObject>> createBulkTestHierarchy() {
257
+ // 51 accounts x 5 contacts = 255 contacts
258
+ // 51 accounts x 5 opportunities = 255 opportunities
259
+ return createAccountHierarchy(51, 5, 5);
260
+ }
261
+
262
+ // ═══════════════════════════════════════════════════════════════════════
263
+ // HELPER METHODS
264
+ // ═══════════════════════════════════════════════════════════════════════
265
+
266
+ private static String getIndustryForIndex(Integer index) {
267
+ List<String> industries = new List<String>{
268
+ 'Technology', 'Healthcare', 'Finance', 'Manufacturing',
269
+ 'Retail', 'Education', 'Energy', 'Media'
270
+ };
271
+ return industries[Math.mod(index, industries.size())];
272
+ }
273
+
274
+ private static String getTitleForIndex(Integer index) {
275
+ List<String> titles = new List<String>{
276
+ 'CEO', 'CFO', 'CTO', 'VP Sales', 'VP Marketing',
277
+ 'Director', 'Manager', 'Senior Developer', 'Analyst'
278
+ };
279
+ return titles[Math.mod(index, titles.size())];
280
+ }
281
+
282
+ private static String getStageForIndex(Integer index) {
283
+ List<String> stages = new List<String>{
284
+ 'Prospecting', 'Qualification', 'Needs Analysis',
285
+ 'Proposal/Price Quote', 'Negotiation/Review'
286
+ };
287
+ return stages[Math.mod(index, stages.size())];
288
+ }
289
+
290
+ private static String getPriorityForIndex(Integer index) {
291
+ List<String> priorities = new List<String>{'Low', 'Medium', 'High'};
292
+ return priorities[Math.mod(index, priorities.size())];
293
+ }
294
+
295
+ // ═══════════════════════════════════════════════════════════════════════
296
+ // CLEANUP METHODS
297
+ // ═══════════════════════════════════════════════════════════════════════
298
+
299
+ /**
300
+ * Get all IDs from a hierarchy map
301
+ * @param hierarchy Map returned by create methods
302
+ * @return Set of all record IDs
303
+ */
304
+ public static Map<String, Set<Id>> getAllIds(Map<String, List<SObject>> hierarchy) {
305
+ Map<String, Set<Id>> idsByType = new Map<String, Set<Id>>();
306
+
307
+ for (String key : hierarchy.keySet()) {
308
+ Set<Id> ids = new Set<Id>();
309
+ for (SObject record : hierarchy.get(key)) {
310
+ if (record.Id != null) {
311
+ ids.add(record.Id);
312
+ }
313
+ }
314
+ idsByType.put(key, ids);
315
+ }
316
+
317
+ return idsByType;
318
+ }
319
+
320
+ /**
321
+ * Delete all records in a hierarchy (in correct order)
322
+ * Deletes children before parents to avoid referential integrity errors
323
+ *
324
+ * @param hierarchy Map returned by create methods
325
+ */
326
+ public static void cleanup(Map<String, List<SObject>> hierarchy) {
327
+ // Delete in reverse dependency order
328
+ List<String> deleteOrder = new List<String>{
329
+ 'tasks', 'events', 'cases', 'opportunities', 'contacts', 'accounts'
330
+ };
331
+
332
+ for (String key : deleteOrder) {
333
+ if (hierarchy.containsKey(key)) {
334
+ List<SObject> records = hierarchy.get(key);
335
+ if (!records.isEmpty()) {
336
+ try {
337
+ delete records;
338
+ } catch (DmlException e) {
339
+ System.debug('Cleanup error for ' + key + ': ' + e.getMessage());
340
+ }
341
+ }
342
+ }
343
+ }
344
+ }
345
+
346
+ /**
347
+ * Delete nested account hierarchy (in correct order - leaves first)
348
+ *
349
+ * @param hierarchy Map returned by createNestedAccountHierarchy
350
+ */
351
+ public static void cleanupNestedHierarchy(Map<String, List<Account>> hierarchy) {
352
+ // Find max level
353
+ Integer maxLevel = 0;
354
+ for (String key : hierarchy.keySet()) {
355
+ if (key.startsWith('level')) {
356
+ Integer level = Integer.valueOf(key.replace('level', ''));
357
+ maxLevel = Math.max(maxLevel, level);
358
+ }
359
+ }
360
+
361
+ // Delete from deepest level up
362
+ for (Integer level = maxLevel; level >= 0; level--) {
363
+ String key = 'level' + level;
364
+ if (hierarchy.containsKey(key)) {
365
+ List<Account> accounts = hierarchy.get(key);
366
+ if (!accounts.isEmpty()) {
367
+ delete accounts;
368
+ }
369
+ }
370
+ }
371
+ }
372
+ }