-
Notifications
You must be signed in to change notification settings - Fork 257
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add events and logging for payments #797
base: 8.x-2.x
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -27,3 +27,12 @@ order_assigned: | |
category: commerce_order | ||
label: 'Order assigned' | ||
template: '<p>The order was assigned to {{ user }}.</p>' | ||
|
||
payment_log: | ||
category: commerce_payment | ||
label: 'Payment log' | ||
template: '<p>{% if new %} New payment {% else %} Payment {% endif %} {% if remote_id %} {{ remote_id }} {% else %} {{ id }} {% endif %} {% if not previous_amount %} of {{ amount|commerce_price_format }} {% endif %} in state {{ state}} {% if previous_amount %} was changed from {{ previous_amount|commerce_price_format }} to {{ amount|commerce_price_format }} {% endif %}.</p>' | ||
payment_refunded: | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I figured that insert, update, delete and refund are the only things of interest. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Sounds like we want more details in the messages. Let's add the current state as part of the log too. |
||
category: commerce_payment | ||
label: 'Payment refunded' | ||
template: '<p>{% if new %} New payment {% else %} Payment {% endif %} {% if remote_id %} {{ remote_id }} {% else %} {{ id }} {% endif %} was refunded {{ refunded_amount|commerce_price_format }} and is now in state {{ state }}.</p>' |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,108 @@ | ||
<?php | ||
|
||
namespace Drupal\commerce_log\EventSubscriber; | ||
|
||
use Drupal\commerce_payment\Entity\PaymentInterface; | ||
use Drupal\commerce_payment\Event\PaymentEvent; | ||
use Drupal\commerce_payment\Event\PaymentEvents; | ||
use Drupal\commerce_price\Calculator; | ||
use Drupal\Core\Entity\EntityTypeManagerInterface; | ||
use Symfony\Component\EventDispatcher\EventSubscriberInterface; | ||
|
||
class PaymentEventSubscriber implements EventSubscriberInterface { | ||
|
||
/** | ||
* The log storage. | ||
* | ||
* @var \Drupal\commerce_log\LogStorageInterface | ||
*/ | ||
protected $logStorage; | ||
|
||
/** | ||
* Constructs a new PaymentEventSubscriber object. | ||
* | ||
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager | ||
* The entity type manager. | ||
* | ||
* @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException | ||
*/ | ||
public function __construct(EntityTypeManagerInterface $entity_type_manager) { | ||
$this->logStorage = $entity_type_manager->getStorage('commerce_log'); | ||
} | ||
|
||
/** | ||
* {@inheritdoc} | ||
*/ | ||
public static function getSubscribedEvents() { | ||
$events = [ | ||
PaymentEvents::PAYMENT_PRESAVE => ['onPaymentPresave', -100], | ||
PaymentEvents::PAYMENT_PREDELETE => ['onPaymentPredelete', -100], | ||
]; | ||
return $events; | ||
} | ||
|
||
/** | ||
* Creates a log before a payment is saved. | ||
* | ||
* @param \Drupal\commerce_payment\Event\PaymentEvent $event | ||
* The payment event. | ||
* | ||
* @throws \Drupal\Core\Entity\EntityStorageException | ||
*/ | ||
public function onPaymentPresave(PaymentEvent $event) { | ||
$this->logPayment($event->getPayment()); | ||
} | ||
|
||
/** | ||
* Creates a log when a payment is deleted. | ||
* | ||
* @param \Drupal\commerce_payment\Event\PaymentEvent $event | ||
* The payment event. | ||
* | ||
* @throws \Drupal\Core\Entity\EntityStorageException | ||
*/ | ||
public function onPaymentPredelete(PaymentEvent $event) { | ||
$event->getPayment()->setState('deleted'); | ||
$this->logPayment($event->getPayment()); | ||
} | ||
|
||
/** | ||
* Creates a log when a payment is changed. | ||
* | ||
* @param \Drupal\commerce_payment\Entity\PaymentInterface $payment | ||
* The payment. | ||
* | ||
* @throws \Drupal\Core\Entity\EntityStorageException | ||
*/ | ||
protected function logPayment(PaymentInterface $payment) { | ||
$refund = $payment->getRefundedAmount(); | ||
$isNew = $payment->isNew(); | ||
$previousAmount = FALSE; | ||
if (!empty($payment->original) && !$payment->getAmount()->equals($payment->original->getAmount())) { | ||
$previousAmount = $payment->original->getAmount(); | ||
} | ||
if ($refund && Calculator::trim($refund->getNumber())) { | ||
if (!empty($payment->original) && !$payment->getRefundedAmount()->equals($payment->original->getRefundedAmount())) { | ||
$refund = $payment->getRefundedAmount()->subtract($payment->original->getRefundedAmount()); | ||
} | ||
$this->logStorage->generate($payment->getOrder(), 'payment_refunded', [ | ||
'id' => $payment->id(), | ||
'remote_id' => $payment->getRemoteId(), | ||
'refunded_amount' => $refund, | ||
'state' => $payment->getState()->value, | ||
'new' => $isNew, | ||
])->save(); | ||
} | ||
else { | ||
$this->logStorage->generate($payment->getOrder(), 'payment_log', [ | ||
'id' => $payment->id(), | ||
'remote_id' => $payment->getRemoteId(), | ||
'new' => $isNew, | ||
'amount' => $payment->getAmount(), | ||
'previous_amount' => $previousAmount, | ||
'state' => $payment->getState()->value, | ||
])->save(); | ||
} | ||
} | ||
|
||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
<?php | ||
|
||
namespace Drupal\commerce_log; | ||
|
||
use Drupal\commerce_payment\PaymentListBuilder as BasePaymentListBuilder; | ||
|
||
/** | ||
* Overrides the list builder for payments. | ||
*/ | ||
class PaymentListBuilder extends BasePaymentListBuilder { | ||
|
||
/** | ||
* {@inheritdoc} | ||
*/ | ||
public function render() { | ||
$build = parent::render(); | ||
$entities = $this->load(); | ||
/** @var \Drupal\commerce_payment\Entity\PaymentInterface $payment */ | ||
$payment = reset($entities); | ||
if ($payment) { | ||
$build['log']['title'] = [ | ||
'#markup' => '<h3>' . $this->t('Order activity') . '</h3>', | ||
]; | ||
$build['log']['activity'] = [ | ||
'#type' => 'view', | ||
'#name' => 'commerce_activity', | ||
'#display_id' => 'default', | ||
'#arguments' => [$payment->getOrder()->id(), 'commerce_order'], | ||
'#embed' => FALSE, | ||
]; | ||
} | ||
return $build; | ||
} | ||
|
||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
<?php | ||
|
||
namespace Drupal\commerce_payment\Event; | ||
|
||
use Drupal\commerce_payment\Entity\PaymentInterface; | ||
use Symfony\Component\EventDispatcher\Event; | ||
|
||
/** | ||
* Defines the payment event. | ||
* | ||
* @see \Drupal\commerce_payment\Event\PaymentEvents | ||
*/ | ||
class PaymentEvent extends Event { | ||
|
||
/** | ||
* The payment. | ||
* | ||
* @var \Drupal\commerce_payment\Entity\PaymentInterface | ||
*/ | ||
protected $payment; | ||
|
||
/** | ||
* Constructs a new PaymentEvent. | ||
* | ||
* @param \Drupal\commerce_payment\Entity\PaymentInterface $payment | ||
* The payment. | ||
*/ | ||
public function __construct(PaymentInterface $payment) { | ||
$this->payment = $payment; | ||
} | ||
|
||
/** | ||
* Gets the payment. | ||
* | ||
* @return \Drupal\commerce_payment\Entity\PaymentInterface | ||
* The payment. | ||
*/ | ||
public function getPayment() { | ||
return $this->payment; | ||
} | ||
|
||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -10,7 +10,74 @@ final class PaymentEvents { | |
* @Event | ||
* | ||
* @see \Drupal\commerce_payment\Event\FilterPaymentGatewaysEvent | ||
* | ||
* @var string | ||
*/ | ||
const FILTER_PAYMENT_GATEWAYS = 'commerce_payment.filter_payment_gateways'; | ||
|
||
|
||
/** | ||
* Name of the event fired after loading a payment. | ||
* | ||
* @Event | ||
* | ||
* @see \Drupal\commerce_payment\Event\PaymentEvent | ||
* | ||
* @var string | ||
*/ | ||
const PAYMENT_LOAD = 'commerce_payment.commerce_payment.load'; | ||
|
||
/** | ||
* Name of the event fired before saving a payment. | ||
* | ||
* @Event | ||
* | ||
* @see \Drupal\commerce_payment\Event\PaymentEvent | ||
* | ||
* @var string | ||
*/ | ||
const PAYMENT_PRESAVE = 'commerce_payment.commerce_payment.presave'; | ||
|
||
/** | ||
* Name of the event fired after saving a new payment. | ||
* | ||
* @Event | ||
* | ||
* @see \Drupal\commerce_payment\Event\PaymentEvent | ||
*/ | ||
const PAYMENT_INSERT = 'commerce_payment.commerce_payment.insert'; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I see an INSERT and a CREATE in product variation events. Do we need to duplicate the same here? The docs between the two aren't very clear about what the difference is. |
||
|
||
/** | ||
* Name of the event fired after saving an existing payment. | ||
* | ||
* @Event | ||
* | ||
* @see \Drupal\commerce_payment\Event\PaymentEvent | ||
* | ||
* @var string | ||
*/ | ||
const PAYMENT_UPDATE = 'commerce_payment.commerce_payment.update'; | ||
|
||
/** | ||
* Name of the event fired before deleting a payment. | ||
* | ||
* @Event | ||
* | ||
* @see \Drupal\commerce_payment\Event\PaymentEvent | ||
* | ||
* @var string | ||
*/ | ||
const PAYMENT_PREDELETE = 'commerce_payment.commerce_payment.predelete'; | ||
|
||
/** | ||
* Name of the event fired after deleting a payment. | ||
* | ||
* @Event | ||
* | ||
* @see \Drupal\commerce_payment\Event\PaymentEvent | ||
* | ||
* @var string | ||
*/ | ||
const PAYMENT_DELETE = 'commerce_payment.commerce_payment.delete'; | ||
|
||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
name: 'Payment events test' | ||
type: module | ||
package: Testing | ||
core: 8.x |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
services: | ||
payment_events_test.event_subscriber: | ||
class: Drupal\payment_events_test\EventSubscriber | ||
arguments: ['@state'] | ||
tags: | ||
- { name: event_subscriber } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should this read commerce_order?