From f3a9c5197d78123a78570647d95d83b86176f207 Mon Sep 17 00:00:00 2001 From: Maxime Huran Date: Tue, 21 Jan 2025 19:21:41 +0100 Subject: [PATCH] feat(deps): Add compatibility from Sylius 1.12 to 1.14 --- .github/workflows/recipe.yaml | 151 +++++++++--------- .github/workflows/security.yaml | 97 ++++++----- .github/workflows/tests.yaml | 151 +++++++++--------- .php-version.dist | 2 +- LICENSE => LICENSE.txt | 0 Makefile | 29 ++-- README.md | 52 +++--- composer.json | 57 ++----- dist/.env.local | 1 + ...rbiz_sylius_advanced_promotion_plugin.yaml | 2 - ...rbiz_sylius_advanced_promotion_plugin.yaml | 2 - dist/src/Entity/Promotion/Promotion.php | 6 + docker-compose.yaml.dist | 3 +- docs/images/promotion-admin.jpg | Bin 0 -> 7250 bytes docs/images/promotion-front.jpg | Bin 0 -> 52106 bytes phpstan.neon | 18 +-- ...eurBizSyliusAdvancedPromotionExtension.php | 39 ++--- .../config/fixtures/advanced_promotion.yaml | 2 +- 18 files changed, 290 insertions(+), 322 deletions(-) rename LICENSE => LICENSE.txt (100%) create mode 100644 dist/.env.local delete mode 100644 dist/config/packages/monsieurbiz_sylius_advanced_promotion_plugin.yaml delete mode 100644 dist/config/routes/monsieurbiz_sylius_advanced_promotion_plugin.yaml create mode 100644 docs/images/promotion-admin.jpg create mode 100644 docs/images/promotion-front.jpg diff --git a/.github/workflows/recipe.yaml b/.github/workflows/recipe.yaml index cbc8a55..74ca8d0 100644 --- a/.github/workflows/recipe.yaml +++ b/.github/workflows/recipe.yaml @@ -1,81 +1,80 @@ name: Flex Recipe on: - push: - branches: [ master ] - pull_request: + push: + branches: [ master ] + pull_request: jobs: - - recipe: - - name: Flex recipe (PHP ${{ matrix.php }}, Sylius ${{ matrix.sylius }}) - - runs-on: ubuntu-latest - - strategy: - fail-fast: false - matrix: - php: ['8.1', '8.2'] - sylius: ["~1.12.0"] - - steps: - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: ${{ matrix.php }} - extensions: gd, intl, json - ini-values: date.timezone=UTC - - - name: Set project php-version - run: | - echo ${{ matrix.php }} > .php-version - - - uses: actions/checkout@v3 - with: - path: plugin - - - name: Determine composer cache directory - id: composer-cache-directory - working-directory: plugin - run: echo "directory=$(composer config cache-dir)" >> $GITHUB_OUTPUT - - - name: Cache dependencies installed with composer - uses: actions/cache@v3 - id: cache-composer - with: - path: ${{ steps.composer-cache-directory.outputs.directory }} - key: composer2-php:${{ matrix.php }}-sylius:${{ matrix.sylius }}-${{ hashFiles('**/composer.json') }} - restore-keys: composer2-php:${{ matrix.php }}-sylius:${{ matrix.sylius }}- - - - name: Ensure that composer cache directory exists - run: mkdir -p ${{ steps.composer-cache-directory.outputs.directory }} - - - name: Composer Github Auth - run: composer config -g github-oauth.github.com ${{ github.token }} - - - name: Create Sylius-Standard project without install - run: | - composer create-project --prefer-dist --no-scripts --no-progress --no-install sylius/sylius-standard sylius "${{ matrix.sylius }}" - - # Because the sylius-standard has a soft constraint - - name: Make sure to install the required version of Sylius - working-directory: ./sylius - run: | - composer require --no-install --no-scripts --no-progress sylius/sylius="${{ matrix.sylius }}" - - - name: Setup some requirements - working-directory: ./sylius - run: | - composer config --no-plugins allow-plugins true - composer config --no-plugins extra.symfony.allow-contrib true - composer config --no-plugins secure-http false - composer config --no-plugins --unset platform.php - composer config --no-plugins extra.symfony.docker false - composer config --no-plugins --json extra.symfony.endpoint '["https://api.github.com/repos/monsieurbiz/symfony-recipes/contents/index.json?ref=flex/master","flex://defaults"]' - composer config repositories.plugin '{"type": "path", "url": "../plugin/"}' - - - name: Require plugin & install all dependencies - working-directory: ./sylius - run: | - composer require monsieurbiz/sylius-advanced-promotion-plugin="*@dev" + + recipe: + + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + php: ['8.1', '8.2', '8.3'] + sylius: ["~1.12.0", "~1.13.0", "1.14.0"] + + steps: + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + extensions: gd, intl, json + ini-values: date.timezone=UTC + tools: symfony-cli + + - name: Set project php-version + run: | + echo ${{ matrix.php }} > .php-version + + - uses: actions/checkout@v3 + with: + path: plugin + + - name: Determine composer cache directory + id: composer-cache-directory + working-directory: plugin + run: echo "directory=$(composer config cache-dir)" >> $GITHUB_OUTPUT + + - name: Cache dependencies installed with composer + uses: actions/cache@v3 + id: cache-composer + with: + path: ${{ steps.composer-cache-directory.outputs.directory }} + key: composer2-php:${{ matrix.php }}-sylius:${{ matrix.sylius }}-${{ hashFiles('**/composer.json') }} + restore-keys: composer2-php:${{ matrix.php }}-sylius:${{ matrix.sylius }}- + + - name: Ensure that composer cache directory exists + run: mkdir -p ${{ steps.composer-cache-directory.outputs.directory }} + + - name: Composer Github Auth + run: composer config -g github-oauth.github.com ${{ github.token }} + + - name: Create Sylius-Standard project without install + run: | + composer create-project --prefer-dist --no-scripts --no-progress --no-install sylius/sylius-standard sylius "${{ matrix.sylius }}" + + # Because the sylius-standard has a soft constraint + - name: Make sure to install the required version of Sylius + working-directory: ./sylius + run: | + composer require --no-install --no-scripts --no-progress sylius/sylius="${{ matrix.sylius }}" + + - name: Setup some requirements + working-directory: ./sylius + run: | + composer config --no-plugins allow-plugins true + composer config --no-plugins extra.symfony.allow-contrib true + composer config --no-plugins secure-http false + composer config --no-plugins --unset platform.php + composer config --no-plugins extra.symfony.docker false + composer config --no-plugins --json extra.symfony.endpoint '["https://api.github.com/repos/monsieurbiz/symfony-recipes/contents/index.json?ref=flex/master","flex://defaults"]' + composer config repositories.plugin '{"type": "path", "url": "../plugin/"}' + + - name: Require plugin & install all dependencies + working-directory: ./sylius + run: | + composer require monsieurbiz/sylius-advanced-promotion-plugin="*@dev" diff --git a/.github/workflows/security.yaml b/.github/workflows/security.yaml index 44ceeef..df6525a 100644 --- a/.github/workflows/security.yaml +++ b/.github/workflows/security.yaml @@ -1,54 +1,53 @@ name: Security on: - push: - pull_request: + push: + pull_request: jobs: - - security: - - name: Security check (PHP ${{ matrix.php }}) - - runs-on: ubuntu-latest - - strategy: - fail-fast: false - matrix: - php: ['8.1', '8.2'] - - steps: - - uses: actions/checkout@v3 - - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: ${{ matrix.php }} - ini-values: date.timezone=UTC - - - name: Set project php-version - run: | - echo ${{ matrix.php }} > .php-version - - - name: Determine composer cache directory - id: composer-cache-directory - run: echo "directory=$(composer config cache-dir)" >> $GITHUB_OUTPUT - - - name: Cache dependencies installed with composer - uses: actions/cache@v3 - id: cache-composer - with: - path: ${{ steps.composer-cache-directory.outputs.directory }} - key: composer2-php:${{ matrix.php }}-${{ hashFiles('**/composer.json') }} - restore-keys: composer2-php:${{ matrix.php }}- - - - name: Ensure that composer cache directory exists - run: mkdir -p ${{ steps.composer-cache-directory.outputs.directory }} - - - name: Composer Github Auth - run: composer config -g github-oauth.github.com ${{ github.token }} - - - name: Install PHP dependencies - run: composer update --prefer-dist - - - uses: symfonycorp/security-checker-action@v4 + + security: + + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + php: ['8.1', '8.2', '8.3'] + + steps: + - uses: actions/checkout@v3 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + extensions: gd, intl, json + + - name: Set project php-version + run: | + echo "${{ matrix.php }}" > .php-version + + - name: Determine composer cache directory + id: composer-cache-directory + run: echo "directory=$(composer config cache-dir)" >> $GITHUB_OUTPUT + + - name: Cache dependencies installed with composer + uses: actions/cache@v3 + id: cache-composer + with: + path: ${{ steps.composer-cache-directory.outputs.directory }} + key: composer2-php:${{ matrix.php }}-${{ github.sha }} + restore-keys: composer2-php:${{ matrix.php }}- + + - name: Ensure that composer cache directory exists + run: mkdir -p ${{ steps.composer-cache-directory.outputs.directory }} + + - name: Composer Github Auth + run: composer config -g github-oauth.github.com ${{ github.token }} + + - name: Install PHP dependencies + run: composer update --prefer-dist + + - uses: symfonycorp/security-checker-action@v4 + diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index c40aeb5..35e1014 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -1,82 +1,79 @@ name: Tests on: - push: - branches: [ master ] - pull_request: + push: + branches: [ master ] + pull_request: jobs: - - php: - - name: Quality tests (PHP ${{ matrix.php }}) - - runs-on: ubuntu-latest - - strategy: - fail-fast: false - matrix: - php: ['8.1', '8.2'] - - env: - SYMFONY_ARGS: --no-tls - COMPOSER_ARGS: --prefer-dist - DOCKER_INTERACTIVE_ARGS: -t - - steps: - - uses: actions/checkout@v3 - - - uses: actions/setup-node@v3 - with: - node-version: '16' - - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: ${{ matrix.php }} - ini-values: date.timezone=UTC - - - name: Set project php-version - run: | - echo ${{ matrix.php }} > .php-version - - - name: Install symfony CLI - run: | - curl -1sLf 'https://dl.cloudsmith.io/public/symfony/stable/setup.deb.sh' | sudo -E bash - sudo apt install symfony-cli - - - name: Determine composer cache directory - id: composer-cache-directory - run: echo "directory=$(composer config cache-dir)" >> $GITHUB_OUTPUT - - - name: Cache dependencies installed with composer - uses: actions/cache@v3 - id: cache-composer - with: - path: ${{ steps.composer-cache-directory.outputs.directory }} - key: composer2-php:${{ matrix.php }}-${{ hashFiles('**/composer.json') }} - restore-keys: composer2-php:${{ matrix.php }}- - - - name: Ensure that composer cache directory exists - run: mkdir -p ${{ steps.composer-cache-directory.outputs.directory }} - - - name: Composer Github Auth - run: composer config -g github-oauth.github.com ${{ github.token }} - - - run: make install - - - run: make test.composer - - - run: make test.phpcs - - - run: make test.phpstan - - - run: make test.phpmd - - - run: make test.yaml - - - run: make test.twig - - - run: make test.schema - - - run: make test.container + + php: + + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + php: ['8.1', '8.2', '8.3'] + + env: + SYMFONY_ARGS: --no-tls + COMPOSER_ARGS: --prefer-dist + DOCKER_INTERACTIVE_ARGS: -t + + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: '14' + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + extensions: gd, intl, json + ini-values: date.timezone=UTC + tools: symfony-cli + + - name: Set project php-version + run: | + echo "${{ matrix.php }}" > .php-version + + - name: Determine composer cache directory + id: composer-cache-directory + run: echo "directory=$(composer config cache-dir)" >> $GITHUB_OUTPUT + + - name: Cache dependencies installed with composer + uses: actions/cache@v3 + id: cache-composer + with: + path: ${{ steps.composer-cache-directory.outputs.directory }} + key: composer2-php:${{ matrix.php }}-${{ github.sha }} + restore-keys: composer2-php:${{ matrix.php }}- + + - name: Ensure that composer cache directory exists + run: mkdir -p ${{ steps.composer-cache-directory.outputs.directory }} + + - name: Composer Github Auth + run: composer config -g github-oauth.github.com ${{ github.token }} + + - run: make install + + - run: make test.composer + + - run: make test.phpcs + + - run: make test.phpunit + + - run: make test.phpstan + + - run: make test.phpmd + + - run: make test.phpspec + + - run: make test.yaml + + - run: make test.twig + + - run: make test.schema + + - run: make test.container diff --git a/.php-version.dist b/.php-version.dist index 2983cad..cf02201 100644 --- a/.php-version.dist +++ b/.php-version.dist @@ -1 +1 @@ -8.2 +8.3 diff --git a/LICENSE b/LICENSE.txt similarity index 100% rename from LICENSE rename to LICENSE.txt diff --git a/Makefile b/Makefile index 250165a..d5b7d46 100644 --- a/Makefile +++ b/Makefile @@ -1,16 +1,16 @@ .DEFAULT_GOAL := help SHELL=/bin/bash APP_DIR=tests/Application -SYLIUS_VERSION=1.12.0 +SYLIUS_VERSION=1.14.0 SYMFONY=cd ${APP_DIR} && symfony COMPOSER=symfony composer CONSOLE=${SYMFONY} console export COMPOSE_PROJECT_NAME=advanced-promotion +export MIGRATIONS_NAMESPACE=MonsieurBiz\\SyliusAdvancedPromotionPlugin\\Migrations +export USER_UID=$(shell id -u) PLUGIN_NAME=sylius-${COMPOSE_PROJECT_NAME}-plugin COMPOSE=docker compose YARN=yarn -DOCTRINE_MIGRATIONS_NAMESPACE=MonsieurBiz\SyliusAdvancedPromotionPlugin\Migrations - ### ### DEVELOPMENT @@ -78,7 +78,7 @@ setup_application: $(MAKE) ${APP_DIR}/php.ini (cd ${APP_DIR} && ${COMPOSER} install --no-interaction) $(MAKE) apply_dist - (cd ${APP_DIR} && ${COMPOSER} require --no-progress monsieurbiz/${PLUGIN_NAME}="*@dev") + (cd ${APP_DIR} && ${COMPOSER} require --no-progress --no-interaction monsieurbiz/${PLUGIN_NAME}="*@dev") rm -rf ${APP_DIR}/var/cache @@ -111,7 +111,7 @@ apply_dist: ### TESTS ### ¯¯¯¯¯ -test.all: test.composer test.phpstan test.phpmd test.phpcs test.yaml test.schema test.twig test.container ## Run all tests in once +test.all: test.composer test.phpstan test.phpmd test.phpunit test.phpspec test.phpcs test.yaml test.schema test.twig test.container ## Run all tests in once test.composer: ## Validate composer.json ${COMPOSER} validate --strict @@ -122,6 +122,12 @@ test.phpstan: ## Run PHPStan test.phpmd: ## Run PHPMD ${COMPOSER} phpmd +test.phpunit: ## Run PHPUnit + ${COMPOSER} phpunit + +test.phpspec: ## Run PHPSpec + ${COMPOSER} phpspec + test.phpcs: ## Run PHP CS Fixer in dry-run ${COMPOSER} run -- phpcs --dry-run -v @@ -132,7 +138,7 @@ test.container: ## Lint the symfony container ${CONSOLE} lint:container test.yaml: ## Lint the symfony Yaml files - ${CONSOLE} lint:yaml ../../recipes ../../src/Resources/config + ${CONSOLE} lint:yaml ../../src/Resources/config --parse-tags test.schema: ## Validate MySQL Schema ${CONSOLE} doctrine:schema:validate @@ -140,14 +146,6 @@ test.schema: ## Validate MySQL Schema test.twig: ## Validate Twig templates ${CONSOLE} lint:twig --no-debug templates/ ../../src/Resources/views/ -### -### MIGRATIONS -### ¯¯¯¯¯¯¯¯¯¯ - -doctrine.migration.diff: ## create a diff migration file for the plugin - ${CONSOLE} doctrine:migrations:diff --namespace="${DOCTRINE_MIGRATIONS_NAMESPACE}" -.PHONY: doctrine.migration.diff - ### ### SYLIUS ### ¯¯¯¯¯¯ @@ -171,6 +169,9 @@ sylius.assets: ## Install all assets with symlinks messenger.setup: ## Setup Messenger transports ${CONSOLE} messenger:setup-transports +doctrine.diff: ## Doctrine diff + ${CONSOLE} doctrine:migration:diff --namespace="${MIGRATIONS_NAMESPACE}" + ### ### PLATFORM ### ¯¯¯¯¯¯¯¯ diff --git a/README.md b/README.md index 5a48dd0..bfca5dd 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,41 @@ -

- - Monsieur Biz logo - -      - - Sylius logo - -
- Monsieur Biz is a Sylius Extension Artisan partner -

- -

Advanced Promotion for Sylius

- -[![Advanced Promotion Plugin license](https://img.shields.io/github/license/monsieurbiz/SyliusAdvancedPromotionPlugin?public&nocache)](https://github.com/monsieurbiz/SyliusAdvancedPromotionPlugin/blob/master/LICENSE) -[![Tests Status](https://github.com/monsieurbiz/SyliusAdvancedPromotionPlugin/actions/workflows/tests.yaml/badge.svg?branch=master&event=push)](https://github.com/monsieurbiz/SyliusAdvancedPromotionPlugin/actions?query=workflow%3ATests) -[![Security Status](https://github.com/monsieurbiz/SyliusAdvancedPromotionPlugin/actions/workflows/security.yaml/badge.svg?branch=master&event=push)](https://github.com/monsieurbiz/SyliusAdvancedPromotionPlugin/actions?query=workflow%3ASecurity) +

Advanced Promotion

+ +[![Advanced Promotion Plugin license](https://img.shields.io/github/license/monsieurbiz/SyliusAdvancedPromotionPlugin?public)](https://github.com/monsieurbiz/SyliusAdvancedPromotionPlugin/blob/master/LICENSE.txt) +[![Tests Status](https://img.shields.io/github/actions/workflow/status/monsieurbiz/SyliusAdvancedPromotionPlugin/tests.yaml?branch=master&logo=github)](https://github.com/monsieurbiz/SyliusAdvancedPromotionPlugin/actions?query=workflow%3ATests) +[![Recipe Status](https://img.shields.io/github/actions/workflow/status/monsieurbiz/SyliusAdvancedPromotionPlugin/recipe.yaml?branch=master&label=recipes&logo=github)](https://github.com/monsieurbiz/SyliusAdvancedPromotionPlugin/actions?query=workflow%3ASecurity) +[![Security Status](https://img.shields.io/github/actions/workflow/status/monsieurbiz/SyliusAdvancedPromotionPlugin/security.yaml?branch=master&label=security&logo=github)](https://github.com/monsieurbiz/SyliusAdvancedPromotionPlugin/actions?query=workflow%3ASecurity) This plugins add features on promotions. -You can define if a promotion need to be applied before or after tax. + +You can define if a cart promotion need to be applied before or after tax. + +![You can define if a cart promotion need to be applied before or after tax.](docs/images/promotion-admin.jpg) + You can use multiple coupons in your orders. -# Installation +![You can use multiple coupons in your orders.](docs/images/promotion-front.jpg) + +## Compatibility + +| Sylius Version | PHP Version | +|----------------|-----------------| +| 1.12 | 8.1 - 8.2 - 8.3 | +| 1.13 | 8.1 - 8.2 - 8.3 | +| 1.14 | 8.1 - 8.2 - 8.3 | + +## Installation + +If you want to use our recipes, you can configure your composer.json by running: +```bash +composer config --no-plugins --json extra.symfony.endpoint '["https://api.github.com/repos/monsieurbiz/symfony-recipes/contents/index.json?ref=flex/master","flex://defaults"]' +``` ```bash composer require monsieurbiz/sylius-advanced-promotion-plugin ``` -# Configuration +## Configuration + +Copy files in `dist` folder to your Sylius project. -In progress +Then run the migrations. diff --git a/composer.json b/composer.json index 2c78481..3ff6cbc 100644 --- a/composer.json +++ b/composer.json @@ -6,37 +6,16 @@ "license": "MIT", "require": { "php": "^8.1", - "sylius/sylius": ">=1.12 <1.13" + "sylius/sylius": ">=1.12 <2.0" }, "require-dev": { - "behat/behat": "^3.6.1", - "behat/mink-selenium2-driver": "^1.4", - "dmore/behat-chrome-extension": "^1.3", - "dmore/chrome-mink-driver": "^2.7", - "friends-of-behat/mink": "^1.8", - "friends-of-behat/mink-browserkit-driver": "^1.4", - "friends-of-behat/mink-debug-extension": "^2.0.0", - "friends-of-behat/mink-extension": "^2.4", - "friends-of-behat/page-object-extension": "^0.3", - "friends-of-behat/suite-settings-extension": "^1.0", - "friends-of-behat/symfony-extension": "^2.1", - "friends-of-behat/variadic-extension": "^1.3", - "phpspec/phpspec": "^7.2", - "phpstan/phpstan": "^1.8.1", - "phpstan/phpstan-doctrine": "1.3.37", - "phpstan/phpstan-strict-rules": "^1.3.0", - "phpstan/phpstan-webmozart-assert": "^1.2.0", - "phpunit/phpunit": "^9.5", - "polishsymfonycommunity/symfony-mocker-container": "^1.0", - "sylius-labs/coding-standard": "^4.2", - "symfony/browser-kit": "^5.4 || ^6.0", - "symfony/debug-bundle": "^5.4 || ^6.0", - "symfony/dotenv": "^5.4 || ^6.0", - "symfony/flex": "^2.2.2", - "symfony/intl": "^5.4 || ^6.0", - "symfony/web-profiler-bundle": "^5.4 || ^6.0", - "phpmd/phpmd": "^2.13", - "friendsofphp/php-cs-fixer": "^3.16" + "friendsofphp/php-cs-fixer": "^3.16", + "phpspec/phpspec": "^7.0", + "phpstan/phpstan": "^1.8.4", + "phpstan/phpstan-doctrine": "^1.3.2", + "phpstan/phpstan-webmozart-assert": "^1.1", + "phpunit/phpunit": "^10.5", + "phpmd/phpmd": "^2.15" }, "prefer-stable": true, "autoload": { @@ -49,32 +28,28 @@ "cache:clear": "symfony-cmd", "assets:install %PUBLIC_DIR%": "symfony-cmd" }, - "phpcs": "php-cs-fixer fix --using-cache=no", + "phpcs": "PHP_CS_FIXER_IGNORE_ENV=1 php-cs-fixer fix --using-cache=no", "phpstan": "phpstan analyse -c phpstan.neon src/", "phpmd": "phpmd --exclude Migrations/* src/ ansi phpmd.xml", "phpunit": "phpunit", "phpspec": "phpspec run" }, "extra": { - "symfony": { - "docker": false, - "endpoint": [ - "https://api.github.com/repos/monsieurbiz/symfony-recipes/contents/index.json?ref=flex/master", - "flex://defaults" - ] - }, "branch-alias": { "dev-master": "1.0-dev" + }, + "symfony": { + "docker": false, + "endpoint": ["https://api.github.com/repos/monsieurbiz/symfony-recipes/contents/index.json?ref=flex/master", "flex://defaults"] } }, "config": { "allow-plugins": { - "dealerdirect/phpcodesniffer-composer-installer": true, "symfony/thanks": true, - "ergebnis/composer-normalize": true, "symfony/flex": true, - "php-http/discovery": false, - "phpstan/extension-installer": true + "dealerdirect/phpcodesniffer-composer-installer": true, + "ergebnis/composer-normalize": true, + "php-http/discovery": true } } } diff --git a/dist/.env.local b/dist/.env.local new file mode 100644 index 0000000..6c1a99e --- /dev/null +++ b/dist/.env.local @@ -0,0 +1 @@ +SYLIUS_FIXTURES_HOSTNAME=${SYMFONY_DEFAULT_ROUTE_HOST:-localhost} diff --git a/dist/config/packages/monsieurbiz_sylius_advanced_promotion_plugin.yaml b/dist/config/packages/monsieurbiz_sylius_advanced_promotion_plugin.yaml deleted file mode 100644 index 9dccaad..0000000 --- a/dist/config/packages/monsieurbiz_sylius_advanced_promotion_plugin.yaml +++ /dev/null @@ -1,2 +0,0 @@ -imports: - resource: '@MonsieurBizSyliusAdvancedPromotionPlugin/Resources/config/config.yaml' diff --git a/dist/config/routes/monsieurbiz_sylius_advanced_promotion_plugin.yaml b/dist/config/routes/monsieurbiz_sylius_advanced_promotion_plugin.yaml deleted file mode 100644 index 1d0596f..0000000 --- a/dist/config/routes/monsieurbiz_sylius_advanced_promotion_plugin.yaml +++ /dev/null @@ -1,2 +0,0 @@ -imports: - resource: '@MonsieurBizSyliusAdvancedPromotionPlugin/Resources/config/routes.yaml' diff --git a/dist/src/Entity/Promotion/Promotion.php b/dist/src/Entity/Promotion/Promotion.php index 5406b96..5299d42 100644 --- a/dist/src/Entity/Promotion/Promotion.php +++ b/dist/src/Entity/Promotion/Promotion.php @@ -14,6 +14,7 @@ use Doctrine\ORM\Mapping as ORM; use MonsieurBiz\SyliusAdvancedPromotionPlugin\Entity\AfterTaxAwareTrait; use Sylius\Component\Core\Model\Promotion as BasePromotion; +use Sylius\Component\Promotion\Model\PromotionTranslationInterface; /** * @ORM\Entity @@ -24,4 +25,9 @@ class Promotion extends BasePromotion implements PromotionInterface { use AfterTaxAwareTrait; + + protected function createTranslation(): PromotionTranslationInterface + { + return new PromotionTranslation(); + } } diff --git a/docker-compose.yaml.dist b/docker-compose.yaml.dist index ee0776f..24d6f0c 100644 --- a/docker-compose.yaml.dist +++ b/docker-compose.yaml.dist @@ -1,4 +1,3 @@ -version: '3.8' services: database: image: mysql:8.0 @@ -18,4 +17,4 @@ services: - 1080 volumes: - database: {} \ No newline at end of file + database: {} diff --git a/docs/images/promotion-admin.jpg b/docs/images/promotion-admin.jpg new file mode 100644 index 0000000000000000000000000000000000000000..40f0d05ad2b4a6ae4dd96ad2c9734f2c5216f477 GIT binary patch literal 7250 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 E0qVMR`Tzg` literal 0 HcmV?d00001 diff --git a/docs/images/promotion-front.jpg b/docs/images/promotion-front.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e9e76edcd42c7e6f6f2e456ca9fbdb496416171d GIT binary patch literal 52106 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 literal 0 HcmV?d00001 diff --git a/phpstan.neon b/phpstan.neon index c4e853a..b5397be 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -1,18 +1,14 @@ -includes: - - vendor/phpstan/phpstan-doctrine/extension.neon - - vendor/phpstan/phpstan-webmozart-assert/extension.neon - parameters: - level: max + level: 8 paths: - %rootDir%/src/ - checkMissingIterableValueType: false - checkGenericClassInNonGenericObjectType: false - excludePaths: - # Makes PHPStan crash - - 'src/DependencyInjection/MonsieurBizSyliusAdvancedPromotionExtension.php' - # Test dependencies - 'tests/Application/**/*' + + ignoreErrors: + - identifier: missingType.generics + - identifier: missingType.iterableValue + + reportUnmatchedIgnoredErrors: false diff --git a/src/DependencyInjection/MonsieurBizSyliusAdvancedPromotionExtension.php b/src/DependencyInjection/MonsieurBizSyliusAdvancedPromotionExtension.php index 3ee7242..7dbd204 100644 --- a/src/DependencyInjection/MonsieurBizSyliusAdvancedPromotionExtension.php +++ b/src/DependencyInjection/MonsieurBizSyliusAdvancedPromotionExtension.php @@ -11,7 +11,6 @@ namespace MonsieurBiz\SyliusAdvancedPromotionPlugin\DependencyInjection; -use Sylius\Bundle\CoreBundle\DependencyInjection\PrependDoctrineMigrationsTrait; use Symfony\Component\Config\FileLocator; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Extension\Extension; @@ -23,44 +22,34 @@ */ final class MonsieurBizSyliusAdvancedPromotionExtension extends Extension implements PrependExtensionInterface { - use PrependDoctrineMigrationsTrait; - /** * @inheritdoc */ public function load(array $config, ContainerBuilder $container): void { + $configuration = $this->getConfiguration([], $container); + if (null !== $configuration) { + $this->processConfiguration($configuration, $config); + } $loader = new YamlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config')); $loader->load('services.yaml'); } - /** - * @inheritdoc - */ public function getAlias(): string { - return 'monsieurbiz_advanced_promotion'; + return str_replace('monsieur_biz', 'monsieurbiz', parent::getAlias()); } + /** + * @inheritdoc + */ public function prepend(ContainerBuilder $container): void { - $this->prependDoctrineMigrations($container); - } - - protected function getMigrationsNamespace(): string - { - return 'MonsieurBiz\SyliusAdvancedPromotionPlugin\Migrations'; - } - - protected function getMigrationsDirectory(): string - { - return '@MonsieurBizSyliusAdvancedPromotionPlugin/Migrations'; - } - - protected function getNamespacesOfMigrationsExecutedBefore(): array - { - return [ - 'Sylius\Bundle\CoreBundle\Migrations', - ]; + $doctrineConfig = $container->getExtensionConfig('doctrine_migrations'); + $container->prependExtensionConfig('doctrine_migrations', [ + 'migrations_paths' => array_merge(array_pop($doctrineConfig)['migrations_paths'] ?? [], [ + 'MonsieurBiz\SyliusAdvancedPromotionPlugin\Migrations' => '@MonsieurBizSyliusAdvancedPromotionPlugin/Migrations', + ]), + ]); } } diff --git a/src/Resources/config/fixtures/advanced_promotion.yaml b/src/Resources/config/fixtures/advanced_promotion.yaml index 61d405f..368bde6 100644 --- a/src/Resources/config/fixtures/advanced_promotion.yaml +++ b/src/Resources/config/fixtures/advanced_promotion.yaml @@ -45,6 +45,6 @@ sylius_fixtures: options: promotion_advanced_configuration: - code: 'new_year' - after_tax: true + after_tax: false - code: 'gift_card' after_tax: true