You are here

public function PaymentInformation::submitPaneForm in Commerce Core 8.2

Handles the submission of an pane form.

Parameters

array $pane_form: The pane form.

\Drupal\Core\Form\FormStateInterface $form_state: The form state of the parent form.

array $complete_form: The complete form structure.

Overrides CheckoutPaneBase::submitPaneForm

File

modules/payment/src/Plugin/Commerce/CheckoutPane/PaymentInformation.php, line 355

Class

PaymentInformation
Provides the payment information pane.

Namespace

Drupal\commerce_payment\Plugin\Commerce\CheckoutPane

Code

public function submitPaneForm(array &$pane_form, FormStateInterface $form_state, array &$complete_form) {
  if (isset($pane_form['billing_information']['#inline_form'])) {

    /** @var \Drupal\commerce\Plugin\Commerce\InlineForm\EntityInlineFormInterface $inline_form */
    $inline_form = $pane_form['billing_information']['#inline_form'];

    /** @var \Drupal\profile\Entity\ProfileInterface $billing_profile */
    $billing_profile = $inline_form
      ->getEntity();
    $this->order
      ->setBillingProfile($billing_profile);

    // The billing profile is provided either because the order is free,
    // or the selected gateway does not support stored payment methods.
    // If it's the former, stop here.
    if ($this->order
      ->isPaid() || $this->order
      ->getTotalPrice()
      ->isZero()) {
      return;
    }
  }
  $values = $form_state
    ->getValue($pane_form['#parents']);

  /** @var \Drupal\commerce_payment\PaymentOption $selected_option */
  $selected_option = $pane_form['#payment_options'][$values['payment_method']];

  /** @var \Drupal\commerce_payment\PaymentGatewayStorageInterface $payment_gateway_storage */
  $payment_gateway_storage = $this->entityTypeManager
    ->getStorage('commerce_payment_gateway');

  /** @var \Drupal\commerce_payment\Entity\PaymentGatewayInterface $payment_gateway */
  $payment_gateway = $payment_gateway_storage
    ->load($selected_option
    ->getPaymentGatewayId());
  if (!$payment_gateway) {
    return;
  }
  $payment_gateway_plugin = $payment_gateway
    ->getPlugin();
  if ($payment_gateway_plugin instanceof SupportsCreatingPaymentMethodsInterface) {
    if (!empty($selected_option
      ->getPaymentMethodTypeId())) {

      /** @var \Drupal\commerce\Plugin\Commerce\InlineForm\EntityInlineFormInterface $inline_form */
      $inline_form = $pane_form['add_payment_method']['#inline_form'];

      // The payment method was just created.
      $payment_method = $inline_form
        ->getEntity();
    }
    else {

      /** @var \Drupal\commerce_payment\PaymentMethodStorageInterface $payment_method_storage */
      $payment_method_storage = $this->entityTypeManager
        ->getStorage('commerce_payment_method');
      $payment_method = $payment_method_storage
        ->load($selected_option
        ->getPaymentMethodId());
    }

    /** @var \Drupal\commerce_payment\Entity\PaymentMethodInterface $payment_method */
    $this->order
      ->set('payment_gateway', $payment_method
      ->getPaymentGateway());
    $this->order
      ->set('payment_method', $payment_method);

    // Copy the billing information to the order.
    $payment_method_profile = $payment_method
      ->getBillingProfile();
    if ($payment_method_profile) {
      $billing_profile = $this->order
        ->getBillingProfile();
      if (!$billing_profile) {
        $billing_profile = $this->entityTypeManager
          ->getStorage('profile')
          ->create([
          'type' => 'customer',
          'uid' => 0,
        ]);
      }
      $billing_profile
        ->populateFromProfile($payment_method_profile);

      // The data field is not copied by default but needs to be.
      // For example, both profiles need to have an address_book_profile_id.
      $billing_profile
        ->populateFromProfile($payment_method_profile, [
        'data',
      ]);
      $billing_profile
        ->save();
      $this->order
        ->setBillingProfile($billing_profile);
    }
  }
  elseif ($payment_gateway_plugin instanceof SupportsStoredPaymentMethodsInterface) {
    if ($selected_option
      ->getPaymentMethodId()) {

      /** @var \Drupal\commerce_payment\PaymentMethodStorageInterface $payment_method_storage */
      $payment_method_storage = $this->entityTypeManager
        ->getStorage('commerce_payment_method');
      $payment_method = $payment_method_storage
        ->load($selected_option
        ->getPaymentMethodId());
      assert($payment_method instanceof PaymentMethodInterface);

      /** @var \Drupal\commerce_payment\Entity\PaymentMethodInterface $payment_method */
      $this->order
        ->set('payment_gateway', $payment_method
        ->getPaymentGateway());
      $this->order
        ->set('payment_method', $payment_method);
      $this->order
        ->setBillingProfile($payment_method
        ->getBillingProfile());
    }
    else {
      $this->order
        ->set('payment_gateway', $payment_gateway);
      $this->order
        ->set('payment_method', NULL);
    }
  }
  else {
    $this->order
      ->set('payment_gateway', $payment_gateway);
    $this->order
      ->set('payment_method', NULL);
  }
}