Index: uc_coupon.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/uc_coupon/uc_coupon.module,v
retrieving revision 1.57
diff -u -p -r1.57 uc_coupon.module
--- uc_coupon.module	10 Nov 2010 01:23:05 -0000	1.57
+++ uc_coupon.module	10 Nov 2010 14:16:39 -0000
@@ -925,15 +925,20 @@ function uc_coupon_validate($code) {
       while ($tid = db_result($query)) {
         $terms[] = $tid;
       }
-
-      if (isset($coupon->data['products']) && (isset($coupon->data['negate_products']) xor in_array($item->nid, $coupon->data['products']))) {
-        $prices = array_pad($prices, count($prices) + $item->qty, $item->price);
+      
+      
+      if (isset($coupon->data['products']) && in_array($item->nid, $coupon->data['products'])) {
+        if (!isset($coupon->data['negate_products'])) { // only apply if this product not negated
+          $prices = array_pad($prices, count($prices) + $item->qty, $item->price);
+        }
       }
       else if (isset($coupon->data['skus']) && in_array($item->model, $coupon->data['skus'])) {
         $prices = array_pad($prices, count($prices) + $item->qty, $item->price);
       }
-      else if (isset($coupon->data['terms']) && (isset($coupon->data['negate_terms']) xor count(array_intersect($terms, $coupon->data['terms'])))) {
-        $prices = array_pad($prices, count($prices) + $item->qty, $item->price);
+      else if (isset($coupon->data['terms']) && count(array_intersect($terms, $coupon->data['terms']))) {
+        if (!isset($coupon->data['negate_terms'])) { // only apply if these terms not negated
+          $prices = array_pad($prices, count($prices) + $item->qty, $item->price);
+        }
       }
       else if (isset($coupon->data['product_types'])) {
         $type = db_result(db_query("SELECT type FROM {node} WHERE nid = %d", $item->nid));
