You are here

function get_codeless_discounts_for_product_and_quantity in Ubercart Discounts (Alternative) 6.2

Returns all codeless discounts for product when specified quantity is purchased.

Parameters

$product_id Node ID for product:

2 calls to get_codeless_discounts_for_product_and_quantity()
get_codeless_discounts_for_product in uc_discounts/uc_discounts.module
Returns all codeless discounts for product.
uc_discounts_get_discounted_price_for_product in uc_discounts/uc_discounts.module
Helper function that gets the codeless discounted price of a product

File

uc_discounts/uc_discounts.module, line 1851

Code

function get_codeless_discounts_for_product_and_quantity($product, $quantity = NULL, $sort_column = "weight", $is_ascending_sort = TRUE) {
  if (is_null($product) || !$product) {
    return array();
  }

  //If quantity was specified
  if (!is_null($quantity)) {
    global $user;

    //Create phony order and get discounts for order
    $product->price = $product->sell_price;
    $product->qty = $quantity;
    $order = new stdClass();
    $order->uid = $user->uid;
    $order->products = array(
      $product,
    );
    return get_discounts_for_order($order);
  }

  //Otherwise make special query

  //Get terms for product
  $term_ids = array();
  $term_ids[] = ALL_TERMS;
  $result = db_query("SELECT DISTINCT tid FROM {term_node} WHERE nid=%d", $product->nid);
  while ($row = db_fetch_array($result)) {
    $term_ids[] = $row["tid"];
  }

  //Get SKUs for product
  $skus = array();
  $skus[] = "'" . db_escape_string(ALL_SKUS) . "'";
  $result = db_query("SELECT DISTINCT model FROM {uc_products} WHERE nid=%d", $product->nid);
  while ($row = db_fetch_array($result)) {
    $skus[] = "'" . db_escape_string($row["model"]) . "'";
  }

  //Get classes for product
  $classes = array();
  $classes[] = "'" . db_escape_string(ALL_CLASSES) . "'";
  $result = db_query("SELECT DISTINCT type FROM {node} WHERE nid=%d", $product->nid);
  while ($row = db_fetch_array($result)) {
    $classes[] = "'" . db_escape_string($row["type"]) . "'";
  }

  //Get uids for product
  $authors = array();
  $authors[] = "'" . db_escape_string(ALL_AUTHORS) . "'";
  $result = db_query("SELECT DISTINCT uid FROM {node} WHERE nid=%d", $product->nid);
  while ($row = db_fetch_array($result)) {
    $authors[] = "'" . db_escape_string($row["uid"]) . "'";
  }

  //Create roles clause
  global $user;
  $auth_rid = $user->uid != 0 ? DRUPAL_AUTHENTICATED_RID : DRUPAL_ANONYMOUS_RID;
  $roles_clause = sprintf(" OR d.discount_id IN(SELECT dr.discount_id FROM {uc_discounts_roles} dr" . ", {users_roles} ur WHERE (dr.role_id=ur.rid AND ur.uid=%d) OR dr.role_id=%d OR dr.role_id=%d)", $user->uid, ALL_ROLES, $auth_rid);
  $product_ids = array(
    ALL_PRODUCTS,
    $product->nid,
  );
  $product_ids_clause = sprintf("d.filter_type<>%d OR dp.product_id IN(%s)", FILTER_TYPE_PRODUCTS, join(",", $product_ids));
  $term_ids_clause = sprintf("d.filter_type<>%d OR dt.term_id IN(%s)", FILTER_TYPE_TERMS, join(",", $term_ids));
  $skus_clause = sprintf("d.filter_type<>%d OR ds.sku IN(%s)", FILTER_TYPE_SKUS, join(",", $skus));
  $classes_clause = sprintf("d.filter_type<>%d OR dcl.class IN(%s)", FILTER_TYPE_CLASS, join(",", $classes));
  $authors_clause = sprintf("d.filter_type<>%d OR dau.author_id IN(%s)", FILTER_TYPE_AUTHORS, join(",", $authors));
  $sort_order_string = is_ascending_sort ? "ASC" : "DESC";
  $grouping = DISCOUNT_FILTER_GROUPING_APPLICATION;
  $query = sprintf("SELECT d.* FROM {uc_discounts} d\n    LEFT JOIN {uc_discounts_products} dp ON d.discount_id = dp.discount_id AND dp.grouping = {$grouping}\n    LEFT JOIN {uc_discounts_terms} dt ON d.discount_id = dt.discount_id AND dt.grouping = {$grouping}\n    LEFT JOIN {uc_discounts_skus} ds ON d.discount_id = ds.discount_id AND ds.grouping = {$grouping}\n    LEFT JOIN {uc_discounts_classes} dcl ON d.discount_id = dcl.discount_id AND dcl.grouping = {$grouping}\n    LEFT JOIN {uc_discounts_authors} dau ON d.discount_id = dau.discount_id AND dau.grouping = {$grouping}\n    WHERE d.requires_code = 0\n    AND (d.has_role_filter = 0%s)\n    AND (%s)\n    AND (%s)\n    AND (%s)\n    AND (%s)\n    AND (%s)\n    AND (d.has_activation = 0 OR d.activates_on < %d)\n    AND (d.has_expiration = 0 OR d.expiration > %d)\n    AND (d.is_active = %d)\n    ORDER BY d.%s %s", $roles_clause, $product_ids_clause, $term_ids_clause, $skus_clause, $classes_clause, $authors_clause, time(), time(), IS_ACTIVE, $sort_column, $sort_order_string);
  $result = db_query($query);
  $discounts = array();
  while ($discount = db_fetch_object($result)) {
    $discounts[] = $discount;
  }
  return $discounts;
}