From 13a9eb1201bb55572bd26271713c79af04eb4a1e Mon Sep 17 00:00:00 2001 From: heddn Date: Thu, 14 Sep 2017 14:32:43 -0600 Subject: [PATCH 1/4] Add events and logging for payments --- .../commerce_log.commerce_log_categories.yml | 4 + .../commerce_log.commerce_log_templates.yml | 17 +++ modules/log/commerce_log.module | 7 ++ .../install/views.view.commerce_activity.yml | 4 +- .../log/src/CommerceLogServiceProvider.php | 6 + .../PaymentEventSubscriber.php | 103 +++++++++++++++++ modules/log/src/PaymentListBuilder.php | 34 ++++++ modules/payment/src/Entity/Payment.php | 1 + modules/payment/src/Event/PaymentEvent.php | 43 +++++++ modules/payment/src/Event/PaymentEvents.php | 67 +++++++++++ .../payment_events_test.info.yml | 4 + .../payment_events_test.services.yml | 6 + .../src/EventSubscriber.php | 53 +++++++++ .../tests/src/Kernel/PaymentEventsTest.php | 107 ++++++++++++++++++ 14 files changed, 454 insertions(+), 2 deletions(-) create mode 100644 modules/log/src/EventSubscriber/PaymentEventSubscriber.php create mode 100644 modules/log/src/PaymentListBuilder.php create mode 100644 modules/payment/src/Event/PaymentEvent.php create mode 100644 modules/payment/tests/modules/payment_events_test/payment_events_test.info.yml create mode 100644 modules/payment/tests/modules/payment_events_test/payment_events_test.services.yml create mode 100644 modules/payment/tests/modules/payment_events_test/src/EventSubscriber.php create mode 100644 modules/payment/tests/src/Kernel/PaymentEventsTest.php diff --git a/modules/log/commerce_log.commerce_log_categories.yml b/modules/log/commerce_log.commerce_log_categories.yml index b921707752..8ea861b096 100644 --- a/modules/log/commerce_log.commerce_log_categories.yml +++ b/modules/log/commerce_log.commerce_log_categories.yml @@ -5,3 +5,7 @@ commerce_cart: commerce_order: label: Order entity_type: commerce_order + +commerce_payment: + label: Payment + entity_type: commerce_payment diff --git a/modules/log/commerce_log.commerce_log_templates.yml b/modules/log/commerce_log.commerce_log_templates.yml index a9aee4860d..2e0eba13ba 100644 --- a/modules/log/commerce_log.commerce_log_templates.yml +++ b/modules/log/commerce_log.commerce_log_templates.yml @@ -27,3 +27,20 @@ order_assigned: category: commerce_order label: 'Order assigned' template: '

The order was assigned to {{ user }}.

' + +payment_insert: + category: commerce_payment + label: 'Payment created' + template: '

Payment of {{ amount|commerce_price_format }} was created.

' +payment_update: + category: commerce_payment + label: 'Payment updated' + template: '

Payment of {{ amount|commerce_price_format }} was updated.

' +payment_delete: + category: commerce_payment + label: 'Payment deleted' + template: '

Payment of {{ amount|commerce_price_format }} was deleted.

' +payment_refunded: + category: commerce_payment + label: 'Payment refunded' + template: '

Payment of {{ refunded_amount|commerce_price_format }} was refunded.

