From 8a3be38d8f7987fd13cf9ddf1f69d69b7f5fedac Mon Sep 17 00:00:00 2001
From: Dave Long <dave@longwaveconsulting.com>
Date: Fri, 18 Mar 2011 15:41:24 +0000
Subject: [PATCH] Lock product prices at checkout time.

---
 uc_cart/uc_cart.pages.inc |   32 +++++++++++++-------------------
 1 files changed, 13 insertions(+), 19 deletions(-)

diff --git a/uc_cart/uc_cart.pages.inc b/uc_cart/uc_cart.pages.inc
index 6a290a2..7ee908e 100644
--- a/uc_cart/uc_cart.pages.inc
+++ b/uc_cart/uc_cart.pages.inc
@@ -288,28 +288,22 @@ function uc_cart_checkout_form_validate($form, &$form_state) {
   db_query("DELETE FROM {uc_order_products} WHERE order_id = %d", $order->order_id);
   $order->products = unserialize($form_state['values']['cart_contents']);
 
+  // Get the altered price per unit, as ordered products have a locked-in
+  // price. Price altering rules may change over time, but the amount paid
+  // by the customer does not after the fact.
   $context = array(
-    'revision' => 'original',
-    'type' => 'order_product',
+    'revision' => 'altered',
+    'type' => 'cart_item',
+    'subject' => array(
+      'order' => $order,
+    ),
   );
   foreach ($order->products as $key => $item) {
-    $price_info = array(
-      'price' => $item->price,
-      'qty' => $item->qty,
-    );
-    $context['subject'] = array(
-      'order' => $order,
-      'product' => $item,
-      'node' => node_load($item->nid),
-    );
-
-    // Get the altered price per unit, as ordered products have a locked-in
-    // price. Price altering rules may change over time, but the amount paid
-    // by the customer does not after the fact.
-    $price = uc_price($price_info, $context) / $item->qty;
-    if ($order->products[$key]->price != $price) {
-      $order->products[$key]->data['altered_price'] = $price;
-    }
+    $context['subject']['product'] = $item;
+    $context['subject']['node'] = node_load($item->nid);
+
+    $order->products[$key]->cost = uc_price($item->cost, $context + array('field' => 'cost'));
+    $order->products[$key]->price = uc_price($item->price, $context + array('field' => 'sell_price'));
   }
 
   $order->order_total = uc_order_get_total($order, TRUE);
-- 
1.6.0.4

