2017 © Pedro Peláez
 

sylius-plugin deposit-plugin

A Sylius plugin that allows deposit fees for products

image

gweb/deposit-plugin

A Sylius plugin that allows deposit fees for products

  • Monday, June 25, 2018
  • by gweb
  • Repository
  • 0 Watchers
  • 0 Stars
  • 0 Installations
  • PHP
  • 0 Dependents
  • 0 Suggesters
  • 0 Forks
  • 1 Open issues
  • 1 Versions
  • 0 % Grown

The README.md

Sylius Product Deposit Plugin

Latest Version on Packagist ![Software License][ico-license] Build Quality Score, (*1)

, (*2)

The product deposit plugin in Sylius allows you to set an amount of refundable deposit price for any product. For example: deposit for bottles, cans, pallets, batteries or car replacement parts., (*3)

Features

  • Store individual deposit prices for each product variant and channel
  • The deposit price is displayed on the product detail page
  • At shopping cart / checkout / order the total unit price inclusive deposit is displayed.

Installation

Download the plugin via composer

composer require gewebe/sylius-product-deposit-plugin

Enable the plugin

Register the plugin by adding it to your config/bundles.php file, (*4)

<?php

return [
    // ...
    Gewebe\SyliusProductDepositPlugin\GewebeSyliusProductDepositPlugin::class => ['all' => true],
];

Configure the plugin

# config/packages/gewebe_sylius_product_deposit.yaml

imports:
    - { resource: '@GewebeSyliusProductDepositPlugin/Resources/config/app/config.yml'}

Copy the template overrides from the plugin directory

From: [shop_dir]/vendor/gewebe/sylius-product-deposit-plugin/test/Application/templates
To: [shop_dir]/templates

Extend ProductVariant entity

  • If you use annotations mapping:
# src/Entity/Product/ProductVariant.php

namespace App\Entity\Product;

use Doctrine\ORM\Mapping as ORM;
use Gewebe\SyliusProductDepositPlugin\Entity\ProductVariantInterface as ProductVariantDepositInterface;
use Gewebe\SyliusProductDepositPlugin\Entity\ProductVariantDepositTrait;
use Sylius\Component\Core\Model\ProductVariant as BaseProductVariant;

/**
 * @ORM\Entity
 * @ORM\Table(name="sylius_product_variant")
 */
class ProductVariant extends BaseProductVariant implements ProductVariantDepositInterface
{
    use ProductVariantDepositTrait;

    public function __construct()
    {
        parent::__construct();

        $this->initProductVariantDepositTrait();
    }

    // ...
}
  • If you use yaml mapping add also:
App\Entity\Product\ProductVariant:
    type: entity
    table: sylius_product_variant
    manyToOne:
        depositTaxCategory:
            targetEntity: Sylius\Component\Taxation\Model\TaxCategoryInterface
            joinColumn:
                name: deposit_tax_category_id
                referencedColumnName: id
                onDelete: SET NULL
    oneToMany:
        channelDeposits:
            targetEntity: Gewebe\SyliusProductDepositPlugin\Entity\ChannelDepositInterface
            mappedBy: productVariant
            orphanRemoval: true
            indexBy: channelCode
            cascade:
                - all

Update your database schema

bin/console doctrine:migrations:diff
bin/console doctrine:migrations:migrate

Usage

1. Add a deposit price to a product variant

Screenshot manage product variant deposit price, (*5)

2. Browse a product variant with deposit price

Screenshot product details with deposit, (*6)

3. Buy a product with deposit price included in final product price

Screenshot shopping cart with deposit, (*7)

Testing

Setup, (*8)

$ composer install
$ cd tests/Application
$ yarn install
$ yarn run gulp
$ bin/console assets:install public -e test
$ bin/console doctrine:schema:create -e test

$ export APP_ENV=test
$ symfony server:start --port=8080 --dir=public

Run Tests, (*9)

$ vendor/bin/behat
$ vendor/bin/phpspec run
$ vendor/bin/phpstan analyse -c phpstan.neon -l max src/
$ vendor/bin/psalm

The Versions