' diff --git a/modules/log/commerce_log.module b/modules/log/commerce_log.module index 9c4927c624..7710d2f42e 100644 --- a/modules/log/commerce_log.module +++ b/modules/log/commerce_log.module @@ -5,6 +5,8 @@ * Provides activity logs for Commerce entities. */ +use Drupal\commerce_log\PaymentListBuilder; + /** * Implements hook_preprocess_commerce_order(). */ @@ -20,3 +22,8 @@ function commerce_log_preprocess_commerce_order(&$variables) { '#title' => t('Order activity'), ]; } + +function commerce_log_entity_type_alter(array &$entity_types) { + /** @var $entity_types \Drupal\Core\Entity\EntityTypeInterface[] */ + $entity_types['commerce_payment']->setListBuilderClass(PaymentListBuilder::class); +} diff --git a/modules/log/config/install/views.view.commerce_activity.yml b/modules/log/config/install/views.view.commerce_activity.yml index 05014113a5..1b17958fb0 100644 --- a/modules/log/config/install/views.view.commerce_activity.yml +++ b/modules/log/config/install/views.view.commerce_activity.yml @@ -288,7 +288,7 @@ display: entity_type: commerce_log entity_field: log_id plugin_id: standard - title: 'Order logs' + title: 'Activity log' header: { } footer: { } empty: @@ -337,7 +337,7 @@ display: type: none fail: 'not found' validate_options: { } - break_phrase: false + break_phrase: true not: false entity_type: commerce_log entity_field: source_entity_id diff --git a/modules/log/src/CommerceLogServiceProvider.php b/modules/log/src/CommerceLogServiceProvider.php index 769cc5fc21..2998d9623b 100644 --- a/modules/log/src/CommerceLogServiceProvider.php +++ b/modules/log/src/CommerceLogServiceProvider.php @@ -2,6 +2,7 @@ namespace Drupal\commerce_log; +use Drupal\commerce_log\EventSubscriber\PaymentEventSubscriber; use Drupal\Core\DependencyInjection\ContainerBuilder; use Drupal\Core\DependencyInjection\ServiceProviderBase; use Symfony\Component\DependencyInjection\Reference; @@ -29,6 +30,11 @@ public function register(ContainerBuilder $container) { ->addTag('event_subscriber') ->addArgument(new Reference('entity_type.manager')); } + if (isset($modules['commerce_payment'])) { + $container->register('commerce_log.payment_subscriber', PaymentEventSubscriber::class) + ->addTag('event_subscriber') + ->addArgument(new Reference('entity_type.manager')); + } } } diff --git a/modules/log/src/EventSubscriber/PaymentEventSubscriber.php b/modules/log/src/EventSubscriber/PaymentEventSubscriber.php new file mode 100644 index 0000000000..92a6134047 --- /dev/null +++ b/modules/log/src/EventSubscriber/PaymentEventSubscriber.php @@ -0,0 +1,103 @@ +logStorage = $entity_type_manager->getStorage('commerce_log'); + } + + /** + * {@inheritdoc} + */ + public static function getSubscribedEvents() { + $events = [ + PaymentEvents::PAYMENT_INSERT => ['onPaymentInsert', -100], + PaymentEvents::PAYMENT_UPDATE => ['onPaymentUpdate', -100], + PaymentEvents::PAYMENT_DELETE => ['onPaymentDelete', -100], + ]; + return $events; + } + + /** + * Creates a log when a payment is inserted. + * + * @param \Drupal\commerce_payment\Event\PaymentEvent $event + * The payment event. + * + * @throws \Drupal\Core\Entity\EntityStorageException + */ + public function onPaymentInsert(PaymentEvent $event) { + $this->logPayment($event->getPayment(), 'payment_insert'); + } + + /** + * Creates a log when a payment is updated. + * + * @param \Drupal\commerce_payment\Event\PaymentEvent $event + * The payment event. + * + * @throws \Drupal\Core\Entity\EntityStorageException + */ + public function onPaymentUpdate(PaymentEvent $event) { + $payment = $event->getPayment(); + $this->logPayment($payment, 'payment_update'); + if ($refunded = $payment->getRefundedAmount()) { + $this->logStorage->generate($payment, 'refund', [ + 'refunded_amount' => $refunded, + ])->save(); + } + } + + /** + * 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 onPaymentDelete(PaymentEvent $event) { + $this->logPayment($event->getPayment(), 'payment_delete'); + } + + /** + * Creates a log when a payment is changed. + * + * @param \Drupal\commerce_payment\Entity\PaymentInterface $payment + * The payment. + * @param string $templateId + * The log template ID. + * + * @throws \Drupal\Core\Entity\EntityStorageException + */ + protected function logPayment(PaymentInterface $payment, $templateId) { + $this->logStorage->generate($payment, $templateId, [ + 'amount' => $payment->getAmount(), + ])->save(); + } + +} diff --git a/modules/log/src/PaymentListBuilder.php b/modules/log/src/PaymentListBuilder.php new file mode 100644 index 0000000000..c98af32ea2 --- /dev/null +++ b/modules/log/src/PaymentListBuilder.php @@ -0,0 +1,34 @@ +load() as $entity) { + $entityIds[] = $entity->id(); + } + $build['log']['title'] = [ + '#markup' => '

' . $this->t('Payment activity') . '

