Appearance
Commission calculator
The operator commission over each vendor's share of an order is computed by a commission calculator. The core ships a flat-rate calculator (a percentage taken from the vendor's plan, falling back to the marketplace default fee). You can add your own — per category, product, vendor, tiers, etc. — without touching the core.
The contract
php
namespace Odiseo\SyliusMarketplacePlugin\Commission;
interface CommissionCalculatorInterface
{
public function supports(CommissionContext $context): bool;
public function calculate(CommissionContext $context): Commission;
}CommissionContext carries the vendor, the commission base (items subtotal net of discounts, in minor units), the currencyCode, the order and the vendor's items. Commission is the resulting operator amount in minor units.
Adding a calculator
- Implement the interface
php
<?php
// src/Commission/Calculator/CategoryCommissionCalculator.php
declare(strict_types=1);
namespace App\Commission\Calculator;
use Odiseo\SyliusMarketplacePlugin\Commission\Commission;
use Odiseo\SyliusMarketplacePlugin\Commission\CommissionCalculatorInterface;
use Odiseo\SyliusMarketplacePlugin\Commission\CommissionContext;
final class CategoryCommissionCalculator implements CommissionCalculatorInterface
{
public function supports(CommissionContext $context): bool
{
// return true only for the cases this calculator handles
}
public function calculate(CommissionContext $context): Commission
{
// ...
}
}- Tag the service with a priority
yaml
# config/services.yaml
services:
App\Commission\Calculator\CategoryCommissionCalculator:
tags:
- { name: odiseo_marketplace.commission_calculator, priority: 100 }The registry walks the calculators by priority (highest first) and uses the first whose supports() returns true. The core flat-rate calculator is registered with a very low priority, so it acts as the fallback when no custom calculator applies.