commerce-8.x-2.8/modules/payment/src/Plugin/Commerce/PaymentGateway/Manual.php
modules/payment/src/Plugin/Commerce/PaymentGateway/Manual.php
<?php namespace Drupal\commerce_payment\Plugin\Commerce\PaymentGateway; use Drupal\commerce_payment\Entity\PaymentInterface; use Drupal\commerce_price\Price; use Drupal\Core\Form\FormStateInterface; /** * Provides the Manual payment gateway. * * @CommercePaymentGateway( * id = "manual", * label = "Manual", * display_label = "Manual", * modes = { * "n/a" = @Translation("N/A"), * }, * forms = { * "add-payment" = "Drupal\commerce_payment\PluginForm\ManualPaymentAddForm", * "receive-payment" = "Drupal\commerce_payment\PluginForm\PaymentReceiveForm", * }, * payment_type = "payment_manual", * ) */ class Manual extends PaymentGatewayBase implements ManualPaymentGatewayInterface { /** * {@inheritdoc} */ public function defaultConfiguration() { return [ 'instructions' => [ 'value' => '', 'format' => 'plain_text', ], ] + parent::defaultConfiguration(); } /** * {@inheritdoc} */ 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'], ]; return $form; } /** * {@inheritdoc} */ 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']; } } /** * {@inheritdoc} */ public function buildPaymentInstructions(PaymentInterface $payment) { $instructions = []; if (!empty($this->configuration['instructions']['value'])) { $instructions = [ '#type' => 'processed_text', '#text' => $this->configuration['instructions']['value'], '#format' => $this->configuration['instructions']['format'], ]; } return $instructions; } /** * {@inheritdoc} */ public function buildPaymentOperations(PaymentInterface $payment) { $payment_state = $payment->getState()->value; $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; } /** * {@inheritdoc} */ public function createPayment(PaymentInterface $payment, $received = FALSE) { $this->assertPaymentState($payment, ['new']); $payment->state = $received ? 'completed' : 'pending'; $payment->save(); } /** * {@inheritdoc} */ public function receivePayment(PaymentInterface $payment, Price $amount = NULL) { $this->assertPaymentState($payment, ['pending']); // If not specified, use the entire amount. $amount = $amount ?: $payment->getAmount(); $payment->state = 'completed'; $payment->setAmount($amount); $payment->save(); } /** * {@inheritdoc} */ public function voidPayment(PaymentInterface $payment) { $this->assertPaymentState($payment, ['pending']); $payment->state = 'voided'; $payment->save(); } /** * {@inheritdoc} */ public function refundPayment(PaymentInterface $payment, Price $amount = NULL) { $this->assertPaymentState($payment, ['completed', 'partially_refunded']); // If not specified, refund the entire amount. $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(); } }