@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.
- package/package.json +1 -1
- package/skills/activating-datacloud/CREDITS.md +5 -0
- package/skills/activating-datacloud/README.md +39 -0
- package/skills/activating-datacloud/SKILL.md +118 -0
- package/skills/analyzing-omnistudio-dependencies/CREDITS.md +5 -0
- package/skills/analyzing-omnistudio-dependencies/SKILL.md +477 -0
- package/skills/analyzing-omnistudio-dependencies/references/dependency-patterns.md +508 -0
- package/skills/analyzing-omnistudio-dependencies/references/namespace-guide.md +300 -0
- package/skills/building-omnistudio-callable-apex/CREDITS.md +9 -0
- package/skills/building-omnistudio-callable-apex/README.md +80 -0
- package/skills/building-omnistudio-callable-apex/SKILL.md +276 -0
- package/skills/building-omnistudio-callable-apex/assets/pattern_callable_openinterface.cls +40 -0
- package/skills/building-omnistudio-callable-apex/assets/pattern_callable_vanilla.cls +32 -0
- package/skills/building-omnistudio-callable-apex/assets/pattern_migration.cls +54 -0
- package/skills/building-omnistudio-callable-apex/assets/pattern_openinterface.cls +45 -0
- package/skills/building-omnistudio-callable-apex/assets/pattern_test_class.cls +65 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_QuoteByProductCallable/IndustriesCallableException.cls +7 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_QuoteByProductCallable/Industries_QuoteByProductCallable.cls +115 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_QuoteByProductCallable/Industries_QuoteByProductCallableTest.cls +189 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_QuoteByProductCallable/TRANSCRIPT.md +115 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/IndustriesCallableException.cls +7 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/MyCustomCallable.cls +74 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/MyCustomCallableTest.cls +146 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/MyCustomRemoteClass.cls +16 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/TRANSCRIPT.md +120 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/IndustriesCallableException.cls +7 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/MyCustomCallable.cls +73 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/MyCustomCallableTest.cls +128 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/MyCustomVlocityOpenInterface2.cls +23 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/TRANSCRIPT.md +75 -0
- package/skills/building-omnistudio-datamapper/CREDITS.md +5 -0
- package/skills/building-omnistudio-datamapper/SKILL.md +270 -0
- package/skills/building-omnistudio-datamapper/assets/completion-summary-template.md +28 -0
- package/skills/building-omnistudio-datamapper/assets/omni-data-transform-extract.json +6 -0
- package/skills/building-omnistudio-datamapper/assets/omni-data-transform-item.json +12 -0
- package/skills/building-omnistudio-datamapper/assets/omni-data-transform-load.json +6 -0
- package/skills/building-omnistudio-datamapper/assets/omni-data-transform-transform.json +6 -0
- package/skills/building-omnistudio-datamapper/references/best-practices.md +277 -0
- package/skills/building-omnistudio-datamapper/references/naming-conventions.md +145 -0
- package/skills/building-omnistudio-flexcard/CREDITS.md +5 -0
- package/skills/building-omnistudio-flexcard/SKILL.md +325 -0
- package/skills/building-omnistudio-flexcard/assets/omni-ui-card.json +10 -0
- package/skills/building-omnistudio-flexcard/references/best-practices.md +291 -0
- package/skills/building-omnistudio-flexcard/references/data-binding-guide.md +311 -0
- package/skills/building-omnistudio-flexcard/references/scoring-rubric.md +66 -0
- package/skills/building-omnistudio-flexcard/scripts/flexcard-commands.sh +24 -0
- package/skills/building-omnistudio-integration-procedure/CREDITS.md +5 -0
- package/skills/building-omnistudio-integration-procedure/SKILL.md +275 -0
- package/skills/building-omnistudio-integration-procedure/assets/omni-process-element-dr-extract.json +10 -0
- package/skills/building-omnistudio-integration-procedure/assets/omni-process-element-set-values.json +10 -0
- package/skills/building-omnistudio-integration-procedure/assets/omni-process-ip.json +12 -0
- package/skills/building-omnistudio-integration-procedure/assets/scoring-report-format.txt +14 -0
- package/skills/building-omnistudio-integration-procedure/references/best-practices.md +388 -0
- package/skills/building-omnistudio-integration-procedure/references/element-types.md +588 -0
- package/skills/building-omnistudio-integration-procedure/scripts/cli-commands.sh +18 -0
- package/skills/building-omnistudio-omniscript/CREDITS.md +5 -0
- package/skills/building-omnistudio-omniscript/SKILL.md +367 -0
- package/skills/building-omnistudio-omniscript/assets/omni-process-element-step.json +10 -0
- package/skills/building-omnistudio-omniscript/assets/omni-process-element-text-block.json +11 -0
- package/skills/building-omnistudio-omniscript/assets/omni-process-omniscript.json +12 -0
- package/skills/building-omnistudio-omniscript/references/best-practices.md +480 -0
- package/skills/building-omnistudio-omniscript/references/element-types.md +1172 -0
- package/skills/building-omnistudio-omniscript/scripts/check-duplicate-omniscript.sh +13 -0
- package/skills/building-omnistudio-omniscript/scripts/cli-reference.sh +21 -0
- package/skills/building-omnistudio-omniscript/scripts/deploy-omniscript.sh +29 -0
- package/skills/building-sf-integrations/CREDITS.md +5 -0
- package/skills/building-sf-integrations/README.md +95 -0
- package/skills/building-sf-integrations/SKILL.md +192 -0
- package/skills/building-sf-integrations/assets/callouts/callout-retry-handler.cls +167 -0
- package/skills/building-sf-integrations/assets/callouts/http-response-handler.cls +257 -0
- package/skills/building-sf-integrations/assets/callouts/rest-queueable-callout.cls +262 -0
- package/skills/building-sf-integrations/assets/callouts/rest-sync-callout.cls +211 -0
- package/skills/building-sf-integrations/assets/cdc/cdc-handler.cls +246 -0
- package/skills/building-sf-integrations/assets/cdc/cdc-subscriber-trigger.trigger +139 -0
- package/skills/building-sf-integrations/assets/endpoint-security/example.cspTrustedSite-meta.xml +58 -0
- package/skills/building-sf-integrations/assets/endpoint-security/example.remoteSite-meta.xml +39 -0
- package/skills/building-sf-integrations/assets/external-credentials/jwt-external-credential.externalCredential-meta.xml +90 -0
- package/skills/building-sf-integrations/assets/external-credentials/oauth-external-credential.externalCredential-meta.xml +87 -0
- package/skills/building-sf-integrations/assets/external-services/external-service-operations.md +221 -0
- package/skills/building-sf-integrations/assets/external-services/openapi-registration.externalServiceRegistration-meta.xml +193 -0
- package/skills/building-sf-integrations/assets/named-credentials/certificate-auth.namedCredential-meta.xml +62 -0
- package/skills/building-sf-integrations/assets/named-credentials/custom-auth.namedCredential-meta.xml +71 -0
- package/skills/building-sf-integrations/assets/named-credentials/oauth-client-credentials.namedCredential-meta.xml +51 -0
- package/skills/building-sf-integrations/assets/named-credentials/oauth-jwt-bearer.namedCredential-meta.xml +67 -0
- package/skills/building-sf-integrations/assets/platform-events/event-publisher.cls +191 -0
- package/skills/building-sf-integrations/assets/platform-events/event-subscriber-action.cls +295 -0
- package/skills/building-sf-integrations/assets/platform-events/event-subscriber-trigger.trigger +108 -0
- package/skills/building-sf-integrations/assets/platform-events/platform-event-definition.object-meta.xml +124 -0
- package/skills/building-sf-integrations/assets/soap/soap-callout-service.cls +186 -0
- package/skills/building-sf-integrations/assets/soap/wsdl2apex-guide.md +213 -0
- package/skills/building-sf-integrations/hooks/scripts/suggest_credential_setup.py +271 -0
- package/skills/building-sf-integrations/hooks/scripts/validate_integration.py +363 -0
- package/skills/building-sf-integrations/references/callout-patterns.md +719 -0
- package/skills/building-sf-integrations/references/cdc-guide.md +288 -0
- package/skills/building-sf-integrations/references/cli-reference.md +94 -0
- package/skills/building-sf-integrations/references/event-driven-architecture-guide.md +266 -0
- package/skills/building-sf-integrations/references/event-patterns.md +838 -0
- package/skills/building-sf-integrations/references/external-services-guide.md +303 -0
- package/skills/building-sf-integrations/references/messaging-api-v2.md +609 -0
- package/skills/building-sf-integrations/references/named-credentials-automation.md +201 -0
- package/skills/building-sf-integrations/references/named-credentials-guide.md +173 -0
- package/skills/building-sf-integrations/references/platform-events-guide.md +288 -0
- package/skills/building-sf-integrations/references/rest-callout-patterns.md +288 -0
- package/skills/building-sf-integrations/references/scoring-rubric.md +59 -0
- package/skills/building-sf-integrations/references/security-best-practices.md +248 -0
- package/skills/building-sf-integrations/scripts/README.md +100 -0
- package/skills/building-sf-integrations/scripts/configure-named-credential.sh +236 -0
- package/skills/building-sf-integrations/scripts/set-api-credential.sh +146 -0
- package/skills/building-sf-integrations/scripts/templates/setup-credentials-with-csp.sh +158 -0
- package/skills/configuring-connected-apps/CREDITS.md +3 -0
- package/skills/configuring-connected-apps/README.md +99 -0
- package/skills/configuring-connected-apps/SKILL.md +224 -0
- package/skills/configuring-connected-apps/assets/connected-app-basic.xml +29 -0
- package/skills/configuring-connected-apps/assets/connected-app-canvas.xml +62 -0
- package/skills/configuring-connected-apps/assets/connected-app-jwt.xml +49 -0
- package/skills/configuring-connected-apps/assets/connected-app-oauth.xml +65 -0
- package/skills/configuring-connected-apps/assets/eca-global-oauth.xml +36 -0
- package/skills/configuring-connected-apps/assets/eca-oauth-settings.xml +36 -0
- package/skills/configuring-connected-apps/assets/eca-policies.xml +36 -0
- package/skills/configuring-connected-apps/assets/external-client-app.xml +35 -0
- package/skills/configuring-connected-apps/references/example-usage.md +256 -0
- package/skills/configuring-connected-apps/references/migration-guide.md +328 -0
- package/skills/configuring-connected-apps/references/oauth-flows-reference.md +660 -0
- package/skills/configuring-connected-apps/references/security-checklist.md +209 -0
- package/skills/configuring-connected-apps/references/testing-validation-guide.md +275 -0
- package/skills/connecting-datacloud/CREDITS.md +5 -0
- package/skills/connecting-datacloud/README.md +59 -0
- package/skills/connecting-datacloud/SKILL.md +155 -0
- package/skills/connecting-datacloud/examples/connections/heroku-postgres.json +15 -0
- package/skills/connecting-datacloud/examples/connections/ingest-api-connection.json +5 -0
- package/skills/connecting-datacloud/examples/connections/ingest-api-schema.json +31 -0
- package/skills/connecting-datacloud/examples/connections/redshift.json +16 -0
- package/skills/connecting-datacloud/examples/connections/sharepoint-unstructured.json +20 -0
- package/skills/connecting-datacloud/examples/connections/snowflake-connection.json +42 -0
- package/skills/debugging-apex-logs/CREDITS.md +22 -0
- package/skills/debugging-apex-logs/README.md +74 -0
- package/skills/debugging-apex-logs/SKILL.md +172 -0
- package/skills/debugging-apex-logs/assets/benchmarking-template.cls +327 -0
- package/skills/debugging-apex-logs/assets/cpu-heap-optimization.cls +307 -0
- package/skills/debugging-apex-logs/assets/dml-in-loop-fix.cls +219 -0
- package/skills/debugging-apex-logs/assets/null-pointer-fix.cls +252 -0
- package/skills/debugging-apex-logs/assets/soql-in-loop-fix.cls +157 -0
- package/skills/debugging-apex-logs/references/analysis-playbook.md +53 -0
- package/skills/debugging-apex-logs/references/benchmarking-guide.md +287 -0
- package/skills/debugging-apex-logs/references/cli-commands.md +368 -0
- package/skills/debugging-apex-logs/references/common-issues.md +68 -0
- package/skills/debugging-apex-logs/references/debug-log-reference.md +328 -0
- package/skills/debugging-apex-logs/references/log-analysis-tools.md +248 -0
- package/skills/debugging-apex-logs/references/scoring-rubric.md +21 -0
- package/skills/deploying-metadata/CREDITS.md +25 -0
- package/skills/deploying-metadata/README.md +104 -0
- package/skills/deploying-metadata/SKILL.md +214 -0
- package/skills/deploying-metadata/assets/destructiveChanges.xml +143 -0
- package/skills/deploying-metadata/assets/package.xml +121 -0
- package/skills/deploying-metadata/references/agent-deployment-guide.md +628 -0
- package/skills/deploying-metadata/references/deploy.sh +73 -0
- package/skills/deploying-metadata/references/deployment-report-template.md +89 -0
- package/skills/deploying-metadata/references/deployment-workflows.md +395 -0
- package/skills/deploying-metadata/references/orchestration.md +183 -0
- package/skills/deploying-metadata/references/trigger-deployment-safety.md +376 -0
- package/skills/deploying-omnistudio-datapacks/CREDITS.md +5 -0
- package/skills/deploying-omnistudio-datapacks/README.md +88 -0
- package/skills/deploying-omnistudio-datapacks/SKILL.md +174 -0
- package/skills/deploying-omnistudio-datapacks/examples/business-internet-plus-bundle/TRANSCRIPT.md +124 -0
- package/skills/deploying-omnistudio-datapacks/examples/business-internet-plus-bundle/deploy-business-internet-plus-bundle.yaml +11 -0
- package/skills/deploying-omnistudio-datapacks/examples/business-internet-plus-bundle-deploy/TRANSCRIPT.md +142 -0
- package/skills/deploying-omnistudio-datapacks/examples/business-internet-plus-bundle-deploy/deploy-business-internet-plus-bundle.yaml +10 -0
- package/skills/deploying-omnistudio-datapacks/references/job-file-template.md +42 -0
- package/skills/deploying-omnistudio-datapacks/references/troubleshooting-matrix.md +24 -0
- package/skills/developing-agentforce/assets/metadata/http-callout-flow.flow-meta.xml +1 -1
- package/skills/developing-agentforce/references/actions-reference.md +8 -8
- package/skills/fetching-salesforce-docs/README.md +66 -0
- package/skills/fetching-salesforce-docs/SKILL.md +209 -0
- package/skills/fetching-salesforce-docs/requirements.txt +2 -0
- package/skills/fetching-salesforce-docs/scripts/extract_help_salesforce.py +497 -0
- package/skills/fetching-salesforce-docs/scripts/extract_salesforce_doc.py +357 -0
- package/skills/fetching-salesforce-docs/scripts/runtime_bootstrap.py +58 -0
- package/skills/generating-apex/CREDITS.md +1 -26
- package/skills/generating-apex-test/CREDITS.md +2 -27
- package/skills/generating-lwc-components/CREDITS.md +5 -0
- package/skills/generating-lwc-components/README.md +126 -0
- package/skills/generating-lwc-components/SKILL.md +191 -0
- package/skills/generating-lwc-components/assets/apex-controller/LwcController.cls +327 -0
- package/skills/generating-lwc-components/assets/basic-component/basicComponent.css +72 -0
- package/skills/generating-lwc-components/assets/basic-component/basicComponent.html +111 -0
- package/skills/generating-lwc-components/assets/basic-component/basicComponent.js +163 -0
- package/skills/generating-lwc-components/assets/basic-component/basicComponent.js-meta.xml +137 -0
- package/skills/generating-lwc-components/assets/datatable-component/datatableComponent.html +111 -0
- package/skills/generating-lwc-components/assets/datatable-component/datatableComponent.js +367 -0
- package/skills/generating-lwc-components/assets/flow-screen-component/flowScreenComponent.css +63 -0
- package/skills/generating-lwc-components/assets/flow-screen-component/flowScreenComponent.html +154 -0
- package/skills/generating-lwc-components/assets/flow-screen-component/flowScreenComponent.js +348 -0
- package/skills/generating-lwc-components/assets/flow-screen-component/flowScreenComponent.js-meta.xml +87 -0
- package/skills/generating-lwc-components/assets/form-component/formComponent.html +165 -0
- package/skills/generating-lwc-components/assets/form-component/formComponent.js +275 -0
- package/skills/generating-lwc-components/assets/graphql-component/graphqlComponent.html +100 -0
- package/skills/generating-lwc-components/assets/graphql-component/graphqlComponent.js +336 -0
- package/skills/generating-lwc-components/assets/jest-test/componentName.test.js.example +371 -0
- package/skills/generating-lwc-components/assets/message-channel/RecordSelected.messageChannel-meta.xml +71 -0
- package/skills/generating-lwc-components/assets/message-channel/lmsPublisher.js +103 -0
- package/skills/generating-lwc-components/assets/message-channel/lmsSubscriber.js +181 -0
- package/skills/generating-lwc-components/assets/modal-component/modalComponent.html +85 -0
- package/skills/generating-lwc-components/assets/modal-component/modalComponent.js +199 -0
- package/skills/generating-lwc-components/assets/record-picker/recordPicker.html +55 -0
- package/skills/generating-lwc-components/assets/record-picker/recordPicker.js +199 -0
- package/skills/generating-lwc-components/assets/state-store/store.js +282 -0
- package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.css +65 -0
- package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.html +95 -0
- package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.js-meta.xml +75 -0
- package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.test.ts.example +301 -0
- package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.ts +295 -0
- package/skills/generating-lwc-components/assets/workspace-api/workspaceComponent.html +71 -0
- package/skills/generating-lwc-components/assets/workspace-api/workspaceComponent.js +316 -0
- package/skills/generating-lwc-components/hooks/scripts/lwc-lsp-validate.py +295 -0
- package/skills/generating-lwc-components/hooks/scripts/post-tool-validate.py +347 -0
- package/skills/generating-lwc-components/hooks/scripts/slds_data/deprecated_patterns.json +74 -0
- package/skills/generating-lwc-components/hooks/scripts/slds_data/styling_hooks.json +111 -0
- package/skills/generating-lwc-components/hooks/scripts/slds_data/valid_slds_classes.json +127 -0
- package/skills/generating-lwc-components/hooks/scripts/slds_linter_wrapper.py +294 -0
- package/skills/generating-lwc-components/hooks/scripts/slds_rules/__init__.py +22 -0
- package/skills/generating-lwc-components/hooks/scripts/template_validator.py +332 -0
- package/skills/generating-lwc-components/hooks/scripts/validate_slds.py +595 -0
- package/skills/generating-lwc-components/references/accessibility-guide.md +843 -0
- package/skills/generating-lwc-components/references/advanced-features.md +108 -0
- package/skills/generating-lwc-components/references/async-notification-patterns.md +661 -0
- package/skills/generating-lwc-components/references/cli-commands.md +545 -0
- package/skills/generating-lwc-components/references/component-patterns.md +1476 -0
- package/skills/generating-lwc-components/references/flow-integration-guide.md +675 -0
- package/skills/generating-lwc-components/references/jest-testing.md +1011 -0
- package/skills/generating-lwc-components/references/lms-guide.md +860 -0
- package/skills/generating-lwc-components/references/lwc-best-practices.md +1310 -0
- package/skills/generating-lwc-components/references/performance-guide.md +861 -0
- package/skills/generating-lwc-components/references/scoring-and-testing.md +116 -0
- package/skills/generating-lwc-components/references/slds-blueprints.json +14389 -0
- package/skills/generating-lwc-components/references/slds-design-guide.md +166 -0
- package/skills/generating-lwc-components/references/state-management.md +642 -0
- package/skills/generating-lwc-components/references/template-anti-patterns.md +948 -0
- package/skills/generating-lwc-components/references/triangle-pattern.md +365 -0
- package/skills/generating-lwc-components/scripts/local-dev-preview.sh +34 -0
- package/skills/generating-mermaid-diagrams/CREDITS.md +46 -0
- package/skills/generating-mermaid-diagrams/README.md +114 -0
- package/skills/generating-mermaid-diagrams/SKILL.md +218 -0
- package/skills/generating-mermaid-diagrams/assets/agentforce/agent-flow.md +313 -0
- package/skills/generating-mermaid-diagrams/assets/architecture/system-landscape.md +351 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/b2b-commerce-erd.md +317 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/campaigns-erd.md +195 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/consent-erd.md +262 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/files-erd.md +266 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/forecasting-erd.md +261 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/fsl-erd.md +332 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/party-model-erd.md +237 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/quote-order-erd.md +277 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/revenue-cloud-erd.md +343 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/sales-cloud-erd.md +192 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/salesforce-erd.md +209 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/scheduler-erd.md +276 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/service-cloud-erd.md +217 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/territory-management-erd.md +241 -0
- package/skills/generating-mermaid-diagrams/assets/integration/api-sequence.md +387 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/authorization-code-pkce.md +197 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/authorization-code.md +152 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/client-credentials.md +233 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/device-authorization.md +295 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/jwt-bearer.md +256 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/refresh-token.md +281 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/user-agent-social-sign-on.md +281 -0
- package/skills/generating-mermaid-diagrams/assets/role-hierarchy/user-hierarchy.md +322 -0
- package/skills/generating-mermaid-diagrams/references/color-palette.md +464 -0
- package/skills/generating-mermaid-diagrams/references/diagram-conventions.md +313 -0
- package/skills/generating-mermaid-diagrams/references/erd-conventions.md +320 -0
- package/skills/generating-mermaid-diagrams/references/mermaid-reference.md +434 -0
- package/skills/generating-mermaid-diagrams/references/mermaid-styling.md +81 -0
- package/skills/generating-mermaid-diagrams/references/preview-guide.md +49 -0
- package/skills/generating-mermaid-diagrams/references/usage-examples.md +340 -0
- package/skills/generating-mermaid-diagrams/scripts/README.md +160 -0
- package/skills/generating-mermaid-diagrams/scripts/mermaid_preview.py +654 -0
- package/skills/generating-mermaid-diagrams/scripts/query-org-metadata.py +293 -0
- package/skills/generating-visual-diagrams/CREDITS.md +80 -0
- package/skills/generating-visual-diagrams/README.md +83 -0
- package/skills/generating-visual-diagrams/SKILL.md +208 -0
- package/skills/generating-visual-diagrams/assets/architecture/integration-flow.md +55 -0
- package/skills/generating-visual-diagrams/assets/erd/core-objects.md +131 -0
- package/skills/generating-visual-diagrams/assets/erd/custom-objects.md +60 -0
- package/skills/generating-visual-diagrams/assets/lwc/dashboard-card.md +45 -0
- package/skills/generating-visual-diagrams/assets/lwc/data-table.md +57 -0
- package/skills/generating-visual-diagrams/assets/lwc/record-form.md +60 -0
- package/skills/generating-visual-diagrams/assets/review/apex-review.md +57 -0
- package/skills/generating-visual-diagrams/assets/review/lwc-review.md +48 -0
- package/skills/generating-visual-diagrams/references/architect-aesthetic-guide.md +257 -0
- package/skills/generating-visual-diagrams/references/examples-index.md +35 -0
- package/skills/generating-visual-diagrams/references/gemini-cli-setup.md +65 -0
- package/skills/generating-visual-diagrams/references/interview-questions.md +529 -0
- package/skills/generating-visual-diagrams/references/iteration-workflow.md +173 -0
- package/skills/generating-visual-diagrams/scripts/check-prerequisites.sh +101 -0
- package/skills/generating-visual-diagrams/scripts/generate_image.py +243 -0
- package/skills/handling-sf-data/CREDITS.md +5 -0
- package/skills/handling-sf-data/README.md +112 -0
- package/skills/handling-sf-data/SKILL.md +235 -0
- package/skills/handling-sf-data/assets/bulk/bulk-insert-10000.apex +293 -0
- package/skills/handling-sf-data/assets/bulk/bulk-insert-200.apex +208 -0
- package/skills/handling-sf-data/assets/bulk/bulk-insert-500.apex +219 -0
- package/skills/handling-sf-data/assets/bulk/bulk-upsert-external-id.apex +324 -0
- package/skills/handling-sf-data/assets/cleanup/delete-by-created-date.apex +319 -0
- package/skills/handling-sf-data/assets/cleanup/delete-by-name.apex +240 -0
- package/skills/handling-sf-data/assets/cleanup/delete-test-data.apex +311 -0
- package/skills/handling-sf-data/assets/cleanup/rollback-transaction.apex +266 -0
- package/skills/handling-sf-data/assets/csv/account-import.csv +11 -0
- package/skills/handling-sf-data/assets/csv/contact-import.csv +11 -0
- package/skills/handling-sf-data/assets/csv/custom-object-import.csv +11 -0
- package/skills/handling-sf-data/assets/csv/opportunity-import.csv +11 -0
- package/skills/handling-sf-data/assets/factories/account-factory.apex +165 -0
- package/skills/handling-sf-data/assets/factories/case-factory.apex +237 -0
- package/skills/handling-sf-data/assets/factories/contact-factory.apex +168 -0
- package/skills/handling-sf-data/assets/factories/custom-object-factory.apex +260 -0
- package/skills/handling-sf-data/assets/factories/event-factory.apex +275 -0
- package/skills/handling-sf-data/assets/factories/hierarchy-factory.apex +372 -0
- package/skills/handling-sf-data/assets/factories/lead-factory.apex +190 -0
- package/skills/handling-sf-data/assets/factories/opportunity-factory.apex +206 -0
- package/skills/handling-sf-data/assets/factories/task-factory.apex +246 -0
- package/skills/handling-sf-data/assets/factories/user-factory.apex +278 -0
- package/skills/handling-sf-data/assets/json/account-contact-tree.json +130 -0
- package/skills/handling-sf-data/assets/json/account-opportunity-tree.json +110 -0
- package/skills/handling-sf-data/assets/json/full-hierarchy-tree.json +188 -0
- package/skills/handling-sf-data/assets/soql/aggregate.soql +226 -0
- package/skills/handling-sf-data/assets/soql/child-to-parent.soql +162 -0
- package/skills/handling-sf-data/assets/soql/parent-to-child.soql +153 -0
- package/skills/handling-sf-data/assets/soql/polymorphic.soql +198 -0
- package/skills/handling-sf-data/assets/soql/subquery.soql +287 -0
- package/skills/handling-sf-data/references/anonymous-apex-guide.md +98 -0
- package/skills/handling-sf-data/references/bulk-operations-guide.md +94 -0
- package/skills/handling-sf-data/references/bulk-testing-example.md +194 -0
- package/skills/handling-sf-data/references/cleanup-rollback-example.md +322 -0
- package/skills/handling-sf-data/references/cleanup-rollback-guide.md +84 -0
- package/skills/handling-sf-data/references/crud-workflow-example.md +183 -0
- package/skills/handling-sf-data/references/governor-limits-reference.md +74 -0
- package/skills/handling-sf-data/references/orchestration.md +174 -0
- package/skills/handling-sf-data/references/relationship-query-examples.md +249 -0
- package/skills/handling-sf-data/references/sf-cli-data-commands.md +158 -0
- package/skills/handling-sf-data/references/soql-relationship-guide.md +84 -0
- package/skills/handling-sf-data/references/test-data-best-practices.md +104 -0
- package/skills/handling-sf-data/references/test-data-factory-usage.md +290 -0
- package/skills/handling-sf-data/references/test-data-patterns.md +98 -0
- package/skills/handling-sf-data/scripts/soql_validator.py +292 -0
- package/skills/handling-sf-data/scripts/validate_data_operation.py +379 -0
- package/skills/harmonizing-datacloud/CREDITS.md +3 -0
- package/skills/harmonizing-datacloud/README.md +31 -0
- package/skills/harmonizing-datacloud/SKILL.md +117 -0
- package/skills/modeling-omnistudio-epc-catalog/CREDITS.md +14 -0
- package/skills/modeling-omnistudio-epc-catalog/README.md +89 -0
- package/skills/modeling-omnistudio-epc-catalog/SKILL.md +395 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/attribute-assignment-template.json +402 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/compiled-attribute-overrides-template.json +43 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/completion-block-template.txt +8 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/decomposition-relationships-template.json +233 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_AttributeAssignments.json +514 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_CompiledAttributeOverrides.json +21 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_DataPack.json +649 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_DecompositionRelationships.json +200 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_ObjectFieldAttributes.json +138 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_OrchestrationScenarios.json +54 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_OverrideDefinitions.json +266 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_ParentKeys.json +23 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_PriceListEntries.json +54 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_PricebookEntries.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_ProductChildItems.json +34 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_RuleAssignments.json +21 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_AttributeAssignments.json +410 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_DataPack.json +535 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_DecompositionRelationships.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_ObjectFieldAttributes.json +138 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_OrchestrationScenarios.json +28 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_ParentKeys.json +23 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_PriceListEntries.json +220 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_PricebookEntries.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_ProductChildItems.json +414 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_AttributeAssignments.json +382 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_DataPack.json +565 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_DecompositionRelationships.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_ObjectFieldAttributes.json +104 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_OrchestrationScenarios.json +28 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_ParentKeys.json +13 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_PriceListEntries.json +106 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_PricebookEntries.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_ProductChildItems.json +72 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_AttributeAssignments.json +142 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_DataPack.json +377 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_DecompositionRelationships.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_ObjectFieldAttributes.json +36 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_ParentKeys.json +8 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_PriceListEntries.json +54 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_PricebookEntries.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_ProductChildItems.json +34 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/object-field-attributes-template.json +138 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/orchestration-scenarios-template.json +54 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/override-definitions-template.json +134 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/parent-keys-template.json +29 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/price-list-entries-template.json +158 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/pricebook-entries-template.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/product-child-item-template.json +338 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/product2-offer-template.json +527 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/.gitkeep +1 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_AttributeAssignments.json +95 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_CompiledAttributeOverrides.json +1 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_DataPack.json +214 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_DecompositionRelationships.json +28 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_ObjectFieldAttributes.json +98 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_OrchestrationScenarios.json +22 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_OverrideDefinitions.json +1 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_ParentKeys.json +13 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_PriceListEntries.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_PricebookEntries.json +28 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_ProductChildItems.json +110 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/TRANSCRIPT.md +58 -0
- package/skills/modeling-omnistudio-epc-catalog/references/epc-field-guide.md +90 -0
- package/skills/modeling-omnistudio-epc-catalog/references/naming-conventions.md +80 -0
- package/skills/modeling-omnistudio-epc-catalog/references/scoring-model.md +57 -0
- package/skills/modeling-omnistudio-epc-catalog/scripts/cli-validation-commands.sh +19 -0
- package/skills/modeling-omnistudio-epc-catalog/scripts/sample-invocations.sh +18 -0
- package/skills/orchestrating-datacloud/CREDITS.md +15 -0
- package/skills/orchestrating-datacloud/README.md +129 -0
- package/skills/orchestrating-datacloud/SKILL.md +236 -0
- package/skills/orchestrating-datacloud/UPSTREAM.md +45 -0
- package/skills/orchestrating-datacloud/assets/definitions/activation-target.template.json +5 -0
- package/skills/orchestrating-datacloud/assets/definitions/activation.template.json +7 -0
- package/skills/orchestrating-datacloud/assets/definitions/calculated-insight.template.json +7 -0
- package/skills/orchestrating-datacloud/assets/definitions/data-action-target.template.json +5 -0
- package/skills/orchestrating-datacloud/assets/definitions/data-action.template.json +5 -0
- package/skills/orchestrating-datacloud/assets/definitions/data-graph.template.json +21 -0
- package/skills/orchestrating-datacloud/assets/definitions/data-stream.template.json +55 -0
- package/skills/orchestrating-datacloud/assets/definitions/dmo.template.json +17 -0
- package/skills/orchestrating-datacloud/assets/definitions/identity-resolution.template.json +30 -0
- package/skills/orchestrating-datacloud/assets/definitions/mapping.template.json +14 -0
- package/skills/orchestrating-datacloud/assets/definitions/relationship.template.json +12 -0
- package/skills/orchestrating-datacloud/assets/definitions/search-index.template.json +9 -0
- package/skills/orchestrating-datacloud/assets/definitions/segment.template.json +16 -0
- package/skills/orchestrating-datacloud/references/feature-readiness.md +157 -0
- package/skills/orchestrating-datacloud/references/plugin-setup.md +140 -0
- package/skills/orchestrating-datacloud/scripts/bootstrap-plugin.sh +53 -0
- package/skills/orchestrating-datacloud/scripts/diagnose-org.mjs +511 -0
- package/skills/orchestrating-datacloud/scripts/generate-manifest.mjs +68 -0
- package/skills/orchestrating-datacloud/scripts/verify-plugin.sh +58 -0
- package/skills/preparing-datacloud/CREDITS.md +7 -0
- package/skills/preparing-datacloud/README.md +51 -0
- package/skills/preparing-datacloud/SKILL.md +191 -0
- package/skills/preparing-datacloud/examples/ingestion-api/.env.example +8 -0
- package/skills/preparing-datacloud/examples/ingestion-api/README.md +48 -0
- package/skills/preparing-datacloud/examples/ingestion-api/send-data.py +144 -0
- package/skills/querying-soql/CREDITS.md +21 -0
- package/skills/querying-soql/README.md +41 -0
- package/skills/querying-soql/SKILL.md +143 -0
- package/skills/querying-soql/assets/aggregate-queries.soql +242 -0
- package/skills/querying-soql/assets/basic-queries.soql +188 -0
- package/skills/querying-soql/assets/bulkified-query-pattern.cls +280 -0
- package/skills/querying-soql/assets/optimization-patterns.soql +259 -0
- package/skills/querying-soql/assets/relationship-queries.soql +203 -0
- package/skills/querying-soql/assets/selector-class.cls +219 -0
- package/skills/querying-soql/references/anti-patterns.md +348 -0
- package/skills/querying-soql/references/cli-commands.md +358 -0
- package/skills/querying-soql/references/field-coverage-rules.md +514 -0
- package/skills/querying-soql/references/query-optimization.md +142 -0
- package/skills/querying-soql/references/selector-patterns.md +479 -0
- package/skills/querying-soql/references/soql-reference.md +227 -0
- package/skills/querying-soql/references/soql-syntax-reference.md +208 -0
- package/skills/querying-soql/scripts/post-tool-validate.py +322 -0
- package/skills/retrieving-datacloud/CREDITS.md +7 -0
- package/skills/retrieving-datacloud/README.md +44 -0
- package/skills/retrieving-datacloud/SKILL.md +120 -0
- package/skills/retrieving-datacloud/examples/search-indexes/hybrid-structured.json +44 -0
- package/skills/retrieving-datacloud/examples/search-indexes/vector-knowledge.json +43 -0
- package/skills/running-apex-tests/CREDITS.md +22 -0
- package/skills/running-apex-tests/README.md +94 -0
- package/skills/running-apex-tests/SKILL.md +158 -0
- package/skills/running-apex-tests/assets/basic-test.cls +169 -0
- package/skills/running-apex-tests/assets/bulk-test.cls +255 -0
- package/skills/running-apex-tests/assets/dml-mock.cls +339 -0
- package/skills/running-apex-tests/assets/mock-callout-test.cls +353 -0
- package/skills/running-apex-tests/assets/stub-provider-example.cls +364 -0
- package/skills/running-apex-tests/assets/test-data-factory.cls +328 -0
- package/skills/running-apex-tests/hooks/scripts/parse-test-results.py +364 -0
- package/skills/running-apex-tests/references/cli-commands.md +289 -0
- package/skills/running-apex-tests/references/mocking-patterns.md +500 -0
- package/skills/running-apex-tests/references/performance-optimization.md +283 -0
- package/skills/running-apex-tests/references/test-fix-loop.md +49 -0
- package/skills/running-apex-tests/references/test-patterns.md +154 -0
- package/skills/running-apex-tests/references/testing-best-practices.md +509 -0
- package/skills/segmenting-datacloud/CREDITS.md +3 -0
- package/skills/segmenting-datacloud/README.md +36 -0
- 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
|
+
}
|