diff --git a/CHANGELOG.md b/CHANGELOG.md index 76bb97f2..90d6305e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,14 @@ PrestaShop 1.6.x, 1.7.x and 8.x # Changelog +## [5.0.0] +### Added +- Add support for `checkoutSession` for reusable checkout sessions improving fraud detection and conversion. +- Support gateway form independent of the plugin/theme styling. + + > **Note:** `checkoutSession` requires gateway version `20260311` or later. + + ## [4.0.2] ### Added - Add support for Checkout Design v2. diff --git a/Docs/Configuration/independent_payment_page_layout.png b/Docs/Configuration/independent_payment_page_layout.png new file mode 100644 index 00000000..0d7d2d96 Binary files /dev/null and b/Docs/Configuration/independent_payment_page_layout.png differ diff --git a/Docs/Configuration/merchant_details.png b/Docs/Configuration/merchant_details.png new file mode 100644 index 00000000..aff27a52 Binary files /dev/null and b/Docs/Configuration/merchant_details.png differ diff --git a/Docs/Configuration/prestashop_setup_altapay_credentials.png b/Docs/Configuration/prestashop_setup_altapay_credentials.png deleted file mode 100644 index 14835a10..00000000 Binary files a/Docs/Configuration/prestashop_setup_altapay_credentials.png and /dev/null differ diff --git a/altapay.php b/altapay.php index 89bf0107..637eae76 100644 --- a/altapay.php +++ b/altapay.php @@ -27,12 +27,13 @@ class ALTAPAY extends PaymentModule private $api_error = ''; const ADMIN_SEND_PAYMENT_LINK_CONTROLLER = 'AltapaySendPaymentLink'; + const PS_17_MIN_VERSION = '1.7.0.0'; //NOSONAR public function __construct() { $this->name = 'altapay'; $this->tab = 'payments_gateways'; - $this->version = '4.0.2'; + $this->version = '5.0.0'; $this->author = 'AltaPay A/S'; $this->is_eu_compatible = 1; $this->ps_versions_compliancy = ['min' => '1.6.0.1', 'max' => '8.2.3']; @@ -466,11 +467,10 @@ public function install() ) ENGINE=' . _MYSQL_ENGINE_ . ' DEFAULT CHARSET=utf8'); } - // Execute the query - $result = Db::getInstance()->getValue('SELECT COUNT(*) FROM ' . _DB_PREFIX_ . 'altapay_terminals'); // Check if the table contains data - if ($result == 0 && empty(Configuration::get('ALTAPAY_USERNAME'))) { + if (isAltapayTerminalTableEmpty() && empty(Configuration::get('ALTAPAY_USERNAME'))) { Configuration::updateValue('enable_cc_style', 'checkout-cc'); + Configuration::updateValue('payment_page_layout', 'default_layout'); } if (!Db::getInstance()->getRow('SELECT * FROM INFORMATION_SCHEMA.COLUMNS @@ -1760,6 +1760,28 @@ public function renderForm() 'name' => 'name', ], ], + [ + 'type' => 'select', + 'label' => $this->l('Payment page layout'), + 'desc' => $this->l('The default option follows the theme styling, while the custom option + displays the payment page independently of the theme styling.'), + 'name' => 'payment_page_layout', + 'required' => false, + 'options' => [ + 'query' => [ + [ + 'id_option' => 'default_layout', + 'name' => 'Default', + ], + [ + 'id_option' => 'checkout_independent', + 'name' => 'Checkout Independent', + ], + ], + 'id' => 'id_option', + 'name' => 'name', + ], + ], [ 'type' => 'select', 'label' => $this->l('Authorized payments status'), @@ -1882,6 +1904,7 @@ public function getConfigFieldsValues() 'AUTOCAPTURE_STATUSES[]' => Tools::getValue('AUTOCAPTURE_STATUSES', unserialize(Configuration::get('AUTOCAPTURE_STATUSES'))), 'enable_cc_style' => Tools::getValue('enable_cc_style', Configuration::get('enable_cc_style')), + 'payment_page_layout' => Tools::getValue('payment_page_layout', Configuration::get('payment_page_layout')), 'enable_fraud' => Tools::getValue('enable_fraud', Configuration::get('enable_fraud')), 'enable_release_refund' => Tools::getValue('enable_release_refund', Configuration::get('enable_release_refund')), 'authorized_payments_status' => Tools::getValue('authorized_payments_status', Configuration::get('authorized_payments_status')), @@ -2019,6 +2042,9 @@ private function postProcess() if (Tools::getValue('enable_cc_style') !== '') { Configuration::updateValue('enable_cc_style', Tools::getValue('enable_cc_style')); } + if (Tools::getValue('payment_page_layout') !== '') { + Configuration::updateValue('payment_page_layout', Tools::getValue('payment_page_layout')); + } if (Tools::getValue('authorized_payments_status') !== '') { Configuration::updateValue('authorized_payments_status', Tools::getValue('authorized_payments_status')); } @@ -3017,12 +3043,17 @@ public function createTransaction($savecard, $cgConf['uniqueid'] = uniqid('PS'); $cgConf['terminal'] = $terminal->remote_name; $cgConf['cookie'] = $_SERVER['HTTP_COOKIE'] ?? null; + $paymentPageLayout = Configuration::get('payment_page_layout'); $callback = []; + $callbackFormType = 'callbackform'; + if ($paymentPageLayout === 'checkout_independent') { + $callbackFormType = 'callbackformexternal'; + } // Callbacks $callback['callback_form'] = $this->context->link->getModuleLink( $this->name, - 'callbackform', + $callbackFormType, [], true, $languageId, @@ -3138,6 +3169,15 @@ public function createTransaction($savecard, } $type = $cgConf['payment_type']; + $requestShopOrderId = $cgConf['uniqueid']; + $requestAmount = $amount; + if (!empty($shopOrderId)) { + $requestShopOrderId = $shopOrderId; + $requestAmount = $remainingAmount; + $requestOrderLines = $this->orderAddedFromBackOffice($remainingAmount); + } else { + $requestOrderLines = $this->getOrderLines($cart); + } if (!is_null($savecard) && $savecard != 0) { $type = 'verifyCard'; @@ -3147,6 +3187,13 @@ public function createTransaction($savecard, } try { + $sessionRequest = new API\PHP\Altapay\Api\Payments\CheckoutSession(getAuth()); + $sessionRequest->setTerminals([$cgConf['terminal']]) + ->setShopOrderId($requestShopOrderId) + ->setAmount($requestAmount) + ->setCurrency($cgConf['currency']); + $sessionResponse = $sessionRequest->call(); + $sessionId = $sessionResponse->Session->Id; $config = new API\PHP\Altapay\Request\Config(); $config->setCallbackOk($callback['callback_ok']); $config->setCallbackFail($callback['callback_fail']); @@ -3183,20 +3230,11 @@ public function createTransaction($savecard, $request->setAgreement(['type' => 'recurring']); } - $requestShopOrderId = $cgConf['uniqueid']; - $requestAmount = $amount; - if (!empty($shopOrderId)) { - $requestShopOrderId = $shopOrderId; - $requestAmount = $remainingAmount; - $requestOrderLines = $this->orderAddedFromBackOffice($remainingAmount); - } else { - $requestOrderLines = $this->getOrderLines($cart); - } - $request->setType($type)->setTerminal($cgConf['terminal']) ->setShopOrderId($requestShopOrderId) ->setAmount($requestAmount) ->setCurrency($cgConf['currency']) + ->setSessionID($sessionId) ->setCustomerInfo($customer) ->setTransactionInfo($transactionInfo) ->setCookie($cgConf['cookie']) diff --git a/composer.json b/composer.json index a33de8dd..79ed11f1 100755 --- a/composer.json +++ b/composer.json @@ -21,7 +21,7 @@ }, "require": { "php": "^7.0", - "altapay/api-php": "^3.2", + "altapay/api-php": "^3.5.8", "humbug/php-scoper": "0.13.9", "nikic/php-parser": "4.x-dev", "symfony/options-resolver": "^3.0", diff --git a/composer.lock b/composer.lock index 464f7326..b2b424a4 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,20 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "85b743d97d8996877ac32a6391db911e", + "content-hash": "69fa74e65019cb9b3625cacb762206c3", "packages": [ { "name": "altapay/api-php", - "version": "3.5.4", + "version": "3.5.8", "source": { "type": "git", "url": "https://github.com/AltaPay/api-php.git", - "reference": "6fd4457ebb66a83c0995ad86764db40207ad5f53" + "reference": "31202d5f34309eaf62199c90bf6520d3272a4678" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/AltaPay/api-php/zipball/6fd4457ebb66a83c0995ad86764db40207ad5f53", - "reference": "6fd4457ebb66a83c0995ad86764db40207ad5f53", + "url": "https://api.github.com/repos/AltaPay/api-php/zipball/31202d5f34309eaf62199c90bf6520d3272a4678", + "reference": "31202d5f34309eaf62199c90bf6520d3272a4678", "shasum": "" }, "require": { @@ -29,7 +29,7 @@ "ext-simplexml": "*", "ext-spl": "*", "guzzlehttp/guzzle": "^6.0 || ^7.0", - "php": "^7.0 || ^8.0", + "php": "^7.1 || ^8.0", "symfony/event-dispatcher": "^2.1 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0", "symfony/options-resolver": "^2.6 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0" }, @@ -58,9 +58,9 @@ ], "support": { "issues": "https://github.com/AltaPay/api-php/issues", - "source": "https://github.com/AltaPay/api-php/tree/3.5.4" + "source": "https://github.com/AltaPay/api-php/tree/3.5.8" }, - "time": "2025-09-15T05:02:36+00:00" + "time": "2026-03-03T12:37:33+00:00" }, { "name": "composer/package-versions-deprecated", @@ -115,6 +115,10 @@ } ], "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", + "support": { + "issues": "https://github.com/composer/package-versions-deprecated/issues", + "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.5" + }, "funding": [ { "url": "https://packagist.com", @@ -133,22 +137,22 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.9.1", + "version": "7.10.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "a629e5b69db96eb4939c1b34114130077dd4c6fc" + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/a629e5b69db96eb4939c1b34114130077dd4c6fc", - "reference": "a629e5b69db96eb4939c1b34114130077dd4c6fc", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.5.3 || ^2.0.3", - "guzzlehttp/psr7": "^2.7.0", + "guzzlehttp/promises": "^2.3", + "guzzlehttp/psr7": "^2.8", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" @@ -237,6 +241,10 @@ "rest", "web service" ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.10.0" + }, "funding": [ { "url": "https://github.com/GrahamCampbell", @@ -251,20 +259,20 @@ "type": "tidelift" } ], - "time": "2024-07-19T16:19:57+00:00" + "time": "2025-08-23T22:36:01+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.0.3", + "version": "2.3.0", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8" + "reference": "481557b130ef3790cf82b713667b43030dc9c957" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", - "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", + "url": "https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957", + "reference": "481557b130ef3790cf82b713667b43030dc9c957", "shasum": "" }, "require": { @@ -272,7 +280,7 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.39 || ^9.6.20" + "phpunit/phpunit": "^8.5.44 || ^9.6.25" }, "type": "library", "extra": { @@ -316,6 +324,10 @@ "keywords": [ "promise" ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.3.0" + }, "funding": [ { "url": "https://github.com/GrahamCampbell", @@ -330,20 +342,20 @@ "type": "tidelift" } ], - "time": "2024-07-18T10:29:17+00:00" + "time": "2025-08-22T14:34:08+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.7.0", + "version": "2.9.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" + "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", - "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/7d0ed42f28e42d61352a7a79de682e5e67fec884", + "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884", "shasum": "" }, "require": { @@ -359,7 +371,8 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "http-interop/http-factory-tests": "0.9.0", - "phpunit/phpunit": "^8.5.39 || ^9.6.20" + "jshttp/mime-db": "1.54.0.1", + "phpunit/phpunit": "^8.5.44 || ^9.6.25" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" @@ -428,6 +441,10 @@ "uri", "url" ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.9.0" + }, "funding": [ { "url": "https://github.com/GrahamCampbell", @@ -442,7 +459,7 @@ "type": "tidelift" } ], - "time": "2024-07-18T11:15:46+00:00" + "time": "2026-03-10T16:41:02+00:00" }, { "name": "humbug/php-scoper", @@ -467,9 +484,6 @@ "symfony/filesystem": "^3.2 || ^4.0", "symfony/finder": "^3.2 || ^4.0" }, - "replace": { - "humbug/php-scoper": "self.version" - }, "require-dev": { "bamarni/composer-bin-plugin": "^1.1", "humbug/box": "^3.8", @@ -515,6 +529,10 @@ } ], "description": "Prefixes all PHP namespaces in a file or directory.", + "support": { + "issues": "https://github.com/humbug/php-scoper/issues", + "source": "https://github.com/humbug/php-scoper/tree/0.13.9" + }, "funding": [ { "url": "https://github.com/theofidry", @@ -528,21 +546,22 @@ "version": "dev-master", "source": { "type": "git", - "url": "https://github.com/JetBrains/phpstorm-stubs.git", - "reference": "b164b0230c777c0c0673696f2a9a9d7ac0f4a946" + "url": "https://github.com/JetBrains/phpstorm-stubs", + "reference": "cf7bde202a8ead67564ae9008e2badb0dc760891" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/JetBrains/phpstorm-stubs/zipball/b164b0230c777c0c0673696f2a9a9d7ac0f4a946", - "reference": "b164b0230c777c0c0673696f2a9a9d7ac0f4a946", + "url": "https://api.github.com/repos/JetBrains/phpstorm-stubs/zipball/cf7bde202a8ead67564ae9008e2badb0dc760891", + "reference": "cf7bde202a8ead67564ae9008e2badb0dc760891", "shasum": "" }, "require-dev": { - "friendsofphp/php-cs-fixer": "v3.46.0", - "nikic/php-parser": "v5.0.0", - "phpdocumentor/reflection-docblock": "5.3.0", - "phpunit/phpunit": "10.5.5" + "friendsofphp/php-cs-fixer": "^v3.86", + "nikic/php-parser": "^v5.6", + "phpdocumentor/reflection-docblock": "^5.6", + "phpunit/phpunit": "^12.3" }, + "default-branch": true, "type": "library", "autoload": { "files": [ @@ -565,7 +584,7 @@ "stubs", "type" ], - "time": "2024-07-09T19:51:36+00:00" + "time": "2026-03-17T19:50:07+00:00" }, { "name": "nikic/php-parser", @@ -573,12 +592,12 @@ "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "4d36e9c16f4820c2ed9360bc818982f3c02a08f5" + "reference": "51bd93cc741b7fc3d63d20b6bdcd99fdaa359837" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4d36e9c16f4820c2ed9360bc818982f3c02a08f5", - "reference": "4d36e9c16f4820c2ed9360bc818982f3c02a08f5", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/51bd93cc741b7fc3d63d20b6bdcd99fdaa359837", + "reference": "51bd93cc741b7fc3d63d20b6bdcd99fdaa359837", "shasum": "" }, "require": { @@ -587,17 +606,12 @@ }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" }, "bin": [ "bin/php-parse" ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.9-dev" - } - }, "autoload": { "psr-4": { "PhpParser\\": "lib/PhpParser" @@ -617,7 +631,11 @@ "parser", "php" ], - "time": "2024-03-17T09:03:35+00:00" + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/4.x" + }, + "time": "2025-12-06T11:45:25+00:00" }, { "name": "psr/container", @@ -661,6 +679,10 @@ "container-interop", "psr" ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.1" + }, "time": "2021-03-05T17:36:06+00:00" }, { @@ -710,6 +732,9 @@ "psr", "psr-18" ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, "time": "2023-09-23T14:17:50+00:00" }, { @@ -762,6 +787,9 @@ "request", "response" ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, "time": "2024-04-15T12:06:14+00:00" }, { @@ -812,6 +840,9 @@ "request", "response" ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, "time": "2023-04-04T09:54:51+00:00" }, { @@ -852,6 +883,10 @@ } ], "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, "time": "2019-03-08T08:55:37+00:00" }, { @@ -925,6 +960,9 @@ ], "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/console/tree/v4.4.49" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -943,16 +981,16 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v2.5.3", + "version": "v2.5.4", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "80d075412b557d41002320b96a096ca65aa2c98d" + "reference": "605389f2a7e5625f273b53960dc46aeaf9c62918" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/80d075412b557d41002320b96a096ca65aa2c98d", - "reference": "80d075412b557d41002320b96a096ca65aa2c98d", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/605389f2a7e5625f273b53960dc46aeaf9c62918", + "reference": "605389f2a7e5625f273b53960dc46aeaf9c62918", "shasum": "" }, "require": { @@ -960,12 +998,12 @@ }, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -989,6 +1027,9 @@ ], "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.4" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1003,7 +1044,7 @@ "type": "tidelift" } ], - "time": "2023-01-24T14:02:46+00:00" + "time": "2024-09-25T14:11:13+00:00" }, { "name": "symfony/event-dispatcher", @@ -1069,6 +1110,9 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v4.4.18" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1108,12 +1152,12 @@ }, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { "dev-main": "1.1-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -1145,6 +1189,9 @@ "interoperability", "standards" ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v1.10.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1205,6 +1252,9 @@ ], "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v4.4.42" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1264,6 +1314,9 @@ ], "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v4.4.44" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1327,6 +1380,9 @@ "configuration", "options" ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v3.4.47" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1345,20 +1401,20 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.30.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "0424dff1c58f028c451efff2045f5d92410bd540" + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/0424dff1c58f028c451efff2045f5d92410bd540", - "reference": "0424dff1c58f028c451efff2045f5d92410bd540", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-ctype": "*" @@ -1369,8 +1425,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -1403,6 +1459,9 @@ "polyfill", "portable" ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1412,29 +1471,34 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.30.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c" + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c", - "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", "shasum": "" }, "require": { - "php": ">=7.1" + "ext-iconv": "*", + "php": ">=7.2" }, "provide": { "ext-mbstring": "*" @@ -1445,8 +1509,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -1480,6 +1544,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1489,35 +1556,39 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-06-19T12:30:46+00:00" + "time": "2024-12-23T08:48:59+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.30.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "ec444d3f3f6505bb28d11afa41e75faadebc10a1" + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/ec444d3f3f6505bb28d11afa41e75faadebc10a1", - "reference": "ec444d3f3f6505bb28d11afa41e75faadebc10a1", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -1553,6 +1624,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.33.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1562,35 +1636,39 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.30.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "77fa7995ac1b21ab60769b7323d600a991a90433" + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/77fa7995ac1b21ab60769b7323d600a991a90433", - "reference": "77fa7995ac1b21ab60769b7323d600a991a90433", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -1630,6 +1708,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1639,25 +1720,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2025-01-02T08:10:11+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.5.3", + "version": "v2.5.4", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "a2329596ddc8fd568900e3fc76cba42489ecc7f3" + "reference": "f37b419f7aea2e9abf10abd261832cace12e3300" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/a2329596ddc8fd568900e3fc76cba42489ecc7f3", - "reference": "a2329596ddc8fd568900e3fc76cba42489ecc7f3", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f37b419f7aea2e9abf10abd261832cace12e3300", + "reference": "f37b419f7aea2e9abf10abd261832cace12e3300", "shasum": "" }, "require": { @@ -1673,12 +1758,12 @@ }, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -1710,6 +1795,9 @@ "interoperability", "standards" ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v2.5.4" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1724,7 +1812,7 @@ "type": "tidelift" } ], - "time": "2023-04-21T15:04:16+00:00" + "time": "2024-09-25T14:11:13+00:00" } ], "packages-dev": [ @@ -1779,6 +1867,10 @@ "regex", "regular expression" ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/1.0.1" + }, "funding": [ { "url": "https://packagist.com", @@ -1797,24 +1889,24 @@ }, { "name": "composer/semver", - "version": "3.4.2", + "version": "3.4.4", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "c51258e759afdb17f1fd1fe83bc12baaef6309d6" + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/c51258e759afdb17f1fd1fe83bc12baaef6309d6", - "reference": "c51258e759afdb17f1fd1fe83bc12baaef6309d6", + "url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^1.4", - "symfony/phpunit-bridge": "^4.2 || ^5" + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" }, "type": "library", "extra": { @@ -1855,6 +1947,11 @@ "validation", "versioning" ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.4" + }, "funding": [ { "url": "https://packagist.com", @@ -1863,13 +1960,9 @@ { "url": "https://github.com/composer", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" } ], - "time": "2024-07-12T11:35:52+00:00" + "time": "2025-08-20T19:15:30+00:00" }, { "name": "composer/xdebug-handler", @@ -1916,6 +2009,11 @@ "Xdebug", "performance" ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/2.0.5" + }, "funding": [ { "url": "https://packagist.com", @@ -1934,16 +2032,16 @@ }, { "name": "doctrine/annotations", - "version": "1.14.3", + "version": "1.14.4", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af" + "reference": "253dca476f70808a5aeed3a47cc2cc88c5cab915" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", - "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/253dca476f70808a5aeed3a47cc2cc88c5cab915", + "reference": "253dca476f70808a5aeed3a47cc2cc88c5cab915", "shasum": "" }, "require": { @@ -1954,11 +2052,11 @@ }, "require-dev": { "doctrine/cache": "^1.11 || ^2.0", - "doctrine/coding-standard": "^9 || ^10", - "phpstan/phpstan": "~1.4.10 || ^1.8.0", + "doctrine/coding-standard": "^9 || ^12", + "phpstan/phpstan": "~1.4.10 || ^1.10.28", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "symfony/cache": "^4.4 || ^5.4 || ^6", - "vimeo/psalm": "^4.10" + "symfony/cache": "^4.4 || ^5.4 || ^6.4 || ^7", + "vimeo/psalm": "^4.30 || ^5.14" }, "suggest": { "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" @@ -2002,33 +2100,39 @@ "docblock", "parser" ], - "time": "2023-02-01T09:20:38+00:00" + "support": { + "issues": "https://github.com/doctrine/annotations/issues", + "source": "https://github.com/doctrine/annotations/tree/1.14.4" + }, + "abandoned": true, + "time": "2024-09-05T10:15:52+00:00" }, { "name": "doctrine/deprecations", - "version": "1.1.3", + "version": "1.1.6", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" + "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", - "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca", + "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, + "conflict": { + "phpunit/phpunit": "<=7.5 || >=14" + }, "require-dev": { - "doctrine/coding-standard": "^9", - "phpstan/phpstan": "1.4.10 || 1.10.15", - "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "psalm/plugin-phpunit": "0.18.4", - "psr/log": "^1 || ^2 || ^3", - "vimeo/psalm": "4.30.0 || 5.12.0" + "doctrine/coding-standard": "^9 || ^12 || ^14", + "phpstan/phpstan": "1.4.10 || 2.1.30", + "phpstan/phpstan-phpunit": "^1.0 || ^2", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12.4 || ^13.0", + "psr/log": "^1 || ^2 || ^3" }, "suggest": { "psr/log": "Allows logging deprecations via PSR-3 logger implementation" @@ -2036,7 +2140,7 @@ "type": "library", "autoload": { "psr-4": { - "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + "Doctrine\\Deprecations\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -2045,7 +2149,11 @@ ], "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", "homepage": "https://www.doctrine-project.org/", - "time": "2024-01-30T19:34:25+00:00" + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.6" + }, + "time": "2026-02-07T07:09:04+00:00" }, { "name": "doctrine/lexer", @@ -2105,6 +2213,10 @@ "parser", "php" ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/2.1.1" + }, "funding": [ { "url": "https://www.doctrine-project.org/sponsorship.html", @@ -2218,6 +2330,10 @@ } ], "description": "A tool to automatically fix PHP code style", + "support": { + "issues": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/issues", + "source": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/tree/v2.19.3" + }, "funding": [ { "url": "https://github.com/keradus", @@ -2275,6 +2391,10 @@ "keywords": [ "diff" ], + "support": { + "issues": "https://github.com/PHP-CS-Fixer/diff/issues", + "source": "https://github.com/PHP-CS-Fixer/diff/tree/v1.3.1" + }, "abandoned": true, "time": "2020-10-14T08:39:05+00:00" }, @@ -2318,6 +2438,10 @@ "MIT" ], "description": "PHPStan - PHP Static Analysis Tool", + "support": { + "issues": "https://github.com/phpstan/phpstan/issues", + "source": "https://github.com/phpstan/phpstan/tree/0.12.100" + }, "funding": [ { "url": "https://github.com/ondrejmirtes", @@ -2379,20 +2503,23 @@ ], "description": "Automatically add an 'index.php' in all the current or specified directories and all sub-directories.", "homepage": "https://github.com/PrestaShopCorp/autoindex", + "support": { + "source": "https://github.com/PrestaShopCorp/autoindex/tree/v2.1.0" + }, "time": "2022-10-10T08:35:00+00:00" }, { "name": "prestashop/header-stamp", - "version": "v2.3", + "version": "v2.6", "source": { "type": "git", "url": "https://github.com/PrestaShopCorp/header-stamp.git", - "reference": "3104b69ad73b6039c7082dbba4af9dbeb0b936b3" + "reference": "7f09cd041bbf1fa56bd71ae91bab3919da88b6ac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PrestaShopCorp/header-stamp/zipball/3104b69ad73b6039c7082dbba4af9dbeb0b936b3", - "reference": "3104b69ad73b6039c7082dbba4af9dbeb0b936b3", + "url": "https://api.github.com/repos/PrestaShopCorp/header-stamp/zipball/7f09cd041bbf1fa56bd71ae91bab3919da88b6ac", + "reference": "7f09cd041bbf1fa56bd71ae91bab3919da88b6ac", "shasum": "" }, "require": { @@ -2402,7 +2529,7 @@ "symfony/finder": "^3.4 || ~4.0 || ~5.0 || ~6.0" }, "require-dev": { - "phpstan/phpstan": "^0.12.83", + "phpstan/phpstan": "^1.12", "prestashop/php-dev-tools": "1.*" }, "bin": [ @@ -2426,7 +2553,11 @@ ], "description": "Rewrite your file headers to add the license or to make them up-to-date", "homepage": "https://github.com/PrestaShopCorp/header-stamp", - "time": "2023-03-23T14:44:10+00:00" + "support": { + "issues": "https://github.com/PrestaShopCorp/header-stamp/issues", + "source": "https://github.com/PrestaShopCorp/header-stamp/tree/v2.6" + }, + "time": "2025-02-05T08:44:26+00:00" }, { "name": "prestashop/php-dev-tools", @@ -2468,6 +2599,10 @@ "MIT" ], "description": "PrestaShop coding standards", + "support": { + "issues": "https://github.com/PrestaShop/php-dev-tools/issues", + "source": "https://github.com/PrestaShop/php-dev-tools/tree/v4.1.0" + }, "time": "2021-06-17T14:24:59+00:00" }, { @@ -2514,6 +2649,9 @@ "psr", "psr-6" ], + "support": { + "source": "https://github.com/php-fig/cache/tree/master" + }, "time": "2016-08-06T20:24:11+00:00" }, { @@ -2561,20 +2699,23 @@ "psr", "psr-3" ], + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.4" + }, "time": "2021-05-03T11:20:27+00:00" }, { "name": "squizlabs/php_codesniffer", - "version": "3.10.2", + "version": "3.13.5", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "86e5f5dd9a840c46810ebe5ff1885581c42a3017" + "reference": "0ca86845ce43291e8f5692c7356fccf3bcf02bf4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/86e5f5dd9a840c46810ebe5ff1885581c42a3017", - "reference": "86e5f5dd9a840c46810ebe5ff1885581c42a3017", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/0ca86845ce43291e8f5692c7356fccf3bcf02bf4", + "reference": "0ca86845ce43291e8f5692c7356fccf3bcf02bf4", "shasum": "" }, "require": { @@ -2591,11 +2732,6 @@ "bin/phpcs" ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" @@ -2621,6 +2757,12 @@ "standards", "static analysis" ], + "support": { + "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", + "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", + "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" + }, "funding": [ { "url": "https://github.com/PHPCSStandards", @@ -2633,9 +2775,13 @@ { "url": "https://opencollective.com/php_codesniffer", "type": "open_collective" + }, + { + "url": "https://thanks.dev/u/gh/phpcsstandards", + "type": "thanks_dev" } ], - "time": "2024-07-21T23:26:44+00:00" + "time": "2025-11-04T16:30:35+00:00" }, { "name": "symfony/polyfill-php70", @@ -2656,12 +2802,12 @@ }, "type": "metapackage", "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + }, "branch-alias": { "dev-main": "1.20-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" } }, "notification-url": "https://packagist.org/downloads/", @@ -2686,6 +2832,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-php70/tree/v1.20.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -2704,34 +2853,26 @@ }, { "name": "symfony/polyfill-php72", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "10112722600777e02d2745716b70c5db4ca70442" + "reference": "fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/10112722600777e02d2745716b70c5db4ca70442", - "reference": "10112722600777e02d2745716b70c5db4ca70442", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce", + "reference": "fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, - "type": "library", + "type": "metapackage", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "notification-url": "https://packagist.org/downloads/", @@ -2756,6 +2897,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.31.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -2770,20 +2914,20 @@ "type": "tidelift" } ], - "time": "2024-06-19T12:30:46+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/process", - "version": "v5.4.40", + "version": "v5.4.51", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "deedcb3bb4669cae2148bc920eafd2b16dc7c046" + "reference": "467bfc56f18f5ef6d5ccb09324d7e988c1c0a98f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/deedcb3bb4669cae2148bc920eafd2b16dc7c046", - "reference": "deedcb3bb4669cae2148bc920eafd2b16dc7c046", + "url": "https://api.github.com/repos/symfony/process/zipball/467bfc56f18f5ef6d5ccb09324d7e988c1c0a98f", + "reference": "467bfc56f18f5ef6d5ccb09324d7e988c1c0a98f", "shasum": "" }, "require": { @@ -2815,6 +2959,9 @@ ], "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v5.4.51" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -2824,25 +2971,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-05-31T14:33:22+00:00" + "time": "2026-01-26T15:53:37+00:00" }, { "name": "symfony/stopwatch", - "version": "v5.4.40", + "version": "v5.4.45", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "0e9daf3b7c805c747638b2cc48f1649e594f9625" + "reference": "fb2c199cf302eb207f8c23e7ee174c1c31a5c004" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/0e9daf3b7c805c747638b2cc48f1649e594f9625", - "reference": "0e9daf3b7c805c747638b2cc48f1649e594f9625", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/fb2c199cf302eb207f8c23e7ee174c1c31a5c004", + "reference": "fb2c199cf302eb207f8c23e7ee174c1c31a5c004", "shasum": "" }, "require": { @@ -2874,6 +3025,9 @@ ], "description": "Provides a way to profile code", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v5.4.45" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -2888,7 +3042,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:33:22+00:00" + "time": "2024-09-25T14:11:13+00:00" } ], "aliases": [], diff --git a/config.xml b/config.xml index 95a41bec..7c2468de 100644 --- a/config.xml +++ b/config.xml @@ -10,7 +10,7 @@ altapay - + diff --git a/controllers/front/callbackfail.php b/controllers/front/callbackfail.php index 66cf6dbf..be5b23e1 100644 --- a/controllers/front/callbackfail.php +++ b/controllers/front/callbackfail.php @@ -259,12 +259,18 @@ public function postProcess() 'this_path_ssl' => Tools::getShopDomainSsl(true, true) . __PS_BASE_URI__ . 'modules/' . $mNa . '/', 'css_dir' => null, ]); - // PrestaShop 1.6 and PrestaShop 1.7 have different declarations of $this->setTemplate() - if (version_compare(_PS_VERSION_, '1.7.0.0', '>=')) { - $this->setTemplate('module:altapay/views/templates/front/payment_error17.tpl'); - } else { - $this->setTemplate('payment_error.tpl'); - } + + Tools::redirect( + $this->context->link->getModuleLink( + 'altapay', + 'paymenterror', + [ + 'error' => $errorMessage, + 'order_id' => $unique_id, + 'payment_id' => $postData['transaction_id'], + ] + ) + ); } } } diff --git a/controllers/front/callbackformexternal.php b/controllers/front/callbackformexternal.php new file mode 100644 index 00000000..fb05dec2 --- /dev/null +++ b/controllers/front/callbackformexternal.php @@ -0,0 +1,53 @@ +context->smarty->assign([ + 'stylingclass' => $payment_style, + 'amount' => $postData['amount'], + 'shop_logo' => _PS_IMG_ . Configuration::get('PS_LOGO'), + ]); + if (version_compare(_PS_VERSION_, $this->module::PS_17_MIN_VERSION, '>=')) { + $this->setTemplate('module:altapay/views/templates/front/payment_form_independent.tpl'); + } else { + $this->setTemplate('payment_form_independent.tpl'); + } + } +} diff --git a/controllers/front/paymenterror.php b/controllers/front/paymenterror.php new file mode 100644 index 00000000..97b44b3c --- /dev/null +++ b/controllers/front/paymenterror.php @@ -0,0 +1,25 @@ +context->smarty->assign(['errorText' => $error]); + + if (version_compare(_PS_VERSION_, $this->module::PS_17_MIN_VERSION, '>=')) { + $this->setTemplate('module:altapay/views/templates/front/payment_error17.tpl'); + } else { + $this->setTemplate('payment_error.tpl'); + } + } +} diff --git a/helpers.php b/helpers.php index fb61eb59..c7a5f438 100644 --- a/helpers.php +++ b/helpers.php @@ -24,7 +24,7 @@ function transactionInfo($transactionInfo = []) { $pluginName = 'altapay'; - $pluginVersion = '4.0.2'; + $pluginVersion = '5.0.0'; // Transaction info $transactionInfo['ecomPlatform'] = 'PrestaShop'; @@ -1650,3 +1650,17 @@ function getFormTemplate() return $form_templates[$style] ?? null; } + +/** + * Check if terminals exists. + * + * @return bool + */ +function isAltapayTerminalTableEmpty() +{ + $count = Db::getInstance()->getValue( + 'SELECT COUNT(*) FROM ' . _DB_PREFIX_ . 'altapay_terminals' + ); + + return (int) $count === 0; +} diff --git a/sonar-project.properties b/sonar-project.properties index 3a735850..5cbdbe05 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -1,2 +1,7 @@ sonar.projectKey=AltaPay_plugin-prestashop_37fe3889-2a05-47ac-b3f9-4c4169e24be3 sonar.coverage.exclusions=** +sonar.cpd.exclusions=** +# Ignore Sonar rule: Property names should match ^[a-z][a-zA-Z0-9]*$ +sonar.issue.ignore.multicriteria=e1 +sonar.issue.ignore.multicriteria.e1.ruleKey=php:S116 +sonar.issue.ignore.multicriteria.e1.resourceKey=**/*.php \ No newline at end of file diff --git a/views/templates/front/payment_form_independent.tpl b/views/templates/front/payment_form_independent.tpl new file mode 100644 index 00000000..edb4c48b --- /dev/null +++ b/views/templates/front/payment_form_independent.tpl @@ -0,0 +1,761 @@ +{** + * AltaPay module for PrestaShop + * + * Copyright © 2026 AltaPay. All rights reserved. + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. +*} + + + + + + Checkout + + + + +
+ +
+
+
+
+ +
+
+
+ + \ No newline at end of file diff --git a/wiki.md b/wiki.md index ce3dce7c..db9f0a8b 100644 --- a/wiki.md +++ b/wiki.md @@ -21,6 +21,8 @@ Installing this plug-in will enable the web shop to handle card transactions thr [Reconcile Orders](#reconcile-orders) [Styling](#styling) + +* [Payment page layout](#payment-page-layout) * [Customize Payment Form Page](#customize-payment-form-page) * [Customize Redirect Form Page](#customize-redirect-form-page) @@ -74,7 +76,7 @@ be provided by AltaPay. ![enter_credentials](Docs/Configuration/altapay_module_list.png) - ![enter_credentials](Docs/Configuration/prestashop_setup_altapay_credentials.png) + ![enter_credentials](Docs/Configuration/merchant_details.png) 2. If you wish to enable fraud detection service and release/refund if fraud is detected then refer to the below screenshot. @@ -159,7 +161,7 @@ In order to reconcile payments please follow the steps below: Choose one of the below options from Checkout form style dropdown to change the styling of payment form on the checkout page. - ![prestashop_configure_styling](Docs/Configuration/prestashop_configure_styling.png) + ![prestashop_configure_styling](Docs/Configuration/merchant_details.png) - `Legacy` Legacy design with basic form styling. @@ -175,6 +177,18 @@ In order to reconcile payments please follow the steps below: - `Custom` This option can be selected to implement custom styling on the payment page. Selecting this option will remove all the styling from the payment page. +## Payment page layout + +Choose one of the below options from Payment page layout dropdown to select the layout type for payment page. + +- `Default` This will use the styling from the checkout/theme. + + ![altapay_cc_checkout_form.png](Docs/Configuration/prestashop_checkout_styling_form.png) + +- `Checkout Independent` This will show the payment page independent from the theme styling. This will provide a visually appealing appearance seamlessly, without conflicting with the theme styling. + + ![independent_payment_page_layout.png](Docs/Configuration/independent_payment_page_layout.png) + ### Customize Payment Form Page: You can change/update the **Payment Form Page** by navigating to the below path: