diff --git a/Controller/Checkout/RestoreCart.php b/Controller/Checkout/RestoreCart.php index 8f3655a..d3875ff 100644 --- a/Controller/Checkout/RestoreCart.php +++ b/Controller/Checkout/RestoreCart.php @@ -11,7 +11,6 @@ */ namespace PostFinanceCheckout\Payment\Controller\Checkout; -use Magento\Checkout\Model\Session as CheckoutSession; use Magento\Framework\DataObject; use Magento\Framework\App\Action\Context; @@ -21,27 +20,18 @@ class RestoreCart extends \PostFinanceCheckout\Payment\Controller\Checkout { - /** - * - * @var CheckoutSession - */ - private $checkoutSession; - - /** - * - * @param Context $context - * @param CheckoutSession $checkoutSession - */ - public function __construct(Context $context, CheckoutSession $checkoutSession) - { - parent::__construct($context); - $this->checkoutSession = $checkoutSession; - } - public function execute() { - $this->checkoutSession->restoreQuote(); - + try { + // Triggers event to validate and restore quote. + $this->_eventManager->dispatch('postfinancecheckout_validate_and_restore_quote'); + } catch (\Exception $e) { + // If an error occurs, we display a generic message and redirect to the cart. + $this->messageManager->addErrorMessage(__('An error occurred while restoring your cart.')); + return $this->_redirect('checkout/cart'); + } + + // Redirects to the cart or to the path determined by the redirection. return $this->_redirect($this->getFailureRedirectionPath()); } diff --git a/Controller/Transaction/Success.php b/Controller/Transaction/Success.php index c11f9af..882e9af 100644 --- a/Controller/Transaction/Success.php +++ b/Controller/Transaction/Success.php @@ -61,6 +61,14 @@ public function execute() 'However, the payment was successful. Please contact us.')); return $this->_redirect('checkout/cart'); } + + // Deactivate quote after successful payment. + $quote = $this->checkoutSession->getQuote(); + if ($quote && $quote->getId()) { + $quote->setIsActive(false); + $quote->removeAllItems(); + $quote->save(); + } $this->checkoutSession->setLastOrderId($order->getId()) ->setLastRealOrderId($order->getIncrementId()) diff --git a/Model/Config/Source/IntegrationMethod.php b/Model/Config/Source/IntegrationMethod.php index 0b54c61..ca5cd86 100644 --- a/Model/Config/Source/IntegrationMethod.php +++ b/Model/Config/Source/IntegrationMethod.php @@ -19,7 +19,7 @@ class IntegrationMethod implements \Magento\Framework\Option\ArrayInterface const IFRAME = 'iframe'; const LIGHTBOX = 'lightbox'; - const PAYMENT_PAGE = 'paymentpage'; + const PAYMENT_PAGE = 'payment_page'; public function toOptionArray() { @@ -31,7 +31,11 @@ public function toOptionArray() [ 'value' => self::LIGHTBOX, 'label' => \__('Lightbox') - ] + ], + [ + 'value' => self::PAYMENT_PAGE, + 'label' => \__('Payment Page') + ] ]; } } \ No newline at end of file diff --git a/Model/Resolver/UpdateTransactionUrls.php b/Model/Resolver/UpdateTransactionUrls.php index baf0d30..b884aaa 100644 --- a/Model/Resolver/UpdateTransactionUrls.php +++ b/Model/Resolver/UpdateTransactionUrls.php @@ -138,6 +138,22 @@ private function setTransactionUrls($cartIdMasked, $successUrl, $failureUrl) // Get the quote using the actual ID /** @var Quote $quote */ $quote = $this->cartRepository->get($quoteId); + $spaceId = $quote->getPostfinancecheckoutSpaceId(); + $transactionId = $quote->getPostfinancecheckoutTransactionId(); + + //At this step, if the transaction ID and space ID are empty, + //it could be because the enableAvailablePaymentMethodsCheck option is active, + //and the quote no longer has these values. + if (empty($spaceId) || empty($transactionId)) { + //Fetching the JavaScript URL here allows updating the quote + //with the current transaction and saving it in the session. + $this->transactionQuoteService->getJavaScriptUrl($quote); + + //values from the session + $quote = $this->checkoutSession->getQuote(); + $spaceId = $quote->getPostfinancecheckoutSpaceId(); + $transactionId = $quote->getPostfinancecheckoutTransactionId(); + } //$quoteSession = $this->checkoutSession->getQuote(); /** @var \PostFinanceCheckout\Payment\Model\ResourceModel\TransactionInfo $transactionInfo */ diff --git a/Model/Webhook/Listener/AbstractOrderRelatedListener.php b/Model/Webhook/Listener/AbstractOrderRelatedListener.php index 113b85a..2f999ea 100644 --- a/Model/Webhook/Listener/AbstractOrderRelatedListener.php +++ b/Model/Webhook/Listener/AbstractOrderRelatedListener.php @@ -13,6 +13,7 @@ use Magento\Framework\App\ResourceConnection; use Magento\Framework\Exception\NotFoundException; +use Magento\Framework\Lock\LockManagerInterface; use Magento\Sales\Model\Order; use Magento\Sales\Model\OrderFactory; use Magento\Sales\Model\ResourceModel\Order as OrderResourceModel; @@ -63,6 +64,12 @@ abstract class AbstractOrderRelatedListener implements ListenerInterface */ private $transactionInfoRepository; + /** + * + * @var lockManager + */ + protected $lockManager; + /** * * @param ResourceConnection $resource @@ -71,17 +78,24 @@ abstract class AbstractOrderRelatedListener implements ListenerInterface * @param OrderResourceModel $orderResourceModel * @param CommandPoolInterface $commandPool * @param TransactionInfoRepositoryInterface $transactionInfoRepository + * @param LockManagerInterface $lockManager */ - public function __construct(ResourceConnection $resource, LoggerInterface $logger, OrderFactory $orderFactory, - OrderResourceModel $orderResourceModel, CommandPoolInterface $commandPool, - TransactionInfoRepositoryInterface $transactionInfoRepository) - { + public function __construct( + ResourceConnection $resource, + LoggerInterface $logger, + OrderFactory $orderFactory, + OrderResourceModel $orderResourceModel, + CommandPoolInterface $commandPool, + TransactionInfoRepositoryInterface $transactionInfoRepository, + LockManagerInterface $lockManager + ) { $this->resource = $resource; $this->logger = $logger; $this->orderFactory = $orderFactory; $this->orderResourceModel = $orderResourceModel; $this->commandPool = $commandPool; $this->transactionInfoRepository = $transactionInfoRepository; + $this->lockManager = $lockManager; } public function execute(Request $request) @@ -90,6 +104,7 @@ public function execute(Request $request) $connection = $this->beginTransaction(); try { $order = $this->loadOrder($this->getOrderId($entity)); + $transactionId = $order->getPostfinancecheckoutTransactionId(); if ($order instanceof Order) { if ($order->getPostfinancecheckoutTransactionId() != $this->getTransactionId($entity)) { $this->logger->warning( @@ -98,13 +113,15 @@ public function execute(Request $request) $connection->commit(); return; } - $this->lock($order); + $this->lock($transactionId); $this->process($this->loadEntity($request), $this->loadOrder($order->getId())); } + $this->unlock($transactionId); $connection->commit(); } catch (\Exception $e) { + $this->unlock($transactionId); + $connection->rollback(); $this->logger->critical($e); - $connection->rollBack(); throw $e; } } @@ -171,17 +188,21 @@ private function getOrderId($entity) /** * Creates a lock to prevent concurrency. * - * @param Order $order - * @return void + * @return bool + */ + protected function lock(string $lockId): bool + { + return $this->lockManager->lock($lockId, 1); + } + + /** + * Releases our lock. + * + * @return bool */ - private function lock(Order $order) + protected function unlock(string $lockId): bool { - $this->resource->getConnection()->update($this->resource->getTableName('sales_order'), - [ - 'postfinancecheckout_lock' => \date('Y-m-d H:i:s') - ], [ - 'entity_id = ?' => $order->getId() - ]); + return $this->lockManager->unlock($lockId); } /** @@ -216,4 +237,4 @@ abstract protected function loadEntity(Request $request); * @return int */ abstract protected function getTransactionId($entity); -} \ No newline at end of file +} diff --git a/Model/Webhook/Listener/DeliveryIndicationListener.php b/Model/Webhook/Listener/DeliveryIndicationListener.php index 1d66952..6eb00a9 100644 --- a/Model/Webhook/Listener/DeliveryIndicationListener.php +++ b/Model/Webhook/Listener/DeliveryIndicationListener.php @@ -12,6 +12,7 @@ namespace PostFinanceCheckout\Payment\Model\Webhook\Listener; use Magento\Framework\App\ResourceConnection; +use Magento\Framework\Lock\LockManagerInterface; use Magento\Sales\Model\OrderFactory; use Magento\Sales\Model\ResourceModel\Order as OrderResourceModel; use Psr\Log\LoggerInterface; @@ -41,13 +42,15 @@ class DeliveryIndicationListener extends AbstractOrderRelatedListener * @param CommandPoolInterface $commandPool * @param TransactionInfoRepositoryInterface $transactionInfoRepository * @param ApiClient $apiClient + * @param LockManagerInterface $lockManager */ public function __construct(ResourceConnection $resource, LoggerInterface $logger, OrderFactory $orderFactory, OrderResourceModel $orderResourceModel, CommandPoolInterface $commandPool, - TransactionInfoRepositoryInterface $transactionInfoRepository, ApiClient $apiClient) + TransactionInfoRepositoryInterface $transactionInfoRepository, ApiClient $apiClient, + LockManagerInterface $lockManager) { parent::__construct($resource, $logger, $orderFactory, $orderResourceModel, $commandPool, - $transactionInfoRepository); + $transactionInfoRepository, $lockManager); $this->apiClient = $apiClient; } @@ -73,4 +76,4 @@ protected function getTransactionId($entity) { return $entity->getLinkedTransaction(); } -} \ No newline at end of file +} diff --git a/Model/Webhook/Listener/RefundListener.php b/Model/Webhook/Listener/RefundListener.php index 2a44a66..0609882 100644 --- a/Model/Webhook/Listener/RefundListener.php +++ b/Model/Webhook/Listener/RefundListener.php @@ -12,6 +12,7 @@ namespace PostFinanceCheckout\Payment\Model\Webhook\Listener; use Magento\Framework\App\ResourceConnection; +use Magento\Framework\Lock\LockManagerInterface; use Magento\Sales\Model\OrderFactory; use Magento\Sales\Model\ResourceModel\Order as OrderResourceModel; use Psr\Log\LoggerInterface; @@ -41,13 +42,15 @@ class RefundListener extends AbstractOrderRelatedListener * @param CommandPoolInterface $commandPool * @param TransactionInfoRepositoryInterface $transactionInfoRepository * @param ApiClient $apiClient + * @param LockManagerInterface $lockManager */ public function __construct(ResourceConnection $resource, LoggerInterface $logger, OrderFactory $orderFactory, OrderResourceModel $orderResourceModel, CommandPoolInterface $commandPool, - TransactionInfoRepositoryInterface $transactionInfoRepository, ApiClient $apiClient) + TransactionInfoRepositoryInterface $transactionInfoRepository, ApiClient $apiClient, + LockManagerInterface $lockManager) { parent::__construct($resource, $logger, $orderFactory, $orderResourceModel, $commandPool, - $transactionInfoRepository); + $transactionInfoRepository, $lockManager); $this->apiClient = $apiClient; } @@ -72,4 +75,4 @@ protected function getTransactionId($entity) { return $entity->getTransaction()->getId(); } -} \ No newline at end of file +} diff --git a/Model/Webhook/Listener/TransactionCompletionListener.php b/Model/Webhook/Listener/TransactionCompletionListener.php index 746e31d..5feb3e1 100644 --- a/Model/Webhook/Listener/TransactionCompletionListener.php +++ b/Model/Webhook/Listener/TransactionCompletionListener.php @@ -12,6 +12,7 @@ namespace PostFinanceCheckout\Payment\Model\Webhook\Listener; use Magento\Framework\App\ResourceConnection; +use Magento\Framework\Lock\LockManagerInterface; use Magento\Sales\Model\OrderFactory; use Magento\Sales\Model\ResourceModel\Order as OrderResourceModel; use Psr\Log\LoggerInterface; @@ -41,13 +42,15 @@ class TransactionCompletionListener extends AbstractOrderRelatedListener * @param CommandPoolInterface $commandPool * @param TransactionInfoRepositoryInterface $transactionInfoRepository * @param ApiClient $apiClient + * @param LockManagerInterface $lockManager */ public function __construct(ResourceConnection $resource, LoggerInterface $logger, OrderFactory $orderFactory, OrderResourceModel $orderResourceModel, CommandPoolInterface $commandPool, - TransactionInfoRepositoryInterface $transactionInfoRepository, ApiClient $apiClient) + TransactionInfoRepositoryInterface $transactionInfoRepository, ApiClient $apiClient, + LockManagerInterface $lockManager) { parent::__construct($resource, $logger, $orderFactory, $orderResourceModel, $commandPool, - $transactionInfoRepository); + $transactionInfoRepository, $lockManager); $this->apiClient = $apiClient; } @@ -75,4 +78,4 @@ protected function getTransactionId($entity) ->getTransaction() ->getId(); } -} \ No newline at end of file +} diff --git a/Model/Webhook/Listener/TransactionInvoiceListener.php b/Model/Webhook/Listener/TransactionInvoiceListener.php index 000bec4..1037801 100644 --- a/Model/Webhook/Listener/TransactionInvoiceListener.php +++ b/Model/Webhook/Listener/TransactionInvoiceListener.php @@ -12,6 +12,7 @@ namespace PostFinanceCheckout\Payment\Model\Webhook\Listener; use Magento\Framework\App\ResourceConnection; +use Magento\Framework\Lock\LockManagerInterface; use Magento\Sales\Model\OrderFactory; use Magento\Sales\Model\ResourceModel\Order as OrderResourceModel; use Psr\Log\LoggerInterface; @@ -41,13 +42,15 @@ class TransactionInvoiceListener extends AbstractOrderRelatedListener * @param CommandPoolInterface $commandPool * @param TransactionInfoRepositoryInterface $transactionInfoRepository * @param ApiClient $apiClient + * @param LockManagerInterface $lockManager */ public function __construct(ResourceConnection $resource, LoggerInterface $logger, OrderFactory $orderFactory, OrderResourceModel $orderResourceModel, CommandPoolInterface $commandPool, - TransactionInfoRepositoryInterface $transactionInfoRepository, ApiClient $apiClient) + TransactionInfoRepositoryInterface $transactionInfoRepository, ApiClient $apiClient, + LockManagerInterface $lockManager) { parent::__construct($resource, $logger, $orderFactory, $orderResourceModel, $commandPool, - $transactionInfoRepository); + $transactionInfoRepository, $lockManager); $this->apiClient = $apiClient; } @@ -73,4 +76,4 @@ protected function getTransactionId($entity) { return $entity->getLinkedTransaction(); } -} \ No newline at end of file +} diff --git a/Model/Webhook/Listener/TransactionListener.php b/Model/Webhook/Listener/TransactionListener.php index d5d7766..7f5c519 100644 --- a/Model/Webhook/Listener/TransactionListener.php +++ b/Model/Webhook/Listener/TransactionListener.php @@ -12,6 +12,7 @@ namespace PostFinanceCheckout\Payment\Model\Webhook\Listener; use Magento\Framework\App\ResourceConnection; +use Magento\Framework\Lock\LockManagerInterface; use Magento\Sales\Model\Order; use Magento\Sales\Model\OrderFactory; use Magento\Sales\Model\ResourceModel\Order as OrderResourceModel; @@ -62,14 +63,20 @@ class TransactionListener extends AbstractOrderRelatedListener * @param TransactionInfoManagementInterface $transactionInfoManagement * @param ApiClient $apiClient * @param LoggerInterface $logger + * @param LockManagerInterface $lockManager */ - public function __construct(ResourceConnection $resource, LoggerInterface $logger, OrderFactory $orderFactory, - OrderResourceModel $orderResourceModel, CommandPoolInterface $commandPool, + public function __construct( + ResourceConnection $resource, + LoggerInterface $logger, OrderFactory $orderFactory, + OrderResourceModel $orderResourceModel, + CommandPoolInterface $commandPool, TransactionInfoRepositoryInterface $transactionInfoRepository, - TransactionInfoManagementInterface $transactionInfoManagement, ApiClient $apiClient) - { + TransactionInfoManagementInterface $transactionInfoManagement, + ApiClient $apiClient, + LockManagerInterface $lockManager + ) { parent::__construct($resource, $logger, $orderFactory, $orderResourceModel, $commandPool, - $transactionInfoRepository); + $transactionInfoRepository, $lockManager); $this->transactionInfoRepository = $transactionInfoRepository; $this->transactionInfoManagement = $transactionInfoManagement; $this->apiClient = $apiClient; @@ -115,4 +122,4 @@ protected function getTransactionId($entity) { return $entity->getId(); } -} \ No newline at end of file +} diff --git a/Observer/ValidateAndRestoreQuote.php b/Observer/ValidateAndRestoreQuote.php new file mode 100644 index 0000000..8033367 --- /dev/null +++ b/Observer/ValidateAndRestoreQuote.php @@ -0,0 +1,81 @@ +order = $order; + $this->checkoutSession = $checkoutSession; + } + + /** + * Validate and restore the quote. + * + * @param Observer $observer + * @throws LocalizedException + */ + public function execute(Observer $observer) + { + $quote = $this->checkoutSession->getQuote(); + + if (!$quote || !$quote->getId()) { + throw new LocalizedException(__('No cart to restore.')); + } + + // Find any orders associated with the quote + $orderCollection = $this->order->getCollection() + ->addFieldToFilter('quote_id', $quote->getId()); + + if ($orderCollection->getSize()) { + /** @var Order $order */ + $order = $orderCollection->getFirstItem(); + + $orderStates = [ + TransactionState::AUTHORIZED, + TransactionState::COMPLETED, + TransactionState::FULFILL, + ]; + + // Prevent restoring if the quote is already paid + if (in_array($order->getState(), $orderStates)) { + throw new LocalizedException(__('Your cart has already been paid for and cannot be restored.')); + } + } + + // If all validations pass, let the session restore the quote + $this->checkoutSession->restoreQuote(); + } +} diff --git a/README.md b/README.md index fe64faa..f9962cb 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ This repository contains the Magento 2 extension that enables to process payment ## Documentation -* [Documentation](https://plugin-documentation.postfinance-checkout.ch/pfpayments/magento-2/2.1.20/docs/en/documentation.html) +* [Documentation](https://plugin-documentation.postfinance-checkout.ch/pfpayments/magento-2/2.1.21/docs/en/documentation.html) ## Support @@ -39,4 +39,4 @@ We do provide special integrations for the following one step checkouts: ## License -Please see the [license file](https://github.com/pfpayments/magento-2/blob/2.1.20/LICENSE) for more information. +Please see the [license file](https://github.com/pfpayments/magento-2/blob/2.1.21/LICENSE) for more information. diff --git a/composer.json b/composer.json index eaf09a5..b6dd6ea 100644 --- a/composer.json +++ b/composer.json @@ -16,7 +16,7 @@ } ], "type" : "magento2-module", - "version" : "2.1.20", + "version" : "2.1.21", "require" : { "php" : "~7.1.3||~7.2.0||~7.3.0||~7.4.0||~8.0||~8.1||~8.2", "magento/framework" : "^102.0.0||^103.0.0", diff --git a/docs/en/documentation.html b/docs/en/documentation.html index 637b7e2..c51f125 100644 --- a/docs/en/documentation.html +++ b/docs/en/documentation.html @@ -23,7 +23,7 @@

Documentation

  • - + Source
  • diff --git a/docs/en/resource/application-user-configuration.png b/docs/en/resource/application-user-configuration.png deleted file mode 100644 index c187595..0000000 Binary files a/docs/en/resource/application-user-configuration.png and /dev/null differ diff --git a/docs/en/resource/payment-method-configuration.png b/docs/en/resource/payment-method-configuration.png deleted file mode 100644 index 9983151..0000000 Binary files a/docs/en/resource/payment-method-configuration.png and /dev/null differ diff --git a/docs/en/resource/space-configuration.png b/docs/en/resource/space-configuration.png deleted file mode 100644 index 13306b0..0000000 Binary files a/docs/en/resource/space-configuration.png and /dev/null differ diff --git a/etc/adminhtml/system.xml b/etc/adminhtml/system.xml index 570e785..f666400 100644 --- a/etc/adminhtml/system.xml +++ b/etc/adminhtml/system.xml @@ -19,7 +19,7 @@ PostFinanceCheckout_Payment::config - documentation.]]> + documentation.]]> diff --git a/etc/config.xml b/etc/config.xml index d9c24fb..72d59bc 100644 --- a/etc/config.xml +++ b/etc/config.xml @@ -15,7 +15,7 @@ - 2.1.20 + 2.1.21 4.6.0 diff --git a/etc/di.xml b/etc/di.xml index 209663b..0eb00b8 100644 --- a/etc/di.xml +++ b/etc/di.xml @@ -87,6 +87,16 @@ + + + var/lock + + + + + Magento\Framework\Lock\Backend\Database + + PostFinanceCheckoutTransactionWebhookCommandPool diff --git a/etc/events.xml b/etc/events.xml index e699c0b..03a1dca 100644 --- a/etc/events.xml +++ b/etc/events.xml @@ -63,4 +63,8 @@ + + + + \ No newline at end of file diff --git a/etc/module.xml b/etc/module.xml index 58f3a2a..bddf7ce 100644 --- a/etc/module.xml +++ b/etc/module.xml @@ -12,7 +12,7 @@ */ --> - + diff --git a/i18n/de_CH.csv b/i18n/de_CH.csv index 46a326d..4460fe6 100644 --- a/i18n/de_CH.csv +++ b/i18n/de_CH.csv @@ -51,7 +51,7 @@ "Hold Delivery","Lieferung halten" "ID required","ID erforderlich" "When a refund request is in a pending state, update its status to successful", "Wenn die Rückerstattung aussteht, markieren Sie sie als erfolgreich" -"If you need help setting up the PostFinance Checkout extension, check out the documentation.","Falls Sie Hilfe benötigen beim Einrichten der PostFinance Checkout-Erweiterung, sehen Sie sich die Dokumentation an." +"If you need help setting up the PostFinance Checkout extension, check out the documentation.","Falls Sie Hilfe benötigen beim Einrichten der PostFinance Checkout-Erweiterung, sehen Sie sich die Dokumentation an." "Inactive","Inaktiv" "Information","Informationen" "Invoice","Rechnung" diff --git a/i18n/de_DE.csv b/i18n/de_DE.csv index 46a326d..4460fe6 100644 --- a/i18n/de_DE.csv +++ b/i18n/de_DE.csv @@ -51,7 +51,7 @@ "Hold Delivery","Lieferung halten" "ID required","ID erforderlich" "When a refund request is in a pending state, update its status to successful", "Wenn die Rückerstattung aussteht, markieren Sie sie als erfolgreich" -"If you need help setting up the PostFinance Checkout extension, check out the documentation.","Falls Sie Hilfe benötigen beim Einrichten der PostFinance Checkout-Erweiterung, sehen Sie sich die Dokumentation an." +"If you need help setting up the PostFinance Checkout extension, check out the documentation.","Falls Sie Hilfe benötigen beim Einrichten der PostFinance Checkout-Erweiterung, sehen Sie sich die Dokumentation an." "Inactive","Inaktiv" "Information","Informationen" "Invoice","Rechnung" diff --git a/i18n/en_US.csv b/i18n/en_US.csv index 5950756..44cd795 100644 --- a/i18n/en_US.csv +++ b/i18n/en_US.csv @@ -51,7 +51,7 @@ "Hold Delivery","Hold Delivery" "ID required","ID required" "When a refund request is in a pending state, update its status to successful", "When a refund request is in a pending state, update its status to successful" -"If you need help setting up the PostFinance Checkout extension, check out the documentation.","If you need help setting up the PostFinance Checkout extension, check out the documentation." +"If you need help setting up the PostFinance Checkout extension, check out the documentation.","If you need help setting up the PostFinance Checkout extension, check out the documentation." "Inactive","Inactive" "Information","Information" "Invoice","Invoice" diff --git a/i18n/fr_CH.csv b/i18n/fr_CH.csv index 75a6537..84348ee 100644 --- a/i18n/fr_CH.csv +++ b/i18n/fr_CH.csv @@ -50,7 +50,7 @@ "Gift Wrap","Papier cadeau" "Hold Delivery","Suspendre la livraison" "ID required","Pièce d'identité requise" -"If you need help setting up the postfinancecheckout extension, check out the documentation.","Si vous avez besoin d'aide pour configurer l'extension postfinancecheckout, consultez la documentation an." +"If you need help setting up the postfinancecheckout extension, check out the documentation.","Si vous avez besoin d'aide pour configurer l'extension postfinancecheckout, consultez la documentation an." "Inactive","Inactif" "Information","Information" "Invoice","Facture" diff --git a/i18n/fr_FR.csv b/i18n/fr_FR.csv index 16eb923..39c063b 100644 --- a/i18n/fr_FR.csv +++ b/i18n/fr_FR.csv @@ -51,7 +51,7 @@ "Hold Delivery","Suspendre la livraison" "ID required","Pièce d'identité requise" "When a refund request is in a pending state, update its status to successful", "Lorsqu'une demande de remboursement est en état d'attente, mettre à jour son statut pour le marquer comme réussi" -"If you need help setting up the postfinancecheckout extension, check out the documentation.","Si vous avez besoin d'aide pour configurer l'extension postfinancecheckout, consultez la documentation an." +"If you need help setting up the postfinancecheckout extension, check out the documentation.","Si vous avez besoin d'aide pour configurer l'extension postfinancecheckout, consultez la documentation an." "Inactive","Inactif" "Information","Information" "Invoice","Facture" diff --git a/i18n/it_CH.csv b/i18n/it_CH.csv index 959352d..c5e0c4e 100644 --- a/i18n/it_CH.csv +++ b/i18n/it_CH.csv @@ -51,7 +51,7 @@ "Hold Delivery","Sospendi la consegna" "ID required","ID richiesto" "When a refund request is in a pending state, update its status to successful", "Quando una richiesta di rimborso è in stato di attesa, contrassegnalo come eseguito con successo." -"If you need help setting up the postfinancecheckout extension, check out the documentation.","Se hai bisogno di aiuto per configurare l'estensione postfinancecheckout, consulta la documentazione an." +"If you need help setting up the postfinancecheckout extension, check out the documentation.","Se hai bisogno di aiuto per configurare l'estensione postfinancecheckout, consulta la documentazione an." "Inactive","Inattivo" "Information","Informazione" "Invoice","Fattura" diff --git a/i18n/it_IT.csv b/i18n/it_IT.csv index 959352d..c5e0c4e 100644 --- a/i18n/it_IT.csv +++ b/i18n/it_IT.csv @@ -51,7 +51,7 @@ "Hold Delivery","Sospendi la consegna" "ID required","ID richiesto" "When a refund request is in a pending state, update its status to successful", "Quando una richiesta di rimborso è in stato di attesa, contrassegnalo come eseguito con successo." -"If you need help setting up the postfinancecheckout extension, check out the documentation.","Se hai bisogno di aiuto per configurare l'estensione postfinancecheckout, consulta la documentazione an." +"If you need help setting up the postfinancecheckout extension, check out the documentation.","Se hai bisogno di aiuto per configurare l'estensione postfinancecheckout, consulta la documentazione an." "Inactive","Inattivo" "Information","Informazione" "Invoice","Fattura"