diff --git a/.github/workflows/ci_pipe.yml b/.github/workflows/ci_pipe.yml index ea1a3636b..a12892442 100644 --- a/.github/workflows/ci_pipe.yml +++ b/.github/workflows/ci_pipe.yml @@ -340,7 +340,7 @@ jobs: fail-fast: false matrix: include: - - shopware: '6.6.0.0' + - shopware: '6.6.0.1' php: '8.2' - shopware: '6.5.8.7' php: '8.2' diff --git a/.github/workflows/nightly_pipe.yml b/.github/workflows/nightly_pipe.yml index e063ae83b..cf07efcd4 100644 --- a/.github/workflows/nightly_pipe.yml +++ b/.github/workflows/nightly_pipe.yml @@ -334,7 +334,7 @@ jobs: fail-fast: false matrix: include: - - shopware: '6.6.0.0' + - shopware: '6.6.0.1' php: '8.2' - shopware: '6.5.8.7' php: '8.2' diff --git a/.github/workflows/pr_pipe.yml b/.github/workflows/pr_pipe.yml index 30380d8aa..a0a18e34d 100644 --- a/.github/workflows/pr_pipe.yml +++ b/.github/workflows/pr_pipe.yml @@ -333,7 +333,7 @@ jobs: fail-fast: false matrix: include: - - shopware: '6.6.0.0' + - shopware: '6.6.0.1' php: '8.2' - shopware: '6.5.8.7' php: '8.2' diff --git a/composer.lock b/composer.lock index 7f834bfea..01cb399f7 100644 --- a/composer.lock +++ b/composer.lock @@ -63,16 +63,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.301.6", + "version": "3.301.9", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "18c0ebd71d3071304f1ea02aa9af75f95863177a" + "reference": "23eda9eeb6c44a3ed6a12951b61020dc6048f7f5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/18c0ebd71d3071304f1ea02aa9af75f95863177a", - "reference": "18c0ebd71d3071304f1ea02aa9af75f95863177a", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/23eda9eeb6c44a3ed6a12951b61020dc6048f7f5", + "reference": "23eda9eeb6c44a3ed6a12951b61020dc6048f7f5", "shasum": "" }, "require": { @@ -152,9 +152,9 @@ "support": { "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.301.6" + "source": "https://github.com/aws/aws-sdk-php/tree/3.301.9" }, - "time": "2024-03-22T18:05:21+00:00" + "time": "2024-03-27T18:26:04+00:00" }, { "name": "boxblinkracer/phpunuhi", @@ -5751,16 +5751,16 @@ }, { "name": "php-http/discovery", - "version": "1.19.2", + "version": "1.19.3", "source": { "type": "git", "url": "https://github.com/php-http/discovery.git", - "reference": "61e1a1eb69c92741f5896d9e05fb8e9d7e8bb0cb" + "reference": "7fbed2f92518827eb0ece6bf869f8c6b054d5730" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/discovery/zipball/61e1a1eb69c92741f5896d9e05fb8e9d7e8bb0cb", - "reference": "61e1a1eb69c92741f5896d9e05fb8e9d7e8bb0cb", + "url": "https://api.github.com/repos/php-http/discovery/zipball/7fbed2f92518827eb0ece6bf869f8c6b054d5730", + "reference": "7fbed2f92518827eb0ece6bf869f8c6b054d5730", "shasum": "" }, "require": { @@ -5769,6 +5769,7 @@ }, "conflict": { "nyholm/psr7": "<1.0", + "sebastian/comparator": ">=5.0", "zendframework/zend-diactoros": "*" }, "provide": { @@ -5784,7 +5785,7 @@ "php-http/httplug": "^1.0 || ^2.0", "php-http/message-factory": "^1.0", "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", - "symfony/phpunit-bridge": "^6.2" + "symfony/phpunit-bridge": "^6.4.4 || ^7.0.1" }, "type": "composer-plugin", "extra": { @@ -5823,9 +5824,9 @@ ], "support": { "issues": "https://github.com/php-http/discovery/issues", - "source": "https://github.com/php-http/discovery/tree/1.19.2" + "source": "https://github.com/php-http/discovery/tree/1.19.3" }, - "time": "2023-11-30T16:49:05+00:00" + "time": "2024-03-28T07:38:36+00:00" }, { "name": "php-http/multipart-stream-builder", diff --git a/polyfill/Shopware/Core/Checkout/Payment/Exception/PaymentProcessException.php b/polyfill/Shopware/Core/Checkout/Payment/Exception/PaymentProcessException.php new file mode 100644 index 000000000..42b8aff71 --- /dev/null +++ b/polyfill/Shopware/Core/Checkout/Payment/Exception/PaymentProcessException.php @@ -0,0 +1,36 @@ +orderTransactionId = $orderTransactionId; + + parent::__construct($message, $parameters, $e); + } + + public function getStatusCode(): int + { + return Response::HTTP_BAD_REQUEST; + } + + public function getOrderTransactionId(): string + { + return $this->orderTransactionId; + } +} diff --git a/src/Components/Subscription/DAL/Currency/CurrencyExtension.php b/src/Components/Subscription/DAL/Currency/CurrencyExtension.php new file mode 100644 index 000000000..889219c04 --- /dev/null +++ b/src/Components/Subscription/DAL/Currency/CurrencyExtension.php @@ -0,0 +1,24 @@ +add((new OneToManyAssociationField('subscriptions', SubscriptionDefinition::class, 'currency_id'))->addFlags(new CascadeDelete())); + } +} diff --git a/src/Components/Subscription/DAL/Repository/SubscriptionRepository.php b/src/Components/Subscription/DAL/Repository/SubscriptionRepository.php index d233a3615..e8ad06a4d 100644 --- a/src/Components/Subscription/DAL/Repository/SubscriptionRepository.php +++ b/src/Components/Subscription/DAL/Repository/SubscriptionRepository.php @@ -11,6 +11,7 @@ use Kiener\MolliePayments\Components\Subscription\Exception\SubscriptionNotFoundException; use Shopware\Core\Framework\Context; use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository; +use Shopware\Core\Framework\DataAbstractionLayer\Pricing\CashRoundingConfig; use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria; use Shopware\Core\Framework\DataAbstractionLayer\Search\EntitySearchResult; use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter; @@ -61,6 +62,7 @@ public function findById(string $id, Context $context): SubscriptionEntity $criteria = new Criteria([$id]); $criteria->addAssociation('customer'); $criteria->addAssociation('historyEntries'); + $criteria->addAssociation('currency'); $result = $this->repoSubscriptions->search($criteria, $context); @@ -80,6 +82,7 @@ public function findById(string $id, Context $context): SubscriptionEntity public function findByMandateId(string $customerId, string $mandateId, Context $context): SubscriptionCollection { $criteria = new Criteria(); + $criteria->addAssociation('currency'); $criteria->addFilter(new EqualsFilter('customerId', $customerId)); $criteria->addFilter(new EqualsFilter('mandateId', $mandateId)); @@ -111,6 +114,7 @@ public function findByCustomer(string $swCustomerId, bool $includedPending, Cont $criteria = new Criteria(); $criteria->addAssociation('customer'); $criteria->addAssociation('historyEntries'); + $criteria->addAssociation('currency'); $criteria->addFilter(new EqualsFilter('customerId', $swCustomerId)); if (!$includedPending) { @@ -137,7 +141,7 @@ public function findByReminderRangeReached(string $salesChannelId, Context $cont $criteria = new Criteria(); $criteria->addAssociation('customer'); - + $criteria->addAssociation('currency'); # subscription is not canceled $criteria->addFilter(new EqualsFilter('canceledAt', null)); $criteria->addFilter(new EqualsFilter('salesChannelId', $salesChannelId)); @@ -157,6 +161,7 @@ public function findPendingSubscriptions(string $orderId, Context $context): Ent { $criteria = new Criteria(); $criteria->addAssociation('customer'); + $criteria->addAssociation('currency'); $criteria->addFilter(new EqualsFilter('orderId', $orderId)); $criteria->addFilter(new EqualsFilter('mollieId', null)); @@ -185,6 +190,18 @@ public function search(Criteria $criteria, Context $context): EntitySearchResult */ public function insertSubscription(SubscriptionEntity $subscription, string $status, Context $context): void { + $totalRoundingValue = null; + $totalRounding = $subscription->getTotalRounding(); + if ($totalRounding instanceof CashRoundingConfig) { + $totalRoundingValue = $totalRounding->jsonSerialize(); + } + + $itemRoundingValue = null; + $itemRounding = $subscription->getItemRounding(); + if ($itemRounding instanceof CashRoundingConfig) { + $itemRoundingValue = $itemRounding->jsonSerialize(); + } + $this->repoSubscriptions->create( [ [ @@ -204,11 +221,13 @@ public function insertSubscription(SubscriptionEntity $subscription, string $sta 'description' => $subscription->getDescription(), 'amount' => $subscription->getAmount(), 'quantity' => $subscription->getQuantity(), - 'currency' => $subscription->getCurrency(), + 'currencyId' => $subscription->getCurrencyId(), 'metadata' => $subscription->getMetadata()->toArray(), 'productId' => $subscription->getProductId(), 'orderId' => $subscription->getOrderId(), 'salesChannelId' => $subscription->getSalesChannelId(), + 'totalRounding' => $totalRoundingValue, + 'itemRounding' => $itemRoundingValue, ] ], $context diff --git a/src/Components/Subscription/DAL/Subscription/SubscriptionDefinition.php b/src/Components/Subscription/DAL/Subscription/SubscriptionDefinition.php index af111697a..981c1f921 100755 --- a/src/Components/Subscription/DAL/Subscription/SubscriptionDefinition.php +++ b/src/Components/Subscription/DAL/Subscription/SubscriptionDefinition.php @@ -8,6 +8,7 @@ use Shopware\Core\Checkout\Order\OrderDefinition; use Shopware\Core\Content\Product\ProductDefinition; use Shopware\Core\Framework\DataAbstractionLayer\EntityDefinition; +use Shopware\Core\Framework\DataAbstractionLayer\Field\CashRoundingConfigField; use Shopware\Core\Framework\DataAbstractionLayer\Field\CreatedAtField; use Shopware\Core\Framework\DataAbstractionLayer\Field\DateTimeField; use Shopware\Core\Framework\DataAbstractionLayer\Field\FkField; @@ -25,6 +26,7 @@ use Shopware\Core\Framework\DataAbstractionLayer\Field\StringField; use Shopware\Core\Framework\DataAbstractionLayer\Field\UpdatedAtField; use Shopware\Core\Framework\DataAbstractionLayer\FieldCollection; +use Shopware\Core\System\Currency\CurrencyDefinition; use Shopware\Core\System\SalesChannel\SalesChannelDefinition; class SubscriptionDefinition extends EntityDefinition @@ -72,7 +74,7 @@ protected function defineFields(): FieldCollection (new StringField('description', 'description'))->addFlags(new ApiAware()), (new FloatField('amount', 'amount'))->addFlags(new ApiAware()), (new IntField('quantity', 'quantity'))->addFlags(new ApiAware()), - (new StringField('currency', 'currency'))->addFlags(new ApiAware()), + (new FkField('currency_id', 'currencyId', CurrencyDefinition::class))->addFlags(new ApiAware(), new Required()), (new JsonField('metadata', 'metadata')), # -------------------------------------------------------------------------------------------------------------------------- @@ -94,7 +96,7 @@ protected function defineFields(): FieldCollection (new FkField('billing_address_id', 'billingAddressId', SalesChannelDefinition::class))->addFlags(new ApiAware()), (new FkField('shipping_address_id', 'shippingAddressId', SalesChannelDefinition::class))->addFlags(new ApiAware()), - + (new FkField('currency_id', 'currencyId', CurrencyDefinition::class))->addFlags(new ApiAware()), new CreatedAtField(), new UpdatedAtField(), @@ -106,13 +108,15 @@ protected function defineFields(): FieldCollection # -------------------------------------------------------------------------------------------------------------------------- new ManyToOneAssociationField('customer', 'customer_id', CustomerDefinition::class, 'id', false), - + new ManyToOneAssociationField('currency', 'currency_id', CurrencyDefinition::class, 'id', false), new OneToManyAssociationField('addresses', SubscriptionAddressDefinition::class, 'subscription_id'), new OneToManyAssociationField('historyEntries', SubscriptionHistoryDefinition::class, 'subscription_id'), new OneToOneAssociationField('billingAddress', 'billing_address_id', 'id', SubscriptionAddressDefinition::class, true), new OneToOneAssociationField('shippingAddress', 'shipping_address_id', 'id', SubscriptionAddressDefinition::class, true), + (new CashRoundingConfigField('total_rounding', 'totalRounding'))->addFlags(new Required()), + (new CashRoundingConfigField('item_rounding', 'itemRounding'))->addFlags(new Required()), ]); } } diff --git a/src/Components/Subscription/DAL/Subscription/SubscriptionEntity.php b/src/Components/Subscription/DAL/Subscription/SubscriptionEntity.php index dfae15c2a..ac739b570 100644 --- a/src/Components/Subscription/DAL/Subscription/SubscriptionEntity.php +++ b/src/Components/Subscription/DAL/Subscription/SubscriptionEntity.php @@ -11,6 +11,8 @@ use Shopware\Core\Checkout\Customer\CustomerEntity; use Shopware\Core\Framework\DataAbstractionLayer\Entity; use Shopware\Core\Framework\DataAbstractionLayer\EntityIdTrait; +use Shopware\Core\Framework\DataAbstractionLayer\Pricing\CashRoundingConfig; +use Shopware\Core\System\Currency\CurrencyEntity; class SubscriptionEntity extends Entity { @@ -58,7 +60,7 @@ class SubscriptionEntity extends Entity protected $quantity; /** - * @var string + * @var ?CurrencyEntity */ protected $currency; @@ -143,6 +145,20 @@ class SubscriptionEntity extends Entity */ protected $historyEntries; + /** + * @var string + */ + protected $currencyId; + + /** + * @var ?CashRoundingConfig + */ + protected $totalRounding; + + /** + * @var ?CashRoundingConfig + */ + protected $itemRounding; # -------------------------------------------------------------------------------- /** @@ -277,17 +293,17 @@ public function setQuantity(int $quantity): void } /** - * @return string + * @return ?CurrencyEntity */ - public function getCurrency(): string + public function getCurrency(): ?CurrencyEntity { - return (string)$this->currency; + return $this->currency; } /** - * @param string $currency + * @param CurrencyEntity $currency */ - public function setCurrency(string $currency): void + public function setCurrency(CurrencyEntity $currency): void { $this->currency = $currency; } @@ -669,4 +685,35 @@ public function setHistoryEntries(SubscriptionHistoryCollection $historyEntries) { $this->historyEntries = $historyEntries; } + + public function setCurrencyId(string $currencyId):void + { + $this->currencyId = $currencyId; + } + + public function getCurrencyId(): ?string + { + return $this->currencyId; + } + + + public function setTotalRounding(?CashRoundingConfig $totalRounding): void + { + $this->totalRounding = $totalRounding; + } + + public function getTotalRounding(): ?CashRoundingConfig + { + return $this->totalRounding; + } + + public function getItemRounding(): ?CashRoundingConfig + { + return $this->itemRounding; + } + + public function setItemRounding(?CashRoundingConfig $itemRounding): void + { + $this->itemRounding = $itemRounding; + } } diff --git a/src/Components/Subscription/Services/Builder/MollieDataBuilder.php b/src/Components/Subscription/Services/Builder/MollieDataBuilder.php index 5989d793b..1fbcd911e 100755 --- a/src/Components/Subscription/Services/Builder/MollieDataBuilder.php +++ b/src/Components/Subscription/Services/Builder/MollieDataBuilder.php @@ -35,10 +35,15 @@ public function buildRequestPayload(SubscriptionEntity $subscription, string $st { $intervalValue = $interval . ' ' . $intervalUnit; $timesValue = ($times > 0) ? $times : null; + $currency = $subscription->getCurrency(); + $currencyIso = ''; + if ($currency !== null) { + $currencyIso = $currency->getIsoCode(); + } return [ 'amount' => [ - 'currency' => $subscription->getCurrency(), + 'currency' => $currencyIso, 'value' => number_format($subscription->getAmount(), 2, '.', '') ], 'description' => $subscription->getDescription(), diff --git a/src/Components/Subscription/Services/Builder/SubscriptionBuilder.php b/src/Components/Subscription/Services/Builder/SubscriptionBuilder.php index c253d8c21..6c957fbce 100755 --- a/src/Components/Subscription/Services/Builder/SubscriptionBuilder.php +++ b/src/Components/Subscription/Services/Builder/SubscriptionBuilder.php @@ -91,7 +91,10 @@ private function buildItemSubscription(OrderLineItemEntity $lineItem, OrderEntit # as promotions. because we only offer subscriptions as a 1-item order without mixed carts, # this is the perfect way to still have shopware doing every calculation. $subscriptionEntity->setAmount($order->getAmountTotal()); - $subscriptionEntity->setCurrency($order->getCurrency()->getIsoCode()); + $subscriptionEntity->setCurrencyId($order->getCurrency()->getId()); + $subscriptionEntity->setTotalRounding($order->getTotalRounding()); + + $subscriptionEntity->setCurrency($order->getCurrency()); $subscriptionEntity->setQuantity($lineItem->getQuantity()); @@ -99,7 +102,8 @@ private function buildItemSubscription(OrderLineItemEntity $lineItem, OrderEntit $subscriptionEntity->setProductId((string)$lineItem->getProductId()); $subscriptionEntity->setOrderId($order->getId()); $subscriptionEntity->setSalesChannelId($order->getSalesChannelId()); - + $subscriptionEntity->setTotalRounding($order->getTotalRounding()); + $subscriptionEntity->setItemRounding($order->getItemRounding()); # calculate our first start date. # this is our current date (now) + 1x the planned interval. diff --git a/src/Components/Subscription/Services/Installer/MailTemplateInstaller.php b/src/Components/Subscription/Services/Installer/MailTemplateInstaller.php index 613895408..7e4ae45ca 100644 --- a/src/Components/Subscription/Services/Installer/MailTemplateInstaller.php +++ b/src/Components/Subscription/Services/Installer/MailTemplateInstaller.php @@ -14,6 +14,7 @@ use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria; use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter; use Shopware\Core\Framework\Uuid\Uuid; +use Shopware\Core\System\Currency\CurrencyEntity; use Shopware\Core\System\SalesChannel\SalesChannelEntity; class MailTemplateInstaller @@ -77,11 +78,14 @@ public function install(Context $context): void # ---------------------------------------------------------------------------------------------- # update our sample data for the admin mail preview + $currencyEntity = new CurrencyEntity(); + $currencyEntity->setIsoCode('EUR'); + $subscription = new SubscriptionEntity(); $subscription->setDescription('1x Sample Product (Order #1233, 24.99 EUR)'); $subscription->setQuantity(1); $subscription->setAmount(24.99); - $subscription->setCurrency('EUR'); + $subscription->setCurrency($currencyEntity); $subscription->setMollieCustomerId('cst_123456'); $subscription->setMollieId('sub_123456'); $subscription->setNextPaymentAt(new \DateTime()); diff --git a/src/Migration/Migration1711618833SubscriptionCurrency.php b/src/Migration/Migration1711618833SubscriptionCurrency.php new file mode 100644 index 000000000..338d44e30 --- /dev/null +++ b/src/Migration/Migration1711618833SubscriptionCurrency.php @@ -0,0 +1,76 @@ +executeStatement($sql); + + //add foreign key + $sql = "ALTER TABLE `mollie_subscription` ADD CONSTRAINT `fk.mollie_subscription.currency_id` FOREIGN KEY (`currency_id`) REFERENCES `currency` (`id`) ON DELETE SET NULL ON UPDATE CASCADE"; + $connection->executeStatement($sql); + + //load used currencies + $sql = "SELECT DISTINCT `currency` FROM `mollie_subscription`"; + $statement = $connection->executeQuery($sql); + $currencies = array_keys($statement->fetchAllAssociativeIndexed()); + + //get the data for each currency + $sql = "SELECT HEX(`id`) as `id`,`iso_code`,`item_rounding`,`total_rounding` FROM `currency` WHERE `iso_code` IN(:currencies)"; + $statement = $connection->executeQuery($sql, [ + 'currencies' => $currencies + ], [ + 'currencies' => Connection::PARAM_STR_ARRAY + ]); + + + //update currency information + $sql = "UPDATE `mollie_subscription` SET `currency_id` = :currencyId, `item_rounding` = :itemRounding,`total_rounding` =:totalRounding WHERE `currency` = :currencyIso"; + + $updateStatement = $connection->prepare($sql); + + while ($row = $statement->fetchAssociative()) { + $updateStatement->executeStatement([ + 'currencyId' => Uuid::fromHexToBytes($row['id']), + 'itemRounding' => $row['item_rounding'], + 'totalRounding' => $row['total_rounding'], + 'currencyIso' => $row['iso_code'] + ]); + } + + //delete unsused column + $sql = "ALTER TABLE `mollie_subscription` DROP COLUMN `currency`"; + $connection->executeStatement($sql); + } + + /** + * @param Connection $connection + * @return void + */ + public function updateDestructive(Connection $connection): void + { + // implement update destructive + } +} diff --git a/src/Resources/app/administration/src/module/mollie-payments/page/mollie-subscriptions-detail/index.js b/src/Resources/app/administration/src/module/mollie-payments/page/mollie-subscriptions-detail/index.js index 5e431bedc..89ca7c41a 100644 --- a/src/Resources/app/administration/src/module/mollie-payments/page/mollie-subscriptions-detail/index.js +++ b/src/Resources/app/administration/src/module/mollie-payments/page/mollie-subscriptions-detail/index.js @@ -3,7 +3,7 @@ import './mollie-subscriptions-detail.scss'; import SubscriptionService from '../../../../core/service/subscription/subscription.service'; // eslint-disable-next-line no-undef -const {Component, Mixin, Application, ApiService} = Shopware; +const {Component, Mixin, Application, ApiService, Filter} = Shopware; // eslint-disable-next-line no-undef const {Criteria} = Shopware.Data; @@ -124,6 +124,10 @@ Component.register('mollie-subscriptions-detail', { return this.$tc('mollie-payments.subscriptions.detail.history.cardTitle') + ' (' + this.history.length + ')'; }, + + dateFilter() { + return Filter.getByName('date'); + }, }, created() { @@ -150,6 +154,7 @@ Component.register('mollie-subscriptions-detail', { criteria.addAssociation('addresses'); criteria.addAssociation('historyEntries'); criteria.addAssociation('customer'); + criteria.addAssociation('currency'); // eslint-disable-next-line no-undef this.repoSubscriptions.search(criteria, Shopware.Context.api).then((result) => { diff --git a/src/Resources/app/administration/src/module/mollie-payments/page/mollie-subscriptions-detail/mollie-subscriptions-detail.html.twig b/src/Resources/app/administration/src/module/mollie-payments/page/mollie-subscriptions-detail/mollie-subscriptions-detail.html.twig index e2866ae31..32840cee4 100644 --- a/src/Resources/app/administration/src/module/mollie-payments/page/mollie-subscriptions-detail/mollie-subscriptions-detail.html.twig +++ b/src/Resources/app/administration/src/module/mollie-payments/page/mollie-subscriptions-detail/mollie-subscriptions-detail.html.twig @@ -103,7 +103,7 @@ {% endblock %} {% block sw_order_detail_card_basic_field_mollie_customer_id %} - @@ -112,6 +112,7 @@ {% block sw_order_detail_card_basic_field_created_at %} @@ -137,12 +138,14 @@ {% block sw_order_detail_card_status_field_status %} {% endblock %} {% block sw_order_detail_card_status_field_canceled_at %} {% endblock %} @@ -151,12 +154,14 @@ {% block sw_order_detail_card_status_field_mollie_id %} {% endblock %} {% block sw_order_detail_card_status_field_mandate_id %} {% endblock %} @@ -164,14 +169,16 @@ {% block sw_order_detail_card_status_field_next_payment_at %} {% endblock %} {% block sw_order_detail_card_status_field_reminded_at %} {% endblock %} @@ -216,7 +223,7 @@ :allowInlineEdit="false">