', + ]; + $build['log']['activity'] = [ + '#type' => 'view', + '#name' => 'commerce_activity', + '#display_id' => 'default', + '#arguments' => [implode('+', $entityIds), 'commerce_payment'], + '#embed' => FALSE, + ]; + return $build; + } + +} diff --git a/modules/payment/src/Entity/Payment.php b/modules/payment/src/Entity/Payment.php index f887f6f957..697473add7 100644 --- a/modules/payment/src/Entity/Payment.php +++ b/modules/payment/src/Entity/Payment.php @@ -26,6 +26,7 @@ * bundle_plugin_type = "commerce_payment_type", * handlers = { * "access" = "Drupal\commerce_payment\PaymentAccessControlHandler", + * "event" = "Drupal\commerce_payment\Event\PaymentEvent", * "list_builder" = "Drupal\commerce_payment\PaymentListBuilder", * "storage" = "Drupal\commerce_payment\PaymentStorage", * "form" = { diff --git a/modules/payment/src/Event/PaymentEvent.php b/modules/payment/src/Event/PaymentEvent.php new file mode 100644 index 0000000000..2eb4763503 --- /dev/null +++ b/modules/payment/src/Event/PaymentEvent.php @@ -0,0 +1,43 @@ +payment = $payment; + } + + /** + * Gets the payment. + * + * @return \Drupal\commerce_payment\Entity\PaymentInterface + * The payment. + */ + public function getPayment() { + return $this->payment; + } + +} diff --git a/modules/payment/src/Event/PaymentEvents.php b/modules/payment/src/Event/PaymentEvents.php index 9a4abfeab3..eb73d3988e 100644 --- a/modules/payment/src/Event/PaymentEvents.php +++ b/modules/payment/src/Event/PaymentEvents.php @@ -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'; + + /** + * 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'; + } diff --git a/modules/payment/tests/modules/payment_events_test/payment_events_test.info.yml b/modules/payment/tests/modules/payment_events_test/payment_events_test.info.yml new file mode 100644 index 0000000000..179ebc0ca6 --- /dev/null +++ b/modules/payment/tests/modules/payment_events_test/payment_events_test.info.yml @@ -0,0 +1,4 @@ +name: 'Payment events test' +type: module +package: Testing +core: 8.x diff --git a/modules/payment/tests/modules/payment_events_test/payment_events_test.services.yml b/modules/payment/tests/modules/payment_events_test/payment_events_test.services.yml new file mode 100644 index 0000000000..a7df3aa96c --- /dev/null +++ b/modules/payment/tests/modules/payment_events_test/payment_events_test.services.yml @@ -0,0 +1,6 @@ +services: + payment_events_test.event_subscriber: + class: Drupal\payment_events_test\EventSubscriber + arguments: ['@state'] + tags: + - { name: event_subscriber } diff --git a/modules/payment/tests/modules/payment_events_test/src/EventSubscriber.php b/modules/payment/tests/modules/payment_events_test/src/EventSubscriber.php new file mode 100644 index 0000000000..f748494531 --- /dev/null +++ b/modules/payment/tests/modules/payment_events_test/src/EventSubscriber.php @@ -0,0 +1,53 @@ +state = $state; + } + + /** + * Reacts to payment event. + * + * @param \Drupal\commerce_payment\Event\PaymentEvent $event + * The payment event. + * @param string $name + * The name of the event. + */ + public function paymentEvent(PaymentEvent $event, $name) { + $this->state->set('payment_events_test.event', [ + 'event_name' => $name, + 'event_entity' => $event->getPayment(), + ]); + } + + /** + * {@inheritdoc} + */ + public static function getSubscribedEvents() { + $events[PaymentEvents::PAYMENT_LOAD][] = ['paymentEvent']; + $events[PaymentEvents::PAYMENT_INSERT][] = ['paymentEvent']; + return $events; + } + +} diff --git a/modules/payment/tests/src/Kernel/PaymentEventsTest.php b/modules/payment/tests/src/Kernel/PaymentEventsTest.php new file mode 100644 index 0000000000..7f584004bd --- /dev/null +++ b/modules/payment/tests/src/Kernel/PaymentEventsTest.php @@ -0,0 +1,107 @@ +installEntitySchema('profile'); + $this->installEntitySchema('commerce_order'); + $this->installEntitySchema('commerce_order_item'); + $this->installEntitySchema('commerce_payment'); + $this->installEntitySchema('commerce_payment_method'); + $this->installConfig('commerce_order'); + $this->installConfig('commerce_payment'); + + // An order item type that doesn't need a purchasable entity, for simplicity. + OrderItemType::create([ + 'id' => 'test', + 'label' => 'Test', + 'orderType' => 'default', + ])->save(); + + $payment_gateway = PaymentGateway::create([ + 'id' => 'example', + 'label' => 'Example', + 'plugin' => 'example_onsite', + ]); + $payment_gateway->save(); + + $user = $this->createUser(); + + /** @var \Drupal\commerce_payment\Entity\PaymentMethodInterface $payment_method */ + $payment_method_active = PaymentMethod::create([ + 'type' => 'credit_card', + 'payment_gateway' => 'example', + // Thu, 16 Jan 2020. + 'expires' => '1579132800', + 'uid' => $user->id(), + ]); + $payment_method_active->save(); + } + + /** + * Tests the basic payment events. + */ + public function testPaymentEvents() { + // Create a dummy payment. + $payment = Payment::create([ + 'payment_gateway' => 'example', + 'payment_method' => 'credit_card', + 'remote_id' => '123456', + 'amount' => [ + 'number' => '39.99', + 'currency_code' => 'USD', + ], + 'state' => 'capture_completed', + 'test' => TRUE, + ]); + $payment->save(); + + // Check the create event. + $event_recorder = \Drupal::state()->get('payment_events_test.event', FALSE); + $this->assertEquals('commerce_payment.commerce_payment.create', $event_recorder['event_name']); + $this->assertEquals($payment->id(), $event_recorder['event_entity']->id()); + + // Reload the payment. + $this->reloadEntity($payment); + + // Check the load event. + $event_recorder = \Drupal::state()->get('payment_events_test.event', FALSE); + $this->assertEquals('commerce_payment.commerce_payment.load', $event_recorder['event_name']); + } + +} From c5cde7c1cb90c69b804ecc0ef9d57079ca65174a Mon Sep 17 00:00:00 2001 From: heddn Date: Thu, 14 Sep 2017 15:57:34 -0600 Subject: [PATCH 2/4] respond to feedback on PR --- .../commerce_log.commerce_log_templates.yml | 10 ++++---- modules/log/commerce_log.module | 6 +++-- .../PaymentEventSubscriber.php | 25 ++++++++++++------- 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/modules/log/commerce_log.commerce_log_templates.yml b/modules/log/commerce_log.commerce_log_templates.yml index 2e0eba13ba..d1c0a36556 100644 --- a/modules/log/commerce_log.commerce_log_templates.yml +++ b/modules/log/commerce_log.commerce_log_templates.yml @@ -28,15 +28,15 @@ order_assigned: label: 'Order assigned' template: '

