-
-
Save flocondetoile/48bb0b353a8b99ed37391299b48bb99c to your computer and use it in GitHub Desktop.
Customization for revoking a subscription/Commerce recurring
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* @file | |
* Contains custom_commerce_recurring.module. | |
*/ | |
use Drupal\Core\Entity\EntityTypeInterface; | |
use Drupal\Core\Form\FormStateInterface; | |
/** | |
* Implements hook_entity_base_field_info_alter(). | |
*/ | |
function custom_commerce_recurring_entity_base_field_info_alter(&$fields, EntityTypeInterface $entity_type) { | |
if ($entity_type->id() == 'commerce_subscription' && !empty($fields['state'])) { | |
$fields['state']->setSetting('workflow', 'subscription_default_revoke'); | |
} | |
} | |
/** | |
* Implements hook_form_FORM_ID_alter() for commerce_subscription_license_edit_form. | |
*/ | |
function custom_commerce_recurring_form_commerce_subscription_license_edit_form_alter(&$form, FormStateInterface $form_state, $form_id) { | |
// Attaching core form library which help to prevent double submit. | |
$form['#attached']['library'][] = 'core/drupal.form'; | |
$actions = &$form['actions']; | |
$subscription = $form_state->getFormObject()->getEntity(); | |
$state = $subscription->getState()->value; | |
$actions['revoke'] = [ | |
'#type' => 'submit', | |
'#value' => t('Revoke subscription'), | |
'#submit' => ['custom_commerce_recurring_revoke_submit'], | |
'#access' => $state != 'revoked' && $state != 'pending' && $state != 'canceled', | |
]; | |
} | |
/** | |
* Revoke submit callback. | |
*/ | |
function custom_commerce_recurring_revoke_submit(array &$form, FormStateInterface $form_state) { | |
/** @var \Drupal\commerce_recurring\Entity\SubscriptionInterface $subscription */ | |
$subscription = $form_state->getFormObject()->getEntity(); | |
if ($subscription instanceof SubscriptionInterface) { | |
$transition = $subscription->getState()->getWorkflow()->getTransition('revoke'); | |
$subscription->getState()->applyTransition($transition); | |
$subscription->save(); | |
\Drupal::messenger()->addMessage(t('A subscription has been successfully revoked and it will not be renewed.')); | |
$form_state->setRedirect('entity.commerce_subscription.collection'); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
services: | |
custom_commerce_recurring.order_manager: | |
class: \Drupal\custom_commerce_recurring\RecurringOrderManager | |
decorates: commerce_recurring.order_manager | |
decoration_priority: -99 | |
arguments: ['@custom_commerce_recurring.order_manager.inner', '@entity_type.manager', '@datetime.time'] |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
subscription_default_revoke: | |
id: subscription_default_revoke | |
group: commerce_subscription | |
label: 'Default, with revoke' | |
states: | |
pending: | |
label: Pending | |
active: | |
label: Active | |
revoked: | |
label: Revoked | |
expired: | |
label: Expired | |
canceled: | |
label: Canceled | |
transitions: | |
activate: | |
label: Activate | |
from: [pending] | |
to: active | |
revoke: | |
label: Revoke | |
from: [active] | |
to: revoked | |
expire: | |
label: Expire | |
from: [active] | |
to: expired | |
cancel: | |
label: Cancel | |
from: [active] | |
to: canceled | |
reactivate: | |
label: Reactivate | |
from: [revoked] | |
to: active |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace Drupal\custom_commerce_recurring; | |
use Drupal\commerce_order\Entity\OrderInterface; | |
use Drupal\commerce_recurring\RecurringOrderManager as BaseRecurringOrderManager; | |
use Drupal\commerce_recurring\RecurringOrderManagerInterface; | |
use Drupal\Component\Datetime\TimeInterface; | |
use Drupal\Core\Entity\EntityTypeManagerInterface; | |
/** | |
* Overrides the default recurring order manager. | |
*/ | |
class RecurringOrderManager extends BaseRecurringOrderManager { | |
/** | |
* The recurring order manager. | |
* | |
* @var \Drupal\commerce_recurring\RecurringOrderManagerInterface | |
*/ | |
protected $recurringOrderManager; | |
/** | |
* Constructs a new RecurringOrderManager object. | |
* | |
* @param \Drupal\commerce_recurring\RecurringOrderManagerInterface $recurring_order_manager | |
* The recurring order manager. | |
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager | |
* The entity type manager. | |
* @param \Drupal\Component\Datetime\TimeInterface $time | |
* The time. | |
*/ | |
public function __construct(RecurringOrderManagerInterface $recurring_order_manager, EntityTypeManagerInterface $entity_type_manager, TimeInterface $time) { | |
$this->recurringOrderManager = $recurring_order_manager; | |
parent::__construct($entity_type_manager, $time); | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function closeOrder(OrderInterface $order) { | |
$subscriptions = $this->recurringOrderManager->collectSubscriptions($order); | |
/** @var \Drupal\commerce_recurring\Entity\SubscriptionInterface $subscription */ | |
$subscription = reset($subscriptions); | |
/** @var \Drupal\state_machine\Plugin\Field\FieldType\StateItemInterface $subscription_state */ | |
$subscription_state = $subscription ? $subscription->getState() : NULL; | |
// When a subscription is revoked then on close we cancel it. | |
if ($subscription_state->value == 'revoked') { | |
// Cancelling the order. | |
$transition = $order->getState()->getWorkflow()->getTransition('cancel'); | |
$order->getState()->applyTransition($transition); | |
$order->save(); | |
// Cancelling the subscription. | |
$transition = $subscription_state->getWorkflow()->getTransition('cancel'); | |
$subscription->getState()->applyTransition($transition); | |
$subscription->save(); | |
return; | |
} | |
$this->recurringOrderManager->closeOrder($order); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment