You are here

function _commerce_coupon_update_coupons_multipass in Commerce Coupon 7.2

Update four coupons at a time.

Parameters

array $sandbox: A persistent context store for batch updates.

1 call to _commerce_coupon_update_coupons_multipass()
commerce_coupon_update_7200 in ./commerce_coupon.install
Upgrade a Coupons 1.x site to 2.x. MAKE A BACKUP BEFORE DOING THIS.

File

includes/commerce_coupon.update.inc, line 20
1.x to 2.x update coverage.

Code

function _commerce_coupon_update_coupons_multipass(array &$sandbox, $drush) {
  if (!isset($sandbox['coupons']['progress'])) {
    $sandbox['coupons']['progress'] = 0;
    $sandbox['coupons']['current_id'] = 0;
    $sandbox['coupons']['max'] = db_query('SELECT COUNT(DISTINCT coupon_id) FROM {commerce_coupon}')
      ->fetchField();
  }

  // Get the next four coupon ids.
  $coupon_ids = db_select('commerce_coupon', 'c')
    ->fields('c', array(
    'coupon_id',
  ))
    ->condition('coupon_id', $sandbox['coupons']['current_id'], '>')
    ->range(0, COMMERCE_COUPON_COUPON_IMPORT_RATE)
    ->orderBy('coupon_id', 'ASC')
    ->execute()
    ->fetchCol();

  // Update the coupons.
  if ($coupon_ids) {
    $coupons = commerce_coupon_load_multiple($coupon_ids);
    foreach ($coupons as $coupon) {
      $original_coupon = clone $coupon;
      $coupon_wrapper = entity_metadata_wrapper('commerce_coupon', $coupon);

      // Update code column.
      if (empty($coupon->code)) {
        $code = $coupon_wrapper->commerce_coupon_code
          ->value();
        $coupon->code = $code;
      }

      // Find update information about this coupon type.
      $parameters = module_invoke_all('commerce_coupon_legacy_mapping', $coupon);
      if (!empty($parameters)) {

        // Determine if there is a suitable discount to use.
        $query = new EntityFieldQuery();
        $results = $query
          ->entityCondition('entity_type', 'commerce_discount')
          ->propertyCondition('type', 'order_discount')
          ->propertyCondition('name', $parameters['discount name'])
          ->execute();

        // Load matching discount.
        if (!empty($results['commerce_discount'])) {
          $discount_ids = array_keys($results['commerce_discount']);
          $discounts = entity_load('commerce_discount', $discount_ids);
          $discount = reset($discounts);
        }
        else {

          // Discount not found - create and save offer.
          $offer = entity_create('commerce_discount_offer', array(
            'type' => $parameters['offer type'],
          ));
          $offer_field = $parameters['offer field'];
          $offer_wrapper = entity_metadata_wrapper('commerce_discount_offer', $offer);
          $offer_wrapper->{$offer_field} = $parameters['offer value'];
          $offer_wrapper
            ->save();

          // Create and save discount.
          $discount = entity_create('commerce_discount', array(
            'type' => 'order_discount',
            'name' => $parameters['discount name'],
            'label' => $parameters['label'],
            'component_title' => $parameters['label'],
          ));
          $discount_wrapper = entity_metadata_wrapper('commerce_discount', $discount);

          // Set offer reference.
          $discount_wrapper->commerce_discount_offer = $offer;
          $discount_wrapper
            ->save();
        }
        if ($discount) {
          $conditions = array();
          if (module_exists('commerce_coupon_usage') && !empty($coupon->commerce_coupon_number_of_uses)) {

            // Add an inline condition for number of uses.
            $conditions[] = array(
              'condition_name' => 'commerce_coupon_usage_evaluate_usage',
              'condition_settings' => array(
                'max_usage' => $coupon_wrapper->commerce_coupon_number_of_uses
                  ->value(),
              ),
            );
          }

          // Set the bundle now.
          $coupon->type = 'discount_coupon';

          // Set inline conditions field. The wrapper just gets too confused here
          // b/c of the bundle change so we do not use it.
          if (!empty($conditions)) {
            $lang = field_language('commerce_coupon', $coupon, 'commerce_coupon_conditions');
            $coupon->commerce_coupon_conditions[$lang] = $conditions;
          }

          // Set discount reference and save.
          $lang = field_language('commerce_coupon', $coupon, 'commerce_discount_reference');
          $coupon->commerce_discount_reference[$lang][] = array(
            'target_id' => $discount->discount_id,
          );

          // Allow other modules to alter the coupon before it is saved.
          drupal_alter('commerce_coupon_update_pre_update', $original_coupon, $coupon, $discount);
          commerce_coupon_save($coupon);
        }
      }
      $sandbox['coupons']['progress']++;
      $sandbox['coupons']['current_id'] = $coupon->coupon_id;
    }
    if ($drush) {
      drush_print(t('Processed @n coupons', array(
        '@n' => count($coupon_ids),
      )));
    }
  }
  else {
    $sandbox['coupons']['#finished'] = 1;
  }
  $sandbox['coupons']['#finished'] = empty($sandbox['coupons']['max']) ? 1 : $sandbox['coupons']['progress'] / $sandbox['coupons']['max'];
}