function uc_coupon_find in Ubercart Discount Coupons 7.3
Same name and namespace in other branches
- 5 uc_coupon.module \uc_coupon_find()
 - 6 uc_coupon.module \uc_coupon_find()
 - 7.2 uc_coupon.module \uc_coupon_find()
 
Load a coupon (single or bulk) from the supplied code.
Parameters
$code: The coupon code to search for.
$reset: If TRUE the cache of codes for this request will be purged. Any function which modifies a coupon should purge the cache.
8 calls to uc_coupon_find()
- hook_uc_coupon_validate in ./
uc_coupon.api.php  - Add extra validation to a coupon.
 - uc_coupon_calculate_discounts in ./
uc_coupon.module  - Find items that a coupon will apply to and calculate the discounts.
 - uc_coupon_form_submit in ./
uc_coupon.module  - Submit handler for the uc_coupon form.
 - uc_coupon_get_order_coupons in ./
uc_coupon.module  - Gets the fully validated coupon objects that have been applied to this order.
 - uc_coupon_recurring_recurring_renewal_pending in uc_coupon_recurring/
uc_coupon_recurring.module  - Implements hook_recurring_renewal_pending().
 
File
- ./
uc_coupon.module, line 377  - Provides discount codes and gift certificates for Ubercart.
 
Code
function uc_coupon_find($code, $reset = FALSE) {
  // This is expensive and can be called many times during coupon processing, so we
  // use a simple static cache.
  static $cached = array();
  if ($reset) {
    $cached = array();
  }
  if (!$code) {
    return FALSE;
  }
  elseif (array_key_exists($code, $cached)) {
    return $cached[$code];
  }
  // Look for matching single coupon first.
  $coupon = db_query("SELECT cid FROM {uc_coupons}\n    WHERE code = :code AND status = 1 AND bulk = 0 AND valid_from < :now AND (valid_until = 0 OR valid_until > :now)", array(
    ':code' => $code,
    ':now' => REQUEST_TIME,
  ))
    ->fetchObject();
  if ($coupon) {
    $cached[$code] = uc_coupon_load($coupon->cid);
    return $cached[$code];
  }
  // Look through bulk coupons.
  $result = db_query("SELECT cid, code, data, bulk_seed FROM {uc_coupons}\n    WHERE status = 1 AND bulk = 1 AND valid_from < :now AND (valid_until = 0 OR valid_until > :now)", array(
    ':now' => REQUEST_TIME,
  ));
  foreach ($result as $coupon) {
    // Check coupon prefix.
    $prefix_length = strlen($coupon->code);
    if (substr($code, 0, $prefix_length) != $coupon->code) {
      continue;
    }
    if ($coupon->data) {
      $coupon->data = unserialize($coupon->data);
    }
    // Check coupon sequence ID.
    $id = substr($code, $prefix_length, strlen(dechex($coupon->data['bulk_number'])));
    if (!preg_match("/^[0-9A-F]+\$/", $id)) {
      continue;
    }
    $id = hexdec($id);
    if ($id < 0 || $id > $coupon->data['bulk_number']) {
      continue;
    }
    // Check complete coupon code.
    if ($code == uc_coupon_get_bulk_code($coupon, $id)) {
      $cached[$code] = uc_coupon_load($coupon->cid, TRUE);
      return $cached[$code];
    }
  }
  $cached[$code] = FALSE;
  return $cached[$code];
}