View source
<?php
namespace Drupal\commerce_payment\Plugin\Commerce\PaymentGateway;
use Drupal\commerce_payment\Entity\PaymentInterface;
use Drupal\commerce_payment\PaymentMethodTypeManager;
use Drupal\commerce_payment\PaymentTypeManager;
use Drupal\commerce_price\MinorUnitsConverterInterface;
use Drupal\commerce_price\Price;
use Drupal\Component\Datetime\TimeInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Utility\Token;
use Symfony\Component\DependencyInjection\ContainerInterface;
class Manual extends PaymentGatewayBase implements ManualPaymentGatewayInterface {
protected $token;
public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityTypeManagerInterface $entity_type_manager, PaymentTypeManager $payment_type_manager, PaymentMethodTypeManager $payment_method_type_manager, TimeInterface $time, MinorUnitsConverterInterface $minor_units_converter, Token $token) {
parent::__construct($configuration, $plugin_id, $plugin_definition, $entity_type_manager, $payment_type_manager, $payment_method_type_manager, $time, $minor_units_converter);
$this->token = $token;
}
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static($configuration, $plugin_id, $plugin_definition, $container
->get('entity_type.manager'), $container
->get('plugin.manager.commerce_payment_type'), $container
->get('plugin.manager.commerce_payment_method_type'), $container
->get('datetime.time'), $container
->get('commerce_price.minor_units_converter'), $container
->get('token'));
}
public function defaultConfiguration() {
return [
'instructions' => [
'value' => '',
'format' => 'plain_text',
],
] + parent::defaultConfiguration();
}
public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
$form = parent::buildConfigurationForm($form, $form_state);
$form['instructions'] = [
'#type' => 'text_format',
'#title' => $this
->t('Payment instructions'),
'#description' => $this
->t('Shown the end of checkout, after the customer has placed their order.'),
'#default_value' => $this->configuration['instructions']['value'],
'#format' => $this->configuration['instructions']['format'],
'#element_validate' => [
'token_element_validate',
],
'#token_types' => [
'commerce_order',
'commerce_payment',
],
];
$form['token_help'] = [
'#theme' => 'token_tree_link',
'#token_types' => [
'commerce_order',
'commerce_payment',
],
];
return $form;
}
public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
parent::submitConfigurationForm($form, $form_state);
if (!$form_state
->getErrors()) {
$values = $form_state
->getValue($form['#parents']);
$this->configuration['instructions'] = $values['instructions'];
}
}
public function buildPaymentInstructions(PaymentInterface $payment) {
$instructions = [];
if (!empty($this->configuration['instructions']['value'])) {
$instructions_text = $this->token
->replace($this->configuration['instructions']['value'], [
'commerce_order' => $payment
->getOrder(),
'commerce_payment' => $payment,
]);
$instructions = [
'#type' => 'processed_text',
'#text' => $instructions_text,
'#format' => $this->configuration['instructions']['format'],
];
}
return $instructions;
}
public function buildPaymentOperations(PaymentInterface $payment) {
$payment_state = $payment
->getState()
->getId();
$operations = [];
$operations['receive'] = [
'title' => $this
->t('Receive'),
'page_title' => $this
->t('Receive payment'),
'plugin_form' => 'receive-payment',
'access' => $payment_state == 'pending',
];
$operations['void'] = [
'title' => $this
->t('Void'),
'page_title' => $this
->t('Void payment'),
'plugin_form' => 'void-payment',
'access' => $payment_state == 'pending',
];
$operations['refund'] = [
'title' => $this
->t('Refund'),
'page_title' => $this
->t('Refund payment'),
'plugin_form' => 'refund-payment',
'access' => in_array($payment_state, [
'completed',
'partially_refunded',
]),
];
return $operations;
}
public function createPayment(PaymentInterface $payment, $received = FALSE) {
$this
->assertPaymentState($payment, [
'new',
]);
$payment->state = $received ? 'completed' : 'pending';
$payment
->save();
}
public function receivePayment(PaymentInterface $payment, Price $amount = NULL) {
$this
->assertPaymentState($payment, [
'pending',
]);
$amount = $amount ?: $payment
->getAmount();
$payment->state = 'completed';
$payment
->setAmount($amount);
$payment
->save();
}
public function voidPayment(PaymentInterface $payment) {
$this
->assertPaymentState($payment, [
'pending',
]);
$payment->state = 'voided';
$payment
->save();
}
public function refundPayment(PaymentInterface $payment, Price $amount = NULL) {
$this
->assertPaymentState($payment, [
'completed',
'partially_refunded',
]);
$amount = $amount ?: $payment
->getAmount();
$this
->assertRefundAmount($payment, $amount);
$old_refunded_amount = $payment
->getRefundedAmount();
$new_refunded_amount = $old_refunded_amount
->add($amount);
if ($new_refunded_amount
->lessThan($payment
->getAmount())) {
$payment->state = 'partially_refunded';
}
else {
$payment->state = 'refunded';
}
$payment
->setRefundedAmount($new_refunded_amount);
$payment
->save();
}
}