Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions Controller/Adminhtml/Subscriptions/Cancel.php
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,11 @@ public function execute()
$api = $this->mollieSubscriptionApi->loadByStore($this->getRequest()->getParam('store_id'));
$customerId = $this->getRequest()->getParam('customer_id');
$subscriptionId = $this->getRequest()->getParam('subscription_id');
$canceled = false;

try {
$api->subscriptions->cancelForId($customerId, $subscriptionId);
$canceled = true;
$model = $this->subscriptionToProductRepository->getBySubscriptionId($subscriptionId);
$this->eventManager->dispatch('mollie_subscription_after_cancelled', ['subscription' => $model]);
} catch (\Exception $exception) {
Expand All @@ -69,8 +71,10 @@ public function execute()

return $this->_redirect('*/*/');
} finally {
$this->subscriptionToProductRepository->deleteBySubscriptionId($customerId, $subscriptionId);
$this->eventManager->dispatch('mollie_subscription_cancelled', ['subscription_id' => $subscriptionId]);
if ($canceled) {
$this->subscriptionToProductRepository->deleteBySubscriptionId($customerId, $subscriptionId);
$this->eventManager->dispatch('mollie_subscription_cancelled', ['subscription_id' => $subscriptionId]);
}
}

$this->messageManager->addSuccessMessage(
Expand Down
6 changes: 5 additions & 1 deletion Controller/Index/Cancel.php
Original file line number Diff line number Diff line change
Expand Up @@ -95,13 +95,15 @@ public function execute()
{
$customer = $this->currentCustomer->getCustomer();
$extensionAttributes = $customer->getExtensionAttributes();
$canceled = false;

$api = $this->mollieSubscriptionApi->loadByStore($customer->getStoreId());
$subscriptionId = $this->getRequest()->getParam('subscription_id');

try {
$model = $this->subscriptionToProductRepository->getBySubscriptionId($subscriptionId);
$api->subscriptions->cancelForId($extensionAttributes->getMollieCustomerId(), $subscriptionId);
$canceled = true;

$this->sendAdminCancelNotificationEmail->execute($model);
$this->sendCustomerCancelNotificationEmail->execute($model);
Expand All @@ -116,7 +118,9 @@ public function execute()

return $this->_redirect('*/*/');
} finally {
$this->deleteSubscriptionReference($extensionAttributes->getMollieCustomerId(), $subscriptionId);
if ($canceled) {
$this->deleteSubscriptionReference($extensionAttributes->getMollieCustomerId(), $subscriptionId);
}
}

$this->messageManager->addSuccessMessage(
Expand Down
36 changes: 36 additions & 0 deletions Model/Carrier/SubscriptionShipping.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?php
/*
* Copyright Magmodules.eu. All rights reserved.
* See COPYING.txt for license details.
*/

declare(strict_types=1);

namespace Mollie\Subscriptions\Model\Carrier;

use Magento\Quote\Model\Quote\Address\RateRequest;
use Magento\Shipping\Model\Carrier\AbstractCarrier;
use Magento\Shipping\Model\Carrier\CarrierInterface;

class SubscriptionShipping extends AbstractCarrier implements CarrierInterface
{
public const CARRIER_CODE = 'mollie_subscriptions';

protected $_code = self::CARRIER_CODE;

protected $_isFixed = true;

/**
* This carrier is not available during checkout. It is only used as a fallback
* when no other shipping methods produce rates for subscription orders.
*/
public function collectRates(RateRequest $request)
{
return false;
}

public function getAllowedMethods(): array
{
return ['fallback_shipping' => $this->getConfigData('name') ?: 'Mollie Subscriptions Fallback Shipping'];
}
}
37 changes: 36 additions & 1 deletion Service/Magento/CreateOrderFromSubscription.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
use Magento\Quote\Api\Data\AddressInterface;
use Magento\Quote\Api\Data\AddressInterfaceFactory;
use Magento\Quote\Api\Data\CartInterface;
use Magento\Quote\Model\Quote\Address as QuoteAddress;
use Magento\Quote\Model\Quote\Address\RateFactory;
use Magento\Sales\Api\Data\OrderAddressInterface;
use Magento\Sales\Api\Data\OrderInterface;
use Magento\Sales\Api\OrderAddressRepositoryInterface;
Expand All @@ -29,6 +31,7 @@
use Mollie\Payment\Api\MollieCustomerRepositoryInterface;
use Mollie\Payment\Logger\MollieLogger;
use Mollie\Subscriptions\Config;
use Mollie\Subscriptions\Model\Carrier\SubscriptionShipping;

class CreateOrderFromSubscription
{
Expand Down Expand Up @@ -97,6 +100,10 @@ class CreateOrderFromSubscription
* @var SubscriptionAddProductToCart
*/
private $subscriptionAddToCart;
/**
* @var RateFactory
*/
private $rateFactory;

public function __construct(
Config $config,
Expand All @@ -110,7 +117,8 @@ public function __construct(
AddressInterfaceFactory $addressFactory,
MollieLogger $mollieLogger,
OrderAddressRepositoryInterface $orderAddressRepository,
SubscriptionAddProductToCart $addProductToCart
SubscriptionAddProductToCart $addProductToCart,
RateFactory $rateFactory
) {
$this->mollieCustomerRepository = $mollieCustomerRepository;
$this->customerRepository = $customerRepository;
Expand All @@ -124,6 +132,7 @@ public function __construct(
$this->mollieLogger = $mollieLogger;
$this->orderAddressRepository = $orderAddressRepository;
$this->subscriptionAddToCart = $addProductToCart;
$this->rateFactory = $rateFactory;
}

public function execute(MollieApiClient $api, Payment $molliePayment, Subscription $subscription): OrderInterface
Expand Down Expand Up @@ -222,6 +231,32 @@ private function configureShipping(CartInterface $cart)
', switched to ' . $newMethod
);
}

if ($shippingAddress->getShippingRateByCode($shippingAddress->getShippingMethod()) === false) {
$this->applyFallbackShippingMethod($shippingAddress);
}
}

private function applyFallbackShippingMethod(QuoteAddress $shippingAddress): void
{
$fallbackCode = 'mollie_subscriptions_fallback_shipping';

$rate = $this->rateFactory->create();
$rate->setCarrier(SubscriptionShipping::CARRIER_CODE);
$rate->setCarrierTitle('Mollie Subscriptions Shipping Fallback');
$rate->setMethod('fallback_shipping');
$rate->setMethodTitle('Subscription Shipping');
$rate->setPrice(0);
$rate->setCost(0);
$rate->setCode($fallbackCode);

$shippingAddress->addShippingRate($rate);
$shippingAddress->setShippingMethod($fallbackCode);

$this->mollieLogger->addInfoLog(
'subscriptions',
'No shipping rates available at all, using Mollie Subscriptions fallback carrier'
);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,45 @@ public function testHandlesVirtualProductsCorrect(): void
$this->assertSame(1, $order->getIsVirtual());
}

/**
* @magentoDataFixture Magento/Customer/_files/customer_with_addresses.php
* @magentoDataFixture Magento/Sales/_files/order.php
* @magentoConfigFixture default_store carriers/flatrate/active 0
* @magentoConfigFixture default_store carriers/freeshipping/active 0
* @magentoConfigFixture default_store carriers/tablerate/active 0
* @magentoConfigFixture default_store mollie_subscriptions/general/shipping_method flatrate_flatrate
*
* @return void
*/
public function testFallsBackToSubscriptionShippingWhenNoRatesAvailable(): void
{
$this->createMollieCustomer();
$order = $this->loadOrderById('100000001');

$molliePaymentBuilder = $this->objectManager->get(MolliePaymentBuilder::class);
$molliePaymentBuilder->setMethod('ideal');

$payment = $molliePaymentBuilder->build();
$payment->customerId = 'cst_testcustomer';

$subscription = $this->objectManager->get(Subscription::class);
$subscription->amount = new stdClass();
$subscription->amount->value = 100;
$subscription->amount->currency = 'EUR';
$subscription->customerId = 'cst_testcustomer';
$subscription->metadata = new stdClass();
$subscription->metadata->quantity = '1';
$subscription->metadata->sku = 'simple';
$subscription->metadata->billingAddressId = $order->getBillingAddressId();
$subscription->metadata->shippingAddressId = $order->getBillingAddressId();

$instance = $this->objectManager->create(CreateOrderFromSubscription::class);

$result = $instance->execute(new MollieApiClient(), $payment, $subscription);

$this->assertSame('mollie_subscriptions_fallback_shipping', $result->getShippingMethod());
}

private function createMollieCustomer(): void
{
/** @var CustomerRepositoryInterface $customerRepository */
Expand Down
12 changes: 10 additions & 2 deletions etc/config.xml
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,17 @@
<enable_customer_cancel_notification>0</enable_customer_cancel_notification>
<customer_cancel_notification_template>Mollie_Subscriptions_emails_customer_cancel_notification_template</customer_cancel_notification_template>
<enable_admin_failure_notification>1</enable_admin_failure_notification>
<admin_failure_notification_template>Mollie_Subscriptions_emails_admin_failure_notification_template
</admin_failure_notification_template>
<admin_failure_notification_template>Mollie_Subscriptions_emails_admin_failure_notification_template</admin_failure_notification_template>
</emails>
</mollie_subscriptions>
<carriers>
<mollie_subscriptions>
<active>1</active>
<model>Mollie\Subscriptions\Model\Carrier\SubscriptionShipping</model>
<name>Mollie Subscriptions Fallback Shipping</name>
<title>Mollie Subscriptions Shipping Fallback</title>
<price>0</price>
</mollie_subscriptions>
</carriers>
</default>
</config>
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

<!-- ko if: hasShipping -->
<tr class="totals mollie-subscriptions mollie-subscriptions-shipping excl">
<th class="mark" colspan="1" scope="row" data-bind="i18n: '- Subscription Shipping'"></th>
<th class="mark" colspan="1" scope="row" data-bind="i18n: '- Mollie Subscriptions Fallback Shipping'"></th>
<td class="amount">
<span class="price" data-bind="text: formattedShipping()"></span>
</td>
Expand Down
Loading