You are here

function uc_discounts_get_codeless_discounts_for_product_and_quantity in Ubercart Discounts (Alternative) 7.2

Returns codeless discounts that apply to product with specified quantity.

Parameters

object $product: Loaded ubercart product.

int $quantity:

string $sort_column: Column name on which to sort the discounts.

bool $is_ascending_sort: TRUE sorts ascending.

Return value

array Array of discount IDs

2 calls to uc_discounts_get_codeless_discounts_for_product_and_quantity()
uc_discounts_get_codeless_discounts_for_product in uc_discounts/uc_discounts.module
Returns all codeless discounts that apply to a 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 2074

Code

function uc_discounts_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,
    );

    // @todo - Change this so that a phony order is not required.
    $results = uc_discounts_get_discounts_for_order($order);
    return $results['discounts'];
  }

  // Otherwise make special query.
  // Get terms for product.
  $term_ids = array();
  $term_ids[] = UC_DISCOUNTS_OPTION_ALL_TERMS;
  $result = db_query("SELECT DISTINCT tid FROM {taxonomy_index} WHERE nid = :nid", array(
    ':nid' => $product->nid,
  ));
  foreach ($result as $row) {
    $term_ids[] = $row->tid;
  }

  // Get SKUs for product.
  $skus = array();
  $skus[] = "'" . UC_DISCOUNTS_OPTION_ALL_SKUS . "'";
  $result = db_query("SELECT DISTINCT model FROM {uc_products} WHERE nid = :nid", array(
    ':nid' => $product->nid,
  ));
  foreach ($result as $row) {
    $skus[] = "'" . $row->model . "'";
  }

  // Get classes for product.
  $classes = array();
  $classes[] = "'" . UC_DISCOUNTS_OPTION_ALL_CLASSES . "'";
  $result = db_query("SELECT DISTINCT type FROM {node} WHERE nid = :nid", array(
    ':nid' => $product->nid,
  ));
  foreach ($result as $row) {
    $classes[] = "'" . $row->type . "'";
  }

  // Get uids for product.
  $authors = array();
  $authors[] = "'" . UC_DISCOUNTS_OPTION_ALL_AUTHORS . "'";
  $result = db_query("SELECT DISTINCT uid FROM {node} WHERE nid = :nid", array(
    ':nid' => $product->nid,
  ));
  foreach ($result as $row) {
    $authors[] = "'" . $row->uid . "'";
  }

  // Create roles clause.
  global $user;
  $auth_rid = $user->uid != 0 ? DRUPAL_AUTHENTICATED_RID : DRUPAL_ANONYMOUS_RID;
  $roles_clause = sprintf("d.has_role_filter = 0 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, UC_DISCOUNTS_OPTION_ALL_ROLES, $auth_rid);
  $product_ids = array(
    UC_DISCOUNTS_OPTION_ALL_PRODUCTS,
    $product->nid,
  );
  $product_ids_clause = sprintf("d.filter_type<>%d OR dp.product_id IN(%s)", UC_DISCOUNTS_FILTER_TYPE_PRODUCTS, implode(",", $product_ids));
  $term_ids_clause = sprintf("d.filter_type<>%d OR dt.term_id IN(%s)", UC_DISCOUNTS_FILTER_TYPE_TERMS, implode(",", $term_ids));
  $skus_clause = sprintf("d.filter_type<>%d OR ds.sku IN(%s)", UC_DISCOUNTS_FILTER_TYPE_SKUS, implode(",", $skus));
  $classes_clause = sprintf("d.filter_type<>%d OR dcl.class IN(%s)", UC_DISCOUNTS_FILTER_TYPE_CLASS, implode(",", $classes));
  $authors_clause = sprintf("d.filter_type<>%d OR dau.author_id IN(%s)", UC_DISCOUNTS_FILTER_TYPE_AUTHORS, implode(",", $authors));
  $sort_order_string = $is_ascending_sort ? "ASC" : "DESC";
  $grouping = UC_DISCOUNTS_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 (%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, REQUEST_TIME, REQUEST_TIME, UC_DISCOUNTS_DISCOUNT_ACTIVE, $sort_column, $sort_order_string);

  // TODO Please convert this statement to the D7 database API syntax.
  $result = db_query($query);
  $discounts = array();
  foreach ($result as $discount) {
    $discounts[] = $discount;
  }
  return $discounts;
}