You are here

function commerce_coupon_usage_commerce_order_update in Commerce Coupon 7.2

Implements hook_commerce_order_update().

File

modules/usage/commerce_coupon_usage.module, line 400

Code

function commerce_coupon_usage_commerce_order_update($order) {
  if (!commerce_coupon_order_allows_coupons($order)) {
    return;
  }

  // This hook implementation mostly supports keeping track of coupon usage
  // as completed/pending orders are changed from the order admin UI.
  $unchanged = entity_metadata_wrapper('commerce_order', $order->original);
  $order_wrapper = entity_metadata_wrapper('commerce_order', $order);
  $statuses = commerce_coupon_usage_tracked_order_statuses();

  // Only handle usage for completed orders
  if (in_array($order->status, $statuses)) {

    // Add usage records for coupons present if coupon is present in current but
    // not original or if the original order was in a non-tracked status.
    foreach ($order_wrapper->commerce_coupons as $coupon_wrapper) {
      $coupon_id = $coupon_wrapper->coupon_id
        ->value();
      if (!$unchanged->commerce_coupons
        ->value() || !in_array($coupon_id, $unchanged->commerce_coupons
        ->raw()) || !in_array($unchanged->status
        ->value(), $statuses)) {

        // Never write a record for the same order and coupon twice.
        if (commerce_coupon_usage_record_exists($order->order_id, $coupon_id)) {
          continue;
        }
        $transaction_id = commerce_coupon_usage_transaction_write($coupon_id, $order->order_id);
        if (!$transaction_id) {
          drupal_set_message(t('You have exceeded the maximum usage settings for
            coupon %code. Its usage on this order has not been recorded - you must
            increase its maximum usage value, remove it from this order and add it again.', array(
            '%code' => $coupon_wrapper->code
              ->value(),
          )), 'warning');
        }
      }
    }

    // Remove usage records for coupons absent after update but present before.
    foreach ($unchanged->commerce_coupons as $coupon_wrapper) {
      $coupon_id = $coupon_wrapper->coupon_id
        ->value();
      if (!$order_wrapper->commerce_coupons
        ->value() || !in_array($coupon_id, $order_wrapper->commerce_coupons
        ->raw())) {
        $remove_coupon_ids[] = $coupon_id;
      }
    }
    if (isset($remove_coupon_ids)) {
      commerce_coupon_reset_usage(array(
        $order->order_id,
      ), $remove_coupon_ids);
    }
  }
  else {
    if (in_array($unchanged->status
      ->value(), $statuses)) {

      // If the order is moving out of a tracked status, reset its usage.
      commerce_coupon_reset_usage(array(
        $unchanged->order_id
          ->value(),
      ));
    }
  }
}