Install the Marketplace Merchant Custom Prices feature

Edit on GitHub

This document describes how to integrate the Marketplace Merchant Custom Prices feature into a Spryker project.

Install feature core

Follow the steps below to install the Marketplace Merchant Custom Prices feature core.

Prerequisites

Install the required features:

NAME VERSION INSTALLATION GUIDE
Merchant Custom Prices 202404.0 Install the Merchant Custom Prices feature
Marketplace Merchant Portal Product Management 202404.0 Install the Merchant Portal - Marketplace Product feature

1) Install the required modules

Install the required modules using Composer:

composer require spryker-feature/marketplace-merchant-custom-prices:"202404.0" --with-dependencies
Verification

Make sure the following modules have been installed:

MODULE EXPECTED DIRECTORY
PriceProduct vendor/spryker/price-product
PriceProductMerchantRelationship vendor/spryker/price-product-merchant-relationship
PriceProductMerchantRelationshipMerchantPortalGui vendor/spryker/price-product-merchant-relationship-merchant-portal-gui
ProductMerchantPortalGui vendor/spryker/product-merchant-portal-gui

2) Set up transfer objects

Generate transfer changes:

console transfer:generate
Verification

Make sure the following changes have been applied in transfer objects:

TRANSFER TYPE EVENT PATH
PriceProductTableView.idMerchantRelationship property Created src/Generated/Shared/Transfer/PriceProductTableViewTransfer.php
PriceProductTableView.merchantRelationshipName property Created src/Generated/Shared/Transfer/PriceProductTableViewTransfer.php
MerchantRelationshipFilter.merchantIds property Created src/Generated/Shared/Transfer/MerchantRelationshipFilterTransfer.php

3) Add Zed translations

Generate new translation cache for Zed:

console translator:generate-cache

4) Set up behavior

Enable the following behaviors by registering the plugins:

PLUGIN SPECIFICATION PREREQUISITES NAMESPACE
MerchantRelationshipPreBuildPriceProductGroupKeyPlugin Extends the logic for the Price Product group key generation. Spryker\Service\PriceProductMerchantRelationship\Plugin\PriceProduct
MerchantRelationshipVolumePriceProductValidatorPlugin Validates volume prices. Spryker\Zed\PriceProductMerchantRelationshipMerchantPortalGui\Communication\Plugin\PriceProduct
MerchantRelationshipPriceProductCollectionDeletePlugin Removes price product merchant relationships. Spryker\Zed\PriceProductMerchantRelationship\Communication\Plugin\PriceProduct
MerchantRelationshipPriceProductTableFilterPlugin Filters price product transfers. Spryker\Zed\PriceProductMerchantRelationshipMerchantPortalGui\Communication\Plugin\ProductMerchantPortalGui
MerchantRelationshipPriceProductAbstractTableConfigurationExpanderPlugin Expands price product abstract table configuration. Spryker\Zed\PriceProductMerchantRelationshipMerchantPortalGui\Communication\Plugin\ProductMerchantPortalGui
MerchantRelationshipPriceProductConcreteTableConfigurationExpanderPlugin Expands price product concrete table configuration. Spryker\Zed\PriceProductMerchantRelationshipMerchantPortalGui\Communication\Plugin\ProductMerchantPortalGui
MerchantRelationshipPriceProductMapperPlugin Maps merchant relationship data. Spryker\Zed\PriceProductMerchantRelationshipMerchantPortalGui\Communication\Plugin\ProductMerchantPortalGui
src/Pyz/Zed/ProductMerchantPortalGui/ProductMerchantPortalGuiDependencyProvider.php
<?php

namespace Pyz\Zed\ProductMerchantPortalGui;

use Spryker\Zed\PriceProductMerchantRelationshipMerchantPortalGui\Communication\Plugin\ProductMerchantPortalGui\MerchantRelationshipPriceProductAbstractTableConfigurationExpanderPlugin;
use Spryker\Zed\PriceProductMerchantRelationshipMerchantPortalGui\Communication\Plugin\ProductMerchantPortalGui\MerchantRelationshipPriceProductConcreteTableConfigurationExpanderPlugin;
use Spryker\Zed\PriceProductMerchantRelationshipMerchantPortalGui\Communication\Plugin\ProductMerchantPortalGui\MerchantRelationshipPriceProductMapperPlugin;
use Spryker\Zed\PriceProductMerchantRelationshipMerchantPortalGui\Communication\Plugin\ProductMerchantPortalGui\MerchantRelationshipPriceProductTableFilterPlugin;
use Spryker\Zed\ProductMerchantPortalGui\ProductMerchantPortalGuiDependencyProvider as SprykerProductMerchantPortalGuiDependencyProvider;

class ProductMerchantPortalGuiDependencyProvider extends SprykerProductMerchantPortalGuiDependencyProvider
{
    /**
     * @return array<\Spryker\Zed\ProductMerchantPortalGuiExtension\Dependency\Plugin\PriceProductTableFilterPluginInterface>
     */
    protected function getPriceProductTableFilterPlugins(): array
    {
        return [
            new MerchantRelationshipPriceProductTableFilterPlugin(),
        ];
    }

    /**
     * @return array<\Spryker\Zed\ProductMerchantPortalGuiExtension\Dependency\Plugin\PriceProductAbstractTableConfigurationExpanderPluginInterface>
     */
    protected function getPriceProductAbstractTableConfigurationExpanderPlugins(): array
    {
        return [
            new MerchantRelationshipPriceProductAbstractTableConfigurationExpanderPlugin(),
        ];
    }

    /**
     * @return array<\Spryker\Zed\ProductMerchantPortalGuiExtension\Dependency\Plugin\PriceProductConcreteTableConfigurationExpanderPluginInterface>
     */
    protected function getPriceProductConcreteTableConfigurationExpanderPlugins(): array
    {
        return [
            new MerchantRelationshipPriceProductConcreteTableConfigurationExpanderPlugin(),
        ];
    }

    /**
     * @return array<\Spryker\Zed\ProductMerchantPortalGuiExtension\Dependency\Plugin\PriceProductMapperPluginInterface>
     */
    protected function getPriceProductMapperPlugins(): array
    {
        return [
            new MerchantRelationshipPriceProductMapperPlugin(),
        ];
    }
}
Verification

Log in to the Merchant Portal with a merchant that has at least one merchant relationship.

Open any merchant product and make sure that the Prices table contains the “Customer” column for both: abstract and concrete products.

Make sure that you can filter and sort the price table by Customer column.

src/Pyz/Service/PriceProduct/PriceProductDependencyProvider.php
<?php

namespace Pyz\Service\PriceProduct;

use Spryker\Service\PriceProduct\PriceProductDependencyProvider as SprykerPriceProductDependencyProvider;
use Spryker\Service\PriceProductMerchantRelationship\Plugin\PriceProduct\MerchantRelationshipPreBuildPriceProductGroupKeyPlugin;

class PriceProductDependencyProvider extends SprykerPriceProductDependencyProvider
{
    /**
     * @return array<int, \Spryker\Service\PriceProductExtension\Dependency\Plugin\PreBuildPriceProductGroupKeyPluginInterface>
     */
    protected function getPreBuildPriceProductGroupKeyPlugins(): array
    {
        return [
            new MerchantRelationshipPreBuildPriceProductGroupKeyPlugin(),
        ];
    }
}
Verification

Open any merchant product with a regular price.

Create a customer-specific price with the same combination of currency and country as the existing price.

Make sure that there is no validation error.

src/Pyz/Zed/PriceProduct/PriceProductDependencyProvider.php
<?php

namespace Pyz\Zed\PriceProduct;

use Spryker\Zed\PriceProduct\PriceProductDependencyProvider as SprykerPriceProductDependencyProvider;
use Spryker\Zed\PriceProductMerchantRelationship\Communication\Plugin\PriceProduct\MerchantRelationshipPriceProductCollectionDeletePlugin;
use Spryker\Zed\PriceProductMerchantRelationshipMerchantPortalGui\Communication\Plugin\PriceProduct\MerchantRelationshipVolumePriceProductValidatorPlugin;

class PriceProductDependencyProvider extends SprykerPriceProductDependencyProvider
{
    /**
     * @return array<\Spryker\Zed\PriceProductExtension\Dependency\Plugin\PriceProductValidatorPluginInterface>
     */
    protected function getPriceProductValidatorPlugins(): array
    {
        return [
            new MerchantRelationshipVolumePriceProductValidatorPlugin(),
        ];
    }

    /**
     * @return array<\Spryker\Zed\PriceProductExtension\Dependency\Plugin\PriceProductCollectionDeletePluginInterface>
     */
    protected function getPriceProductCollectionDeletePlugins(): array
    {
        return [
            new MerchantRelationshipPriceProductCollectionDeletePlugin(),
        ];
    }     
}
Verification

Make sure that you see the validation error while attempting to set or create the customer price for the volume price.

Make sure that you can delete the customer price.

5) Filter out product offer prices

This option is only available if you have the Marketplace Product Offer feature installed.

Enable the following behaviors by registering the plugins:

PLUGIN SPECIFICATION PREREQUISITES NAMESPACE
PriceProductOfferPriceProductTableFilterPlugin (Optional) Maps merchant relationship data. Spryker\Zed\PriceProductOfferGui\Communication\Plugin\ProductMerchantPortalGui
namespace Pyz\Zed\ProductMerchantPortalGui;

use Spryker\Zed\PriceProductOfferGui\Communication\Plugin\ProductMerchantPortalGui\PriceProductOfferPriceProductTableFilterPlugin;
use Spryker\Zed\ProductMerchantPortalGui\ProductMerchantPortalGuiDependencyProvider as SprykerProductMerchantPortalGuiDependencyProvider;

class ProductMerchantPortalGuiDependencyProvider extends SprykerProductMerchantPortalGuiDependencyProvider
{
    /**
     * @return array<\Spryker\Zed\ProductMerchantPortalGuiExtension\Dependency\Plugin\PriceProductTableFilterPluginInterface>
     */
    protected function getPriceProductTableFilterPlugins(): array
    {
        return [
            new PriceProductOfferPriceProductTableFilterPlugin(),
        ];
    }
}
Verification
  1. Log in to the Merchant Portal with a merchant that has at least one merchant relationship and product offer.
  2. Open any product that has a product offer.
  3. Make sure that the Prices table does not contain product offer prices for both abstract and concrete products.