spryker-demo/merchant-onboarding-feature

Merchant Onboarding Feature

1.0.0 2025-04-09 16:09 UTC

This package is auto-updated.

Last update: 2025-05-22 16:54:35 UTC


README

Minimum PHP Version

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