spryker-demo / merchant-onboarding-feature
Merchant Onboarding Feature
1.0.0
2025-04-09 16:09 UTC
Requires
- php: >=8.2
- spryker-demo/merchant-onboarding: ^1.0.0
- spryker-demo/merchant-onboarding-gui: ^1.0.0
- spryker-demo/merchant-onboarding-merchant-portal-gui: ^1.0.0
Requires (Dev)
- spryker/code-sniffer: ^0.17.18
README
This feature handles merchant onboarding state machine process.
Installation
composer require spryker-demo/merchant-onboarding-feature
Add SprykerDemo
namespace to configuration
$config[KernelConstants::CORE_NAMESPACES] = [
'SprykerDemo',
...
];
Add ACL configuration
# src/Pyz/Zed/Acl/AclConfig.php protected function addPyzMerchantPortalInstallerRules(array $installerRules): array { $bundleNames = [ ... 'merchant-onboarding-merchant-portal-gui', ]; ... } # src/Pyz/Zed/AclMerchantPortal/AclMerchantPortalDependencyProvider.php use SprykerDemo\Zed\MerchantOnboardingMerchantPortalGui\Communication\Plugin\AclMerchantPortal\MerchantOnboardingMerchantPortalGuiMerchantAclRuleExpanderPlugin; protected function getMerchantAclRuleExpanderPlugins(): array { return [ ... new MerchantOnboardingMerchantPortalGuiMerchantAclRuleExpanderPlugin(), ]; }
Add navigation files
# config/Zed/navigation.xml <merchant-onboarding-merchant-portal-gui> <label>Onboarding</label> <title>Onboarding</title> <bundle>merchant-onboarding-merchant-portal-gui</bundle> <controller>onboarding</controller> <action>index</action> <icon>rocket</icon> </merchant-onboarding-merchant-portal-gui>
Add state machine xml
# config/Zed/StateMachine/MerchantOnboarding/MerchantOnboardingStateMachine.xml <?xml version="1.0"?> <statemachine xmlns="spryker:state-machine-01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="spryker:state-machine-01 http://static.spryker.com/state-machine-01.xsd" > <process name="MerchantOnboardingStateMachine" main="true"> <states> <state name="registered"/> <state name="detected"/> <state name="approved"/> <state name="denied"/> <state name="In onboarding"/> <state name="Product or Offer created"/> <state name="Payment and Service Agreement Completed"/> <state name="Order Testing Completed"/> <state name="Onboarding completed"/> <state name="manual validation needed"/> </states> <transitions> <transition happy="true" condition="MerchantOnboarding/IsDetected"> <source>registered</source> <target>detected</target> <event>initiate</event> </transition> <transition> <source>registered</source> <target>manual validation needed</target> <event>initiate</event> </transition> <transition> <source>manual validation needed</source> <target>approved</target> <event>approve</event> </transition> <transition> <source>manual validation needed</source> <target>denied</target> <event>deny</event> </transition> <transition> <source>detected</source> <target>approved</target> <event>approve</event> </transition> <transition> <source>approved</source> <target>In onboarding</target> <event>Start onboarding</event> </transition> <transition> <source>In onboarding</source> <target>Product or Offer created</target> <event>Merchant Profile Completion</event> </transition> <transition> <source>Product or Offer created</source> <target>Payment and Service Agreement Completed</target> <event>Payment and Service Agreement</event> </transition> <transition> <source>Payment and Service Agreement Completed</source> <target>Order Testing Completed</target> <event>Order Testing</event> </transition> <transition> <source>Order Testing Completed</source> <target>Onboarding completed</target> <event>Complete onboarding</event> </transition> </transitions> <events> <event name="initiate" onEnter="true" command="MerchantOnboarding/DetectMerchantScore"/> <event name="approve" manual="true" command="MerchantOnboarding/ApproveMerchant"/> <event name="deny" manual="true" command="MerchantOnboarding/DenyMerchant"/> <event name="Start onboarding" manual="true"/> <event name="Merchant Profile Completion" manual="true"/> <event name="Product and offer creation" manual="true"/> <event name="Payment and Service Agreement" manual="true"/> <event name="Order Testing" manual="true"/> <event name="Complete onboarding" manual="true"/> </events> </process> </statemachine>
Add merchant onboarding state machine data (optionally)
composer require spryker-demo/merchant-onboarding-data-import
merchant-onboarding
- File
data/import/common/common/marketplace/merchant_onboarding_state_machine.csv
- File template:
vendor/spryker-demo/merchant-onboarding-data-import/data/import/common/common/marketplace/merchant_onboarding_state_machine.csv
- Command:
vendor/bin/console data:import:merchant-onboarding
Wire merchant onboarding plugins
# src/Pyz/Zed/DataImport/DataImportDependencyProvider.php use SprykerDemo\Zed\MerchantOnboardingDataImport\Communication\Plugin\DataImport\MerchantOnboardingDataImportPlugin; protected function getDataImporterPlugins(): array { return [ ... new MerchantOnboardingDataImportPlugin(), ]; }
# src/Pyz/Zed/Merchant/MerchantDependencyProvider.php use SprykerDemo\Zed\MerchantOnboarding\Communication\Plugin\Merchant\MerchantStateMachineExpanderPlugin; use SprykerDemo\Zed\MerchantOnboarding\Communication\Plugin\Merchant\MerchantStateMachinePostCreatePlugin; protected function getMerchantPostCreatePlugins(): array { return [ ... new MerchantStateMachinePostCreatePlugin(), ]; } protected function getMerchantExpanderPlugins(): array { return [ ... new MerchantStateMachineExpanderPlugin(), ]; }
# src/Pyz/Zed/MerchantGui/MerchantGuiDependencyProvider.php use SprykerDemo\Zed\MerchantOnboardingGui\Communication\Plugin\MerchantOnboardingMerchantTableDataExpanderPlugin; use SprykerDemo\Zed\MerchantOnboardingGui\Communication\Plugin\MerchantOnboardingMerchantTableHeaderExpanderPlugin; protected function getMerchantTableDataExpanderPlugins(): array { return [ new MerchantOnboardingMerchantTableDataExpanderPlugin(), ]; } protected function getMerchantTableHeaderExpanderPlugins(): array { return [ new MerchantOnboardingMerchantTableHeaderExpanderPlugin(), ]; }
# src/Pyz/Zed/StateMachine/StateMachineDependencyProvider.php use SprykerDemo\Zed\MerchantOnboarding\Communication\Plugin\MerchantOnboardingStateMachineHandlerPlugin; protected function getStateMachineHandlers(): array { return [ ... new MerchantOnboardingStateMachineHandlerPlugin(), ]; }
Apply Twig customization
# src/Pyz/Zed/MerchantGui/Presentation/EditMerchant/index.twig
{% extends '@Gui/Layout/layout.twig' %}
{% set widget_title = 'Edit Merchant' | trans ~ ': ' ~ idMerchant %}
{% block head_title widget_title %}
{% block section_title widget_title %}
{% block action %}
{{ backActionButton(url('/merchant-gui/list-merchant'), 'Back to Merchants' | trans) }}
{{ render(controller('/merchant-onboarding-gui/render-view/onboarding', {
'id-merchant': idMerchant
})) }}
{% endblock %}
{% block content %}
{% embed '@Gui/Partials/widget.twig' %}
{% block widget_content %}
{{ form_start(form, {'attr': {'novalidate': 'novalidate'}}) }}
{{ tabs(merchantFormTabs, {'merchantForm': form}) }}
{{ form_end(form) }}
{% endblock %}
{% endembed %}
{% endblock %}
Apply Merchant portal customization
# tsconfig.mp.json
"compilerOptions": {
"paths": {
...
"@mp/merchant-onboarding-merchant-portal-gui": [
"./vendor/spryker/spryker-demo/Bundles/MerchantOnboardingMerchantPortalGui/mp.public-api.ts"
]
}
}
# src/Pyz/Zed/ZedUi/Presentation/Components/app/app.module.ts
...
import { IconRocketModule } from '@mp/merchant-onboarding-merchant-portal-gui';
@NgModule({
imports: [
...
IconRocketModule,
],
})
Build Propel classes
vendor/bin/console propel:install
Generate Backoffice translations
vendor/bin/console translator:generate-cache
Build Merchant Portal frontend
vendor/bin/console frontend:mp:build