contacts_events-8.x-1.x-dev/src/Entity/PaymentHooks.php
src/Entity/PaymentHooks.php
<?php
namespace Drupal\contacts_events\Entity;
use Drupal\commerce_payment\Entity\PaymentInterface;
use Drupal\commerce_payment\Exception\PaymentGatewayException;
use Drupal\commerce_price\Price;
/**
* Implementations for Payment hooks.
*/
class PaymentHooks {
/**
* Modify payment on creation.
*
* @param \Drupal\commerce_payment\Entity\PaymentInterface $payment
* The payment entity.
*/
public function create(PaymentInterface $payment) {
// Make sure refunds are zero value with no tracking by default.
if ($payment->getPaymentGateway()->getPluginId() === 'manual_refund') {
if ($payment->getAmount() === NULL) {
// Get the right currency code.
$order = $payment->getOrder();
if ($total = $order->getTotalPrice()) {
$currency_code = $total->getCurrencyCode();
}
else {
$currency_code = $order->getStore()->getDefaultCurrencyCode();
}
// Set the amount.
$payment->setAmount(new Price('0', $currency_code));
}
}
}
/**
* Modify payment prior to saving.
*
* @param \Drupal\commerce_payment\Entity\PaymentInterface $payment
* The payment entity.
* @param \Drupal\commerce_payment\Entity\PaymentInterface|null $original
* The original payment entity, if any.
*/
public function preSave(PaymentInterface $payment, PaymentInterface $original = NULL) {
if ($payment->isNew() && $payment->get('creator')->isEmpty()) {
$payment->set('creator', \Drupal::currentUser()->id());
}
// Validation for manual refunds.
$this->validateManualRefund($payment);
}
/**
* Validate a manual refund payment.
*
* @param \Drupal\commerce_payment\Entity\PaymentInterface $payment
* The payment entity.
*/
public function validateManualRefund(PaymentInterface $payment) {
// Don't do anything if this isn't a manual refund.
if ($payment->getPaymentGatewayId() !== 'manual_refund') {
return;
}
// Ensure the amount is negative.
if (!$payment->getAmount()->isNegative()) {
throw new PaymentGatewayException('Manual refunds must be for a negative amount.');
}
// Ensure there is no refund.
$refund = $payment->getRefundedAmount();
if ($refund && !$refund->isZero()) {
throw new PaymentGatewayException('Manual refunds cannot be refunded.');
}
}
}
