You are here

function commerce_promotion_post_update_6 in Commerce Core 8.2

Update offers and conditions.

File

modules/promotion/commerce_promotion.post_update.php, line 92
Post update functions for Promotion.

Code

function commerce_promotion_post_update_6(&$sandbox = NULL) {
  $promotion_storage = \Drupal::entityTypeManager()
    ->getStorage('commerce_promotion');
  if (!isset($sandbox['current_count'])) {
    $query = $promotion_storage
      ->getQuery();
    $sandbox['total_count'] = $query
      ->count()
      ->execute();
    $sandbox['current_count'] = 0;
    if (empty($sandbox['total_count'])) {
      $sandbox['#finished'] = 1;
      return;
    }
  }
  $query = $promotion_storage
    ->getQuery();
  $query
    ->range($sandbox['current_count'], 25);
  $result = $query
    ->execute();
  if (empty($result)) {
    $sandbox['#finished'] = 1;
    return;
  }

  /** @var \Drupal\commerce_promotion\Entity\PromotionInterface[] $promotions */
  $promotions = $promotion_storage
    ->loadMultiple($result);
  foreach ($promotions as $promotion) {
    $needs_save = FALSE;
    $conditions = $promotion
      ->get('conditions')
      ->getValue();
    foreach ($conditions as &$condition_item) {
      if ($condition_item['target_plugin_id'] == 'commerce_promotion_order_total_price') {
        $condition_item['target_plugin_id'] = 'order_total_price';

        // Remove data added by the old conditions API.
        unset($condition_item['target_plugin_configuration']['id']);
        unset($condition_item['target_plugin_configuration']['negate']);
        $needs_save = TRUE;
      }
    }
    $offer = $promotion
      ->get('offer')
      ->first()
      ->getValue();
    if ($offer['target_plugin_id'] == 'commerce_promotion_order_percentage_off') {
      $offer['target_plugin_id'] = 'order_percentage_off';
      $needs_save = TRUE;
    }
    elseif ($offer['target_plugin_id'] = 'commerce_promotion_product_percentage_off') {
      $offer['target_plugin_id'] = 'order_item_percentage_off';

      // The product_id setting has been removed and needs to be migrated to a condition.
      $product_id = $offer['target_plugin_configuration']['product_id'];
      unset($offer['target_plugin_configuration']['product_id']);
      $has_existing_condition = FALSE;
      foreach ($conditions as &$condition_item) {
        if ($condition_item['target_plugin_id'] == 'order_item_product') {
          $condition_item['target_plugin_configuration']['products'][] = [
            'product_id' => $product_id,
          ];
          $condition_item['target_plugin_configuration']['products'] = array_unique($condition_item['target_plugin_configuration']['products']);
          $has_existing_condition = TRUE;
        }
      }
      if (!$has_existing_condition) {
        $conditions[] = [
          'target_plugin_id' => 'order_item_product',
          'target_plugin_configuration' => [
            'products' => [
              [
                'product_id' => $product_id,
              ],
            ],
          ],
        ];
      }
      $needs_save = TRUE;
    }
    if ($needs_save) {
      $promotion
        ->set('offer', $offer);
      $promotion
        ->set('conditions', $conditions);
      $promotion
        ->save();
    }
  }
  $sandbox['current_count'] += 25;
  if ($sandbox['current_count'] >= $sandbox['total_count']) {
    $sandbox['#finished'] = 1;
  }
  else {
    $sandbox['#finished'] = ($sandbox['total_count'] - $sandbox['current_count']) / $sandbox['total_count'];
  }
}