@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,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description Callable implementation for calculateTotal (converted from VlocityOpenInterface2).
|
|
3
|
+
* Accepts price and quantity from inputMap, returns total in response envelope.
|
|
4
|
+
* Original: MyCustomRemoteClass implements omnistudio.VlocityOpenInterface2.
|
|
5
|
+
* @author building-omnistudio-callable-apex
|
|
6
|
+
*/
|
|
7
|
+
public with sharing class MyCustomCallable implements System.Callable {
|
|
8
|
+
|
|
9
|
+
public Object call(String action, Map<String, Object> args) {
|
|
10
|
+
Map<String, Object> inputMap = (args != null && args.containsKey('inputMap'))
|
|
11
|
+
? (Map<String, Object>) args.get('inputMap') : (args != null ? args : new Map<String, Object>());
|
|
12
|
+
Map<String, Object> options = (args != null && args.containsKey('options'))
|
|
13
|
+
? (Map<String, Object>) args.get('options') : new Map<String, Object>();
|
|
14
|
+
if (inputMap == null) { inputMap = new Map<String, Object>(); }
|
|
15
|
+
if (options == null) { options = new Map<String, Object>(); }
|
|
16
|
+
|
|
17
|
+
switch on action {
|
|
18
|
+
when 'calculateTotal' {
|
|
19
|
+
return calculateTotal(inputMap, options);
|
|
20
|
+
}
|
|
21
|
+
when else {
|
|
22
|
+
throw new IndustriesCallableException('Unsupported action: ' + action);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
private Map<String, Object> calculateTotal(Map<String, Object> inputMap, Map<String, Object> options) {
|
|
28
|
+
Decimal price = toDecimal(inputMap.get('price'));
|
|
29
|
+
Integer qty = toInteger(inputMap.get('quantity'));
|
|
30
|
+
|
|
31
|
+
if (price == null || qty == null) {
|
|
32
|
+
return new Map<String, Object>{
|
|
33
|
+
'success' => false,
|
|
34
|
+
'data' => new Map<String, Object>(),
|
|
35
|
+
'errors' => new List<Map<String, Object>>{
|
|
36
|
+
new Map<String, Object>{
|
|
37
|
+
'code' => 'INVALID_INPUT',
|
|
38
|
+
'message' => 'price and quantity are required and must be numeric'
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
Decimal total = price * qty;
|
|
45
|
+
|
|
46
|
+
return new Map<String, Object>{
|
|
47
|
+
'success' => true,
|
|
48
|
+
'data' => new Map<String, Object>{ 'total' => total },
|
|
49
|
+
'errors' => new List<Map<String, Object>>()
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
private Decimal toDecimal(Object o) {
|
|
54
|
+
if (o == null) return null;
|
|
55
|
+
if (o instanceof Decimal) return (Decimal) o;
|
|
56
|
+
if (o instanceof Integer) return Decimal.valueOf((Integer) o);
|
|
57
|
+
if (o instanceof Double) return Decimal.valueOf((Double) o);
|
|
58
|
+
if (o instanceof String) {
|
|
59
|
+
try { return Decimal.valueOf((String) o); } catch (TypeException e) { return null; }
|
|
60
|
+
}
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
private Integer toInteger(Object o) {
|
|
65
|
+
if (o == null) return null;
|
|
66
|
+
if (o instanceof Integer) return (Integer) o;
|
|
67
|
+
if (o instanceof Long) return ((Long) o).intValue();
|
|
68
|
+
if (o instanceof Decimal) return ((Decimal) o).intValue();
|
|
69
|
+
if (o instanceof String) {
|
|
70
|
+
try { return Integer.valueOf((String) o); } catch (TypeException e) { return null; }
|
|
71
|
+
}
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description Test class for MyCustomCallable (converted from MyCustomRemoteClass VlocityOpenInterface2).
|
|
3
|
+
* Covers positive, negative, contract, and unsupported action scenarios.
|
|
4
|
+
* @author building-omnistudio-callable-apex
|
|
5
|
+
*/
|
|
6
|
+
@IsTest
|
|
7
|
+
private class MyCustomCallableTest {
|
|
8
|
+
|
|
9
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
10
|
+
// POSITIVE TESTS
|
|
11
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @description Tests calculateTotal returns total with inputMap/options format
|
|
15
|
+
*/
|
|
16
|
+
@IsTest
|
|
17
|
+
static void testCalculateTotal_Success() {
|
|
18
|
+
System.Callable svc = new MyCustomCallable();
|
|
19
|
+
Map<String, Object> args = new Map<String, Object>{
|
|
20
|
+
'inputMap' => new Map<String, Object>{
|
|
21
|
+
'price' => 10.50,
|
|
22
|
+
'quantity' => 3
|
|
23
|
+
},
|
|
24
|
+
'options' => new Map<String, Object>()
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
Test.startTest();
|
|
28
|
+
Map<String, Object> result = (Map<String, Object>) svc.call('calculateTotal', args);
|
|
29
|
+
Test.stopTest();
|
|
30
|
+
|
|
31
|
+
Assert.isTrue((Boolean) result.get('success'), 'Should succeed');
|
|
32
|
+
Map<String, Object> data = (Map<String, Object>) result.get('data');
|
|
33
|
+
Assert.areEqual(31.50, (Decimal) data.get('total'), 'total should be 10.50 * 3');
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* @description Tests calculateTotal with flat args (backward compatibility)
|
|
38
|
+
*/
|
|
39
|
+
@IsTest
|
|
40
|
+
static void testCalculateTotal_FlatArgs_Success() {
|
|
41
|
+
System.Callable svc = new MyCustomCallable();
|
|
42
|
+
Map<String, Object> args = new Map<String, Object>{
|
|
43
|
+
'price' => 100,
|
|
44
|
+
'quantity' => 5
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
Test.startTest();
|
|
48
|
+
Map<String, Object> result = (Map<String, Object>) svc.call('calculateTotal', args);
|
|
49
|
+
Test.stopTest();
|
|
50
|
+
|
|
51
|
+
Assert.isTrue((Boolean) result.get('success'), 'Should succeed');
|
|
52
|
+
Map<String, Object> data = (Map<String, Object>) result.get('data');
|
|
53
|
+
Assert.areEqual(500, (Decimal) data.get('total'), 'total should be 100 * 5');
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* @description Tests calculateTotal with string inputs (type coercion from OmniScript)
|
|
58
|
+
*/
|
|
59
|
+
@IsTest
|
|
60
|
+
static void testCalculateTotal_StringInputs_Success() {
|
|
61
|
+
System.Callable svc = new MyCustomCallable();
|
|
62
|
+
Map<String, Object> args = new Map<String, Object>{
|
|
63
|
+
'inputMap' => new Map<String, Object>{
|
|
64
|
+
'price' => '25.00',
|
|
65
|
+
'quantity' => '4'
|
|
66
|
+
},
|
|
67
|
+
'options' => new Map<String, Object>()
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
Map<String, Object> result = (Map<String, Object>) svc.call('calculateTotal', args);
|
|
71
|
+
|
|
72
|
+
Assert.isTrue((Boolean) result.get('success'), 'Should succeed');
|
|
73
|
+
Map<String, Object> data = (Map<String, Object>) result.get('data');
|
|
74
|
+
Assert.areEqual(100, (Decimal) data.get('total'), 'total should be 25 * 4');
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
78
|
+
// NEGATIVE / CONTRACT TESTS
|
|
79
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* @description Tests unsupported action throws IndustriesCallableException
|
|
83
|
+
*/
|
|
84
|
+
@IsTest
|
|
85
|
+
static void testUnsupportedAction_Throws() {
|
|
86
|
+
try {
|
|
87
|
+
System.Callable svc = new MyCustomCallable();
|
|
88
|
+
svc.call('unknownAction', new Map<String, Object>{
|
|
89
|
+
'inputMap' => new Map<String, Object>(),
|
|
90
|
+
'options' => new Map<String, Object>()
|
|
91
|
+
});
|
|
92
|
+
Assert.fail('Expected IndustriesCallableException');
|
|
93
|
+
} catch (IndustriesCallableException e) {
|
|
94
|
+
Assert.isTrue(e.getMessage().contains('Unsupported action'), 'Message should mention unsupported action');
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* @description Tests missing price returns error envelope
|
|
100
|
+
*/
|
|
101
|
+
@IsTest
|
|
102
|
+
static void testCalculateTotal_MissingPrice_ReturnsError() {
|
|
103
|
+
System.Callable svc = new MyCustomCallable();
|
|
104
|
+
Map<String, Object> args = new Map<String, Object>{
|
|
105
|
+
'inputMap' => new Map<String, Object>{ 'quantity' => 2 },
|
|
106
|
+
'options' => new Map<String, Object>()
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
Map<String, Object> result = (Map<String, Object>) svc.call('calculateTotal', args);
|
|
110
|
+
|
|
111
|
+
Assert.isFalse((Boolean) result.get('success'), 'Should fail');
|
|
112
|
+
List<Object> errors = (List<Object>) result.get('errors');
|
|
113
|
+
Assert.isNotNull(errors, 'errors should not be null');
|
|
114
|
+
Assert.areEqual(1, errors.size(), 'Should have one error');
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* @description Tests missing quantity returns error envelope
|
|
119
|
+
*/
|
|
120
|
+
@IsTest
|
|
121
|
+
static void testCalculateTotal_MissingQuantity_ReturnsError() {
|
|
122
|
+
System.Callable svc = new MyCustomCallable();
|
|
123
|
+
Map<String, Object> args = new Map<String, Object>{
|
|
124
|
+
'inputMap' => new Map<String, Object>{ 'price' => 50 },
|
|
125
|
+
'options' => new Map<String, Object>()
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
Map<String, Object> result = (Map<String, Object>) svc.call('calculateTotal', args);
|
|
129
|
+
|
|
130
|
+
Assert.isFalse((Boolean) result.get('success'), 'Should fail');
|
|
131
|
+
List<Object> errors = (List<Object>) result.get('errors');
|
|
132
|
+
Assert.isNotNull(errors, 'errors should not be null');
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* @description Tests null args handled gracefully
|
|
137
|
+
*/
|
|
138
|
+
@IsTest
|
|
139
|
+
static void testCalculateTotal_NullArgs_ReturnsError() {
|
|
140
|
+
System.Callable svc = new MyCustomCallable();
|
|
141
|
+
|
|
142
|
+
Map<String, Object> result = (Map<String, Object>) svc.call('calculateTotal', null);
|
|
143
|
+
|
|
144
|
+
Assert.isFalse((Boolean) result.get('success'), 'Should fail with null inputMap');
|
|
145
|
+
}
|
|
146
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
global with sharing class MyCustomRemoteClass implements omnistudio.VlocityOpenInterface2 {
|
|
2
|
+
|
|
3
|
+
global Boolean invokeMethod(String methodName, Map<String,Object> inputMap, Map<String,Object> outputMap, Map<String,Object> options) {
|
|
4
|
+
if (methodName.equals('calculateTotal')) {
|
|
5
|
+
calculateTotal(inputMap, outputMap);
|
|
6
|
+
return true;
|
|
7
|
+
}
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
private void calculateTotal(Map<String,Object> inputMap, Map<String,Object> outputMap) {
|
|
12
|
+
Decimal price = (Decimal)inputMap.get('price');
|
|
13
|
+
Decimal qty = (Decimal)inputMap.get('quantity');
|
|
14
|
+
outputMap.put('total', price * qty);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# Reasoning Transcript: VlocityOpenInterface2 → Callable Conversion (MyCustomRemoteClass)
|
|
2
|
+
|
|
3
|
+
This document records the reasoning process and skills used to convert `MyCustomRemoteClass.cls` (VlocityOpenInterface2) to `MyCustomCallable.cls` and create `MyCustomCallableTest.cls`.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Task Summary
|
|
8
|
+
|
|
9
|
+
Convert a VlocityOpenInterface2 implementation (`MyCustomRemoteClass`) to `System.Callable`, add a test class, and document reasoning and skills used.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Source Analysis
|
|
14
|
+
|
|
15
|
+
**Original class:** `MyCustomRemoteClass.cls`
|
|
16
|
+
|
|
17
|
+
- **Implements:** `omnistudio.VlocityOpenInterface2`
|
|
18
|
+
- **Action:** `calculateTotal`
|
|
19
|
+
- **Input contract:** `inputMap` with keys `price` (Decimal), `quantity` (Decimal)
|
|
20
|
+
- **Output contract:** `outputMap.put('total', price * qty)`
|
|
21
|
+
- **Behavior:** Single action; returns `true` on success, `false` for unsupported methods
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Skills Applied
|
|
26
|
+
|
|
27
|
+
### 1. **building-omnistudio-callable-apex** (Primary)
|
|
28
|
+
|
|
29
|
+
**Path:** `skills/building-omnistudio-callable-apex/SKILL.md`
|
|
30
|
+
**Trigger:** Callable implementations, VlocityOpenInterface, migration to System.Callable
|
|
31
|
+
|
|
32
|
+
**Application:**
|
|
33
|
+
|
|
34
|
+
- **Migration guidance (SKILL § Migration: VlocityOpenInterface to System.Callable):**
|
|
35
|
+
- Preserved action name: `calculateTotal` → `action` in `call()`
|
|
36
|
+
- Pass `inputMap` and `options` as keys in `args`: `{ 'inputMap' => inputMap, 'options' => options }`
|
|
37
|
+
- Return response envelope instead of mutating `outputMap`
|
|
38
|
+
- Keep `call()` thin; delegate to `calculateTotal(inputMap, options)`
|
|
39
|
+
- Backward compatibility: if `args` lacks `inputMap`, treat `args` as `inputMap`
|
|
40
|
+
|
|
41
|
+
- **Callable skeleton (SKILL § Phase 3 – Callable skeleton):**
|
|
42
|
+
- Extracted `inputMap` and `options` from `args` with null guards
|
|
43
|
+
- `switch on action` with `when else` throwing `IndustriesCallableException`
|
|
44
|
+
|
|
45
|
+
- **Response envelope:**
|
|
46
|
+
```
|
|
47
|
+
{ success, data: { total }, errors }
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
- **Input validation:** Added `toDecimal()` and `toInteger()` type coercion (OmniScript often passes strings); return error envelope when `price` or `quantity` is null or invalid.
|
|
51
|
+
|
|
52
|
+
- **Contract & Dispatch:** Explicit action list; typed exception for unsupported actions.
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
### 2. **generating-apex** (Reference)
|
|
57
|
+
|
|
58
|
+
**Path:** `~/.claude/skills/generating-apex/SKILL.md`
|
|
59
|
+
**Trigger:** Apex classes, code quality
|
|
60
|
+
|
|
61
|
+
**Application:**
|
|
62
|
+
|
|
63
|
+
- ApexDoc on class and key methods
|
|
64
|
+
- `with sharing` on the callable class
|
|
65
|
+
- Null-safe input handling; no direct casts without validation
|
|
66
|
+
- Naming: `MyCustomCallable` (callable pattern; preserves "MyCustom" from source)
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
### 3. **running-apex-tests** (Reference)
|
|
71
|
+
|
|
72
|
+
**Path:** `~/.claude/skills/running-apex-tests/SKILL.md`
|
|
73
|
+
**Trigger:** Apex tests
|
|
74
|
+
|
|
75
|
+
**Application:**
|
|
76
|
+
|
|
77
|
+
- **Positive:** Success with `inputMap`/`options`, flat args, and string inputs (type coercion)
|
|
78
|
+
- **Contract:** Missing `price`, missing `quantity`, null args → error envelope
|
|
79
|
+
- **Negative:** Unsupported action throws `IndustriesCallableException`
|
|
80
|
+
- GIVEN/WHEN/THEN implied via clear assertions and method names
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Design Decisions
|
|
85
|
+
|
|
86
|
+
| Decision | Rationale |
|
|
87
|
+
|----------|-----------|
|
|
88
|
+
| **Preserve lowercase keys** (`price`, `quantity`, `total`) | Original `MyCustomRemoteClass` used lowercase; maintains contract for existing Integration Procedures / OmniScripts |
|
|
89
|
+
| **Response envelope** | Aligns with Industries pattern; callers get consistent `success`, `data`, `errors` shape |
|
|
90
|
+
| **Error envelope for validation** | Return structured errors instead of throwing; callers can handle without try/catch |
|
|
91
|
+
| **Exception for unsupported action** | Skill pattern; `IndustriesCallableException` makes misuse explicit |
|
|
92
|
+
| **Type coercion helpers** | OmniScript/Integration Procedures often pass strings; `toDecimal`/`toInteger` allow `'25.00'`, `'4'` etc. |
|
|
93
|
+
| **Flat args fallback** | When `args` lacks `inputMap`, treat `args` as `inputMap` for backward compatibility |
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Artifacts Produced
|
|
98
|
+
|
|
99
|
+
1. **IndustriesCallableException.cls** – Custom exception for unsupported actions
|
|
100
|
+
2. **MyCustomCallable.cls** – Callable implementation (converted from MyCustomRemoteClass)
|
|
101
|
+
3. **MyCustomCallableTest.cls** – Test class (7 methods)
|
|
102
|
+
4. **TRANSCRIPT.md** – This reasoning transcript
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Contract Mapping (Before → After)
|
|
107
|
+
|
|
108
|
+
| VlocityOpenInterface2 | System.Callable |
|
|
109
|
+
|----------------------|-----------------|
|
|
110
|
+
| `methodName` = `'calculateTotal'` | `action` = `'calculateTotal'` |
|
|
111
|
+
| `inputMap.get('price')`, `inputMap.get('quantity')` | Same keys in `args.inputMap` or flat `args` |
|
|
112
|
+
| `outputMap.put('total', ...)` | `return { success => true, data => { total => ... } }` |
|
|
113
|
+
| `return false` for unsupported | `throw IndustriesCallableException` |
|
|
114
|
+
| `options` (unused in original) | Passed through for future use |
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## Deployment Notes
|
|
119
|
+
|
|
120
|
+
Copy the `.cls` files into your Salesforce project under `force-app/main/default/classes/` and add the corresponding `-meta.xml` files. No SOQL/DML; no special API version requirements.
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description Callable implementation for calculateTotal (converted from VlocityOpenInterface).
|
|
3
|
+
* Accepts Price and Quantity, returns TotalAmount in response envelope.
|
|
4
|
+
* @author building-omnistudio-callable-apex
|
|
5
|
+
*/
|
|
6
|
+
public with sharing class MyCustomCallable implements System.Callable {
|
|
7
|
+
|
|
8
|
+
public Object call(String action, Map<String, Object> args) {
|
|
9
|
+
Map<String, Object> inputMap = (args != null && args.containsKey('inputMap'))
|
|
10
|
+
? (Map<String, Object>) args.get('inputMap') : (args != null ? args : new Map<String, Object>());
|
|
11
|
+
Map<String, Object> options = (args != null && args.containsKey('options'))
|
|
12
|
+
? (Map<String, Object>) args.get('options') : new Map<String, Object>();
|
|
13
|
+
if (inputMap == null) { inputMap = new Map<String, Object>(); }
|
|
14
|
+
if (options == null) { options = new Map<String, Object>(); }
|
|
15
|
+
|
|
16
|
+
switch on action {
|
|
17
|
+
when 'calculateTotal' {
|
|
18
|
+
return calculateTotal(inputMap, options);
|
|
19
|
+
}
|
|
20
|
+
when else {
|
|
21
|
+
throw new IndustriesCallableException('Unsupported action: ' + action);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
private Map<String, Object> calculateTotal(Map<String, Object> inputMap, Map<String, Object> options) {
|
|
27
|
+
Decimal price = toDecimal(inputMap.get('Price'));
|
|
28
|
+
Integer qty = toInteger(inputMap.get('Quantity'));
|
|
29
|
+
|
|
30
|
+
if (price == null || qty == null) {
|
|
31
|
+
return new Map<String, Object>{
|
|
32
|
+
'success' => false,
|
|
33
|
+
'data' => new Map<String, Object>(),
|
|
34
|
+
'errors' => new List<Map<String, Object>>{
|
|
35
|
+
new Map<String, Object>{
|
|
36
|
+
'code' => 'INVALID_INPUT',
|
|
37
|
+
'message' => 'Price and Quantity are required and must be numeric'
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
Decimal total = price * qty;
|
|
44
|
+
|
|
45
|
+
return new Map<String, Object>{
|
|
46
|
+
'success' => true,
|
|
47
|
+
'data' => new Map<String, Object>{ 'TotalAmount' => total },
|
|
48
|
+
'errors' => new List<Map<String, Object>>()
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
private Decimal toDecimal(Object o) {
|
|
53
|
+
if (o == null) return null;
|
|
54
|
+
if (o instanceof Decimal) return (Decimal) o;
|
|
55
|
+
if (o instanceof Integer) return Decimal.valueOf((Integer) o);
|
|
56
|
+
if (o instanceof Double) return Decimal.valueOf((Double) o);
|
|
57
|
+
if (o instanceof String) {
|
|
58
|
+
try { return Decimal.valueOf((String) o); } catch (TypeException e) { return null; }
|
|
59
|
+
}
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
private Integer toInteger(Object o) {
|
|
64
|
+
if (o == null) return null;
|
|
65
|
+
if (o instanceof Integer) return (Integer) o;
|
|
66
|
+
if (o instanceof Long) return ((Long) o).intValue();
|
|
67
|
+
if (o instanceof Decimal) return ((Decimal) o).intValue();
|
|
68
|
+
if (o instanceof String) {
|
|
69
|
+
try { return Integer.valueOf((String) o); } catch (TypeException e) { return null; }
|
|
70
|
+
}
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description Test class for MyCustomCallable.
|
|
3
|
+
* Covers positive, negative, contract, and unsupported action scenarios.
|
|
4
|
+
* @author building-omnistudio-callable-apex
|
|
5
|
+
*/
|
|
6
|
+
@IsTest
|
|
7
|
+
private class MyCustomCallableTest {
|
|
8
|
+
|
|
9
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
10
|
+
// POSITIVE TESTS
|
|
11
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @description Tests calculateTotal returns TotalAmount with inputMap/options format
|
|
15
|
+
*/
|
|
16
|
+
@IsTest
|
|
17
|
+
static void testCalculateTotal_Success() {
|
|
18
|
+
System.Callable svc = new MyCustomCallable();
|
|
19
|
+
Map<String, Object> args = new Map<String, Object>{
|
|
20
|
+
'inputMap' => new Map<String, Object>{
|
|
21
|
+
'Price' => 10.50,
|
|
22
|
+
'Quantity' => 3
|
|
23
|
+
},
|
|
24
|
+
'options' => new Map<String, Object>()
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
Test.startTest();
|
|
28
|
+
Map<String, Object> result = (Map<String, Object>) svc.call('calculateTotal', args);
|
|
29
|
+
Test.stopTest();
|
|
30
|
+
|
|
31
|
+
Assert.isTrue((Boolean) result.get('success'), 'Should succeed');
|
|
32
|
+
Map<String, Object> data = (Map<String, Object>) result.get('data');
|
|
33
|
+
Assert.areEqual(31.50, (Decimal) data.get('TotalAmount'), 'TotalAmount should be 10.50 * 3');
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* @description Tests calculateTotal with flat args (backward compatibility)
|
|
38
|
+
*/
|
|
39
|
+
@IsTest
|
|
40
|
+
static void testCalculateTotal_FlatArgs_Success() {
|
|
41
|
+
System.Callable svc = new MyCustomCallable();
|
|
42
|
+
Map<String, Object> args = new Map<String, Object>{
|
|
43
|
+
'Price' => 100,
|
|
44
|
+
'Quantity' => 5
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
Test.startTest();
|
|
48
|
+
Map<String, Object> result = (Map<String, Object>) svc.call('calculateTotal', args);
|
|
49
|
+
Test.stopTest();
|
|
50
|
+
|
|
51
|
+
Assert.isTrue((Boolean) result.get('success'), 'Should succeed');
|
|
52
|
+
Map<String, Object> data = (Map<String, Object>) result.get('data');
|
|
53
|
+
Assert.areEqual(500, (Decimal) data.get('TotalAmount'), 'TotalAmount should be 100 * 5');
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* @description Tests calculateTotal with string inputs (type coercion from OmniScript)
|
|
58
|
+
*/
|
|
59
|
+
@IsTest
|
|
60
|
+
static void testCalculateTotal_StringInputs_Success() {
|
|
61
|
+
System.Callable svc = new MyCustomCallable();
|
|
62
|
+
Map<String, Object> args = new Map<String, Object>{
|
|
63
|
+
'inputMap' => new Map<String, Object>{
|
|
64
|
+
'Price' => '25.00',
|
|
65
|
+
'Quantity' => '4'
|
|
66
|
+
},
|
|
67
|
+
'options' => new Map<String, Object>()
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
Map<String, Object> result = (Map<String, Object>) svc.call('calculateTotal', args);
|
|
71
|
+
|
|
72
|
+
Assert.isTrue((Boolean) result.get('success'), 'Should succeed');
|
|
73
|
+
Map<String, Object> data = (Map<String, Object>) result.get('data');
|
|
74
|
+
Assert.areEqual(100, (Decimal) data.get('TotalAmount'), 'TotalAmount should be 25 * 4');
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
78
|
+
// NEGATIVE / CONTRACT TESTS
|
|
79
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* @description Tests unsupported action throws IndustriesCallableException
|
|
83
|
+
*/
|
|
84
|
+
@IsTest
|
|
85
|
+
static void testUnsupportedAction_Throws() {
|
|
86
|
+
try {
|
|
87
|
+
System.Callable svc = new MyCustomCallable();
|
|
88
|
+
svc.call('unknownAction', new Map<String, Object>{
|
|
89
|
+
'inputMap' => new Map<String, Object>(),
|
|
90
|
+
'options' => new Map<String, Object>()
|
|
91
|
+
});
|
|
92
|
+
Assert.fail('Expected IndustriesCallableException');
|
|
93
|
+
} catch (IndustriesCallableException e) {
|
|
94
|
+
Assert.isTrue(e.getMessage().contains('Unsupported action'), 'Message should mention unsupported action');
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* @description Tests missing Price returns error envelope
|
|
100
|
+
*/
|
|
101
|
+
@IsTest
|
|
102
|
+
static void testCalculateTotal_MissingPrice_ReturnsError() {
|
|
103
|
+
System.Callable svc = new MyCustomCallable();
|
|
104
|
+
Map<String, Object> args = new Map<String, Object>{
|
|
105
|
+
'inputMap' => new Map<String, Object>{ 'Quantity' => 2 },
|
|
106
|
+
'options' => new Map<String, Object>()
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
Map<String, Object> result = (Map<String, Object>) svc.call('calculateTotal', args);
|
|
110
|
+
|
|
111
|
+
Assert.isFalse((Boolean) result.get('success'), 'Should fail');
|
|
112
|
+
List<Object> errors = (List<Object>) result.get('errors');
|
|
113
|
+
Assert.isNotNull(errors, 'errors should not be null');
|
|
114
|
+
Assert.areEqual(1, errors.size(), 'Should have one error');
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* @description Tests null args handled gracefully
|
|
119
|
+
*/
|
|
120
|
+
@IsTest
|
|
121
|
+
static void testCalculateTotal_NullArgs_ReturnsError() {
|
|
122
|
+
System.Callable svc = new MyCustomCallable();
|
|
123
|
+
|
|
124
|
+
Map<String, Object> result = (Map<String, Object>) svc.call('calculateTotal', null);
|
|
125
|
+
|
|
126
|
+
Assert.isFalse((Boolean) result.get('success'), 'Should fail with null inputMap');
|
|
127
|
+
}
|
|
128
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
global class MyCustomClass implements vlocity_cmt.VlocityOpenInterface {
|
|
2
|
+
|
|
3
|
+
global Boolean invokeMethod(String methodName, Map<String, Object> inputs,
|
|
4
|
+
Map<String, Object> output, Map<String, Object> options) {
|
|
5
|
+
|
|
6
|
+
if (methodName == 'calculateTotal') {
|
|
7
|
+
calculateTotal(inputs, output);
|
|
8
|
+
}
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
private void calculateTotal(Map<String, Object> inputs, Map<String, Object> output) {
|
|
13
|
+
// Retrieve inputs from OmniScript/IP
|
|
14
|
+
Decimal price = (Decimal)inputs.get('Price');
|
|
15
|
+
Integer qty = (Integer)inputs.get('Quantity');
|
|
16
|
+
|
|
17
|
+
// Perform calculation
|
|
18
|
+
Decimal total = price * qty;
|
|
19
|
+
|
|
20
|
+
// Return result to JSON
|
|
21
|
+
output.put('TotalAmount', total);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# TRANSCRIPT: VlocityOpenInterface → System.Callable Conversion
|
|
2
|
+
|
|
3
|
+
## Task
|
|
4
|
+
|
|
5
|
+
Convert `MyCustomVlocityOpenInterface2.cls` (VlocityOpenInterface) to System.Callable and create a test class. Keep a transcript of reasoning and skills used.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Skills Used
|
|
10
|
+
|
|
11
|
+
| Skill | Purpose |
|
|
12
|
+
|-------|---------|
|
|
13
|
+
| **building-omnistudio-callable-apex** | Migration pattern, response envelope, action dispatch, inputMap/options contract, test patterns |
|
|
14
|
+
| **generating-apex** (implicit) | ApexDoc, type coercion, null safety, exception handling |
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Reasoning
|
|
19
|
+
|
|
20
|
+
### 1. Source Analysis
|
|
21
|
+
|
|
22
|
+
**Original class**: `MyCustomClass` implements `vlocity_cmt.VlocityOpenInterface`
|
|
23
|
+
|
|
24
|
+
- **Action**: `calculateTotal`
|
|
25
|
+
- **Inputs**: `Price` (Decimal), `Quantity` (Integer) from `inputs` map
|
|
26
|
+
- **Output**: Mutates `output` map with `TotalAmount`
|
|
27
|
+
- **Observation**: Original returns `true` for all method names (no unsupported-action handling)
|
|
28
|
+
|
|
29
|
+
### 2. Design Decisions
|
|
30
|
+
|
|
31
|
+
| Decision | Rationale |
|
|
32
|
+
|----------|------------|
|
|
33
|
+
| **Open Interface–compatible args** | Use `inputMap` and `options` keys per skill Phase 3 so OmniScript/IP callers can pass the same structure |
|
|
34
|
+
| **Flat args fallback** | Skill allows flat args when `inputMap` is absent; supports both calling styles |
|
|
35
|
+
| **Response envelope** | Return `{ success, data, errors }` instead of mutating `outputMap` per migration guidance |
|
|
36
|
+
| **Input validation** | Skill requires null-safe type coercion; OmniScript can send numbers as String |
|
|
37
|
+
| **Unsupported action** | Skill: use `switch on action` and throw `IndustriesCallableException` |
|
|
38
|
+
| **`with sharing`** | Skill guardrail: enforce sharing on callable classes |
|
|
39
|
+
|
|
40
|
+
### 3. Implementation Pattern
|
|
41
|
+
|
|
42
|
+
- **Entry point**: Extract `inputMap` and `options` from `args` (or treat flat `args` as `inputMap`)
|
|
43
|
+
- **Action dispatch**: `switch on action` with `when 'calculateTotal'` and `when else` throwing
|
|
44
|
+
- **Business logic**: `calculateTotal(inputMap, options)` returns envelope
|
|
45
|
+
- **Type coercion**: `toDecimal()` and `toInteger()` handle Decimal, Integer, Long, String (OmniScript casts)
|
|
46
|
+
- **Error envelope**: Missing/invalid inputs → `success: false` with `INVALID_INPUT` error code
|
|
47
|
+
|
|
48
|
+
### 4. Test Coverage (Phase 4)
|
|
49
|
+
|
|
50
|
+
| Test | Category | Purpose |
|
|
51
|
+
|------|----------|---------|
|
|
52
|
+
| `testCalculateTotal_Success` | Positive | InputMap/options format, validates TotalAmount |
|
|
53
|
+
| `testCalculateTotal_FlatArgs_Success` | Positive | Flat args backward compatibility |
|
|
54
|
+
| `testCalculateTotal_StringInputs_Success` | Contract | String coercion from OmniScript |
|
|
55
|
+
| `testUnsupportedAction_Throws` | Negative | Unsupported action throws `IndustriesCallableException` |
|
|
56
|
+
| `testCalculateTotal_MissingPrice_ReturnsError` | Contract | Missing required key returns error envelope |
|
|
57
|
+
| `testCalculateTotal_NullArgs_ReturnsError` | Contract | Null args handled without NPE |
|
|
58
|
+
|
|
59
|
+
### 5. Files Produced
|
|
60
|
+
|
|
61
|
+
| File | Role |
|
|
62
|
+
|------|------|
|
|
63
|
+
| `MyCustomCallable.cls` | Converted System.Callable |
|
|
64
|
+
| `MyCustomCallableTest.cls` | Test class |
|
|
65
|
+
| `IndustriesCallableException.cls` | Custom exception (skill pattern) |
|
|
66
|
+
| `TRANSCRIPT.md` | This transcript |
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## Skill References
|
|
71
|
+
|
|
72
|
+
- **Phase 2 (Design)**: Contract mapping (`methodName`→`action`, `inputMap`/`options`→`args`)
|
|
73
|
+
- **Phase 3 (Implementation)**: Callable skeleton (inputMap/options), implementation rules (validate early, null-safe)
|
|
74
|
+
- **Phase 4 (Testing)**: Positive, negative, contract tests
|
|
75
|
+
- **Migration**: Preserve action names, return envelope instead of mutating output
|