mirror of
https://github.com/vr-payment/shopware-6.git
synced 2026-06-19 03:13:19 +00:00
Release 6.2.0
This commit is contained in:
Vendored
BIN
Binary file not shown.
@@ -13,7 +13,9 @@ use Symfony\Component\{
|
||||
};
|
||||
use VRPaymentPayment\Core\{
|
||||
Api\Refund\Service\RefundService,
|
||||
Settings\Service\SettingsService
|
||||
Api\Transaction\Service\TransactionService,
|
||||
Settings\Service\SettingsService,
|
||||
Util\Exception\RefundNotSupportedException
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -40,17 +42,24 @@ class RefundController extends AbstractController
|
||||
* @var \Psr\Log\LoggerInterface
|
||||
*/
|
||||
protected $logger;
|
||||
|
||||
|
||||
/**
|
||||
* @var \VRPaymentPayment\Core\Api\Transaction\Service\TransactionService
|
||||
*/
|
||||
protected $transactionService;
|
||||
|
||||
/**
|
||||
* RefundController constructor.
|
||||
*
|
||||
* @param \VRPaymentPayment\Core\Api\Refund\Service\RefundService $refundService
|
||||
* @param \VRPaymentPayment\Core\Settings\Service\SettingsService $settingsService
|
||||
* @param \VRPaymentPayment\Core\Api\Transaction\Service\TransactionService $transactionService
|
||||
*/
|
||||
public function __construct(RefundService $refundService, SettingsService $settingsService)
|
||||
public function __construct(RefundService $refundService, SettingsService $settingsService, TransactionService $transactionService)
|
||||
{
|
||||
$this->settingsService = $settingsService;
|
||||
$this->refundService = $refundService;
|
||||
$this->transactionService = $transactionService;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -81,12 +90,29 @@ class RefundController extends AbstractController
|
||||
$transactionId = $request->request->get('transactionId');
|
||||
$quantity = (int)$request->request->get('quantity');
|
||||
$lineItemId = $request->request->get('lineItemId');
|
||||
|
||||
|
||||
if ($quantity === null || $quantity <= 0) {
|
||||
return new Response('refundQuantityZero', Response::HTTP_BAD_REQUEST);
|
||||
}
|
||||
|
||||
$settings = $this->settingsService->getSettings($salesChannelId);
|
||||
$apiClient = $settings->getApiClient();
|
||||
|
||||
$transaction = $apiClient->getTransactionService()->read($settings->getSpaceId(), $transactionId);
|
||||
$refund = $this->refundService->create($transaction, $context, $lineItemId, $quantity);
|
||||
|
||||
$maxQuantity = $this->refundService->getMaxRefundableQuantity($transaction, $context, $lineItemId);
|
||||
|
||||
if ($quantity > $maxQuantity) {
|
||||
return new Response('refundExceedsQuantity', Response::HTTP_BAD_REQUEST);
|
||||
}
|
||||
|
||||
try {
|
||||
$refund = $this->refundService->create($transaction, $context, $lineItemId, $quantity);
|
||||
} catch (RefundNotSupportedException $exception) {
|
||||
$this->logger->info('Payment method does not support online refunds for transaction: ' . $transactionId);
|
||||
return new Response('methodDoesNotSupportRefund', Response::HTTP_BAD_REQUEST);
|
||||
}
|
||||
|
||||
if ($refund === null) {
|
||||
return new Response('Refund was not created. Please check the refund amound or if the item was not refunded before', Response::HTTP_BAD_REQUEST);
|
||||
}
|
||||
@@ -111,11 +137,33 @@ class RefundController extends AbstractController
|
||||
$transactionId = $request->request->get('transactionId');
|
||||
$refundableAmount = $request->request->get('refundableAmount');
|
||||
|
||||
if ($refundableAmount === null || $refundableAmount <= 0.0) {
|
||||
return new Response('refundAmountZero', Response::HTTP_BAD_REQUEST);
|
||||
}
|
||||
|
||||
$settings = $this->settingsService->getSettings($salesChannelId);
|
||||
$apiClient = $settings->getApiClient();
|
||||
|
||||
$transaction = $apiClient->getTransactionService()->read($settings->getSpaceId(), $transactionId);
|
||||
$this->refundService->createRefundByAmount($transaction, $refundableAmount, $context);
|
||||
|
||||
$completed = (float) $transaction->getCompletedAmount();
|
||||
$refunded = (float) $transaction->getRefundedAmount();
|
||||
$maxRefund = round($completed - $refunded, 2);
|
||||
|
||||
if ($refundableAmount > $maxRefund) {
|
||||
return new Response('refundExceedsAmount', Response::HTTP_BAD_REQUEST);
|
||||
}
|
||||
|
||||
try {
|
||||
$refund = $this->refundService->createRefundByAmount($transaction, $refundableAmount, $context);
|
||||
} catch (RefundNotSupportedException $exception) {
|
||||
$this->logger->info('Payment method does not support online refunds for transaction: ' . $transactionId);
|
||||
return new Response('methodDoesNotSupportRefund', Response::HTTP_BAD_REQUEST);
|
||||
}
|
||||
|
||||
if ($refund === null) {
|
||||
return new Response(null, Response::HTTP_BAD_REQUEST);
|
||||
}
|
||||
|
||||
return new Response(null, Response::HTTP_NO_CONTENT);
|
||||
}
|
||||
@@ -142,7 +190,13 @@ class RefundController extends AbstractController
|
||||
$apiClient = $settings->getApiClient();
|
||||
|
||||
$transaction = $apiClient->getTransactionService()->read($settings->getSpaceId(), $transactionId);
|
||||
$this->refundService->createPartialRefund($transaction, $context, $lineItemId, $refundableAmount);
|
||||
|
||||
try {
|
||||
$refund = $this->refundService->createPartialRefund($transaction, $context, $lineItemId, $refundableAmount);
|
||||
} catch (RefundNotSupportedException $exception) {
|
||||
$this->logger->info('Payment method does not support online refunds for transaction: ' . $transactionId);
|
||||
return new Response('methodDoesNotSupportRefund', Response::HTTP_BAD_REQUEST);
|
||||
}
|
||||
|
||||
return new Response(null, Response::HTTP_NO_CONTENT);
|
||||
}
|
||||
|
||||
@@ -12,14 +12,20 @@ use Shopware\Core\{
|
||||
};
|
||||
use VRPayment\Sdk\{
|
||||
Model\Refund,
|
||||
Model\Transaction
|
||||
Model\Transaction,
|
||||
Model\CriteriaOperator,
|
||||
Model\EntityQueryFilter,
|
||||
Model\EntityQueryFilterType,
|
||||
Model\EntityQuery,
|
||||
ApiException
|
||||
};
|
||||
use VRPaymentPayment\Core\{
|
||||
Api\Refund\Entity\RefundEntity,
|
||||
Api\Transaction\Entity\TransactionEntity,
|
||||
Api\Transaction\Entity\TransactionEntityDefinition,
|
||||
Settings\Service\SettingsService,
|
||||
Util\Payload\RefundPayload
|
||||
Util\Payload\RefundPayload,
|
||||
Util\Exception\RefundNotSupportedException
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -99,6 +105,12 @@ class RefundService
|
||||
$this->upsert($refund, $context);
|
||||
return $refund;
|
||||
}
|
||||
} catch (ApiException $exception) {
|
||||
$message = $exception->getMessage();
|
||||
$this->logger->critical($message);
|
||||
if ($exception->getCode() === 442 && str_contains($message, 'does not support online refunds')) {
|
||||
throw new RefundNotSupportedException($message, 0, $exception);
|
||||
}
|
||||
} catch (\Exception $exception) {
|
||||
$this->logger->critical($exception->getMessage());
|
||||
}
|
||||
@@ -134,6 +146,12 @@ class RefundService
|
||||
$this->upsert($refund, $context);
|
||||
return $refund;
|
||||
}
|
||||
} catch (ApiException $exception) {
|
||||
$message = $exception->getMessage();
|
||||
$this->logger->critical($message);
|
||||
if ($exception->getCode() === 442 && str_contains($message, 'does not support online refunds')) {
|
||||
throw new RefundNotSupportedException($message, 0, $exception);
|
||||
}
|
||||
} catch (\Exception $exception) {
|
||||
$this->logger->critical($exception->getMessage());
|
||||
}
|
||||
@@ -170,6 +188,12 @@ class RefundService
|
||||
$this->upsert($refund, $context);
|
||||
return $refund;
|
||||
}
|
||||
} catch (ApiException $exception) {
|
||||
$message = $exception->getMessage();
|
||||
$this->logger->critical($message);
|
||||
if ($exception->getCode() === 442 && str_contains($message, 'does not support online refunds')) {
|
||||
throw new RefundNotSupportedException($message, 0, $exception);
|
||||
}
|
||||
} catch (\Exception $exception) {
|
||||
$this->logger->critical($exception->getMessage());
|
||||
}
|
||||
@@ -240,5 +264,68 @@ class RefundService
|
||||
)
|
||||
->first();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get total refunded quantity for transaction's line item by lineItemId.
|
||||
*
|
||||
* @param \VRPayment\Sdk\Model\Transaction $transaction
|
||||
* @param \Shopware\Core\Framework\Context $context
|
||||
* @param string $lineItemId
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getRefundedQuantity(Transaction $transaction, Context $context, string $lineItemId): int {
|
||||
$transactionEntity = $this->getTransactionEntityByTransactionId($transaction->getId(), $context);
|
||||
$settings = $this->settingsService->getSettings($transactionEntity->getSalesChannel()->getId());
|
||||
$apiClient = $settings->getApiClient();
|
||||
|
||||
$entityQueryFilter = (new EntityQueryFilter())
|
||||
->setType(EntityQueryFilterType::LEAF)
|
||||
->setOperator(CriteriaOperator::EQUALS)
|
||||
->setFieldName('transaction.id')
|
||||
->setValue($transaction->getId());
|
||||
|
||||
$query = (new EntityQuery())->setFilter($entityQueryFilter);
|
||||
|
||||
$refunds = $apiClient->getRefundService()->search($settings->getSpaceId(), $query);
|
||||
|
||||
$refundedQuantity = 0;
|
||||
|
||||
foreach ($refunds as $refund) {
|
||||
foreach ($refund->getReductions() as $reduction) {
|
||||
if ($reduction->getLineItemUniqueId() === $lineItemId) {
|
||||
$refundedQuantity += (int) $reduction->getQuantityReduction();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $refundedQuantity;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get maximum quantity of available items to refund for line item.
|
||||
*
|
||||
* @param \VRPayment\Sdk\Model\Transaction $transaction
|
||||
* @param \Shopware\Core\Framework\Context $context
|
||||
* @param string $lineItemId
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getMaxRefundableQuantity(Transaction $transaction, Context $context, string $lineItemId): int {
|
||||
|
||||
$originalQuantity = 0;
|
||||
|
||||
foreach ($transaction->getLineItems() as $lineItem) {
|
||||
if ($lineItem->getUniqueId() === $lineItemId) {
|
||||
$originalQuantity = (int) $lineItem->getQuantity();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
$refundedQuantity = $this->getRefundedQuantity($transaction, $context, $lineItemId);
|
||||
|
||||
$maxQuantity = $originalQuantity - $refundedQuantity;
|
||||
|
||||
return $maxQuantity;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@ use VRPaymentPayment\Core\Api\Refund\Entity\RefundEntityDefinition;
|
||||
*/
|
||||
class TransactionEntityDefinition extends EntityDefinition {
|
||||
|
||||
public const ENTITY_NAME = 'vrpayment_transaction';
|
||||
public const ENTITY_NAME = 'vrpayment_transaction_data';
|
||||
|
||||
/**
|
||||
* @return string
|
||||
|
||||
@@ -39,6 +39,7 @@ use VRPaymentPayment\Sdk\{Model\AddressCreate,
|
||||
Model\TransactionCreate,
|
||||
Model\TransactionPending};
|
||||
use Shopware\Core\Framework\Struct\ArrayEntity;
|
||||
use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
|
||||
|
||||
/**
|
||||
* Class CheckoutSubscriber
|
||||
@@ -335,6 +336,7 @@ class CheckoutSubscriber implements EventSubscriberInterface
|
||||
$criteria->addFilter(
|
||||
new EqualsFilter('salesChannels.id', $event->getSalesChannelContext()->getSalesChannelId())
|
||||
);
|
||||
$criteria->addSorting(new FieldSorting('position', FieldSorting::ASCENDING));
|
||||
|
||||
$result = $this->paymentMethodRepository->search($criteria, $event->getContext());
|
||||
foreach ($result->getEntities() as $method) {
|
||||
|
||||
@@ -28,7 +28,7 @@ class Analytics {
|
||||
self::SHOP_SYSTEM => 'shopware',
|
||||
self::SHOP_SYSTEM_VERSION => $shopwareVersion,
|
||||
self::SHOP_SYSTEM_AND_VERSION => 'shopware-' . $shopwareVersion,
|
||||
self::PLUGIN_SYSTEM_VERSION => '6.1.17',
|
||||
self::PLUGIN_SYSTEM_VERSION => '6.2.0',
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
<?php declare(strict_types=1);
|
||||
|
||||
|
||||
namespace VRPaymentPayment\Core\Util\Exception;
|
||||
|
||||
class RefundNotSupportedException extends \LogicException{
|
||||
|
||||
}
|
||||
@@ -31,7 +31,7 @@ class Migration1590156974TransactionEntity extends MigrationStep {
|
||||
public function update(Connection $connection): void
|
||||
{
|
||||
$connection->executeStatement('
|
||||
CREATE TABLE IF NOT EXISTS `vrpayment_transaction` (
|
||||
CREATE TABLE IF NOT EXISTS `vrpayment_transaction_tmp` (
|
||||
`id` BINARY(16) NOT NULL,
|
||||
`data` JSON NOT NULL,
|
||||
`payment_method_id` BINARY(16) NOT NULL,
|
||||
|
||||
@@ -42,7 +42,7 @@ class Migration1590646356RefundEntity extends MigrationStep {
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `refund_id_UNIQUE` (`refund_id`),
|
||||
KEY `fk.vrp_refund.transaction_id` (`transaction_id`),
|
||||
CONSTRAINT `fk.vrp_refund.transaction_id` FOREIGN KEY (`transaction_id`) REFERENCES `vrpayment_transaction` (`transaction_id`) ON DELETE CASCADE
|
||||
CONSTRAINT `fk.vrp_refund.transaction_id` FOREIGN KEY (`transaction_id`) REFERENCES `vrpayment_transaction_tmp` (`transaction_id`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
');
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@ class Migration1590646356TransactionEntity extends MigrationStep {
|
||||
public function update(Connection $connection): void
|
||||
{
|
||||
try {
|
||||
$connection->executeStatement('ALTER TABLE `vrpayment_transaction` ADD COLUMN `confirmation_email_sent` TINYINT(1) NOT NULL DEFAULT 0 AFTER `id`;');
|
||||
$connection->executeStatement('ALTER TABLE `vrpayment_transaction_tmp` ADD COLUMN `confirmation_email_sent` TINYINT(1) NOT NULL DEFAULT 0 AFTER `id`;');
|
||||
}catch (\Exception $exception){
|
||||
// column probably exists
|
||||
}
|
||||
|
||||
@@ -33,19 +33,19 @@ class Migration1605701048TransactionEntity extends MigrationStep
|
||||
|
||||
try {
|
||||
$connection->executeStatement('
|
||||
ALTER TABLE `vrpayment_transaction`
|
||||
ALTER TABLE `vrpayment_transaction_tmp`
|
||||
ADD `order_version_id` binary(16) NOT NULL AFTER `transaction_id`;
|
||||
');
|
||||
|
||||
$connection->executeStatement('
|
||||
UPDATE `vrpayment_transaction` t1
|
||||
UPDATE `vrpayment_transaction_tmp` t1
|
||||
INNER JOIN `order` t2
|
||||
ON t1.order_id = t2.id
|
||||
SET t1.order_version_id = t2.version_id;
|
||||
');
|
||||
|
||||
$connection->executeStatement('
|
||||
ALTER TABLE `vrpayment_transaction`
|
||||
ALTER TABLE `vrpayment_transaction_tmp`
|
||||
DROP FOREIGN KEY `fk.vrp_transaction.order_id`,
|
||||
DROP FOREIGN KEY `fk.vrp_transaction.order_transaction_id`,
|
||||
DROP FOREIGN KEY `fk.vrp_transaction.payment_method_id`,
|
||||
@@ -53,7 +53,7 @@ class Migration1605701048TransactionEntity extends MigrationStep
|
||||
');
|
||||
|
||||
$connection->executeStatement('
|
||||
ALTER TABLE `vrpayment_transaction`
|
||||
ALTER TABLE `vrpayment_transaction_tmp`
|
||||
ADD CONSTRAINT `fk.vrp_transaction_order_id` FOREIGN KEY (`order_id`, `order_version_id`)
|
||||
REFERENCES `order` (`id`, `version_id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
ADD CONSTRAINT `fk.vrp_transaction_payment_method_id` FOREIGN KEY (`payment_method_id`)
|
||||
|
||||
@@ -30,7 +30,7 @@ class Migration1684240994TransactionEntity extends MigrationStep {
|
||||
public function update(Connection $connection): void
|
||||
{
|
||||
try {
|
||||
$connection->executeStatement('ALTER TABLE `vrpayment_transaction` ADD COLUMN `erp_merchant_id` VARCHAR(255) DEFAULT NULL AFTER `confirmation_email_sent`;');
|
||||
$connection->executeStatement('ALTER TABLE `vrpayment_transaction_tmp` ADD COLUMN `erp_merchant_id` VARCHAR(255) DEFAULT NULL AFTER `confirmation_email_sent`;');
|
||||
}catch (\Exception $exception){
|
||||
// column probably exists
|
||||
}
|
||||
|
||||
@@ -0,0 +1,324 @@
|
||||
<?php declare(strict_types=1);
|
||||
|
||||
namespace VRPaymentPayment\Migration;
|
||||
|
||||
use Doctrine\DBAL\Connection;
|
||||
use Shopware\Core\Framework\Migration\MigrationStep;
|
||||
use Monolog\Logger;
|
||||
use Monolog\Handler\StreamHandler;
|
||||
|
||||
/**
|
||||
* Class Migration1766067106TransactionEntity
|
||||
*
|
||||
* @package VRPaymentPayment\Migration
|
||||
*/
|
||||
class Migration1766067106TransactionEntity extends MigrationStep
|
||||
{
|
||||
|
||||
/**
|
||||
* get creation timestamp
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getCreationTimestamp(): int
|
||||
{
|
||||
return 1766067106;
|
||||
}
|
||||
|
||||
/**
|
||||
* update non-destructive changes
|
||||
*
|
||||
* @param \Doctrine\DBAL\Connection $connection
|
||||
*/
|
||||
public function update(Connection $connection): void
|
||||
{
|
||||
$oldTableName = 'vrpayment_transaction';
|
||||
$tempTableName = 'vrpayment_transaction_tmp';
|
||||
$realTableName = 'vrpayment_transaction_data';
|
||||
$logger = new Logger('vrpayment_migration');
|
||||
$logger->pushHandler(new StreamHandler(dirname(__DIR__, 5) . '/var/log/vrpayment-migration.log'));
|
||||
$logger->info(
|
||||
'Migration start', [
|
||||
'old_table_exists' => $this->tableExists($connection, $oldTableName),
|
||||
'temp_table_exists' => $this->tableExists($connection, $tempTableName),
|
||||
'real_table_exists' => $this->tableExists($connection, $realTableName),
|
||||
]
|
||||
);
|
||||
|
||||
if ($this->tableExists($connection, $tempTableName)) {
|
||||
// If _temp table exists, it means that this is a fresh installation.
|
||||
$logger->info('Fresh installation detected.');
|
||||
$connection->executeStatement(
|
||||
sprintf('RENAME TABLE `%s` TO `%s`', $tempTableName, $realTableName)
|
||||
);
|
||||
$logger->info('Fresh installation finished.');
|
||||
} else {
|
||||
// If _temp does not exist, it means that this could be a version upgrade.
|
||||
$logger->info('Possible plugin upgrade detected.');
|
||||
if ($this->tableExists($connection, $oldTableName) && !$this->isOldPluginTable($connection, $oldTableName)) {
|
||||
$logger->info('Old vrpayment_transaction table detected.');
|
||||
// If vrpayment_transaction already exists and does not belong to old plugin,
|
||||
// it means that this is indeed a version update.
|
||||
$this->syncTransactionTable($connection, $oldTableName);
|
||||
$logger->info('Old vrpayment_transaction table sync finished.');
|
||||
$this->syncRefundTable($connection, $oldTableName);
|
||||
$logger->info('Old vrpayment_refund table sync finished.');
|
||||
$connection->executeStatement(
|
||||
sprintf('RENAME TABLE `%s` TO `%s`', $oldTableName, $realTableName)
|
||||
);
|
||||
$logger->info('Old vrpayment_transaction table renaming completed.');
|
||||
}
|
||||
$logger->info('Possible plugin upgrade finished.');
|
||||
// If vrpayment_transaction exists and it does belong to old plugin,
|
||||
// it means we must run it in parallel.
|
||||
}
|
||||
$logger->info('Migration finished.');
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if table exists.
|
||||
*
|
||||
* @param \Doctrine\DBAL\Connection $connection
|
||||
* @param string $table
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function tableExists(Connection $connection, string $table): bool {
|
||||
$result = $connection->fetchOne('SHOW TABLES LIKE :table', ['table' => $table]);
|
||||
return $result !== false && $result !== null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if table belongs to old plugin.
|
||||
*
|
||||
* @param \Doctrine\DBAL\Connection $connection
|
||||
* @param string $table
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isOldPluginTable(Connection $connection, string $table): bool {
|
||||
$oldTableExclusiveColumns = [
|
||||
'finalized_at' => 'datetime',
|
||||
'refunded_at' => 'datetime',
|
||||
'initial_transaction_mode' => 'varchar',
|
||||
'manual_capture' => 'tinyint',
|
||||
'partial_refunded_at' => 'datetime',
|
||||
'refunded_amount' => 'double',
|
||||
'amount_to_refund' => 'double',
|
||||
];
|
||||
$resultColumns = $connection->fetchAllAssociative(
|
||||
'SELECT LOWER(COLUMN_NAME) AS column_name, LOWER(DATA_TYPE) AS data_type
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = :table',
|
||||
['table' => $table]
|
||||
);
|
||||
$dbColumns = [];
|
||||
foreach($resultColumns as $column) {
|
||||
$dbColumns[$column['column_name']] = $column['data_type'];
|
||||
}
|
||||
|
||||
$oldPluginTable = true;
|
||||
foreach($oldTableExclusiveColumns as $columnName => $columnType) {
|
||||
if(!isset($dbColumns[$columnName])) {
|
||||
$oldPluginTable = false;
|
||||
break;
|
||||
}
|
||||
if ($dbColumns[$columnName] !== $columnType) {
|
||||
$oldPluginTable = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return $oldPluginTable;
|
||||
}
|
||||
|
||||
/**
|
||||
* Synchronizes the transaction table with the current/latest version.
|
||||
*
|
||||
* @param \Doctrine\DBAL\Connection $connection
|
||||
* @param string $table
|
||||
*/
|
||||
private function syncTransactionTable(Connection $connection, string $table): void {
|
||||
$this->addColumnIfMissing($connection, $table, 'confirmation_email_sent', "TINYINT(1) NOT NULL DEFAULT 0 AFTER `id`");
|
||||
$this->addColumnIfMissing($connection, $table, 'erp_merchant_id', "VARCHAR(255) DEFAULT NULL AFTER `confirmation_email_sent`");
|
||||
$this->addColumnIfMissing($connection, $table, 'data', "LONGTEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL CHECK (json_valid(`data`)) AFTER `erp_merchant_id`");
|
||||
$this->addColumnIfMissing($connection, $table, 'payment_method_id', "BINARY(16) NOT NULL");
|
||||
$this->addColumnIfMissing($connection, $table, 'order_id', "BINARY(16) NOT NULL");
|
||||
$this->addColumnIfMissing($connection, $table, 'order_transaction_id', "BINARY(16) NOT NULL");
|
||||
$this->addColumnIfMissing($connection, $table, 'space_id', "INT(10) UNSIGNED NOT NULL");
|
||||
$this->addColumnIfMissing($connection, $table, 'state', "VARCHAR(255) NOT NULL");
|
||||
$this->addColumnIfMissing($connection, $table, 'sales_channel_id', "BINARY(16) NOT NULL");
|
||||
$this->addColumnIfMissing($connection, $table, 'transaction_id', "INT(10) UNSIGNED NOT NULL");
|
||||
$this->addColumnIfMissing($connection, $table, 'order_version_id', "BINARY(16) NOT NULL AFTER `transaction_id`");
|
||||
|
||||
$this->addColumnIfMissing($connection, $table, 'created_at', "DATETIME(3) NOT NULL");
|
||||
$this->addColumnIfMissing($connection, $table, 'updated_at', "DATETIME(3) DEFAULT NULL");
|
||||
|
||||
$this->ensureIndexBySql($connection, $table, 'fk.vrp_transaction.order_id', "KEY `fk.vrp_transaction.order_id` (`order_id`)");
|
||||
$this->ensureIndexBySql($connection, $table, 'fk.vrp_transaction.order_transaction_id', "KEY `fk.vrp_transaction.order_transaction_id` (`order_transaction_id`)");
|
||||
$this->ensureIndexBySql($connection, $table, 'fk.vrp_transaction.payment_method_id', "KEY `fk.vrp_transaction.payment_method_id` (`payment_method_id`)");
|
||||
$this->ensureIndexBySql($connection, $table, 'fk.vrp_transaction.sales_channel_id', "KEY `fk.vrp_transaction.sales_channel_id` (`sales_channel_id`)");
|
||||
$this->ensureIndexBySql($connection, $table, 'fk.vrp_transaction', "KEY `fk.vrp_transaction` (`order_id`,`order_version_id`)");
|
||||
|
||||
$this->ensureForeignKey(
|
||||
$connection,
|
||||
$table,
|
||||
'fk.vrp_transaction_order_id',
|
||||
['order_id', 'order_version_id'],
|
||||
'order',
|
||||
['id', 'version_id'],
|
||||
'CASCADE',
|
||||
'CASCADE'
|
||||
);
|
||||
$this->ensureForeignKey(
|
||||
$connection,
|
||||
$table,
|
||||
'fk.vrp_transaction_payment_method_id',
|
||||
['payment_method_id'],
|
||||
'payment_method',
|
||||
['id'],
|
||||
'RESTRICT',
|
||||
'CASCADE'
|
||||
);
|
||||
$this->ensureForeignKey(
|
||||
$connection,
|
||||
$table,
|
||||
'fk.vrp_transaction_sales_channel_id',
|
||||
['sales_channel_id'],
|
||||
'sales_channel',
|
||||
['id'],
|
||||
'RESTRICT',
|
||||
'CASCADE'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Synchronizes the parts of the refund table related to transactions with the current/latest version.
|
||||
*
|
||||
* @param \Doctrine\DBAL\Connection $connection
|
||||
* @param string $table
|
||||
*/
|
||||
private function syncRefundTable(Connection $connection, string $table): void {
|
||||
$refundTable = 'vrpayment_refund';
|
||||
$this->ensureIndexBySql($connection, $refundTable, 'fk.vrp_refund.transaction_id', "KEY `fk.vrp_refund.transaction_id` (`transaction_id`)");
|
||||
$this->ensureForeignKey(
|
||||
$connection,
|
||||
$refundTable,
|
||||
'fk.vrp_refund.transaction_id',
|
||||
['transaction_id'],
|
||||
$table,
|
||||
['transaction_id'],
|
||||
'CASCADE',
|
||||
null
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds column to the table if it's missing.
|
||||
*
|
||||
* @param \Doctrine\DBAL\Connection $connection
|
||||
* @param string $table
|
||||
* @param string $column
|
||||
* @param string $sqlFragment
|
||||
*/
|
||||
private function addColumnIfMissing(Connection $connection, string $table, string $column, string $sqlFragment): void {
|
||||
if ($this->columnExists($connection, $table, $column)) {
|
||||
return;
|
||||
}
|
||||
$connection->executeStatement(
|
||||
sprintf("ALTER TABLE `%s` ADD COLUMN `%s` %s", $table, $column, $sqlFragment)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds index to the table if it's missing.
|
||||
*
|
||||
* @param \Doctrine\DBAL\Connection $connection
|
||||
* @param string $table
|
||||
* @param string $indexName
|
||||
* @param string $sqlFragment
|
||||
*/
|
||||
private function ensureIndexBySql(Connection $connection, string $table, string $indexName, string $sqlFragment): void {
|
||||
if ($this->indexExists($connection, $table, $indexName)) {
|
||||
return;
|
||||
}
|
||||
$connection->executeStatement(
|
||||
sprintf("ALTER TABLE `%s` ADD %s", $table, $sqlFragment)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds foreign key constraint to the table if it's missing.
|
||||
*
|
||||
* @param \Doctrine\DBAL\Connection $connection
|
||||
* @param string $table
|
||||
* @param string $constraintName
|
||||
* @param string $columns
|
||||
* @param string $refTable
|
||||
* @param string $refColumns
|
||||
* @param string|null $onDelete
|
||||
* @param string|null $onUpdate
|
||||
*/
|
||||
private function ensureForeignKey(
|
||||
Connection $connection,
|
||||
string $table,
|
||||
string $constraintName,
|
||||
array $columns,
|
||||
string $refTable,
|
||||
array $refColumns,
|
||||
?string $onDelete,
|
||||
?string $onUpdate
|
||||
): void {
|
||||
if ($this->foreignKeyExists($connection, $table, $constraintName)) {
|
||||
return;
|
||||
}
|
||||
$columnsList = '`' . implode('`,`', $columns) . '`';
|
||||
$refColumnsList = '`' . implode('`,`', $refColumns) . '`';
|
||||
$connection->executeStatement(
|
||||
sprintf(
|
||||
"ALTER TABLE `%s`
|
||||
ADD CONSTRAINT `%s` FOREIGN KEY (%s)
|
||||
REFERENCES `%s` (%s)%s%s",
|
||||
$table,
|
||||
$constraintName,
|
||||
$columnsList,
|
||||
$refTable,
|
||||
$refColumnsList,
|
||||
$onDelete ? " ON DELETE {$onDelete}" : "",
|
||||
$onUpdate ? " ON UPDATE {$onUpdate}" : ""
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if foreign key constraint exists.
|
||||
*
|
||||
* @param \Doctrine\DBAL\Connection $connection
|
||||
* @param string $table
|
||||
* @param string $constraintName
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
private function foreignKeyExists(Connection $connection, string $table, $constraintName): bool {
|
||||
$result = $connection->fetchOne(
|
||||
"SELECT 1 FROM information_schema.referential_constraints
|
||||
WHERE constraint_schema = DATABASE()
|
||||
AND table_name = ?
|
||||
AND constraint_name = ?
|
||||
LIMIT 1",
|
||||
[$table,$constraintName]
|
||||
);
|
||||
return $result !== false && $result !== null;
|
||||
}
|
||||
|
||||
/**
|
||||
* update destructive changes
|
||||
*
|
||||
* @param \Doctrine\DBAL\Connection $connection
|
||||
*/
|
||||
public function updateDestructive(Connection $connection): void
|
||||
{
|
||||
// implement update destructive
|
||||
}
|
||||
}
|
||||
Vendored
BIN
Binary file not shown.
+17
-2
@@ -70,9 +70,24 @@ Component.register('vrpayment-order-action-refund-by-amount', {
|
||||
});
|
||||
}).catch((errorResponse) => {
|
||||
try {
|
||||
var errorTitle = errorResponse?.response?.data?.errors?.[0]?.title ?? this.$tc('vrpayment-order.refundAction.refundCreateError.errorTitle')
|
||||
var errorMessage;
|
||||
switch(errorResponse.response.data) {
|
||||
case 'refundAmountZero':
|
||||
errorMessage = this.$tc('vrpayment-order.refundAction.refundCreateError.messageRefundAmountIsZero');
|
||||
break;
|
||||
case 'refundExceedsAmount':
|
||||
errorMessage = this.$tc('vrpayment-order.refundAction.refundCreateError.messageRefundAmountExceedsAvailableBalance');
|
||||
break;
|
||||
case 'methodDoesNotSupportRefund':
|
||||
errorMessage = this.$tc('vrpayment-order.refundAction.refundCreateError.messagePaymentMethodDoesNotSupportRefund');
|
||||
break;
|
||||
default:
|
||||
errorMessage = errorResponse.response.data.errors[0].detail;
|
||||
}
|
||||
this.createNotificationError({
|
||||
title: errorResponse.response.data.errors[0].title,
|
||||
message: errorResponse.response.data.errors[0].detail,
|
||||
title: errorTitle,
|
||||
message: errorMessage,
|
||||
autoClose: false
|
||||
});
|
||||
} catch (e) {
|
||||
|
||||
+11
-2
@@ -69,9 +69,18 @@ Component.register('vrpayment-order-action-refund-partial', {
|
||||
});
|
||||
}).catch((errorResponse) => {
|
||||
try {
|
||||
var errorTitle = errorResponse?.response?.data?.errors?.[0]?.title ?? this.$tc('vrpayment-order.refundAction.refundCreateError.errorTitle')
|
||||
var errorMessage;
|
||||
switch(errorResponse.response.data) {
|
||||
case 'methodDoesNotSupportRefund':
|
||||
errorMessage = this.$tc('vrpayment-order.refundAction.refundCreateError.messagePaymentMethodDoesNotSupportRefund');
|
||||
break;
|
||||
default:
|
||||
errorMessage = errorResponse.response.data.errors[0].detail;
|
||||
}
|
||||
this.createNotificationError({
|
||||
title: errorResponse.response.data.errors[0].title,
|
||||
message: errorResponse.response.data.errors[0].detail,
|
||||
title: errorTitle,
|
||||
message: errorMessage,
|
||||
autoClose: false
|
||||
});
|
||||
} catch (e) {
|
||||
|
||||
+11
-2
@@ -70,9 +70,18 @@ Component.register('vrpayment-order-action-refund-selected', {
|
||||
});
|
||||
}).catch((errorResponse) => {
|
||||
try {
|
||||
var errorTitle = errorResponse?.response?.data?.errors?.[0]?.title ?? this.$tc('vrpayment-order.refundAction.refundCreateError.errorTitle')
|
||||
var errorMessage;
|
||||
switch(errorResponse.response.data) {
|
||||
case 'methodDoesNotSupportRefund':
|
||||
errorMessage = this.$tc('vrpayment-order.refundAction.refundCreateError.messagePaymentMethodDoesNotSupportRefund');
|
||||
break;
|
||||
default:
|
||||
errorMessage = errorResponse.response.data.errors[0].detail;
|
||||
}
|
||||
this.createNotificationError({
|
||||
title: errorResponse.response.data.errors[0].title,
|
||||
message: errorResponse.response.data.errors[0].detail,
|
||||
title: errorTitle,
|
||||
message: errorMessage,
|
||||
autoClose: false
|
||||
});
|
||||
} catch (e) {
|
||||
|
||||
+1
@@ -9,6 +9,7 @@
|
||||
:max="this.$parent.$parent.itemRefundableQuantity"
|
||||
:min="0"
|
||||
v-model:value="refundQuantity"
|
||||
number-type="int"
|
||||
:label="$tc('vrpayment-order.refund.refundQuantity.label')">
|
||||
</sw-number-field>
|
||||
|
||||
|
||||
+17
-2
@@ -68,9 +68,24 @@ Component.register('vrpayment-order-action-refund', {
|
||||
});
|
||||
}).catch((errorResponse) => {
|
||||
try {
|
||||
var errorTitle = errorResponse?.response?.data?.errors?.[0]?.title ?? this.$tc('vrpayment-order.refundAction.refundCreateError.errorTitle')
|
||||
var errorMessage;
|
||||
switch(errorResponse.response.data) {
|
||||
case 'refundQuantityZero':
|
||||
errorMessage = this.$tc('vrpayment-order.refundAction.refundCreateError.messageRefundQuantityIsZero');
|
||||
break;
|
||||
case 'refundExceedsQuantity':
|
||||
errorMessage = this.$tc('vrpayment-order.refundAction.refundCreateError.messageRefundQuantityExceedsAvailableBalance');
|
||||
break;
|
||||
case 'methodDoesNotSupportRefund':
|
||||
errorMessage = this.$tc('vrpayment-order.refundAction.refundCreateError.messagePaymentMethodDoesNotSupportRefund');
|
||||
break;
|
||||
default:
|
||||
errorMessage = errorResponse.response.data.errors[0].detail;
|
||||
}
|
||||
this.createNotificationError({
|
||||
title: errorResponse.response.data.errors[0].title,
|
||||
message: errorResponse.response.data.errors[0].detail,
|
||||
title: errorTitle,
|
||||
message: errorMessage,
|
||||
autoClose: false
|
||||
});
|
||||
} catch (e) {
|
||||
|
||||
+1
-1
@@ -98,7 +98,7 @@
|
||||
<template #actions="{ item }">
|
||||
<sw-context-menu-item
|
||||
:disabled="transaction.state != 'FULFILL' || item.refundableQuantity != item.quantity || item.refundableAmount == 0 || item.itemRefundedAmount > 0 || item.itemRefundedQuantity > 0"
|
||||
@click="lineItemRefund(item.uniqueId)">
|
||||
@click="lineItemRefund(item.uniqueId, item.quantity)">
|
||||
{{ $tc('vrpayment-order.buttons.label.refund-whole-line-item') }}
|
||||
</sw-context-menu-item>
|
||||
|
||||
|
||||
+29
-11
@@ -332,12 +332,12 @@ Component.register('vrpayment-order-detail', {
|
||||
this.modalType = '';
|
||||
},
|
||||
|
||||
lineItemRefund(lineItemId) {
|
||||
lineItemRefund(lineItemId, itemQuantity) {
|
||||
this.isLoading = true;
|
||||
this.VRPaymentRefundService.createRefund(
|
||||
this.transactionData.transactions[0].metaData.salesChannelId,
|
||||
this.transactionData.transactions[0].id,
|
||||
0,
|
||||
itemQuantity,
|
||||
lineItemId
|
||||
).then(() => {
|
||||
this.createNotificationSuccess({
|
||||
@@ -351,9 +351,18 @@ Component.register('vrpayment-order-detail', {
|
||||
});
|
||||
}).catch((errorResponse) => {
|
||||
try {
|
||||
var errorTitle = errorResponse?.response?.data?.errors?.[0]?.title ?? this.$tc('vrpayment-order.refundAction.refundCreateError.errorTitle')
|
||||
var errorMessage;
|
||||
switch(errorResponse.response.data) {
|
||||
case 'methodDoesNotSupportRefund':
|
||||
errorMessage = this.$tc('vrpayment-order.refundAction.refundCreateError.messagePaymentMethodDoesNotSupportRefund');
|
||||
break;
|
||||
default:
|
||||
errorMessage = errorResponse.response.data.errors[0].detail;
|
||||
}
|
||||
this.createNotificationError({
|
||||
title: errorResponse.response.data.errors[0].title,
|
||||
message: errorResponse.response.data.errors[0].detail,
|
||||
title: errorTitle,
|
||||
message: errorMessage,
|
||||
autoClose: false
|
||||
});
|
||||
} catch (e) {
|
||||
@@ -385,7 +394,7 @@ Component.register('vrpayment-order-detail', {
|
||||
// Force the DOM to update before proceeding with the asynchronous operations
|
||||
this.$nextTick(() => {
|
||||
const refundPromises = this.selectedItems.map((item) => {
|
||||
return this.lineItemRefundBulk(item.uniqueId); // Simulated refund action with delay
|
||||
return this.lineItemRefundBulk(item.uniqueId, item.quantity); // Simulated refund action with delay
|
||||
});
|
||||
|
||||
// Wait for all refund promises to complete
|
||||
@@ -410,7 +419,7 @@ Component.register('vrpayment-order-detail', {
|
||||
});
|
||||
}
|
||||
},
|
||||
lineItemRefundBulk(lineItemId) {
|
||||
lineItemRefundBulk(lineItemId, itemQuantity) {
|
||||
return new Promise((resolve, reject) => {
|
||||
this.VRPaymentRefundService.createRefund(
|
||||
this.transactionData.transactions[0].metaData.salesChannelId,
|
||||
@@ -427,11 +436,20 @@ Component.register('vrpayment-order-detail', {
|
||||
})
|
||||
.catch((errorResponse) => {
|
||||
try {
|
||||
this.createNotificationError({
|
||||
title: errorResponse.response.data.errors[0].title,
|
||||
message: errorResponse.response.data.errors[0].detail,
|
||||
autoClose: false
|
||||
});
|
||||
var errorTitle = errorResponse?.response?.data?.errors?.[0]?.title ?? this.$tc('vrpayment-order.refundAction.refundCreateError.errorTitle')
|
||||
var errorMessage;
|
||||
switch(errorResponse.response.data) {
|
||||
case 'methodDoesNotSupportRefund':
|
||||
errorMessage = this.$tc('vrpayment-order.refundAction.refundCreateError.messagePaymentMethodDoesNotSupportRefund');
|
||||
break;
|
||||
default:
|
||||
errorMessage = errorResponse.response.data.errors[0].detail;
|
||||
}
|
||||
this.createNotificationError({
|
||||
title: errorTitle,
|
||||
message: errorMessage,
|
||||
autoClose: false
|
||||
});
|
||||
} catch (e) {
|
||||
this.createNotificationError({
|
||||
title: errorResponse.title,
|
||||
|
||||
@@ -77,7 +77,15 @@
|
||||
"successMessage": "Ihre Rückerstattung war erfolgreich",
|
||||
"successTitle": "Erfolg",
|
||||
"maxAvailableItemsToRefund": "Maximal Verfügbare Artikel zum Erstatten",
|
||||
"maxAvailableAmountToRefund": "Maximal verfügbarer Erstattungsbetrag"
|
||||
"maxAvailableAmountToRefund": "Maximal verfügbarer Erstattungsbetrag",
|
||||
"refundCreateError": {
|
||||
"errorTitle": "Fehler beim Erstellen der Rückerstattung.",
|
||||
"messageRefundAmountExceedsAvailableBalance": "Der Rückerstattungsbetrag übersteigt das verfügbare Guthaben.",
|
||||
"messageRefundAmountIsZero": "Der Rückerstattungsbetrag muss größer als 0 sein.",
|
||||
"messageRefundQuantityExceedsAvailableBalance": "Rückerstattung nach Menge überschreitet die maximal verfügbare Anzahl an Artikeln zur Rückerstattung.",
|
||||
"messageRefundQuantityIsZero": "Rückerstattung nach Menge muss größer als 0 sein.",
|
||||
"messagePaymentMethodDoesNotSupportRefund": "Die Zahlungsmethode unterstützt keine Online-Rückerstattungen."
|
||||
}
|
||||
},
|
||||
"transactionHistory": {
|
||||
"cardTitle": "Einzelheiten",
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
"void": "Cancel authorization",
|
||||
"refund-whole-line-item": "Refund whole line item",
|
||||
"refund-line-item-by-quantity": "Refund by quantity",
|
||||
"refund-line-item-selected": "Rembourser sélectionnés",
|
||||
"refund-line-item-selected": "Refund selected",
|
||||
"refund-line-item-parial": "Partial refund"
|
||||
}
|
||||
@@ -78,7 +77,15 @@
|
||||
"successMessage": "Your refund was successful.",
|
||||
"successTitle": "Success",
|
||||
"maxAvailableItemsToRefund": "Maximum available items to refund",
|
||||
"maxAvailableAmountToRefund": "Maximum available amount to refund"
|
||||
"maxAvailableAmountToRefund": "Maximum available amount to refund",
|
||||
"refundCreateError": {
|
||||
"errorTitle": "Error while creating the refund.",
|
||||
"messageRefundAmountExceedsAvailableBalance": "Refund amount exceeds available balance.",
|
||||
"messageRefundAmountIsZero": "Refund amount must be greater than 0.",
|
||||
"messageRefundQuantityExceedsAvailableBalance": "Refund by quantity exceeds maximum available items to refund.",
|
||||
"messageRefundQuantityIsZero": "Refund by quantity must be greater than 0.",
|
||||
"messagePaymentMethodDoesNotSupportRefund": "Payment method does not support online refunds."
|
||||
}
|
||||
},
|
||||
"transactionHistory": {
|
||||
"cardTitle": "Details",
|
||||
|
||||
@@ -77,7 +77,15 @@
|
||||
"successMessage": "Votre remboursement a été effectué avec succès.",
|
||||
"successTitle": "Succès",
|
||||
"maxAvailableItemsToRefund": "Nombre maximum d'articles disponibles pour le remboursement",
|
||||
"maxAvailableAmountToRefund": "Montant maximal disponible pour le remboursement"
|
||||
"maxAvailableAmountToRefund": "Montant maximal disponible pour le remboursement",
|
||||
"refundCreateError": {
|
||||
"errorTitle": "Erreur lors de la création du remboursement.",
|
||||
"messageRefundAmountExceedsAvailableBalance": "Le montant du remboursement dépasse le solde disponible.",
|
||||
"messageRefundAmountIsZero": "Le montant du remboursement doit être supérieur à 0.",
|
||||
"messageRefundQuantityExceedsAvailableBalance": "Le remboursement par quantité dépasse le nombre maximal d’articles remboursables.",
|
||||
"messageRefundQuantityIsZero": "Le remboursement par quantité doit être supérieur à 0.",
|
||||
"messagePaymentMethodDoesNotSupportRefund": "Le mode de paiement ne prend pas en charge les remboursements en ligne."
|
||||
}
|
||||
},
|
||||
"transactionHistory": {
|
||||
"cardTitle": "Détails",
|
||||
|
||||
@@ -77,7 +77,15 @@
|
||||
"successMessage": "Il tuo rimborso è andato a buon fine.",
|
||||
"successTitle": "Successo",
|
||||
"maxAvailableItemsToRefund": "Numero massimo di articoli disponibili da rimborsare",
|
||||
"maxAvailableAmountToRefund": "Importo massimo disponibile per il rimborso"
|
||||
"maxAvailableAmountToRefund": "Importo massimo disponibile per il rimborso",
|
||||
"refundCreateError": {
|
||||
"errorTitle": "Errore durante la creazione del rimborso.",
|
||||
"messageRefundAmountExceedsAvailableBalance": "LL'importo del rimborso supera il saldo disponibile.",
|
||||
"messageRefundAmountIsZero": "L'importo del rimborso deve essere superiore a 0.",
|
||||
"messageRefundQuantityExceedsAvailableBalance": "Il rimborso per quantità supera il numero massimo di articoli rimborsabili.",
|
||||
"messageRefundQuantityIsZero": "Il rimborso per quantità deve essere maggiore di 0.",
|
||||
"messagePaymentMethodDoesNotSupportRefund": "Il metodo di pagamento non supporta i rimborsi online."
|
||||
}
|
||||
},
|
||||
"transactionHistory": {
|
||||
"cardTitle": "Dettagli",
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
<service id="VRPaymentPayment\Core\Api\Refund\Controller\RefundController" public="true">
|
||||
<argument type="service" id="VRPaymentPayment\Core\Api\Refund\Service\RefundService"/>
|
||||
<argument type="service" id="VRPaymentPayment\Core\Settings\Service\SettingsService"/>
|
||||
<argument type="service" id="VRPaymentPayment\Core\Api\Transaction\Service\TransactionService"/>
|
||||
<call method="setLogger">
|
||||
<argument type="service" id="monolog.logger.vrpayment_payment"/>
|
||||
</call>
|
||||
|
||||
Vendored
BIN
Binary file not shown.
BIN
Binary file not shown.
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user