The order was assigned to {{ user }}.

' -payment_insert: +payment_inserted: category: commerce_payment label: 'Payment created' template: '

Payment of {{ amount|commerce_price_format }} was created.

' -payment_update: +payment_price_updated: category: commerce_payment - label: 'Payment updated' - template: '

Payment of {{ amount|commerce_price_format }} was updated.

' -payment_delete: + label: 'Payment price updated' + template: '

Payment was changed from {{ previous_amount|commerce_price_format }} to {{ current_amount|commerce_price_format }}.

' +payment_deleted: category: commerce_payment label: 'Payment deleted' template: '

Payment of {{ amount|commerce_price_format }} was deleted.

' diff --git a/modules/log/commerce_log.module b/modules/log/commerce_log.module index 7710d2f42e..3fc5fc838f 100644 --- a/modules/log/commerce_log.module +++ b/modules/log/commerce_log.module @@ -24,6 +24,8 @@ function commerce_log_preprocess_commerce_order(&$variables) { } function commerce_log_entity_type_alter(array &$entity_types) { - /** @var $entity_types \Drupal\Core\Entity\EntityTypeInterface[] */ - $entity_types['commerce_payment']->setListBuilderClass(PaymentListBuilder::class); + if (isset($entity_types['commerce_payment'])) { + /** @var $entity_types \Drupal\Core\Entity\EntityTypeInterface[] */ + $entity_types['commerce_payment']->setListBuilderClass(PaymentListBuilder::class); + } } diff --git a/modules/log/src/EventSubscriber/PaymentEventSubscriber.php b/modules/log/src/EventSubscriber/PaymentEventSubscriber.php index 92a6134047..0e0ca28a8e 100644 --- a/modules/log/src/EventSubscriber/PaymentEventSubscriber.php +++ b/modules/log/src/EventSubscriber/PaymentEventSubscriber.php @@ -5,6 +5,7 @@ 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 Drupal\state_machine\Event\WorkflowTransitionEvent; use Symfony\Component\EventDispatcher\EventSubscriberInterface; @@ -36,7 +37,7 @@ public function __construct(EntityTypeManagerInterface $entity_type_manager) { public static function getSubscribedEvents() { $events = [ PaymentEvents::PAYMENT_INSERT => ['onPaymentInsert', -100], - PaymentEvents::PAYMENT_UPDATE => ['onPaymentUpdate', -100], + PaymentEvents::PAYMENT_PRESAVE => ['onPaymentPresave', -100], PaymentEvents::PAYMENT_DELETE => ['onPaymentDelete', -100], ]; return $events; @@ -51,23 +52,29 @@ public static function getSubscribedEvents() { * @throws \Drupal\Core\Entity\EntityStorageException */ public function onPaymentInsert(PaymentEvent $event) { - $this->logPayment($event->getPayment(), 'payment_insert'); + $this->logPayment($event->getPayment(), 'payment_inserted'); } /** - * Creates a log when a payment is updated. + * 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 onPaymentUpdate(PaymentEvent $event) { + public function onPaymentPresave(PaymentEvent $event) { $payment = $event->getPayment(); - $this->logPayment($payment, 'payment_update'); - if ($refunded = $payment->getRefundedAmount()) { - $this->logStorage->generate($payment, 'refund', [ - 'refunded_amount' => $refunded, + $refund = $payment->getRefundedAmount(); + if (!$payment->isNew() && !$payment->getAmount()->equals($payment->original->getAmount())) { + $this->logStorage->generate($payment, 'payment_price_updated', [ + 'previous_amount' => $payment->original->getAmount(), + 'current_amount' => $payment->getAmount(), + ])->save(); + } + if ($refund && Calculator::trim($refund->getNumber())) { + $this->logStorage->generate($payment, 'payment_refunded', [ + 'refunded_amount' => $refund, ])->save(); } } @@ -81,7 +88,7 @@ public function onPaymentUpdate(PaymentEvent $event) { * @throws \Drupal\Core\Entity\EntityStorageException */ public function onPaymentDelete(PaymentEvent $event) { - $this->logPayment($event->getPayment(), 'payment_delete'); + $this->logPayment($event->getPayment(), 'payment_deleted'); } /** From 0bfe44e5fa0b03564351f343d17a1693d1b1068a Mon Sep 17 00:00:00 2001 From: heddn Date: Fri, 15 Sep 2017 09:46:32 -0600 Subject: [PATCH 3/4] tag log entries as tied to the order --- .../commerce_log.commerce_log_templates.yml | 16 ++--- .../install/views.view.commerce_activity.yml | 4 +- .../PaymentEventSubscriber.php | 69 +++++++++---------- modules/log/src/PaymentListBuilder.php | 27 ++++---- 4 files changed, 54 insertions(+), 62 deletions(-) diff --git a/modules/log/commerce_log.commerce_log_templates.yml b/modules/log/commerce_log.commerce_log_templates.yml index d1c0a36556..8e0e2ba06d 100644 --- a/modules/log/commerce_log.commerce_log_templates.yml +++ b/modules/log/commerce_log.commerce_log_templates.yml @@ -28,19 +28,11 @@ order_assigned: label: 'Order assigned' template: '

