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;
}