@salesforce/afv-skills 1.8.0 → 1.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* System.Callable skeleton — same inputMap/options structure as VlocityOpenInterface.
|
|
3
|
+
* Use when integrating with Open Interface callers or when callers pass { inputMap, options }.
|
|
4
|
+
* Backward-compatible: if args lacks 'inputMap', treats args itself as inputMap.
|
|
5
|
+
*
|
|
6
|
+
* Replace Industries_XxxCallable and actionOne with the actual class/action names.
|
|
7
|
+
*/
|
|
8
|
+
public with sharing class Industries_XxxCallable implements System.Callable {
|
|
9
|
+
|
|
10
|
+
public Object call(String action, Map<String, Object> args) {
|
|
11
|
+
Map<String, Object> inputMap = (args != null && args.containsKey('inputMap'))
|
|
12
|
+
? (Map<String, Object>) args.get('inputMap')
|
|
13
|
+
: (args != null ? args : new Map<String, Object>());
|
|
14
|
+
Map<String, Object> options = (args != null && args.containsKey('options'))
|
|
15
|
+
? (Map<String, Object>) args.get('options')
|
|
16
|
+
: new Map<String, Object>();
|
|
17
|
+
if (inputMap == null) { inputMap = new Map<String, Object>(); }
|
|
18
|
+
if (options == null) { options = new Map<String, Object>(); }
|
|
19
|
+
|
|
20
|
+
switch on action {
|
|
21
|
+
when 'actionOne' {
|
|
22
|
+
return actionOne(inputMap, options);
|
|
23
|
+
}
|
|
24
|
+
when else {
|
|
25
|
+
throw new IndustriesCallableException('Unsupported action: ' + action);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
private Map<String, Object> actionOne(Map<String, Object> inputMap, Map<String, Object> options) {
|
|
31
|
+
// 1. Validate required keys from inputMap
|
|
32
|
+
// 2. Coerce types safely
|
|
33
|
+
// 3. Run business logic (SOQL with WITH USER_MODE, DML with sharing)
|
|
34
|
+
// 4. Return response envelope
|
|
35
|
+
return new Map<String, Object>{
|
|
36
|
+
'success' => true,
|
|
37
|
+
'data' => new Map<String, Object>()
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vanilla System.Callable skeleton — flat args, no Open Interface coupling.
|
|
3
|
+
* Use when callers pass flat args and no VlocityOpenInterface integration is required.
|
|
4
|
+
*
|
|
5
|
+
* Replace Industries_XxxCallable and actionOne with the actual class/action names.
|
|
6
|
+
*/
|
|
7
|
+
public with sharing class Industries_XxxCallable implements System.Callable {
|
|
8
|
+
|
|
9
|
+
public Object call(String action, Map<String, Object> args) {
|
|
10
|
+
Map<String, Object> input = args != null ? args : new Map<String, Object>();
|
|
11
|
+
|
|
12
|
+
switch on action {
|
|
13
|
+
when 'actionOne' {
|
|
14
|
+
return actionOne(input);
|
|
15
|
+
}
|
|
16
|
+
when else {
|
|
17
|
+
throw new IndustriesCallableException('Unsupported action: ' + action);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
private Map<String, Object> actionOne(Map<String, Object> args) {
|
|
23
|
+
// 1. Validate required keys (e.g. args.get('requiredKey'))
|
|
24
|
+
// 2. Coerce types safely
|
|
25
|
+
// 3. Run business logic (SOQL with WITH USER_MODE, DML with sharing)
|
|
26
|
+
// 4. Return response envelope
|
|
27
|
+
return new Map<String, Object>{
|
|
28
|
+
'success' => true,
|
|
29
|
+
'data' => new Map<String, Object>()
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
2
|
+
// BEFORE: VlocityOpenInterface2
|
|
3
|
+
// Results written into outputMap by reference; return value is Boolean success flag.
|
|
4
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
5
|
+
// global class OrderOpenInterface implements omnistudio.VlocityOpenInterface2 {
|
|
6
|
+
// global Boolean invokeMethod(String methodName, Map<String, Object> input,
|
|
7
|
+
// Map<String, Object> output,
|
|
8
|
+
// Map<String, Object> options) {
|
|
9
|
+
// if (methodName == 'createOrder') {
|
|
10
|
+
// output.putAll(createOrder(input, options));
|
|
11
|
+
// return true;
|
|
12
|
+
// }
|
|
13
|
+
// return false;
|
|
14
|
+
// }
|
|
15
|
+
//
|
|
16
|
+
// private Map<String, Object> createOrder(Map<String, Object> inputMap,
|
|
17
|
+
// Map<String, Object> options) {
|
|
18
|
+
// return new Map<String, Object>{ 'success' => true };
|
|
19
|
+
// }
|
|
20
|
+
// }
|
|
21
|
+
|
|
22
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
23
|
+
// AFTER: System.Callable
|
|
24
|
+
// Same inputs (inputMap, options); return value replaces outputMap mutation.
|
|
25
|
+
// Action strings mirror the original methodName values to keep callers stable.
|
|
26
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
27
|
+
public with sharing class Industries_XxxCallable implements System.Callable {
|
|
28
|
+
|
|
29
|
+
public Object call(String action, Map<String, Object> args) {
|
|
30
|
+
Map<String, Object> inputMap = (args != null && args.containsKey('inputMap'))
|
|
31
|
+
? (Map<String, Object>) args.get('inputMap')
|
|
32
|
+
: (args != null ? args : new Map<String, Object>());
|
|
33
|
+
Map<String, Object> options = (args != null && args.containsKey('options'))
|
|
34
|
+
? (Map<String, Object>) args.get('options')
|
|
35
|
+
: new Map<String, Object>();
|
|
36
|
+
if (inputMap == null) { inputMap = new Map<String, Object>(); }
|
|
37
|
+
if (options == null) { options = new Map<String, Object>(); }
|
|
38
|
+
|
|
39
|
+
switch on action {
|
|
40
|
+
when 'createOrder' {
|
|
41
|
+
return createOrder(inputMap, options);
|
|
42
|
+
}
|
|
43
|
+
when else {
|
|
44
|
+
throw new IndustriesCallableException('Unsupported action: ' + action);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
private Map<String, Object> createOrder(Map<String, Object> inputMap,
|
|
50
|
+
Map<String, Object> options) {
|
|
51
|
+
// Validate input, run business logic, return response envelope
|
|
52
|
+
return new Map<String, Object>{ 'success' => true, 'data' => new Map<String, Object>() };
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VlocityOpenInterface2 implementation skeleton.
|
|
3
|
+
* Use when the Industries extension point requires the legacy Open Interface contract.
|
|
4
|
+
*
|
|
5
|
+
* Key rules:
|
|
6
|
+
* - Write results into outputMap via putAll(); do NOT return the envelope from invokeMethod
|
|
7
|
+
* - Return true for success, false for unsupported/failed actions
|
|
8
|
+
* - Delegate to the same private methods as the Callable (same inputMap, options signature)
|
|
9
|
+
* - Populate outputMap with the same envelope shape (success, data, errors)
|
|
10
|
+
*
|
|
11
|
+
* Replace Industries_XxxOpenInterface and actionOne with the actual class/action names.
|
|
12
|
+
*/
|
|
13
|
+
global with sharing class Industries_XxxOpenInterface implements omnistudio.VlocityOpenInterface2 {
|
|
14
|
+
|
|
15
|
+
global Boolean invokeMethod(String methodName, Map<String, Object> inputMap,
|
|
16
|
+
Map<String, Object> outputMap, Map<String, Object> options) {
|
|
17
|
+
switch on methodName {
|
|
18
|
+
when 'actionOne' {
|
|
19
|
+
Map<String, Object> result = actionOne(inputMap, options);
|
|
20
|
+
outputMap.putAll(result);
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
when else {
|
|
24
|
+
outputMap.put('success', false);
|
|
25
|
+
outputMap.put('errors', new List<Map<String, Object>>{
|
|
26
|
+
new Map<String, Object>{
|
|
27
|
+
'code' => 'UNSUPPORTED_ACTION',
|
|
28
|
+
'message' => 'Unsupported action: ' + methodName
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
private Map<String, Object> actionOne(Map<String, Object> inputMap, Map<String, Object> options) {
|
|
37
|
+
// 1. Validate required keys from inputMap
|
|
38
|
+
// 2. Run business logic (SOQL with WITH USER_MODE, DML with sharing)
|
|
39
|
+
// 3. Return response envelope (written into outputMap by the caller above)
|
|
40
|
+
return new Map<String, Object>{
|
|
41
|
+
'success' => true,
|
|
42
|
+
'data' => new Map<String, Object>()
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test class skeleton for System.Callable implementations.
|
|
3
|
+
* Covers: positive, negative (missing input), unsupported action, and null-args cases.
|
|
4
|
+
*
|
|
5
|
+
* Replace Industries_XxxCallable, Industries_XxxCallableTest, and actionOne
|
|
6
|
+
* with the actual class/action names. Add @TestSetup data for your specific SObjects.
|
|
7
|
+
*/
|
|
8
|
+
@IsTest
|
|
9
|
+
private class Industries_XxxCallableTest {
|
|
10
|
+
|
|
11
|
+
@TestSetup
|
|
12
|
+
static void setup() {
|
|
13
|
+
// Insert test SObject records needed by the callable here.
|
|
14
|
+
// Example:
|
|
15
|
+
// Account acc = new Account(Name = 'Test Account');
|
|
16
|
+
// insert acc;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
@IsTest
|
|
20
|
+
static void testActionOne_success() {
|
|
21
|
+
System.Callable svc = new Industries_XxxCallable();
|
|
22
|
+
Map<String, Object> args = new Map<String, Object>{
|
|
23
|
+
'inputMap' => new Map<String, Object>{ 'requiredKey' => 'requiredValue' },
|
|
24
|
+
'options' => new Map<String, Object>()
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
Map<String, Object> result = (Map<String, Object>) svc.call('actionOne', args);
|
|
28
|
+
|
|
29
|
+
Assert.isTrue((Boolean) result.get('success'), 'Expected success=true');
|
|
30
|
+
Assert.isNotNull(result.get('data'), 'Expected data to be present');
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
@IsTest
|
|
34
|
+
static void testActionOne_missingInput() {
|
|
35
|
+
System.Callable svc = new Industries_XxxCallable();
|
|
36
|
+
Map<String, Object> args = new Map<String, Object>{
|
|
37
|
+
'inputMap' => new Map<String, Object>(),
|
|
38
|
+
'options' => new Map<String, Object>()
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
Map<String, Object> result = (Map<String, Object>) svc.call('actionOne', args);
|
|
42
|
+
|
|
43
|
+
Assert.isFalse((Boolean) result.get('success'), 'Expected success=false for missing input');
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
@IsTest
|
|
47
|
+
static void testUnsupportedAction() {
|
|
48
|
+
try {
|
|
49
|
+
System.Callable svc = new Industries_XxxCallable();
|
|
50
|
+
svc.call('unknownAction', new Map<String, Object>());
|
|
51
|
+
Assert.fail('Expected IndustriesCallableException');
|
|
52
|
+
} catch (IndustriesCallableException e) {
|
|
53
|
+
Assert.isTrue(e.getMessage().contains('Unsupported action'),
|
|
54
|
+
'Expected unsupported action message');
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
@IsTest
|
|
59
|
+
static void testNullArgs() {
|
|
60
|
+
System.Callable svc = new Industries_XxxCallable();
|
|
61
|
+
// Null args must be handled defensively; must not throw NullPointerException
|
|
62
|
+
Map<String, Object> result = (Map<String, Object>) svc.call('actionOne', null);
|
|
63
|
+
Assert.isNotNull(result, 'Result must not be null even with null args');
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description Industries callable that finds Quotes on an Account that have at least one
|
|
3
|
+
* QuoteLineItem with a specified Product2.ProductCode.
|
|
4
|
+
* Integrates with OmniStudio/Industries extension points.
|
|
5
|
+
* @author building-omnistudio-callable-apex
|
|
6
|
+
*
|
|
7
|
+
* Actions:
|
|
8
|
+
* - findQuotesByProductCode: Returns Quotes for an Account with QuoteLineItems matching productCode
|
|
9
|
+
*
|
|
10
|
+
* Input (findQuotesByProductCode):
|
|
11
|
+
* - accountId (String, required): Id of the Account
|
|
12
|
+
* - productCode (String, required): Product2.ProductCode to match on QuoteLineItems
|
|
13
|
+
*
|
|
14
|
+
* Output envelope:
|
|
15
|
+
* - success (Boolean)
|
|
16
|
+
* - data (Map): quotes (List<Map> with Id, Name, QuoteNumber)
|
|
17
|
+
* - errors (List<Map>)
|
|
18
|
+
*/
|
|
19
|
+
public with sharing class Industries_QuoteByProductCallable implements System.Callable {
|
|
20
|
+
|
|
21
|
+
private static final String ACTION_FIND_QUOTES = 'findQuotesByProductCode';
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @description Dispatches to the appropriate action handler.
|
|
25
|
+
* @param action Action name (e.g. 'findQuotesByProductCode')
|
|
26
|
+
* @param args Input map with accountId and productCode
|
|
27
|
+
* @return Response envelope: success, data, errors
|
|
28
|
+
*/
|
|
29
|
+
public Object call(String action, Map<String, Object> args) {
|
|
30
|
+
switch on action {
|
|
31
|
+
when ACTION_FIND_QUOTES {
|
|
32
|
+
return findQuotesByProductCode(args);
|
|
33
|
+
}
|
|
34
|
+
when else {
|
|
35
|
+
throw new IndustriesCallableException('Unsupported action: ' + action);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* @description Finds all Quotes on an Account that have at least one QuoteLineItem
|
|
42
|
+
* with the specified Product2.ProductCode.
|
|
43
|
+
* @param args Map with keys: accountId (String), productCode (String)
|
|
44
|
+
* @return Response envelope with quotes list or errors
|
|
45
|
+
*/
|
|
46
|
+
private Map<String, Object> findQuotesByProductCode(Map<String, Object> args) {
|
|
47
|
+
List<Map<String, Object>> errors = new List<Map<String, Object>>();
|
|
48
|
+
|
|
49
|
+
Object accountIdObj = args != null ? args.get('accountId') : null;
|
|
50
|
+
Object productCodeObj = args != null ? args.get('productCode') : null;
|
|
51
|
+
|
|
52
|
+
String accountId = accountIdObj != null ? String.valueOf(accountIdObj).trim() : null;
|
|
53
|
+
String productCode = productCodeObj != null ? String.valueOf(productCodeObj).trim() : null;
|
|
54
|
+
|
|
55
|
+
if (String.isBlank(accountId)) {
|
|
56
|
+
errors.add(new Map<String, Object>{
|
|
57
|
+
'code' => 'MISSING_ACCOUNT_ID',
|
|
58
|
+
'message' => 'accountId is required'
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
if (String.isBlank(productCode)) {
|
|
62
|
+
errors.add(new Map<String, Object>{
|
|
63
|
+
'code' => 'MISSING_PRODUCT_CODE',
|
|
64
|
+
'message' => 'productCode is required'
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
if (!errors.isEmpty()) {
|
|
68
|
+
return new Map<String, Object>{
|
|
69
|
+
'success' => false,
|
|
70
|
+
'data' => new Map<String, Object>{ 'quotes' => new List<Map<String, Object>>() },
|
|
71
|
+
'errors' => errors
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
try {
|
|
76
|
+
List<Quote> quotes = [
|
|
77
|
+
SELECT Id, Name, QuoteNumber, OpportunityId
|
|
78
|
+
FROM Quote
|
|
79
|
+
WITH USER_MODE
|
|
80
|
+
WHERE Opportunity.AccountId = :accountId
|
|
81
|
+
AND Id IN (
|
|
82
|
+
SELECT QuoteId
|
|
83
|
+
FROM QuoteLineItem
|
|
84
|
+
WHERE Product2.ProductCode = :productCode
|
|
85
|
+
)
|
|
86
|
+
];
|
|
87
|
+
|
|
88
|
+
List<Map<String, Object>> quoteMaps = new List<Map<String, Object>>();
|
|
89
|
+
for (Quote q : quotes) {
|
|
90
|
+
quoteMaps.add(new Map<String, Object>{
|
|
91
|
+
'Id' => q.Id,
|
|
92
|
+
'Name' => q.Name,
|
|
93
|
+
'QuoteNumber' => q.QuoteNumber
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return new Map<String, Object>{
|
|
98
|
+
'success' => true,
|
|
99
|
+
'data' => new Map<String, Object>{ 'quotes' => quoteMaps },
|
|
100
|
+
'errors' => new List<Map<String, Object>>()
|
|
101
|
+
};
|
|
102
|
+
} catch (Exception e) {
|
|
103
|
+
return new Map<String, Object>{
|
|
104
|
+
'success' => false,
|
|
105
|
+
'data' => new Map<String, Object>{ 'quotes' => new List<Map<String, Object>>() },
|
|
106
|
+
'errors' => new List<Map<String, Object>>{
|
|
107
|
+
new Map<String, Object>{
|
|
108
|
+
'code' => 'QUERY_ERROR',
|
|
109
|
+
'message' => e.getMessage()
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description Test class for Industries_QuoteByProductCallable.
|
|
3
|
+
* Covers positive, negative, contract, and unsupported action scenarios.
|
|
4
|
+
* @author building-omnistudio-callable-apex
|
|
5
|
+
*/
|
|
6
|
+
@IsTest
|
|
7
|
+
private class Industries_QuoteByProductCallableTest {
|
|
8
|
+
|
|
9
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
10
|
+
// TEST DATA SETUP
|
|
11
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
12
|
+
|
|
13
|
+
@TestSetup
|
|
14
|
+
static void setupTestData() {
|
|
15
|
+
Account acc = new Account(Name = 'Test Account');
|
|
16
|
+
insert acc;
|
|
17
|
+
|
|
18
|
+
Pricebook2 pb = [SELECT Id FROM Pricebook2 WHERE IsStandard = true LIMIT 1];
|
|
19
|
+
|
|
20
|
+
Opportunity opp = new Opportunity(
|
|
21
|
+
Name = 'Test Opp',
|
|
22
|
+
AccountId = acc.Id,
|
|
23
|
+
Pricebook2Id = pb.Id,
|
|
24
|
+
StageName = 'Prospecting',
|
|
25
|
+
CloseDate = Date.today().addMonths(1)
|
|
26
|
+
);
|
|
27
|
+
insert opp;
|
|
28
|
+
|
|
29
|
+
Product2 prod = new Product2(
|
|
30
|
+
Name = 'Test Product',
|
|
31
|
+
ProductCode = 'PROD-001',
|
|
32
|
+
IsActive = true
|
|
33
|
+
);
|
|
34
|
+
insert prod;
|
|
35
|
+
|
|
36
|
+
PricebookEntry pbe = new PricebookEntry(
|
|
37
|
+
Pricebook2Id = pb.Id,
|
|
38
|
+
Product2Id = prod.Id,
|
|
39
|
+
UnitPrice = 100,
|
|
40
|
+
IsActive = true
|
|
41
|
+
);
|
|
42
|
+
insert pbe;
|
|
43
|
+
|
|
44
|
+
Quote q = new Quote(
|
|
45
|
+
Name = 'Test Quote',
|
|
46
|
+
OpportunityId = opp.Id,
|
|
47
|
+
Pricebook2Id = pb.Id
|
|
48
|
+
);
|
|
49
|
+
insert q;
|
|
50
|
+
|
|
51
|
+
QuoteLineItem qli = new QuoteLineItem(
|
|
52
|
+
QuoteId = q.Id,
|
|
53
|
+
PricebookEntryId = pbe.Id,
|
|
54
|
+
Quantity = 1,
|
|
55
|
+
UnitPrice = 100
|
|
56
|
+
);
|
|
57
|
+
insert qli;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
61
|
+
// POSITIVE TESTS
|
|
62
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* @description Tests findQuotesByProductCode returns Quotes with matching productCode
|
|
66
|
+
*/
|
|
67
|
+
@IsTest
|
|
68
|
+
static void testFindQuotesByProductCode_Success() {
|
|
69
|
+
Account acc = [SELECT Id FROM Account LIMIT 1];
|
|
70
|
+
System.Callable svc = new Industries_QuoteByProductCallable();
|
|
71
|
+
Map<String, Object> args = new Map<String, Object>{
|
|
72
|
+
'accountId' => acc.Id,
|
|
73
|
+
'productCode' => 'PROD-001'
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
Test.startTest();
|
|
77
|
+
Map<String, Object> result = (Map<String, Object>) svc.call('findQuotesByProductCode', args);
|
|
78
|
+
Test.stopTest();
|
|
79
|
+
|
|
80
|
+
Assert.isTrue((Boolean) result.get('success'), 'Should succeed');
|
|
81
|
+
Map<String, Object> data = (Map<String, Object>) result.get('data');
|
|
82
|
+
List<Object> quotes = (List<Object>) data.get('quotes');
|
|
83
|
+
Assert.isNotNull(quotes, 'quotes list should not be null');
|
|
84
|
+
Assert.areEqual(1, quotes.size(), 'Should return 1 Quote');
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* @description Tests findQuotesByProductCode returns empty list when no match
|
|
89
|
+
*/
|
|
90
|
+
@IsTest
|
|
91
|
+
static void testFindQuotesByProductCode_NoMatch_ReturnsEmpty() {
|
|
92
|
+
Account acc = [SELECT Id FROM Account LIMIT 1];
|
|
93
|
+
System.Callable svc = new Industries_QuoteByProductCallable();
|
|
94
|
+
Map<String, Object> args = new Map<String, Object>{
|
|
95
|
+
'accountId' => acc.Id,
|
|
96
|
+
'productCode' => 'NONEXISTENT'
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
Test.startTest();
|
|
100
|
+
Map<String, Object> result = (Map<String, Object>) svc.call('findQuotesByProductCode', args);
|
|
101
|
+
Test.stopTest();
|
|
102
|
+
|
|
103
|
+
Assert.isTrue((Boolean) result.get('success'), 'Should succeed with empty result');
|
|
104
|
+
Map<String, Object> data = (Map<String, Object>) result.get('data');
|
|
105
|
+
List<Object> quotes = (List<Object>) data.get('quotes');
|
|
106
|
+
Assert.areEqual(0, quotes.size(), 'Should return 0 Quotes');
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
110
|
+
// CONTRACT / INPUT VALIDATION TESTS
|
|
111
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* @description Tests missing accountId returns error envelope
|
|
115
|
+
*/
|
|
116
|
+
@IsTest
|
|
117
|
+
static void testFindQuotesByProductCode_MissingAccountId_ReturnsError() {
|
|
118
|
+
Map<String, Object> args = new Map<String, Object>{
|
|
119
|
+
'productCode' => 'PROD-001'
|
|
120
|
+
};
|
|
121
|
+
System.Callable svc = new Industries_QuoteByProductCallable();
|
|
122
|
+
|
|
123
|
+
Test.startTest();
|
|
124
|
+
Map<String, Object> result = (Map<String, Object>) svc.call('findQuotesByProductCode', args);
|
|
125
|
+
Test.stopTest();
|
|
126
|
+
|
|
127
|
+
Assert.isFalse((Boolean) result.get('success'), 'Should fail');
|
|
128
|
+
List<Object> errors = (List<Object>) result.get('errors');
|
|
129
|
+
Assert.isTrue(errors.size() >= 1, 'Should have at least one error');
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* @description Tests missing productCode returns error envelope
|
|
134
|
+
*/
|
|
135
|
+
@IsTest
|
|
136
|
+
static void testFindQuotesByProductCode_MissingProductCode_ReturnsError() {
|
|
137
|
+
Account acc = [SELECT Id FROM Account LIMIT 1];
|
|
138
|
+
Map<String, Object> args = new Map<String, Object>{
|
|
139
|
+
'accountId' => acc.Id
|
|
140
|
+
};
|
|
141
|
+
System.Callable svc = new Industries_QuoteByProductCallable();
|
|
142
|
+
|
|
143
|
+
Test.startTest();
|
|
144
|
+
Map<String, Object> result = (Map<String, Object>) svc.call('findQuotesByProductCode', args);
|
|
145
|
+
Test.stopTest();
|
|
146
|
+
|
|
147
|
+
Assert.isFalse((Boolean) result.get('success'), 'Should fail');
|
|
148
|
+
List<Object> errors = (List<Object>) result.get('errors');
|
|
149
|
+
Assert.isTrue(errors.size() >= 1, 'Should have at least one error');
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* @description Tests null args returns error envelope
|
|
154
|
+
*/
|
|
155
|
+
@IsTest
|
|
156
|
+
static void testFindQuotesByProductCode_NullArgs_ReturnsError() {
|
|
157
|
+
System.Callable svc = new Industries_QuoteByProductCallable();
|
|
158
|
+
|
|
159
|
+
Test.startTest();
|
|
160
|
+
Map<String, Object> result = (Map<String, Object>) svc.call('findQuotesByProductCode', null);
|
|
161
|
+
Test.stopTest();
|
|
162
|
+
|
|
163
|
+
Assert.isFalse((Boolean) result.get('success'), 'Should fail');
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
167
|
+
// NEGATIVE TESTS (Unsupported Action)
|
|
168
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* @description Tests unsupported action throws IndustriesCallableException
|
|
172
|
+
*/
|
|
173
|
+
@IsTest
|
|
174
|
+
static void testUnsupportedAction_ThrowsException() {
|
|
175
|
+
System.Callable svc = new Industries_QuoteByProductCallable();
|
|
176
|
+
|
|
177
|
+
Test.startTest();
|
|
178
|
+
try {
|
|
179
|
+
svc.call('unknownAction', new Map<String, Object>());
|
|
180
|
+
Assert.fail('Expected IndustriesCallableException');
|
|
181
|
+
} catch (IndustriesCallableException e) {
|
|
182
|
+
Assert.isTrue(
|
|
183
|
+
e.getMessage().contains('Unsupported action'),
|
|
184
|
+
'Error message should mention unsupported action: ' + e.getMessage()
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
Test.stopTest();
|
|
188
|
+
}
|
|
189
|
+
}
|
package/skills/building-omnistudio-callable-apex/examples/Test_QuoteByProductCallable/TRANSCRIPT.md
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# Reasoning Transcript: Industries Quote-by-Product Callable
|
|
2
|
+
|
|
3
|
+
This document records the reasoning process and skills used to generate `Industries_QuoteByProductCallable.cls` and `Industries_QuoteByProductCallableTest.cls`.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Task Summary
|
|
8
|
+
|
|
9
|
+
Create a callable Apex class that finds all Quotes on an Account that have at least one QuoteLineItem with a specified Product2.ProductCode, plus a supporting test class.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Skills Applied
|
|
14
|
+
|
|
15
|
+
### 1. **building-omnistudio-callable-apex** (Primary)
|
|
16
|
+
|
|
17
|
+
**Path:** `~/.claude/skills/building-omnistudio-callable-apex/SKILL.md`
|
|
18
|
+
**Trigger:** Callable implementations, OmniStudio, Vlocity, Industries Apex extensions
|
|
19
|
+
|
|
20
|
+
**Application:**
|
|
21
|
+
|
|
22
|
+
- **Phase 1 – Requirements Gathering:**
|
|
23
|
+
Entry point: Integration Procedure / OmniScript. Action: `findQuotesByProductCode`.
|
|
24
|
+
Inputs: `accountId` (String), `productCode` (String).
|
|
25
|
+
Data: Quote, QuoteLineItem, Product2. No side effects (read-only).
|
|
26
|
+
|
|
27
|
+
- **Phase 2 – Contract Definition:**
|
|
28
|
+
Response envelope: `{ success, data: { quotes }, errors }`.
|
|
29
|
+
Action dispatch via `switch on action` with typed exception for unsupported actions.
|
|
30
|
+
|
|
31
|
+
- **Phase 3 – Implementation Pattern:**
|
|
32
|
+
- `call()` kept thin; logic delegated to `findQuotesByProductCode(args)`
|
|
33
|
+
- Input validation for `accountId` and `productCode` (blank checks)
|
|
34
|
+
- `with sharing` on the callable class
|
|
35
|
+
- SOQL with `WITH USER_MODE` for CRUD/FLS
|
|
36
|
+
- No SOQL/DML in loops
|
|
37
|
+
- Consistent envelope shape
|
|
38
|
+
|
|
39
|
+
- **Phase 4 – Testing:**
|
|
40
|
+
Positive, negative, contract, and unsupported-action tests per skill requirements.
|
|
41
|
+
|
|
42
|
+
- **Exception Class:**
|
|
43
|
+
`IndustriesCallableException` used per skill pattern for unsupported actions.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
### 2. **generating-apex** (Reference)
|
|
48
|
+
|
|
49
|
+
**Path:** `~/.claude/skills/generating-apex/SKILL.md`
|
|
50
|
+
**Trigger:** Apex classes, code quality
|
|
51
|
+
|
|
52
|
+
**Application:**
|
|
53
|
+
|
|
54
|
+
- ApexDoc on the class and action method
|
|
55
|
+
- Naming: `Industries_QuoteByProductCallable` (callable pattern)
|
|
56
|
+
- Null-safe input handling
|
|
57
|
+
- Clear separation of concerns
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
### 3. **running-apex-tests** (Reference)
|
|
62
|
+
|
|
63
|
+
**Path:** `~/.claude/skills/running-apex-tests/SKILL.md`
|
|
64
|
+
**Trigger:** Apex tests
|
|
65
|
+
|
|
66
|
+
**Application:**
|
|
67
|
+
|
|
68
|
+
- `@TestSetup` for shared data (Account, Opportunity, Product2, PricebookEntry, Quote, QuoteLineItem)
|
|
69
|
+
- Positive: success case and empty-result case
|
|
70
|
+
- Contract: missing `accountId`, missing `productCode`, null args
|
|
71
|
+
- Negative: unsupported action throws `IndustriesCallableException`
|
|
72
|
+
- GIVEN/WHEN/THEN comments (adapted from basic-test template)
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
### 4. **querying-soql / handling-sf-data** (Reference)
|
|
77
|
+
|
|
78
|
+
**Paths:** `skills/handling-sf-data/assets/soql/`, `skills/generating-mermaid-diagrams/assets/datamodel/`
|
|
79
|
+
**Trigger:** SOQL and data model
|
|
80
|
+
|
|
81
|
+
**Application:**
|
|
82
|
+
|
|
83
|
+
- Quote–Opportunity–Account: `Quote.Opportunity.AccountId`
|
|
84
|
+
- QuoteLineItem–Product2: `QuoteLineItem.Product2.ProductCode`
|
|
85
|
+
- Subquery: `Id IN (SELECT QuoteId FROM QuoteLineItem WHERE Product2.ProductCode = :productCode)`
|
|
86
|
+
- Confirmation that Product2.ProductCode is queryable from QuoteLineItem
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Design Decisions
|
|
91
|
+
|
|
92
|
+
| Decision | Rationale |
|
|
93
|
+
|----------|-----------|
|
|
94
|
+
| **Response envelope** | Aligns with Industries pattern: `success`, `data`, `errors` for consistent handling by Integration Procedures |
|
|
95
|
+
| **Error envelope for validation** | Return structured errors instead of throwing; callers can handle without try/catch |
|
|
96
|
+
| **Exception for unsupported action** | Follows skill pattern; `IndustriesCallableException` makes misuse explicit |
|
|
97
|
+
| **`IndustriesCallableException` in separate class** | Reusable across callable classes, matches skill examples |
|
|
98
|
+
| **`WITH USER_MODE` on SOQL** | Enforces CRUD/FLS; requires API 59+ |
|
|
99
|
+
| **Quote ↔ Account path** | Standard model: `Quote.Opportunity.AccountId` (no direct Quote → Account) |
|
|
100
|
+
| **Product code on Product2** | Standard `Product2.ProductCode` via `QuoteLineItem.Product2` relationship |
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## Artifacts Produced
|
|
105
|
+
|
|
106
|
+
1. **IndustriesCallableException.cls** – Custom exception for unsupported actions
|
|
107
|
+
2. **Industries_QuoteByProductCallable.cls** – Callable implementation
|
|
108
|
+
3. **Industries_QuoteByProductCallableTest.cls** – Test class (6 methods)
|
|
109
|
+
4. **TRANSCRIPT.md** – This reasoning transcript
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Deployment Notes
|
|
114
|
+
|
|
115
|
+
Copy the `.cls` files into your Salesforce project under `force-app/main/default/classes/` and add the corresponding `-meta.xml` files with `apiVersion` 59.0 or higher (for `WITH USER_MODE`). If your org uses an older API, remove `WITH USER_MODE` from the SOQL query.
|