The order was assigned to {{ user }}.

' -payment_inserted: +payment_log: category: commerce_payment - label: 'Payment created' - template: '

Payment of {{ amount|commerce_price_format }} was created.

' -payment_price_updated: - category: commerce_payment - label: 'Payment price updated' - template: '

Payment was changed from {{ previous_amount|commerce_price_format }} to {{ current_amount|commerce_price_format }}.

' -payment_deleted: - category: commerce_payment - label: 'Payment deleted' - template: '

Payment of {{ amount|commerce_price_format }} was deleted.

' + label: 'Payment log' + template: '

{% 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 %}.

' payment_refunded: category: commerce_payment label: 'Payment refunded' - template: '

Payment of {{ refunded_amount|commerce_price_format }} was refunded.

' + template: '

{% 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 }}.

' diff --git a/modules/log/config/install/views.view.commerce_activity.yml b/modules/log/config/install/views.view.commerce_activity.yml index 1b17958fb0..9c7ce437f4 100644 --- a/modules/log/config/install/views.view.commerce_activity.yml +++ b/modules/log/config/install/views.view.commerce_activity.yml @@ -288,7 +288,7 @@ display: entity_type: commerce_log entity_field: log_id plugin_id: standard - title: 'Activity log' + title: 'Order activity' header: { } footer: { } empty: @@ -337,7 +337,7 @@ display: type: none fail: 'not found' validate_options: { } - break_phrase: true + break_phrase: false not: false entity_type: commerce_log entity_field: source_entity_id diff --git a/modules/log/src/EventSubscriber/PaymentEventSubscriber.php b/modules/log/src/EventSubscriber/PaymentEventSubscriber.php index 0e0ca28a8e..8348565f04 100644 --- a/modules/log/src/EventSubscriber/PaymentEventSubscriber.php +++ b/modules/log/src/EventSubscriber/PaymentEventSubscriber.php @@ -36,25 +36,12 @@ public function __construct(EntityTypeManagerInterface $entity_type_manager) { */ public static function getSubscribedEvents() { $events = [ - PaymentEvents::PAYMENT_INSERT => ['onPaymentInsert', -100], PaymentEvents::PAYMENT_PRESAVE => ['onPaymentPresave', -100], - PaymentEvents::PAYMENT_DELETE => ['onPaymentDelete', -100], + PaymentEvents::PAYMENT_PREDELETE => ['onPaymentPredelete', -100], ]; return $events; } - /** - * Creates a log when a payment is inserted. - * - * @param \Drupal\commerce_payment\Event\PaymentEvent $event - * The payment event. - * - * @throws \Drupal\Core\Entity\EntityStorageException - */ - public function onPaymentInsert(PaymentEvent $event) { - $this->logPayment($event->getPayment(), 'payment_inserted'); - } - /** * Creates a log before a payment is saved. * @@ -64,19 +51,7 @@ public function onPaymentInsert(PaymentEvent $event) { * @throws \Drupal\Core\Entity\EntityStorageException */ public function onPaymentPresave(PaymentEvent $event) { - $payment = $event->getPayment(); - $refund = $payment->getRefundedAmount(); - if (!$payment->isNew() && !$payment->getAmount()->equals($payment->original->getAmount())) { - $this->logStorage->generate($payment, 'payment_price_updated', [ - 'previous_amount' => $payment->original->getAmount(), - 'current_amount' => $payment->getAmount(), - ])->save(); - } - if ($refund && Calculator::trim($refund->getNumber())) { - $this->logStorage->generate($payment, 'payment_refunded', [ - 'refunded_amount' => $refund, - ])->save(); - } + $this->logPayment($event->getPayment()); } /** @@ -87,8 +62,9 @@ public function onPaymentPresave(PaymentEvent $event) { * * @throws \Drupal\Core\Entity\EntityStorageException */ - public function onPaymentDelete(PaymentEvent $event) { - $this->logPayment($event->getPayment(), 'payment_deleted'); + public function onPaymentPredelete(PaymentEvent $event) { + $event->getPayment()->setState('deleted'); + $this->logPayment($event->getPayment()); } /** @@ -96,15 +72,38 @@ public function onPaymentDelete(PaymentEvent $event) { * * @param \Drupal\commerce_payment\Entity\PaymentInterface $payment * The payment. - * @param string $templateId - * The log template ID. * * @throws \Drupal\Core\Entity\EntityStorageException */ - protected function logPayment(PaymentInterface $payment, $templateId) { - $this->logStorage->generate($payment, $templateId, [ - 'amount' => $payment->getAmount(), - ])->save(); + 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(); + } } } diff --git a/modules/log/src/PaymentListBuilder.php b/modules/log/src/PaymentListBuilder.php index c98af32ea2..65d38b0401 100644 --- a/modules/log/src/PaymentListBuilder.php +++ b/modules/log/src/PaymentListBuilder.php @@ -14,20 +14,21 @@ class PaymentListBuilder extends BasePaymentListBuilder { */ public function render() { $build = parent::render(); - $entityIds = []; - foreach ($this->load() as $entity) { - $entityIds[] = $entity->id(); + $entities = $this->load(); + /** @var \Drupal\commerce_payment\Entity\PaymentInterface $payment */ + $payment = reset($entities); + if ($payment) { + $build['log']['title'] = [ + '#markup' => '

