### Eclipse Workspace Patch 1.0 #P Drupal Modules Index: uc_discounts/uc_discounts.install =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/uc_discounts_alt/uc_discounts/uc_discounts.install,v retrieving revision 1.9 diff -u -r1.9 uc_discounts.install --- uc_discounts/uc_discounts.install 22 Aug 2009 21:30:39 -0000 1.9 +++ uc_discounts/uc_discounts.install 29 Apr 2010 12:15:46 -0000 @@ -39,9 +39,8 @@ "default" => 0, ), "qualifying_amount" => array( - "type" => "float", - "not null" => TRUE, - "default" => 0.0, + "type" => "text", + "size" => "big", "description" => t("Minimum quantity or price required to qualify for this discount."), ), "has_qualifying_amount_max" => array( @@ -63,9 +62,8 @@ "default" => 0, ), "discount_amount" => array( - "type" => "float", - "not null" => TRUE, - "default" => 0.0, + "type" => "text", + "size" => "big", "description" => t("Amount to discount (i.e. 1 free item, 25%, or $2.00)"), ), "requires_code" => array( @@ -487,3 +485,31 @@ return $queries; } +function uc_discounts_update_5() { + $ret = array(); + switch ($GLOBALS["db_type"]) { + case "mysql": + case "mysqli": + $ret[] = update_sql("ALTER TABLE {uc_discounts} CHANGE qualifying_amount qualifying_amount LONGTEXT"); + $ret[] = update_sql("ALTER TABLE {uc_discounts} CHANGE discount_amount discount_amount LONGTEXT"); + break; + case "pgsql": + $new_schemas = array( + "qualifying_amount" => array( + "type" => "text", + "size" => "big", + "description" => t("Minimum quantity or price required to qualify for this discount."), + ), + "discount_amount" => array( + "type" => "text", + "size" => "big", + "description" => t("Amount to discount (i.e. 1 free item, 25%, or $2.00)"), + ), + ); + db_change_field($ret, "uc_discounts", "qualifying_amount", "qualifying_amount", $new_schemas["qualifying_amount"]); + db_change_field($ret, "uc_discounts", "discount_amount", "discount_amount", $new_schemas["discount_amount"]); + break; + } + return $ret; +} + Index: uc_discounts/uc_discounts.admin.inc =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/uc_discounts_alt/uc_discounts/uc_discounts.admin.inc,v retrieving revision 1.10 diff -u -r1.10 uc_discounts.admin.inc --- uc_discounts/uc_discounts.admin.inc 22 Aug 2009 21:30:39 -0000 1.10 +++ uc_discounts/uc_discounts.admin.inc 29 Apr 2010 12:15:46 -0000 @@ -114,13 +114,19 @@ "#default_value" => $form_state["values"]["qualifying_type"], ); + $form_state["values"]["qualifying_amount"] = unserialize($form_state["values"]["qualifying_amount"]); + if (is_array($form_state["values"]["qualifying_amount"])) { + $form_state["values"]["qualifying_amount"] = implode(',', $form_state["values"]["qualifying_amount"]); + } + $form["qualifying_amount"] = array( - "#type" => "textfield", + "#type" => drupal_strlen($form_state["values"]["qualifying_amount"]) > 50 ? "textarea" : "textfield", "#title" => t("Qualifying amount"), - "#description" => t("The amount required to qualify for the discount. E.g. 50 (for $50), 5 (for 5 items). Remember for a discount like 'buy 4 get 1 free' the qualifying amount is '5'."), + "#description" => t("The amount required to qualify for the discount. E.g. 50 (for $50), 5 (for 5 items). Remember for a discount like 'buy 4 get 1 free' the qualifying amount is '5'. Separate multiple values with a comma e.g. 5,10,15."), "#default_value" => $form_state["values"]["qualifying_amount"], "#size" => 15, "#required" => TRUE, + "#maxlength" => NULL, ); @@ -174,14 +180,18 @@ "#options" => discount_type_options(), "#default_value" => $form_state["values"]["discount_type"], ); - + $form_state["values"]["discount_amount"] = unserialize($form_state["values"]["discount_amount"]); + if (is_array($form_state["values"]["discount_amount"])) { + $form_state["values"]["discount_amount"] = implode(',', $form_state["values"]["discount_amount"]); + } $form["discount_amount"] = array( - "#type" => "textfield", + "#type" => drupal_strlen($form_state["values"]["discount_amount"]) > 50 ? "textarea" : "textfield", "#title" => t("Discount amount"), - "#description" => t("The amount of discount. E.g. 50 (for $50), 5 (for 5 items), or 0.05 (for 5%)"), + "#description" => t("The amount of discount. E.g. 50 (for $50), 5 (for 5 items), or 0.05 (for 5%). Separate multiple values with a comma e.g. 5,10,15."), "#default_value" => $form_state["values"]["discount_amount"], "#size" => 15, "#required" => TRUE, + "#maxlength" => NULL, ); $requires_code = isset($form_state["values"]["requires_code"]) ? $form_state["values"]["requires_code"] : REQUIRES_CODE_DEFAULT; @@ -528,21 +538,37 @@ } } - - //Check discount_amount - - if (($index = strpos($values["discount_amount"], "%")) !== FALSE) { - - $value = substr($values["discount_amount"], 0, $index); - + // Check qualifying and discount amount(s) + $fields = array("qualifying_amount" => -1, "discount_amount" => -1); + foreach ($fields as $field => $value) { + $form_state["values"][$field] = array_filter(array_map("_uc_discounts_trim_values", explode(',', $form_state["values"][$field])), "_uc_discounts_filter_values"); } - else $value = $values["discount_amount"]; - if (!is_numeric($value)) { - form_set_error("discount_amount", t("Discount amount must be integer, decimal or percentage.")); + if (count($form_state["values"]["qualifying_amount"]) != count($form_state["values"]["discount_amount"])) { + $error_field = count($form_state["values"]["discount_amount"]) > count($form_state["values"]["qualifying_amount"]) ? 'discount_amount' : 'qualifying_amount'; + form_set_error($error_field, t("There are too many values in the !field field. (Qualifying and discount amount fields must have the same number of values).", array("!field" => $error_field))); $has_errors = TRUE; } - + else { + for ($i = 0; $i < count($form_state["values"]["discount_amount"]); $i++) { + if (($index = strpos($form_state["values"]["discount_amount"][$i], "%")) !== FALSE) { + $form_state["values"]['discount_amount'][$i] = drupal_substr($form_state["values"]['discount_amount'][$i], 0, $index) / 100; + } + foreach ($fields as $field => $amount) { + if (!is_numeric($amount)) { + form_set_error($field, t("Incorrect or blank amount entered: @amount", array("@amount" => $amount))); + $has_errors = TRUE; + } + elseif ($form_state["values"][$field][$i] <= $amount) { + form_set_error($field, t("!field must be sequential (error at @amount), e.g. 5,6,7.", array("!field" => $field, "@amount" => $form_state["values"][$field][$i]))); + $has_errors = TRUE; + } + else { + $fields[$field] = $form_state["values"][$field][$i]; + } + } + } + } if ($values["filter_type"] == FILTER_TYPE_PRODUCTS) { if (empty($values["product_ids"])) { @@ -582,7 +608,20 @@ $form_state["rebuild"] = TRUE; } } - +/** + * Callback for array_map in uc_discounts_form_validate(). + */ +function _uc_discounts_trim_values($var) { + return preg_replace("/\s+/", "", $var); +} +/** + * Callback for array_filter in uc_discounts_form_validate(). + */ +function _uc_discounts_filter_values($var) { + if ($var != "") { + return TRUE; + } +} /** * Submit handler for uc_discounts_form(). */ @@ -626,10 +665,8 @@ else $expiration = 0; //Set discount_amount - if (($index = strpos($form_state["values"]["discount_amount"], "%")) !== FALSE) { - $discount_amount = floatval(substr($form_state["values"]["discount_amount"], 0, $index)) / 100; - } - else $discount_amount = floatval($form_state["values"]["discount_amount"]); + $form_state["values"]["discount_amount"] = serialize($form_state["values"]["discount_amount"]); + $form_state["values"]["qualifying_amount"] = serialize($form_state["values"]["qualifying_amount"]); if (empty($form_state["values"]["discount_id"])) { //Insert base discount @@ -641,7 +678,7 @@ $form_state["values"]["has_qualifying_amount_max"], $form_state["values"]["qualifying_amount_max"], $form_state["values"]["discount_type"], - $discount_amount, + $form_state["values"]["discount_amount"], $form_state["values"]["requires_code"], $form_state["values"]["filter_type"], $form_state["values"]["has_role_filter"], @@ -672,7 +709,7 @@ $form_state["values"]["has_qualifying_amount_max"], $form_state["values"]["qualifying_amount_max"], $form_state["values"]["discount_type"], - $discount_amount, + $form_state["values"]["discount_amount"], $form_state["values"]["requires_code"], $form_state["values"]["filter_type"], $form_state["values"]["has_role_filter"], Index: uc_discounts/uc_discounts.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/uc_discounts_alt/uc_discounts/uc_discounts.module,v retrieving revision 1.30 diff -u -r1.30 uc_discounts.module --- uc_discounts/uc_discounts.module 23 Dec 2009 15:27:20 -0000 1.30 +++ uc_discounts/uc_discounts.module 29 Apr 2010 12:15:48 -0000 @@ -579,8 +579,8 @@ */ function get_uc_discounts_column_printf_wildcards() { return array("'%s'", "'%s'", "'%s'", "%d", - "%f", "%d", "%f", "%d", - "%f", "%d", "%d", "%d", + "'%s'", "%d", "%f", "%d", + "'%s'", "%d", "%d", "%d", "%d", "%d", "%d", "%d", "%d", "%d", "%d", "%d", "%d", "%d", @@ -1198,14 +1198,15 @@ break; } } - + $discount->qualifying_amount = unserialize($discount->qualifying_amount); + $discount->discount_amount = unserialize($discount->discount_amount); //If order does not qualify for this discount - if ($order_qualifying_amount < $discount->qualifying_amount) { + if ($order_qualifying_amount < $discount->qualifying_amount[0]) { //If this is a coded discount, add warning message if (!is_null($warnings) && !is_null($discount->code)) { switch ($discount->qualifying_type) { case QUALIFYING_TYPE_MINIMUM_PRICE: - $qualifying_amount = uc_currency_format($discount->qualifying_amount); + $qualifying_amount = uc_currency_format($discount->qualifying_amount[0]); $warnings[] = t('The discount for code "@code" requires a minimum price of @qualifying_amount to qualify.', array("@code" => $discount->code, "@qualifying_amount" => $qualifying_amount) ); @@ -1213,13 +1214,21 @@ case QUALIFYING_TYPE_MINIMUM_QUANTITY: $warnings[] = t('The discount for code "@code" requires a minimum quantity of @qualifying_amount to qualify.', - array("@code" => $discount->code, "@qualifying_amount" => $discount->qualifying_amount) + array("@code" => $discount->code, "@qualifying_amount" => $discount->qualifying_amount[0]) ); break; } } continue; } + else { + for ($i = 0; $i < count($discount->qualifying_amount); $i++) { + if ($order_qualifying_amount < $discount->qualifying_amount[$i]) { + break; + } + $discount->qualifying_tier = $i; + } + } //If this discount has a maximum qualifying amount and the order exceeds it if ($discount->has_qualifying_amount_max && ($order_qualifying_amount > $discount->qualifying_amount_max)) { @@ -1244,8 +1253,8 @@ } //Determine number of times to apply discount - if ($discount->qualifying_amount != 0) { - $discount->times_applied = (int)($order_qualifying_amount / $discount->qualifying_amount); + if ($discount->qualifying_amount[$discount->qualifying_tier] != 0) { + $discount->times_applied = (int)($order_qualifying_amount / $discount->qualifying_amount[$discount->qualifying_tier]); } else $discount->times_applied = 1; if ($discount->max_times_applied != 0) { @@ -1273,7 +1282,7 @@ $this_product_price = $this_product->price; $product_sum = $product_sum + ($order_product_id_quantity_map[$this_product->nid] * $this_product->price); } - $discount->amount = $product_sum - ($product_sum * $discount->discount_amount); + $discount->amount = $product_sum - ($product_sum * $discount->discount_amount[$discount->qualifying_tier]); } break; case DISCOUNT_TYPE_FREE_ITEMS: @@ -1281,7 +1290,7 @@ $discount_amount = 0; //The variable free_items_remaining is the [max] number of free items for the order - $free_items_remaining = $discount->discount_amount * $discount->times_applied; + $free_items_remaining = $discount->discount_amount[$discount->qualifying_tier] * $discount->times_applied; //Loop until all free items have been applied or there are no more products to //discount (discount cheapest first) @@ -1369,8 +1378,8 @@ if ($are_equal) { //($last_discount->amount / $last_discount->discount_amount) == last discount's subtotal - $local_order_subtotal = ($last_discount->amount / $last_discount->discount_amount); - $discount->amount = $local_order_subtotal * $discount->discount_amount; + $local_order_subtotal = ($last_discount->amount / $last_discount->discount_amount[$last_discount->qualifying_tier]); + $discount->amount = $local_order_subtotal * $discount->discount_amount[$discount->qualifying_tier]; break; } } @@ -1389,23 +1398,23 @@ foreach ($order_and_discount_products as $product) { $discounted_products_amount += $product->price * $product->qty; } - $discount->amount = $discounted_products_amount * $discount->discount_amount; + $discount->amount = $discounted_products_amount * $discount->discount_amount[$discount->qualifying_tier]; // Discount the subtotal so far } else { - $discount->amount = max($order_subtotal - $total_discount_amount, 0) * $discount->discount_amount; + $discount->amount = max($order_subtotal - $total_discount_amount, 0) * $discount->discount_amount[$discount->qualifying_tier]; } //End patch from lutegrass break; case DISCOUNT_TYPE_FIXED_AMOUNT_OFF: - $discount->amount = $discount->discount_amount * $discount->times_applied; + $discount->amount = $discount->discount_amount[$discount->qualifying_tier] * $discount->times_applied; break; case DISCOUNT_TYPE_FIXED_AMOUNT_OFF_PER_QUALIFYING_ITEM: //Discount is the total quantity of qualifying items in order (order_qualifying_amount) //times the discount amount - $discount->amount = $discount->discount_amount * $order_qualifying_amount; + $discount->amount = $discount->discount_amount[$discount->qualifying_tier] * $order_qualifying_amount; break; }