$ Promotion-> Apply ($ Order) funktioniert nicht

6

Ich habe ein Einlösungsformular, in das ich einen Gutscheincode eingeben möchte. Anschließend sollte automatisch eine Bestellung erstellt werden. Anschließend wird der Gutscheincode auch auf die Bestellung angewendet.

Die Bestellung wird erfolgreich erstellt, $promotion->apply($order)funktioniert aber nicht.

Geben Sie hier die Bildbeschreibung ein

Wie Sie im Bild oben sehen können, habe ich eine Aktion mit Gutscheincode Z-8FDA5A218B44. Im Bedingungsbereich ist diese Aktion auf ein Produkt namens beschränkt Monthly.

Ich möchte ein Einlösungsformular erstellen, in dem, wenn ein Benutzer einen Gutscheincode eingibt, automatisch eine Bestellung und ein Bestellartikel erstellt werden, der mein Produkt enthält (monatlich). (Bild unten)

Geben Sie hier die Bildbeschreibung ein Wie Sie sehen können, wenn ich das Einlösungsformular mit einem Gutscheincode abschicke, wird eine Bestellung erstellt, aber ich möchte den Gutscheincode auch auf die Bestellung anwenden.

Hier ist mein Code:

namespace Drupal\my_subscription\Form;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Session\AccountProxy;
use Drupal\commerce_product\Plugin\Commerce\Condition\OrderItemProduct as OrderItemProductCondition;
use Drupal\commerce_order\Entity\Order;
use Drupal\commerce_product\Entity\ProductVariation;


/**
 * Class RedemptionForm.
 *
 * @package Drupal\my_subscription\Form
 */
class RedemptionForm extends FormBase {

  /**
   * Drupal\Core\Session\AccountProxy definition.
   *
   * @var \Drupal\Core\Session\AccountProxy
   */
  protected $currentUser;

  public function __construct(
    AccountProxy $current_user
  ) {
    $this->currentUser = $current_user;
  }

  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('current_user')
    );
  }


  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    return 'meditation_redemption_form';
  }

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $form['coupon_code'] = [
      '#type' => 'textfield',
      '#title' => t('Coupon code'),
      '#description' => t('Enter your coupon code to redeem a promotion.'),
    ];

    $form['submit'] = [
      '#type' => 'submit',
      '#value' => $this->t('Submit'),
    ];

    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function validateForm(array &$form, FormStateInterface $form_state) {
    $coupon_code = $form_state->getValue('coupon_code');
    /** @var \Drupal\commerce_promotion\CouponStorageInterface $coupon_storage */
    $coupon_storage = \Drupal::entityTypeManager()->getStorage('commerce_promotion_coupon');

    $coupon = $coupon_storage->loadByCode($coupon_code);
    if (empty($coupon)) {
      $form_state->setErrorByName('coupon_code', t('The provided coupon code is invalid.'));
      return;
    }
    else {
      $form_state->set('coupon', $coupon);
    }
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    /** @var \Drupal\commerce_promotion\Entity\Coupon $coupon */
    $coupon = $form_state->get('coupon');
    /** @var \Drupal\commerce_promotion\Entity\Promotion $promotion */
    $promotion = $coupon->getPromotion();

    $conditions = $promotion->getConditions();
    if ($conditions[0] instanceof OrderItemProductCondition) {
      $uid = $this->currentUser->id();

      $configuration = $conditions[0]->getConfiguration();
      $subscription_product_id = $configuration['products'][0]['product_id'];

      $subscription = ProductVariation::load($subscription_product_id);

      $order_item_storage = \Drupal::entityManager()->getStorage('commerce_order_item');

      $order_item = $order_item_storage->createFromPurchasableEntity($subscription, [
        'quantity' => 1,
      ]);

      /** @var \Drupal\commerce_order\Entity\Order $order */
      $order = Order::create([
        'type' => 'default',
      ]);
      $order->addItem($order_item);
      $order->setCustomerId($uid);
      $order->set('store_id', 1);
      $order->save();
      ///** @var  \Drupal\commerce_ORDER\OrderAssignment $order_assignment */
      //$order_assignment = \Drupal::service('commerce_order.order_assignment');
      //$order_assignment->assign($order, $account);

      if ($coupon->available($order) && $promotion->applies($order)) {
        $promotion->apply($order);
      }
    }

  }

}
Iman Kiani
quelle
2
Schlägt es aufgrund des verfügbaren und angewendeten Schecks fehl, trifft es tatsächlich nicht zu? Versuchen Sie auch, die Aktualisierung beim nächsten Laden
festzulegen
Lieber @MattGlaman, sowohl verfügbar als auch gültig sind bestanden. Und was meinst du mit Aktualisieren?
Iman Kiani

Antworten:

1

Hallo, ich bin vielleicht TLTTP, aber es scheint, dass Ihre Implementierung richtig ist (vorausgesetzt, Sie sagen, sie besteht die verfügbaren und wendet Prüfungen an). Ich denke, das Problem ist, dass Sie die Bestellung nicht speichern, nachdem die Aktion angewendet wurde.

...
if ($coupon->available($order) && $promotion->applies($order)) {
    $promotion->apply($order);
    $order->save();
}
...

Auch als @ matt-glaman schlägt vor , sollten Sie aktualisieren den Auftrag so der Endpreis aktualisiert wird.

...
if ($coupon->available($order) && $promotion->applies($order)) {
    $promotion->apply($order);
    // Recalculates total price of the order including any adjustment
    // to the order or it's order items.
    $order->recalculateTotalPrice();
    // Persist any changes applied to the order.
    $order->save();
}
...
d70rr3s
quelle