' . $this->t('Order activity') . '

', + ]; + $build['log']['activity'] = [ + '#type' => 'view', + '#name' => 'commerce_activity', + '#display_id' => 'default', + '#arguments' => [$payment->getOrder()->id(), 'commerce_order'], + '#embed' => FALSE, + ]; } - $build['log']['title'] = [ - '#markup' => '

' . $this->t('Payment activity') . '

', - ]; - $build['log']['activity'] = [ - '#type' => 'view', - '#name' => 'commerce_activity', - '#display_id' => 'default', - '#arguments' => [implode('+', $entityIds), 'commerce_payment'], - '#embed' => FALSE, - ]; return $build; } From 999e590a8c749a988f601ea2a8bd2229650d1725 Mon Sep 17 00:00:00 2001 From: heddn Date: Tue, 19 Sep 2017 10:15:30 -0600 Subject: [PATCH 4/4] fix code style and test failure --- modules/log/commerce_log.module | 5 ++++- modules/log/src/EventSubscriber/PaymentEventSubscriber.php | 3 +-- modules/payment/src/Event/PaymentEvent.php | 1 - modules/payment/tests/src/Kernel/PaymentEventsTest.php | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/modules/log/commerce_log.module b/modules/log/commerce_log.module index 3fc5fc838f..79d0d105ca 100644 --- a/modules/log/commerce_log.module +++ b/modules/log/commerce_log.module @@ -23,9 +23,12 @@ function commerce_log_preprocess_commerce_order(&$variables) { ]; } +/** + * Implements hook_entity_type_alter() for commerce_payment. + */ function commerce_log_entity_type_alter(array &$entity_types) { if (isset($entity_types['commerce_payment'])) { - /** @var $entity_types \Drupal\Core\Entity\EntityTypeInterface[] */ + /** @var \Drupal\Core\Entity\EntityTypeInterface[] $entity_types */ $entity_types['commerce_payment']->setListBuilderClass(PaymentListBuilder::class); } } diff --git a/modules/log/src/EventSubscriber/PaymentEventSubscriber.php b/modules/log/src/EventSubscriber/PaymentEventSubscriber.php index 8348565f04..d03840b093 100644 --- a/modules/log/src/EventSubscriber/PaymentEventSubscriber.php +++ b/modules/log/src/EventSubscriber/PaymentEventSubscriber.php @@ -7,7 +7,6 @@ use Drupal\commerce_payment\Event\PaymentEvents; use Drupal\commerce_price\Calculator; use Drupal\Core\Entity\EntityTypeManagerInterface; -use Drupal\state_machine\Event\WorkflowTransitionEvent; use Symfony\Component\EventDispatcher\EventSubscriberInterface; class PaymentEventSubscriber implements EventSubscriberInterface { @@ -78,7 +77,7 @@ public function onPaymentPredelete(PaymentEvent $event) { protected function logPayment(PaymentInterface $payment) { $refund = $payment->getRefundedAmount(); $isNew = $payment->isNew(); - $previousAmount = FALSE; + $previousAmount = FALSE; if (!empty($payment->original) && !$payment->getAmount()->equals($payment->original->getAmount())) { $previousAmount = $payment->original->getAmount(); } diff --git a/modules/payment/src/Event/PaymentEvent.php b/modules/payment/src/Event/PaymentEvent.php index 2eb4763503..dcac009bf4 100644 --- a/modules/payment/src/Event/PaymentEvent.php +++ b/modules/payment/src/Event/PaymentEvent.php @@ -3,7 +3,6 @@ namespace Drupal\commerce_payment\Event; use Drupal\commerce_payment\Entity\PaymentInterface; -use Drupal\commerce_price\Price; use Symfony\Component\EventDispatcher\Event; /** diff --git a/modules/payment/tests/src/Kernel/PaymentEventsTest.php b/modules/payment/tests/src/Kernel/PaymentEventsTest.php index 7f584004bd..6069fb0336 100644 --- a/modules/payment/tests/src/Kernel/PaymentEventsTest.php +++ b/modules/payment/tests/src/Kernel/PaymentEventsTest.php @@ -93,7 +93,7 @@ public function testPaymentEvents() { // Check the create event. $event_recorder = \Drupal::state()->get('payment_events_test.event', FALSE); - $this->assertEquals('commerce_payment.commerce_payment.create', $event_recorder['event_name']); + $this->assertEquals('commerce_payment.commerce_payment.insert', $event_recorder['event_name']); $this->assertEquals($payment->id(), $event_recorder['event_entity']->id()); // Reload the payment.