Ref: http://www.zen-cart.com/forum/showthread.php?t=95855

I think I've solved the issue.

Try this:

Make a product that has at least two attributes that effect the price, is on special, and has a quantity discount.

Example: I had a product that had two attributes: small was $5.00 and large was $10.00. I put it on sale for 10%, so they're now $4.50 and $9.00 respectively. I also have a quantity discount which takes an additional 10% off, so if more than ten items are purchased the price is $4.05 and $8.10 respectively.

Problem: When I tried to purchase 10 small items, everything worked fine; HOWEVER, if I purchase 1 large item, the price shows as $4.50 (the small item), and if I purchase 10 large items, once again the cart shows the price of the small item. Obviously the program is missing the attributes in this situation.

The Bug (?):
file: includes/functions/functions_prices.php, around line 540 in the zen_get_discount_calc function, you will see the following code:
case (zen_get_discount_qty($product_id, $qty) and zen_get_products_price_is_priced_by_attributes($product_id)):
$check_discount_qty_price = zen_get_products_discount_price_qty($product_id, $qty, $attributes_amount);

In the zen_get_products_discount_price_qty function (around line 1250 of the same file) you find the following line:
$display_specials_price = zen_get_products_special_price($product_id, true);

Notice that it doesn't give any provisions for attributes here, and if this thread of code is followed, the $display_specials_price is set to the base special price - in my case the small item, regardless of which attribute was chosen.

The Solution (?): This works, but I don't know if it's the best way. There's also a chance that it messes something else up. I've done a good bit of testing and haven't found any problems so far.

In the functions_prices.php file mentioned above, replace this code:

case (zen_get_discount_qty($product_id, $qty) and zen_get_products_price_is_priced_by_attributes($product_id)):
// discount quanties exist and this is not an attribute
// $this->contents[$products_id]['qty']
$check_discount_qty_price = zen_get_products_discount_price_qty($product_id, $qty, $attributes_amount);
//echo 'How much 2 ' . $qty . ' : ' . $attributes_amount . ' vs ' . $check_discount_qty_price . '<br />';


with this:

case (zen_get_discount_qty($product_id, $qty) and zen_get_products_price_is_priced_by_attributes($product_id)):
// discount quanties exist and this is not an attribute
// $this->contents[$products_id]['qty']
$newCalc = $attributes_amount * $special_price_discount;
$check_discount_qty_price = zen_get_products_discount_price_qty($product_id, $qty, $newCalc);
//echo 'How much 2 ' . $qty . ' : ' . $attributes_amount . ' vs ' . $check_discount_qty_price . '<br />';


look for this code:

function zen_get_products_discount_price_qty($product_id, $check_qty, $check_amount=0) {
global $db, $cart;
$new_qty = $_SESSION['cart']->in_cart_mixed_discount_quantity($product_id);
// check for discount qty mix
if ($new_qty > $check_qty) {
$check_qty = $new_qty;
}
$product_id = (int)$product_id;
$products_query = $db->Execute("select products_discount_type, products_discount_type_from, products_priced_by_attribute from " . TABLE_PRODUCTS . " where products_id='" . (int)$product_id . "'");
$products_discounts_query = $db->Execute("select * from " . TABLE_PRODUCTS_DISCOUNT_QUANTITY . " where products_id='" . (int)$product_id . "' and discount_qty <='" . (float)$check_qty . "' order by discount_qty desc");

$display_price = zen_get_products_base_price($product_id);


and immediately after that replace this:

$display_specials_price = zen_get_products_special_price($product_id, true);

with this:

if(zen_get_discount_qty($product_id, $check_qty) and zen_get_products_price_is_priced_by_attributes($product_id))
$display_specials_price = $check_amount;
else
$display_specials_price = zen_get_products_special_price($product_id, true)
;

Let me know what you think.