? .svn
? product_discount.patch
? discounts/.svn
Index: uc_discounts.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/uc_discounts/uc_discounts.module,v
retrieving revision 1.1.2.20
diff -p -U8 -r1.1.2.20 uc_discounts.module
--- uc_discounts.module	5 Nov 2008 07:57:29 -0000	1.1.2.20
+++ uc_discounts.module	13 Dec 2008 02:05:28 -0000
@@ -531,27 +531,28 @@ function uc_discounts_apply_discounts($p
         $condition_groups[$condition->condition_group] = $check_callback($condition, $total_price, $cart_copy);
 //drupal_set_message("condition group status: ".$condition_groups[$condition->condition_group]);
       }
       if (isset($condition_info[$condition->property]['count_callback'])) {
         $count_callback = $condition_info[$condition->property]['count_callback'];
         $condition_counts[$condition->condition_group] += $count_callback($condition, $cart_copy);
       }
 
-      foreach ($condition_groups as $i => $check) {
-        $c = isset($condition_counts[$i]) ? $condition_counts[$i] : false;
-        if ($c === false) { }
-        elseif ($condition->op == '=' && $c == $condition->value) { $condition_groups[$i] = TRUE; }
-        elseif ($condition->op == '!=' && $c != $condition->value) { $condition_groups[$i] = TRUE; }
-        elseif ($condition->op == '>=' && $c >= $condition->value) { $condition_groups[$i] = TRUE; }
-        elseif ($condition->op == '>' && $c > $condition->value) { $condition_groups[$i] = TRUE; }
-        elseif ($condition->op == '<=' && $c <= $condition->value) { $condition_groups[$i] = TRUE; }
-        elseif ($condition->op == '<' && $c < $condition->value) { $condition_groups[$i] = TRUE; }
-        else { $condition_groups[$i] = FALSE; }
-      }
+      // This code seems redundant and possibly destructive, as modules should define their own "valid/invalid" function
+      //foreach ($condition_groups as $i => $check) {
+      //  $c = isset($condition_counts[$i]) ? $condition_counts[$i] : false;
+      //  if ($c === false) { }
+      //  elseif ($condition->op == '=' && $c == $condition->value) { $condition_groups[$i] = TRUE; }
+      //  elseif ($condition->op == '!=' && $c != $condition->value) { $condition_groups[$i] = TRUE; }
+      //  elseif ($condition->op == '>=' && $c >= $condition->value) { $condition_groups[$i] = TRUE; }
+      //  elseif ($condition->op == '>' && $c > $condition->value) { $condition_groups[$i] = TRUE; }
+      //  elseif ($condition->op == '<=' && $c <= $condition->value) { $condition_groups[$i] = TRUE; }
+      //  elseif ($condition->op == '<' && $c < $condition->value) { $condition_groups[$i] = TRUE; }
+      //  else { $condition_groups[$i] = FALSE; }
+      //}
     }
 
     // did any condition groups match
     if (array_search(TRUE, $condition_groups) !== FALSE) {
 //drupal_set_message("condition group matches");
       $action_list = uc_discounts_get_discount_actions($discount->id);
       foreach ($action_list as $action) {
         if (!isset($action_info[$action->property]['apply_callback'])) {
Index: discounts/uc_discounts_product.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/uc_discounts/discounts/uc_discounts_product.module,v
retrieving revision 1.1.2.5
diff -p -U8 -r1.1.2.5 uc_discounts_product.module
--- discounts/uc_discounts_product.module	1 Nov 2008 00:22:47 -0000	1.1.2.5
+++ discounts/uc_discounts_product.module	13 Dec 2008 02:05:28 -0000
@@ -19,17 +19,17 @@ function uc_discounts_product_discounts_
 
   return $conditions;
 }
 
 function uc_discounts_product_discounts_action() {
   $actions[] = array(
     'property' => 'product_from_order',
     'description' => t('Discount product price from order'),
-    'has_qty_field' => FALSE,
+    'has_qty_field' => TRUE,
     'item_field_callback' => 'uc_discounts_product_item_field', //recycle
     'item_name_callback' => 'uc_discounts_product_item_name', //recycle
     'apply_callback' => 'uc_discounts_product_apply',
   );
 
   return $actions;
 }
 
@@ -127,90 +127,90 @@ function uc_discounts_product_value_fiel
     '#maxlength' => 12,
     '#size' => 6,
     '#required' => TRUE,
   );
   return $field;
 }
 
 function uc_discounts_product_apply($op, $action, $total_price, &$cart) {
-  // get conditions to make sure products can't be used more than once for
-  $sql = "SELECT * FROM {uc_discounts_conditions} WHERE discount_id=%d ";
-  $sql .= "ORDER BY condition_group, weight";
-  $result = db_query($sql, $action->discount_id, $action->item_id);
 
-  $condition_list = array();
-  while ($row = db_fetch_object($result)) {
-    $condition_list[$row->id] = $row;
-  }
-
-  if (empty($condition_list)) {
-    return 0;
-  }
-
-  $condition_found = FALSE;
-  $product_price = 0;
+  // Grab the discount information
+  $discount = uc_discounts_load_discount($action->discount_id);
+  $conditions = uc_discounts_get_discount_conditions($discount->id);
+  $iterations = null;
+  $qty = 0;
+  $price = 0;
+  $products = array();
+  $unitQuantity = $action->qty;
+  
+  //If we don't have a quantity to work with, we should apply the discount to all units.
+  if ($unitQuantity == null || $unitQuantity == '' || $unitQuantity == 0) {
+  	$unitQuantity = 1;
+  }
+  
+  
+  // Loop through the cart to get the product amount and quantity
   foreach ($cart as $index => $product) {
-    // has the condition already been satisified
-    if (empty($condition_found)) {
-      foreach ($condition_list as $condition) {
-        if ($product->nid == intval($condition->item_id)) {
-          // product id (or type) matches condition item
-          $required_qty = $condition->value;
-          if ($condition->item_id == intval($action->item_id)) {
-            // condition item and action item are the same
-            $product_price = $product->price;
-          }
-        }
-      }
-    }
-
-    if ($product_price && $condition_found) {
-      // condition and action have been found
-      break;
-    }
     if ($product->nid == $action->item_id) {
-      $qty = $product->qty;
-        $product_found[$index] = $product->qty;
-        $product_count += $product->qty;
-        $product_price = $product->price;
-        continue;
+      $qty += intval($product->qty);
+      $price = $product->price;
     }
+    
+    $products[$product->nid] += $product->qty;
   }
-
-  if (empty($product_price)) {
+  
+  if (count($conditions) == 0 || $price == 0) {
+    drupal_set_message(t('Cannot apply product discount with no conditions or no price', 'error'));
     return 0;
   }
-
-  // calculate discount amount
+  
+  
+  // Determine if we should apply a percentage discount or a dollar one.
   if (substr($action->amount, -1) == '%') {
-    $discount_percent = substr($action->amount, 0, -1) / 100;
-    if ($discount_percent > 1) {
-      // invalid percentage
+    $discount = substr($action->amount, 0, -1);
+    
+    if ($discount > 100) {
       drupal_set_message(t('Cannot apply product discount greater than 100%', 'error'));
-      $discount_percent = 0;
-    }
-
-    if ($action->qty != 0) {
-      $qty = $action->qty;
-    }
-    $discount = $product_price * ($discount_percent * $qty);
-  }
-  else {
-    if (substr($action->amount, 0, 1) == '$') {
-      $discount_amount = substr($action->amount, 1);
+      return 0;
     }
-    else {
-      $discount_amount = $action->amount;
-    }
-    if ($discount_amount > $product_price) {
-      // do not allow discounting greater than the product price
-      $discount_amount = $product_price;
-    }
-    $discount = $discount_amount * $product_count;
-  }
-  // no refunds
-  if ($discount > $total_price) {
-    $discount = $total_price;
-  }
-
-  return $discount;
+    $discount = (($discount / 100) * $price) * $unitQuantity;
+    
+  } else {
+    $discount = $action->amount;
+    if (substr($discount, 0, 1) == '$') {
+      $discount = substr($discount, 1);
+    }
+    
+    if ($discount >= $price) {
+      drupal_set_message(t('Cannot apply product discount greater than price.', 'error'));
+      return 0;
+    }
+    
+    $discount = $discount * $unitQuantity;
+  }
+  
+  // determine the maximum number of iterations (through values or max discounts)
+  foreach ($conditions as $condition) {
+    $curIteration = floor($products[$condition->item_id] / $condition->value);
+    if ($iterations == null) {
+      $iterations = $curIteration;
+    } else {
+      $iterations = min($iterations, $curIteration);
+    }
+    
+//drupal_set_message(t('Current iteration count is ' . $iterations));
+  }
+  
+  //If we don't have a unit quantity set, apply to all products
+  if ($action->qty == null || $action->qty == '' || $action->qty == 0) {
+  	$iterations = $qty;
+  }
+  
+  
+  // return our iterations * discount
+  if ($discount->max_discounts != 0) {
+  	$iterations = min($iterations, $discount->max_discounts);
+  }
+  
+//drupal_set_message(t('iteration count is ' . $iterations . ' and per iteration discount is ' . $discount));
+  return $discount * $iterations;
 }
