### Eclipse Workspace Patch 1.0 #P uc_discounts_alt 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.29.2.2 diff -u -r1.29.2.2 uc_discounts.module --- uc_discounts/uc_discounts.module 5 Oct 2009 00:58:21 -0000 1.29.2.2 +++ uc_discounts/uc_discounts.module 2 Nov 2009 17:24:20 -0000 @@ -58,80 +58,80 @@ * Implementation of hook_init(). */ function uc_discounts_init() { - drupal_add_css(drupal_get_path("module", "uc_discounts") ."/uc_discounts.css"); + drupal_add_css(drupal_get_path("module", "uc_discounts") ."/uc_discounts.css"); } function uc_discounts_help($path, $arg) { - switch ($path) { - case "admin/store/settings/uc_discounts": - return t("Add and review discounts"); - } - return $output; + switch ($path) { + case "admin/store/settings/uc_discounts": + return t("Add and review discounts"); + } + return $output; } /** * Implementation of hook_perm(). */ function uc_discounts_perm() { - return array("configure discounts"); + return array("configure discounts"); } /** * Implementation of hook_menu(). */ function uc_discounts_menu() { - $items = array(); + $items = array(); - $items["admin/store/settings/uc_discounts"] = array( + $items["admin/store/settings/uc_discounts"] = array( "title" => "Discount settings", "description" => "Configure discount settings.", "page callback" => "uc_discounts_admin_settings", "access arguments" => array("configure discounts"), "file" => "uc_discounts.admin.inc", - ); - $items["admin/store/settings/uc_discounts/edit"] = array( + ); + $items["admin/store/settings/uc_discounts/edit"] = array( "title" => "Edit discount rule", "page callback" => "drupal_get_form", "page arguments" => array("uc_discounts_form"), "access arguments" => array("configure discounts"), "type" => MENU_CALLBACK, "file" => "uc_discounts.admin.inc", - ); - $items["admin/store/settings/uc_discounts/copy"] = array( + ); + $items["admin/store/settings/uc_discounts/copy"] = array( "page callback" => "uc_discounts_copy", "access arguments" => array("configure discounts"), "type" => MENU_CALLBACK, "file" => "uc_discounts.admin.inc", - ); - $items["admin/store/settings/uc_discounts/delete"] = array( + ); + $items["admin/store/settings/uc_discounts/delete"] = array( "title" => "Delete discount rule", "page callback" => "drupal_get_form", "page arguments" => array("uc_discounts_delete"), "access arguments" => array("configure discounts"), "type" => MENU_CALLBACK, "file" => "uc_discounts.admin.inc", - ); - $items["cart/checkout/uc_discounts/calculate"] = array( + ); + $items["cart/checkout/uc_discounts/calculate"] = array( "page callback" => "uc_discounts_js_calculate", "access arguments" => array("access content"), "type" => MENU_CALLBACK, - ); - $items["admin/reports/uc_discounts/all"] = array( + ); + $items["admin/reports/uc_discounts/all"] = array( "title" => "Ubercart discounts usage data", "description" => "View usage data for each Ubercart discount.", "page callback" => "uc_discounts_report", "access arguments" => array("access site reports"), "file" => "uc_discounts.admin.inc", - ); - $items["admin/reports/uc_discounts/discount"] = array( + ); + $items["admin/reports/uc_discounts/discount"] = array( "title" => "Ubercart discount usage data", "page callback" => "uc_discounts_report_for_discount", "access arguments" => array("access site reports"), "type" => MENU_CALLBACK, "file" => "uc_discounts.admin.inc", - ); + ); - return $items; + return $items; } /** @@ -140,132 +140,132 @@ * Manages order->uc_discounts_codes (array of code) and order->discounts (array of uses) */ function uc_discounts_order($op, &$arg1, $arg2) { - switch ($op) { - case "load": - //Get order's codes from database - $codes_string = uc_discounts_order_codes_get($arg1->order_id); - $arg1->uc_discounts_codes = get_codes($codes_string); - break; - - case "save": - //If discount line items need updating - if ($arg1->uc_discounts_line_items_need_updating) { - //Delete existing order codes - uc_discounts_order_codes_delete($arg1->order_id); - - //Save order's codes as string - $codes_string = create_codes_string($arg1->uc_discounts_codes); - uc_discounts_order_codes_insert($arg1->order_id, $codes_string); - - //Get order line items - if (is_array($arg1->line_items)) { - $existing_line_items = $arg1->line_items; - } - else $existing_line_items = uc_order_load_line_items($arg1->order_id, TRUE); - - //Use new_order_line_items to populate $arg1->line_items by: - // Storing all non-discounts line items - // Storing new discount line items - $new_order_line_items = array(); - - //Delete existing discount line items - foreach ($existing_line_items as $line_item) { - if ($line_item["type"] == LINE_ITEM_KEY_NAME) { - uc_order_delete_line_item($line_item["line_item_id"]); - } - //Otherwise store non-discount line item - else $new_order_line_items[] = $line_item; - } - - //Add discount line items - foreach ($arg1->uc_discounts_line_items as $line_item) { - uc_order_line_item_add($arg1->order_id, $line_item["type"], $line_item["title"], - $line_item["amount"], $line_item["weight"] - ); - $new_order_line_items[] = $line_item; - } - - //Update order line items (see new_order_line_items notes above) - $arg1->line_items = $new_order_line_items; - - //Force tax recalculation (currently unused but may be required if line item weights change) - //module_invoke("uc_taxes", "order", "save", $arg1, ""); - - $arg1->uc_discounts_line_items_need_updating = FALSE; - } - break; - - case "update": - //If status changes to "cancelled", delete order uses - if ($arg2 == "cancelled") { - uc_discounts_uses_delete_for_order($arg1->order_id); - } - break; - - case "submit": - //Ensure stored discounts are accurate (recalculate and match new amounts against stored amounts) - - //Store existing discount amounts - $existing_discount_amounts = array(); - foreach (get_existing_discount_line_items($arg1) as $line_item) $existing_discount_amounts[] = uc_currency_format($line_item["amount"]); - - - //Regenerate discount amounts - - $errors = array(); - $warnings = array(); - $messages = array(); - $discounts = get_discounts_for_order($arg1, $errors, $warnings, $messages); - - //If there were errors, print and return FALSE - if (!empty($errors)) { - foreach ($errors as $error) drupal_set_message($error, "error"); - return array(array('pass' => FALSE, + switch ($op) { + case "load": + //Get order's codes from database + $codes_string = uc_discounts_order_codes_get($arg1->order_id); + $arg1->uc_discounts_codes = get_codes($codes_string); + break; + + case "save": + //If discount line items need updating + if ($arg1->uc_discounts_line_items_need_updating) { + //Delete existing order codes + uc_discounts_order_codes_delete($arg1->order_id); + + //Save order's codes as string + $codes_string = create_codes_string($arg1->uc_discounts_codes); + uc_discounts_order_codes_insert($arg1->order_id, $codes_string); + + //Get order line items + if (is_array($arg1->line_items)) { + $existing_line_items = $arg1->line_items; + } + else $existing_line_items = uc_order_load_line_items($arg1->order_id, TRUE); + + //Use new_order_line_items to populate $arg1->line_items by: + // Storing all non-discounts line items + // Storing new discount line items + $new_order_line_items = array(); + + //Delete existing discount line items + foreach ($existing_line_items as $line_item) { + if ($line_item["type"] == LINE_ITEM_KEY_NAME) { + uc_order_delete_line_item($line_item["line_item_id"]); + } + //Otherwise store non-discount line item + else $new_order_line_items[] = $line_item; + } + + //Add discount line items + foreach ($arg1->uc_discounts_line_items as $line_item) { + uc_order_line_item_add($arg1->order_id, $line_item["type"], $line_item["title"], + $line_item["amount"], $line_item["weight"], $line_item["data"] + ); + $new_order_line_items[] = $line_item; + } + + //Update order line items (see new_order_line_items notes above) + $arg1->line_items = $new_order_line_items; + + //Force tax recalculation (currently unused but may be required if line item weights change) + //module_invoke("uc_taxes", "order", "save", $arg1, ""); + + $arg1->uc_discounts_line_items_need_updating = FALSE; + } + break; + + case "update": + //If status changes to "cancelled", delete order uses + if ($arg2 == "cancelled") { + uc_discounts_uses_delete_for_order($arg1->order_id); + } + break; + + case "submit": + //Ensure stored discounts are accurate (recalculate and match new amounts against stored amounts) + + //Store existing discount amounts + $existing_discount_amounts = array(); + foreach (get_existing_discount_line_items($arg1) as $line_item) $existing_discount_amounts[] = uc_currency_format($line_item["amount"]); + + + //Regenerate discount amounts + + $errors = array(); + $warnings = array(); + $messages = array(); + $discounts = get_discounts_for_order($arg1, $errors, $warnings, $messages); + + //If there were errors, print and return FALSE + if (!empty($errors)) { + foreach ($errors as $error) drupal_set_message($error, "error"); + return array(array('pass' => FALSE, 'message' => t('Discounts have changed. Please review your cart and continue checkout.'), - )); - } + )); + } - //Add discount line items to order - add_discount_line_items_to_order($arg1, $discounts); + //Add discount line items to order + add_discount_line_items_to_order($arg1, $discounts); - $new_discount_amounts = array(); - foreach ($arg1->uc_discounts_line_items as $line_item) $new_discount_amounts[] = uc_currency_format($line_item["amount"]); + $new_discount_amounts = array(); + foreach ($arg1->uc_discounts_line_items as $line_item) $new_discount_amounts[] = uc_currency_format($line_item["amount"]); - $discount_intersection = array_intersect($existing_discount_amounts, $new_discount_amounts); - if (count($discount_intersection) != count($existing_discount_amounts)) { - //Save new discount line items - $arg1->uc_discounts_line_items_need_updating = TRUE; - uc_discounts_order("save", $arg1, NULL); + $discount_intersection = array_intersect($existing_discount_amounts, $new_discount_amounts); + if (count($discount_intersection) != count($existing_discount_amounts)) { + //Save new discount line items + $arg1->uc_discounts_line_items_need_updating = TRUE; + uc_discounts_order("save", $arg1, NULL); - return array(array('pass' => FALSE, + return array(array('pass' => FALSE, 'message' => t('Discounts have changed. Please review your cart and continue checkout.'), - )); - } + )); + } - //Delete existing uses for order - uc_discounts_uses_delete_for_order($arg1->order_id); + //Delete existing uses for order + uc_discounts_uses_delete_for_order($arg1->order_id); - //Insert uses (for best results use discounts returned by call to get_discounts_for_order) - foreach ($discounts as $discount) { - $code = (!empty($discount->code)) ? $discount->code : ""; - $times_applied = (is_numeric($discount->times_applied)) ? $discount->times_applied : 1; - $amount = (is_numeric($discount->amount)) ? $discount->amount : 0; - - uc_discounts_uses_insert($discount->discount_id, $arg1->uid, - $arg1->order_id, $code, $times_applied, $amount - ); - } - - //Add discount messages to order - uc_order_log_changes($arg1->order_id, $messages); - break; - - case "delete": - //Delete existing order codes - uc_discounts_order_codes_delete($arg1->order_id); - //TO DO: determine if uses should be deleted or put global setting in for user to decide - break; - } + //Insert uses (for best results use discounts returned by call to get_discounts_for_order) + foreach ($discounts as $discount) { + $code = (!empty($discount->code)) ? $discount->code : ""; + $times_applied = (is_numeric($discount->times_applied)) ? $discount->times_applied : 1; + $amount = (is_numeric($discount->amount)) ? $discount->amount : 0; + + uc_discounts_uses_insert($discount->discount_id, $arg1->uid, + $arg1->order_id, $code, $times_applied, $amount + ); + } + + //Add discount messages to order + uc_order_log_changes($arg1->order_id, $messages); + break; + + case "delete": + //Delete existing order codes + uc_discounts_order_codes_delete($arg1->order_id); + //TO DO: determine if uses should be deleted or put global setting in for user to decide + break; + } } /** @@ -276,16 +276,16 @@ * @see hook_line_item() */ function uc_discounts_line_item() { - $line_items[] = array( + $line_items[] = array( "id" => LINE_ITEM_KEY_NAME, "title" => t("Discount"), "weight" => LINE_ITEM_WEIGHT, "stored" => TRUE, - // Added to total + // Added to total "calculated" => TRUE, "display_only" => FALSE, - ); - return $line_items; + ); + return $line_items; } /** @@ -294,52 +294,56 @@ * @see hook_cart_pane() */ function uc_discounts_cart_pane($items) { - global $user; + global $user; - //Create phony order object to call to get_discounts_for_order - $order = new stdClass(); - $order->uid = $user->uid; - $order->products = $items; - - $errors = array(); - $warnings = array(); - $messages = array(); - $discounts = get_discounts_for_order($order, $errors, $warnings, $messages); - - //If there are no discounts, do not alter cart - if (count($discounts) == 0) { - return array(); - } - - //Calculate subtotal with discounts - $subtotal = 0; - foreach ($items as $item) $subtotal += $item->price * $item->qty; - $total_discount_amount = 0; - foreach ($discounts as $discount) $total_discount_amount += $discount->amount; - $subtotal_including_discounts = $subtotal - $total_discount_amount; - - //Add total discount message - $messages[] = "". t("Total discount") .": ". uc_currency_format($total_discount_amount); - - //Add new subtotal message - $messages[] = "". t("Subtotal including discounts") .": ". uc_currency_format($subtotal_including_discounts); - - //Start row index at item count + 2 (1 for subtotal row in cart form, 1 more for our first row) - $i = count($items) + 2; - - //Create table to hold discount messages - $body = "
"; - foreach ($messages as $message) { - $evenOddClass = (($i % 2) == 0) ? "even" : "odd"; - $body .= sprintf(""; - $i += 1; - } + //Create phony order object to call to get_discounts_for_order + $order = new stdClass(); + $order->uid = $user->uid; + $order->products = $items; + + $errors = array(); + $warnings = array(); + $messages = array(); + $discounts = get_discounts_for_order($order, $errors, $warnings, $messages); + + //If there are no discounts, do not alter cart + if (count($discounts) == 0) { + return array(); + } + + //Calculate subtotal with discounts + $subtotal = 0; + if (is_array($items)) { + foreach ($items as $item) $subtotal += $item->price * $item->qty; + } + $total_discount_amount = 0; + if (is_array($discounts)) { + foreach ($discounts as $discount) $total_discount_amount += $discount->amount; + } + $subtotal_including_discounts = $subtotal - $total_discount_amount; + + //Add total discount message + $messages[] = "". t("Total discount") .": ". uc_currency_format($total_discount_amount); + + //Add new subtotal message + $messages[] = "". t("Subtotal including discounts") .": ". uc_currency_format($subtotal_including_discounts); + + //Start row index at item count + 2 (1 for subtotal row in cart form, 1 more for our first row) + $i = count($items) + 2; + + //Create table to hold discount messages + $body = "
", $evenOddClass, "uc-discounts-cart-pane-table-cell") . $message ."
"; + foreach ($messages as $message) { + $evenOddClass = (($i % 2) == 0) ? "even" : "odd"; + $body .= sprintf(""; + $i += 1; + } - //Close table - $body .= "
", $evenOddClass, "uc-discounts-cart-pane-table-cell") . $message ."
"; + //Close table + $body .= ""; - //Write table using javascript between items and cart form buttons - drupal_add_js(sprintf("$(document).ready(function() + //Write table using javascript between items and cart form buttons + drupal_add_js(sprintf("$(document).ready(function() { $(\"#cart-form-buttons\").before(\"%s\"); });", $body), "inline"); @@ -351,14 +355,14 @@ * @see hook_checkout_pane() */ function uc_discounts_checkout_pane() { - $panes[] = array( + $panes[] = array( "id" => "uc_discounts", "callback" => "uc_checkout_pane_discounts", 'process' => TRUE, "title" => t("Enter discount codes"), "weight" => 5, - ); - return $panes; + ); + return $panes; } /** @@ -367,39 +371,39 @@ * More information at http://www.ubercart.org/docs/developer/245/checkout */ function uc_checkout_pane_discounts($op, &$arg1, $arg2) { - global $user; + global $user; - switch ($op) { - case "view": - //Add form to checkout pane + switch ($op) { + case "view": + //Add form to checkout pane - $description = t("Enter discount codes in the box below (one per line)."); + $description = t("Enter discount codes in the box below (one per line)."); - //If viewing an existing order, load order's codes - if (!empty($arg1->order_id)) { - $codes_string = uc_discounts_order_codes_get($arg1->order_id); - } + //If viewing an existing order, load order's codes + if (!empty($arg1->order_id)) { + $codes_string = uc_discounts_order_codes_get($arg1->order_id); + } - $contents["uc-discounts-codes"] = array( + $contents["uc-discounts-codes"] = array( "#type" => "textarea", "#default_value" => $codes_string, "#rows" => 5, "#prefix" => "
", "#suffix" => "
", - ); + ); - $contents["uc-discounts-placeholder"] = array( + $contents["uc-discounts-placeholder"] = array( "#type" => "hidden", "#prefix" => "
", "#suffix" => "
", - ); + ); - $contents["uc-discounts-button"] = array( + $contents["uc-discounts-button"] = array( "#type" => "button", "#value" => t("Click to calculate discounts"), - ); + ); - drupal_add_js(array( + drupal_add_js(array( "uc_discounts" => array( "line_item_key_name" => LINE_ITEM_KEY_NAME, "line_item_weight" => LINE_ITEM_WEIGHT, @@ -411,45 +415,45 @@ "no_codes_entered" => t("Please enter at least one code"), "no_applicable_discounts" => t("No applicable discounts"), "err_msg" => t("There were problems determining if any discounts apply. Please try again shortly.\nIf this does not resolve the issue, please call @phone to complete your order.", - array("@phone" => variable_get("uc_store_phone", NULL)) - ), + array("@phone" => variable_get("uc_store_phone", NULL)) + ), "response_parse_err_msg" => t("Unable to parse response text: "), - ), - ), "setting"); + ), + ), "setting"); - drupal_add_js("$(document).ready(function() { uc_discountsOnLoad(); });", "inline"); - drupal_add_js("misc/progress.js"); - drupal_add_js(drupal_get_path("module", "uc_discounts") ."/uc_discounts.js"); + drupal_add_js("$(document).ready(function() { uc_discountsOnLoad(); });", "inline"); + drupal_add_js("misc/progress.js"); + drupal_add_js(drupal_get_path("module", "uc_discounts") ."/uc_discounts.js"); - return array("description" => $description, "contents" => $contents); + return array("description" => $description, "contents" => $contents); - case "process": - //TO DO: only update codes if codes_string ($arg2["uc-discounts-codes"]) has changed + case "process": + //TO DO: only update codes if codes_string ($arg2["uc-discounts-codes"]) has changed - //Save form values from checkout pane in order ($arg1) - $arg1->uc_discounts_codes = get_codes($arg2["uc-discounts-codes"]); + //Save form values from checkout pane in order ($arg1) + $arg1->uc_discounts_codes = get_codes($arg2["uc-discounts-codes"]); - $has_code_errors = FALSE; + $has_code_errors = FALSE; - $errors = array(); - $warnings = array(); - $discounts = get_discounts_for_order($arg1, $errors, $warnings); + $errors = array(); + $warnings = array(); + $discounts = get_discounts_for_order($arg1, $errors, $warnings); - foreach ($errors as $error) drupal_set_message($error, "error"); - foreach ($warnings as $warning) drupal_set_message(t("Warning:") . $warning, "error"); + foreach ($errors as $error) drupal_set_message($error, "error"); + foreach ($warnings as $warning) drupal_set_message(t("Warning:") . $warning, "error"); - //If there were errors, return FALSE - if (!empty($errors)) { - return FALSE; - } + //If there were errors, return FALSE + if (!empty($errors)) { + return FALSE; + } - //Add discount line items to order - add_discount_line_items_to_order($arg1, $discounts); + //Add discount line items to order + add_discount_line_items_to_order($arg1, $discounts); - //Mark order as needing discount line items updated - $arg1->uc_discounts_line_items_need_updating = TRUE; - break; - } + //Mark order as needing discount line items updated + $arg1->uc_discounts_line_items_need_updating = TRUE; + break; + } } /** @@ -458,39 +462,40 @@ * Note: assumes discount objects are the result of a call to get_discounts_for_order() */ function add_discount_line_items_to_order($order, $discounts) { - //Create line items for discounts and store in order's uc_discounts_line_items field - $line_items = array(); - foreach ($discounts as $discount) { - $line_item = array( + //Create line items for discounts and store in order's uc_discounts_line_items field + $line_items = array(); + foreach ($discounts as $discount) { + $line_item = array( "type" => LINE_ITEM_KEY_NAME, "title" => $discount->short_description, "amount" => -$discount->amount, "weight" => LINE_ITEM_WEIGHT, - ); + "data" => array('discount_id' => $discount->discount_id), + ); - $line_items[] = $line_item; - } - $order->uc_discounts_line_items = $line_items; + $line_items[] = $line_item; + } + $order->uc_discounts_line_items = $line_items; } /** * Returns existing discounts line items for order. */ function get_existing_discount_line_items($order) { - if (is_array($order->line_items)) { - $existing_line_items = $order->line_items; - } - else $existing_line_items = uc_order_load_line_items($order->order_id, TRUE); - - $line_items = array(); - foreach ($existing_line_items as $line_item) { - //If line item type is LINE_ITEM_KEY_NAME, add it to array - if ($line_item["type"] == LINE_ITEM_KEY_NAME) { - $line_items[] = $line_item; - } - } + if (is_array($order->line_items)) { + $existing_line_items = $order->line_items; + } + else $existing_line_items = uc_order_load_line_items($order->order_id, TRUE); + + $line_items = array(); + foreach ($existing_line_items as $line_item) { + //If line item type is LINE_ITEM_KEY_NAME, add it to array + if ($line_item["type"] == LINE_ITEM_KEY_NAME) { + $line_items[] = $line_item; + } + } - return $line_items; + return $line_items; } /** @@ -499,57 +504,57 @@ * Calculate discount for an order in the checkout page. */ function uc_discounts_js_calculate() { - global $user; + global $user; - //If session order exists, use it - if (!empty($_SESSION["cart_order"])) { - $order_id = $_SESSION['cart_order']; - $order = uc_order_load($order_id); - if (is_null($order)) { - print "{}"; - exit(); - return; - } - } - //Otherwise create phony order - else { - $order = new stdClass(); - $order->uid = $user->uid; - $order->products = uc_cart_get_contents(); - } - - $order->uc_discounts_codes = get_codes($_POST["uc-discounts-codes"]); - - $line_items = array(); - $errors = array(); - $warnings = array(); - $messages = array(); - - $discounts = get_discounts_for_order($order, $errors, $warnings, $messages); - - $i = 0; - foreach ($discounts as $discount) { - $line_item = array(); - $line_item["id"] = LINE_ITEM_KEY_NAME . $i++; - $line_item["type"] = $discount->type; - $line_item["title"] = $discount->title; - $line_item["amount"] = -$discount->amount; - $line_item["weight"] = $discount->weight; - $line_items[] = $line_item; - } - - if (!empty($warnings)) { - $warnings2 = array(); - foreach ($warnings as $warning) $warnings2[] = t("Warning:") . $warning; - $errors = array_merge($errors, $warnings2); - } - - $calculate_discount_response = array(CALCULATE_DISCOUNT_RESPONSE_LINE_ITEMS_KEY => $line_items, - CALCULATE_DISCOUNT_RESPONSE_ERRORS_KEY => $errors, - CALCULATE_DISCOUNT_RESPONSE_MESSAGES_KEY => $messages, - ); - drupal_json($calculate_discount_response); - exit(); + //If session order exists, use it + if (!empty($_SESSION["cart_order"])) { + $order_id = $_SESSION['cart_order']; + $order = uc_order_load($order_id); + if (is_null($order)) { + print "{}"; + exit(); + return; + } + } + //Otherwise create phony order + else { + $order = new stdClass(); + $order->uid = $user->uid; + $order->products = uc_cart_get_contents(); + } + + $order->uc_discounts_codes = get_codes($_POST["uc-discounts-codes"]); + + $line_items = array(); + $errors = array(); + $warnings = array(); + $messages = array(); + + $discounts = get_discounts_for_order($order, $errors, $warnings, $messages); + + $i = 0; + foreach ($discounts as $discount) { + $line_item = array(); + $line_item["id"] = LINE_ITEM_KEY_NAME . $i++; + $line_item["type"] = $discount->type; + $line_item["title"] = $discount->title; + $line_item["amount"] = -$discount->amount; + $line_item["weight"] = $discount->weight; + $line_items[] = $line_item; + } + + if (!empty($warnings)) { + $warnings2 = array(); + foreach ($warnings as $warning) $warnings2[] = t("Warning:") . $warning; + $errors = array_merge($errors, $warnings2); + } + + $calculate_discount_response = array(CALCULATE_DISCOUNT_RESPONSE_LINE_ITEMS_KEY => $line_items, + CALCULATE_DISCOUNT_RESPONSE_ERRORS_KEY => $errors, + CALCULATE_DISCOUNT_RESPONSE_MESSAGES_KEY => $messages, + ); + drupal_json($calculate_discount_response); + exit(); } @@ -561,163 +566,163 @@ * Returns array of uc_discounts column names. */ function get_uc_discounts_column_names() { - return array("name", "short_description", "description", "qualifying_type", + return array("name", "short_description", "description", "qualifying_type", "qualifying_amount", "has_qualifying_amount_max", "qualifying_amount_max", "discount_type", "discount_amount", "requires_code", "filter_type", "has_role_filter", "requires_single_product_to_qualify", "required_product", "max_times_applied", "can_be_combined_with_other_discounts", "max_uses", "max_uses_per_user", "max_uses_per_code", "has_expiration", "expiration", "is_published", "weight", - ); + ); } /** * Returns array of uc_discounts insert column names. */ function get_uc_discounts_insert_column_names() { - return array_merge(get_uc_discounts_column_names(), array("insert_timestamp")); + return array_merge(get_uc_discounts_column_names(), array("insert_timestamp")); } /** * Returns array of uc_discounts update column names. */ function get_uc_discounts_update_column_names() { - return get_uc_discounts_column_names(); + return get_uc_discounts_column_names(); } /** * Returns array of uc_discounts column printf wildcards. */ function get_uc_discounts_column_printf_wildcards() { - return array("'%s'", "'%s'", "'%s'", "%d", + return array("'%s'", "'%s'", "'%s'", "%d", "%f", "%d", "%f", "%d", "%f", "%d", "%d", "%d", "%d", "'%s'", "%d", "%d", "%d", "%d", "%d", "%d", "%d", "%d", "%d", - ); + ); } /** * Returns array of uc_discounts insert column printf wildcards. */ function get_uc_discounts_column_insert_printf_wildcards() { - return array_merge(get_uc_discounts_column_printf_wildcards(), array("%d")); + return array_merge(get_uc_discounts_column_printf_wildcards(), array("%d")); } /** * Returns array of uc_discounts update column printf wildcards. */ function get_uc_discounts_column_update_printf_wildcards() { - return get_uc_discounts_column_printf_wildcards(); + return get_uc_discounts_column_printf_wildcards(); } /** * Inserts a uc_discounts row and returns its discount_id. */ function uc_discounts_insert($name, $short_description, $description, $qualifying_type, - $qualifying_amount, $has_qualifying_amount_max, $qualifying_amount_max, $discount_type, - $discount_amount, $requires_code, $filter_type, $has_role_filter, - $requires_single_product_to_qualify, $required_product, $max_times_applied, $can_be_combined_with_other_discounts, $max_uses, - $max_uses_per_user, $max_uses_per_code, $has_expiration, $expiration, - $is_published, $weight, $insert_timestamp = NULL +$qualifying_amount, $has_qualifying_amount_max, $qualifying_amount_max, $discount_type, +$discount_amount, $requires_code, $filter_type, $has_role_filter, +$requires_single_product_to_qualify, $required_product, $max_times_applied, $can_be_combined_with_other_discounts, $max_uses, +$max_uses_per_user, $max_uses_per_code, $has_expiration, $expiration, +$is_published, $weight, $insert_timestamp = NULL ) { - if (is_null($insert_timestamp)) { - $insert_timestamp = time(); - } - - $query = "INSERT INTO {uc_discounts}(". join(",", get_uc_discounts_insert_column_names()) .") VALUES(". join(",", get_uc_discounts_column_insert_printf_wildcards()) .")"; - uc_discounts_log("query=". $query); - db_query($query, - $name, $short_description, $description, $qualifying_type, - $qualifying_amount, $has_qualifying_amount_max, $qualifying_amount_max, $discount_type, - $discount_amount, $requires_code, $filter_type, $has_role_filter, - $requires_single_product_to_qualify, $required_product, $max_times_applied, $can_be_combined_with_other_discounts, $max_uses, - $max_uses_per_user, $max_uses_per_code, $has_expiration, $expiration, - $is_published, $weight, $insert_timestamp - ); - $discount_id = db_last_insert_id("uc_discounts", "discount_id"); - uc_discounts_log("new discount_id=". $discount_id); - return $discount_id; + if (is_null($insert_timestamp)) { + $insert_timestamp = time(); + } + + $query = "INSERT INTO {uc_discounts}(". join(",", get_uc_discounts_insert_column_names()) .") VALUES(". join(",", get_uc_discounts_column_insert_printf_wildcards()) .")"; + uc_discounts_log("query=". $query); + db_query($query, + $name, $short_description, $description, $qualifying_type, + $qualifying_amount, $has_qualifying_amount_max, $qualifying_amount_max, $discount_type, + $discount_amount, $requires_code, $filter_type, $has_role_filter, + $requires_single_product_to_qualify, $required_product, $max_times_applied, $can_be_combined_with_other_discounts, $max_uses, + $max_uses_per_user, $max_uses_per_code, $has_expiration, $expiration, + $is_published, $weight, $insert_timestamp + ); + $discount_id = db_last_insert_id("uc_discounts", "discount_id"); + uc_discounts_log("new discount_id=". $discount_id); + return $discount_id; } /** * Updates a uc_discounts row. */ function uc_discounts_update($discount_id, - $name, $short_description, $description, $qualifying_type, - $qualifying_amount, $has_qualifying_amount_max, $qualifying_amount_max, $discount_type, - $discount_amount, $requires_code, $filter_type, $has_role_filter, - $requires_single_product_to_qualify, $required_product, $max_times_applied, $can_be_combined_with_other_discounts, $max_uses, - $max_uses_per_user, $max_uses_per_code, $has_expiration, $expiration, - $is_published, $weight +$name, $short_description, $description, $qualifying_type, +$qualifying_amount, $has_qualifying_amount_max, $qualifying_amount_max, $discount_type, +$discount_amount, $requires_code, $filter_type, $has_role_filter, +$requires_single_product_to_qualify, $required_product, $max_times_applied, $can_be_combined_with_other_discounts, $max_uses, +$max_uses_per_user, $max_uses_per_code, $has_expiration, $expiration, +$is_published, $weight ) { - $query = "UPDATE {uc_discounts} SET "; + $query = "UPDATE {uc_discounts} SET "; - $column_names = get_uc_discounts_update_column_names(); - $printf_wildcards = get_uc_discounts_column_update_printf_wildcards(); + $column_names = get_uc_discounts_update_column_names(); + $printf_wildcards = get_uc_discounts_column_update_printf_wildcards(); - for ($i = 0; $i < count($column_names); $i++) { - if ($i != 0) { - $query .= ", "; - } - $query .= $column_names[$i] ."=". $printf_wildcards[$i]; - } - - $query .= " WHERE discount_id=%d"; - - uc_discounts_log("query=". $query); - db_query($query, - $name, $short_description, $description, $qualifying_type, - $qualifying_amount, $has_qualifying_amount_max, $qualifying_amount_max, $discount_type, - $discount_amount, $requires_code, $filter_type, $has_role_filter, - $requires_single_product_to_qualify, $required_product, $max_times_applied, $can_be_combined_with_other_discounts, $max_uses, - $max_uses_per_user, $max_uses_per_code, $has_expiration, $expiration, - $is_published, $weight, $discount_id - ); + for ($i = 0; $i < count($column_names); $i++) { + if ($i != 0) { + $query .= ", "; + } + $query .= $column_names[$i] ."=". $printf_wildcards[$i]; + } + + $query .= " WHERE discount_id=%d"; + + uc_discounts_log("query=". $query); + db_query($query, + $name, $short_description, $description, $qualifying_type, + $qualifying_amount, $has_qualifying_amount_max, $qualifying_amount_max, $discount_type, + $discount_amount, $requires_code, $filter_type, $has_role_filter, + $requires_single_product_to_qualify, $required_product, $max_times_applied, $can_be_combined_with_other_discounts, $max_uses, + $max_uses_per_user, $max_uses_per_code, $has_expiration, $expiration, + $is_published, $weight, $discount_id + ); } /** * Deletes a uc_discounts row and all dependencies. */ function uc_discounts_delete_all($discount_id) { - db_query("DELETE FROM {uc_discounts_uses} WHERE discount_id=%d", $discount_id); - db_query("DELETE FROM {uc_discounts_products} WHERE discount_id=%d", $discount_id); - db_query("DELETE FROM {uc_discounts_terms} WHERE discount_id=%d", $discount_id); - db_query("DELETE FROM {uc_discounts_skus} WHERE discount_id=%d", $discount_id); - db_query("DELETE FROM {uc_discounts_roles} WHERE discount_id=%d", $discount_id); - db_query("DELETE FROM {uc_discounts_codes} WHERE discount_id=%d", $discount_id); - db_query("DELETE FROM {uc_discounts} WHERE discount_id=%d", $discount_id); + db_query("DELETE FROM {uc_discounts_uses} WHERE discount_id=%d", $discount_id); + db_query("DELETE FROM {uc_discounts_products} WHERE discount_id=%d", $discount_id); + db_query("DELETE FROM {uc_discounts_terms} WHERE discount_id=%d", $discount_id); + db_query("DELETE FROM {uc_discounts_skus} WHERE discount_id=%d", $discount_id); + db_query("DELETE FROM {uc_discounts_roles} WHERE discount_id=%d", $discount_id); + db_query("DELETE FROM {uc_discounts_codes} WHERE discount_id=%d", $discount_id); + db_query("DELETE FROM {uc_discounts} WHERE discount_id=%d", $discount_id); } /** * Returns codes for discount. */ function get_codes_for_discount($discount_id) { - $codes = array(); + $codes = array(); - //Get codes from database - $result = db_query("SELECT code FROM {uc_discounts_codes} WHERE discount_id=%d", $discount_id); - while ($row = db_fetch_array($result)) $codes[] = $row["code"]; - return $codes; + //Get codes from database + $result = db_query("SELECT code FROM {uc_discounts_codes} WHERE discount_id=%d", $discount_id); + while ($row = db_fetch_array($result)) $codes[] = $row["code"]; + return $codes; } /** * Inserts a uc_discounts_codes row and returns its discount_code_id. */ function uc_discounts_codes_insert($discount_id, $code) { - $query = "INSERT INTO {uc_discounts_codes}(discount_id, code) VALUES(%d, '%s')"; - uc_discounts_log("query=". $query); - db_query($query, $discount_id, $code); - return db_last_insert_id("uc_discounts_codes", "discount_code_id"); + $query = "INSERT INTO {uc_discounts_codes}(discount_id, code) VALUES(%d, '%s')"; + uc_discounts_log("query=". $query); + db_query($query, $discount_id, $code); + return db_last_insert_id("uc_discounts_codes", "discount_code_id"); } /** * Deletes all uc_discounts_codes rows for a discount. */ function uc_discounts_codes_delete($discount_id) { - $query = "DELETE FROM {uc_discounts_codes} WHERE discount_id=%d"; - uc_discounts_log("query=". $query); - db_query($query, $discount_id); + $query = "DELETE FROM {uc_discounts_codes} WHERE discount_id=%d"; + uc_discounts_log("query=". $query); + db_query($query, $discount_id); } /** @@ -730,42 +735,42 @@ * @return array of product ids (nids) */ function get_product_ids_for_discount_object($discount, $exclude_all_products = FALSE) { - switch ($discount->filter_type) { - case FILTER_TYPE_PRODUCTS: - return get_product_ids_for_discount($discount->discount_id, $exclude_all_products); + switch ($discount->filter_type) { + case FILTER_TYPE_PRODUCTS: + return get_product_ids_for_discount($discount->discount_id, $exclude_all_products); - case FILTER_TYPE_TERMS: - $product_ids = array(); + case FILTER_TYPE_TERMS: + $product_ids = array(); - //Get products for terms - $query = "SELECT DISTINCT p.nid FROM {uc_products} p + //Get products for terms + $query = "SELECT DISTINCT p.nid FROM {uc_products} p INNER JOIN {term_node} tn ON p.nid=tn.nid INNER JOIN {uc_discounts_terms} dt ON tn.tid=dt.term_id WHERE dt.discount_id=%d"; - uc_discounts_log($query); - $result = db_query($query, $discount->discount_id); - while ($row = db_fetch_array($result)) $product_ids[] = $row["nid"]; - return $product_ids; + uc_discounts_log($query); + $result = db_query($query, $discount->discount_id); + while ($row = db_fetch_array($result)) $product_ids[] = $row["nid"]; + return $product_ids; - case FILTER_TYPE_SKUS: - $query = "SELECT DISTINCT p.nid FROM {uc_products} p + case FILTER_TYPE_SKUS: + $query = "SELECT DISTINCT p.nid FROM {uc_products} p INNER JOIN {uc_discounts_skus} ds ON p.model=ds.sku WHERE ds.discount_id=%d"; - uc_discounts_log($query); - $result = db_query($query, $discount->discount_id); - while ($row = db_fetch_array($result)) $product_ids[] = $row["nid"]; - return $product_ids; + uc_discounts_log($query); + $result = db_query($query, $discount->discount_id); + while ($row = db_fetch_array($result)) $product_ids[] = $row["nid"]; + return $product_ids; - case FILTER_TYPE_CLASS: - $query = "SELECT DISTINCT n.nid FROM {node} n + case FILTER_TYPE_CLASS: + $query = "SELECT DISTINCT n.nid FROM {node} n INNER JOIN {uc_discounts_classes} dcl ON n.type=dcl.class WHERE dcl.discount_id=%d"; - uc_discounts_log($query); - $result = db_query($query, $discount->discount_id); - while ($row = db_fetch_array($result)) $product_ids[] = $row["nid"]; - return $product_ids; - } - return array(); + uc_discounts_log($query); + $result = db_query($query, $discount->discount_id); + while ($row = db_fetch_array($result)) $product_ids[] = $row["nid"]; + return $product_ids; + } + return array(); } /** @@ -779,185 +784,185 @@ * @return array of product ids (nids) */ function get_product_ids_for_discount($discount_id, $exclude_all_products = FALSE) { - $product_ids = array(); + $product_ids = array(); - //Get products from database - if ($exclude_all_products) { - $result = db_query("SELECT product_id FROM {uc_discounts_products} WHERE discount_id=%d AND product_id<>%d", - $discount_id, ALL_PRODUCTS - ); - } - else $result = db_query("SELECT product_id FROM {uc_discounts_products} WHERE discount_id=%d", $discount_id); + //Get products from database + if ($exclude_all_products) { + $result = db_query("SELECT product_id FROM {uc_discounts_products} WHERE discount_id=%d AND product_id<>%d", + $discount_id, ALL_PRODUCTS + ); + } + else $result = db_query("SELECT product_id FROM {uc_discounts_products} WHERE discount_id=%d", $discount_id); - while ($row = db_fetch_array($result)) $product_ids[] = $row["product_id"]; - return $product_ids; + while ($row = db_fetch_array($result)) $product_ids[] = $row["product_id"]; + return $product_ids; } /** * Inserts a uc_discounts_products row and returns its discount_product_id. */ function uc_discounts_products_insert($discount_id, $product_id) { - $query = "INSERT INTO {uc_discounts_products}(discount_id, product_id) VALUES(%d, %d)"; - uc_discounts_log("query=". $query); - db_query($query, $discount_id, $product_id); - return db_last_insert_id("uc_discounts_products", "discount_product_id"); + $query = "INSERT INTO {uc_discounts_products}(discount_id, product_id) VALUES(%d, %d)"; + uc_discounts_log("query=". $query); + db_query($query, $discount_id, $product_id); + return db_last_insert_id("uc_discounts_products", "discount_product_id"); } /** * Deletes all uc_discounts_products rows for a discount. */ function uc_discounts_products_delete($discount_id) { - $query = "DELETE FROM {uc_discounts_products} WHERE discount_id=%d"; - uc_discounts_log("query=". $query); - db_query($query, $discount_id); + $query = "DELETE FROM {uc_discounts_products} WHERE discount_id=%d"; + uc_discounts_log("query=". $query); + db_query($query, $discount_id); } /** * Returns term_ids for discount. */ function get_term_ids_for_discount($discount_id, $exclude_all_terms = FALSE) { - $term_ids = array(); + $term_ids = array(); - //Get terms from database - if ($exclude_all_terms) { - $result = db_query("SELECT term_id FROM {uc_discounts_terms} WHERE discount_id=%d AND term_id<>%d", - $discount_id, ALL_TERMS - ); - } - else $result = db_query("SELECT term_id FROM {uc_discounts_terms} WHERE discount_id=%d", $discount_id); + //Get terms from database + if ($exclude_all_terms) { + $result = db_query("SELECT term_id FROM {uc_discounts_terms} WHERE discount_id=%d AND term_id<>%d", + $discount_id, ALL_TERMS + ); + } + else $result = db_query("SELECT term_id FROM {uc_discounts_terms} WHERE discount_id=%d", $discount_id); - while ($row = db_fetch_array($result)) $term_ids[] = $row["term_id"]; - return $term_ids; + while ($row = db_fetch_array($result)) $term_ids[] = $row["term_id"]; + return $term_ids; } /** * Returns SKUs for discount. */ function get_skus_for_discount($discount_id, $exclude_all_skus = FALSE) { - $skus = array(); + $skus = array(); - //Get SKUs from database - if ($exclude_all_skus) { - $result = db_query("SELECT sku FROM {uc_discounts_skus} WHERE discount_id=%d AND sku<>%d", - $discount_id, ALL_SKUS - ); - } - else $result = db_query("SELECT sku FROM {uc_discounts_skus} WHERE discount_id=%d", $discount_id); + //Get SKUs from database + if ($exclude_all_skus) { + $result = db_query("SELECT sku FROM {uc_discounts_skus} WHERE discount_id=%d AND sku<>%d", + $discount_id, ALL_SKUS + ); + } + else $result = db_query("SELECT sku FROM {uc_discounts_skus} WHERE discount_id=%d", $discount_id); - while ($row = db_fetch_array($result)) $skus[] = $row["sku"]; - return $skus; + while ($row = db_fetch_array($result)) $skus[] = $row["sku"]; + return $skus; } /** * Returns Product Class names for discount. */ function get_classes_for_discount($discount_id, $exclude_all_classes = FALSE) { - $classes = array(); + $classes = array(); - //Get Classes from database - if ($exclude_all_classes) { - $result = db_query("SELECT class FROM {uc_discounts_classes} WHERE discount_id=%d AND class<>%d", - $discount_id, ALL_CLASSES - ); - } - else $result = db_query("SELECT class FROM {uc_discounts_classes} WHERE discount_id=%d", $discount_id); + //Get Classes from database + if ($exclude_all_classes) { + $result = db_query("SELECT class FROM {uc_discounts_classes} WHERE discount_id=%d AND class<>%d", + $discount_id, ALL_CLASSES + ); + } + else $result = db_query("SELECT class FROM {uc_discounts_classes} WHERE discount_id=%d", $discount_id); - while ($row = db_fetch_array($result)) $classes[] = $row["class"]; - return $classes; + while ($row = db_fetch_array($result)) $classes[] = $row["class"]; + return $classes; } /** * Returns role_ids for discount. */ function get_role_ids_for_discount($discount_id, $exclude_all_roles = FALSE) { - $role_ids = array(); + $role_ids = array(); - //Get roles from database - if ($exclude_all_roles) { - $result = db_query("SELECT role_id FROM {uc_discounts_roles} WHERE discount_id=%d AND role_id<>%d", - $discount_id, ALL_ROLES - ); - } - else $result = db_query("SELECT role_id FROM {uc_discounts_roles} WHERE discount_id=%d", $discount_id); + //Get roles from database + if ($exclude_all_roles) { + $result = db_query("SELECT role_id FROM {uc_discounts_roles} WHERE discount_id=%d AND role_id<>%d", + $discount_id, ALL_ROLES + ); + } + else $result = db_query("SELECT role_id FROM {uc_discounts_roles} WHERE discount_id=%d", $discount_id); - while ($row = db_fetch_array($result)) $role_ids[] = $row["role_id"]; - return $role_ids; + while ($row = db_fetch_array($result)) $role_ids[] = $row["role_id"]; + return $role_ids; } /** * Inserts a uc_discounts_terms row and returns its discount_term_id. */ function uc_discounts_terms_insert($discount_id, $term_id) { - $query = "INSERT INTO {uc_discounts_terms}(discount_id, term_id) VALUES(%d, %d)"; - uc_discounts_log("query=". $query); - db_query($query, $discount_id, $term_id); - return db_last_insert_id("uc_discounts_terms", "discount_term_id"); + $query = "INSERT INTO {uc_discounts_terms}(discount_id, term_id) VALUES(%d, %d)"; + uc_discounts_log("query=". $query); + db_query($query, $discount_id, $term_id); + return db_last_insert_id("uc_discounts_terms", "discount_term_id"); } /** * Deletes all uc_discounts_terms rows for a discount. */ function uc_discounts_terms_delete($discount_id) { - $query = "DELETE FROM {uc_discounts_terms} WHERE discount_id=%d"; - uc_discounts_log("query=". $query); - db_query($query, $discount_id); + $query = "DELETE FROM {uc_discounts_terms} WHERE discount_id=%d"; + uc_discounts_log("query=". $query); + db_query($query, $discount_id); } /** * Inserts a uc_discounts_skus row and returns its discount_sku_id. */ function uc_discounts_skus_insert($discount_id, $sku) { - $query = "INSERT INTO {uc_discounts_skus}(discount_id, sku) VALUES(%d, '%s')"; - uc_discounts_log("query=". $query); - db_query($query, $discount_id, $sku); - return db_last_insert_id("uc_discounts_skus", "discount_sku_id"); + $query = "INSERT INTO {uc_discounts_skus}(discount_id, sku) VALUES(%d, '%s')"; + uc_discounts_log("query=". $query); + db_query($query, $discount_id, $sku); + return db_last_insert_id("uc_discounts_skus", "discount_sku_id"); } /** * Deletes all uc_discounts_skus rows for a discount. */ function uc_discounts_skus_delete($discount_id) { - $query = "DELETE FROM {uc_discounts_skus} WHERE discount_id=%d"; - uc_discounts_log("query=". $query); - db_query($query, $discount_id); + $query = "DELETE FROM {uc_discounts_skus} WHERE discount_id=%d"; + uc_discounts_log("query=". $query); + db_query($query, $discount_id); } /** * Inserts a uc_discounts_classes row and returns its discount_class_id. */ function uc_discounts_classes_insert($discount_id, $class) { - $query = "INSERT INTO {uc_discounts_classes}(discount_id, class) VALUES(%d, '%s')"; - uc_discounts_log("query=". $query); - db_query($query, $discount_id, $class); - return db_last_insert_id("uc_discounts_classes", "discount_class_id"); + $query = "INSERT INTO {uc_discounts_classes}(discount_id, class) VALUES(%d, '%s')"; + uc_discounts_log("query=". $query); + db_query($query, $discount_id, $class); + return db_last_insert_id("uc_discounts_classes", "discount_class_id"); } /** * Deletes all uc_discounts_classes rows for a discount. */ function uc_discounts_classes_delete($discount_id) { - $query = "DELETE FROM {uc_discounts_classes} WHERE discount_id=%d"; - uc_discounts_log("query=". $query); - db_query($query, $discount_id); + $query = "DELETE FROM {uc_discounts_classes} WHERE discount_id=%d"; + uc_discounts_log("query=". $query); + db_query($query, $discount_id); } /** * Inserts a uc_discounts_roles row and returns its discount_role_id. */ function uc_discounts_roles_insert($discount_id, $role_id) { - $query = "INSERT INTO {uc_discounts_roles}(discount_id, role_id) VALUES(%d, %d)"; - uc_discounts_log("query=". $query); - db_query($query, $discount_id, $role_id); - return db_last_insert_id("uc_discounts_roles", "discount_role_id"); + $query = "INSERT INTO {uc_discounts_roles}(discount_id, role_id) VALUES(%d, %d)"; + uc_discounts_log("query=". $query); + db_query($query, $discount_id, $role_id); + return db_last_insert_id("uc_discounts_roles", "discount_role_id"); } /** * Deletes all uc_discounts_roles rows for a discount. */ function uc_discounts_roles_delete($discount_id) { - $query = "DELETE FROM {uc_discounts_roles} WHERE discount_id=%d"; - uc_discounts_log("query=". $query); - db_query($query, $discount_id); + $query = "DELETE FROM {uc_discounts_roles} WHERE discount_id=%d"; + uc_discounts_log("query=". $query); + db_query($query, $discount_id); } /** @@ -971,112 +976,112 @@ * @return array of discount objects */ function get_discounts_for_order($order, &$errors = NULL, &$warnings = NULL, &$messages = NULL) { - // Product NIDS in cart => subtotal of individual item - $order_product_id_subtotal_map = array(); - // Product NIDS in cart => quantity of individual item - $order_product_id_quantity_map = array(); - // Product NIDS in cart - $order_product_ids = array(); - // Product NIDS in cart=> bool - $order_product_ids_set = array(); - // Product objects in cart - $order_product_id_product_array_map = array(); - $order_subtotal = 0; - - //Create IN string of product node IDs in order - if (is_array($order->products) && !empty($order->products)) { - foreach ($order->products as $product) { - $nid = $product->nid; - - $order_product_ids_set[$nid] = TRUE; - - uc_discounts_add_to_existing_map_number_value($order_product_id_subtotal_map, - $nid, $product->price * $product->qty - ); - uc_discounts_add_to_existing_map_number_value($order_product_id_quantity_map, $nid, $product->qty); - - $a = $order_product_id_product_array_map[$nid]; - if (!is_array($a)) { - $a = array(); - } - $a[] = $product; - $order_product_id_product_array_map[$nid] = $a; - - $order_subtotal += $product->price * $product->qty; - } - } - - // Populate product NID array with NIDs from the order - $order_product_ids = array_keys($order_product_ids_set); - - $temp_product_ids = $order_product_ids; - $temp_product_ids[] = ALL_PRODUCTS; - $product_ids_clause = sprintf("d.filter_type<>%d OR dp.product_id IN(%s)", - FILTER_TYPE_PRODUCTS, join(",", $temp_product_ids) - ); - - //Create IN string of term TIDs in order - $temp_term_ids = array(); - $temp_term_ids[] = ALL_TERMS; - if (is_array($order->products) && !empty($order->products)) { - //Get terms for order's products - $result = db_query("SELECT DISTINCT tid FROM {term_node} WHERE nid IN(%s)", join(",", $order_product_ids)); - while ($row = db_fetch_array($result)) { - $temp_term_ids[] = $row["tid"]; - $order_term_ids[] = $row["tid"]; - } - } - $term_ids_clause = sprintf("d.filter_type<>%d OR dt.term_id IN(%s)", - FILTER_TYPE_TERMS, join(",", $temp_term_ids) - ); - - //Create IN string of SKUs in order - $temp_skus = array(); - $temp_skus[] = "'". db_escape_string(ALL_SKUS) ."'"; - if (is_array($order->products) && !empty($order->products)) { - //Get SKUs for order's products - $result = db_query("SELECT DISTINCT model FROM {uc_products} WHERE nid IN(%s)", join(",", $order_product_ids)); - while ($row = db_fetch_array($result)) $temp_skus[] = "'". db_escape_string($row["model"]) ."'"; - } - $skus_clause = sprintf("d.filter_type<>%d OR ds.sku IN(%s)", - FILTER_TYPE_SKUS, join(",", $temp_skus) - ); - - //Create IN string of classes in order - $temp_classes = array(); - $temp_classes[] = "'". db_escape_string(ALL_CLASSES) ."'"; - if (is_array($order->products) && !empty($order->products)) { - //Get classes for order's products - $result = db_query("SELECT DISTINCT type FROM {node} WHERE nid IN(%s)", join(",", $order_product_ids)); - while ($row = db_fetch_array($result)) $temp_classes[] = "'". db_escape_string($row["type"]) ."'"; - } - $classes_clause = sprintf("d.filter_type<>%d OR dcl.class IN(%s)", - FILTER_TYPE_CLASS, join(",", $temp_classes) - ); - - //Create codes clause - $escaped_codes_string = NULL; - if (!empty($order->uc_discounts_codes)) { - //Create IN string of product node IDs in order - $escaped_codes = array(); - foreach ($order->uc_discounts_codes as $code) $escaped_codes[] = "'". db_escape_string($code) ."'"; - $escaped_codes_string = join(",", $escaped_codes); - - $codes_clause = sprintf(" OR d.discount_id IN( SELECT discount_id FROM {uc_discounts_codes} WHERE code IN(%s) )", - $escaped_codes_string - ); - } - else $codes_clause = ""; - - //Create roles clause - $auth_rid = ($order->uid != 0) ? DRUPAL_AUTHENTICATED_RID : DRUPAL_ANONYMOUS_RID; - $roles_clause = sprintf(" OR d.discount_id IN(SELECT dr.discount_id FROM {uc_discounts_roles} dr" . ", {users_roles} ur WHERE (dr.role_id=ur.rid AND ur.uid=%d) OR dr.role_id=%d OR dr.role_id=%d)", - $order->uid, ALL_ROLES, $auth_rid - ); - - //Add warnings for expired discounts with codes (if necessary) - if (!empty($order->uc_discounts_codes)) { - $query = sprintf("SELECT DISTINCT d.*, dc.code code FROM {uc_discounts} d + // Product NIDS in cart => subtotal of individual item + $order_product_id_subtotal_map = array(); + // Product NIDS in cart => quantity of individual item + $order_product_id_quantity_map = array(); + // Product NIDS in cart + $order_product_ids = array(); + // Product NIDS in cart=> bool + $order_product_ids_set = array(); + // Product objects in cart + $order_product_id_product_array_map = array(); + $order_subtotal = 0; + + //Create IN string of product node IDs in order + if (is_array($order->products) && !empty($order->products)) { + foreach ($order->products as $product) { + $nid = $product->nid; + + $order_product_ids_set[$nid] = TRUE; + + uc_discounts_add_to_existing_map_number_value($order_product_id_subtotal_map, + $nid, $product->price * $product->qty + ); + uc_discounts_add_to_existing_map_number_value($order_product_id_quantity_map, $nid, $product->qty); + + $a = $order_product_id_product_array_map[$nid]; + if (!is_array($a)) { + $a = array(); + } + $a[] = $product; + $order_product_id_product_array_map[$nid] = $a; + + $order_subtotal += $product->price * $product->qty; + } + } + + // Populate product NID array with NIDs from the order + $order_product_ids = array_keys($order_product_ids_set); + + $temp_product_ids = $order_product_ids; + $temp_product_ids[] = ALL_PRODUCTS; + $product_ids_clause = sprintf("d.filter_type<>%d OR dp.product_id IN(%s)", + FILTER_TYPE_PRODUCTS, join(",", $temp_product_ids) + ); + + //Create IN string of term TIDs in order + $temp_term_ids = array(); + $temp_term_ids[] = ALL_TERMS; + if (is_array($order->products) && !empty($order->products)) { + //Get terms for order's products + $result = db_query("SELECT DISTINCT tid FROM {term_node} WHERE nid IN(%s)", join(",", $order_product_ids)); + while ($row = db_fetch_array($result)) { + $temp_term_ids[] = $row["tid"]; + $order_term_ids[] = $row["tid"]; + } + } + $term_ids_clause = sprintf("d.filter_type<>%d OR dt.term_id IN(%s)", + FILTER_TYPE_TERMS, join(",", $temp_term_ids) + ); + + //Create IN string of SKUs in order + $temp_skus = array(); + $temp_skus[] = "'". db_escape_string(ALL_SKUS) ."'"; + if (is_array($order->products) && !empty($order->products)) { + //Get SKUs for order's products + $result = db_query("SELECT DISTINCT model FROM {uc_products} WHERE nid IN(%s)", join(",", $order_product_ids)); + while ($row = db_fetch_array($result)) $temp_skus[] = "'". db_escape_string($row["model"]) ."'"; + } + $skus_clause = sprintf("d.filter_type<>%d OR ds.sku IN(%s)", + FILTER_TYPE_SKUS, join(",", $temp_skus) + ); + + //Create IN string of classes in order + $temp_classes = array(); + $temp_classes[] = "'". db_escape_string(ALL_CLASSES) ."'"; + if (is_array($order->products) && !empty($order->products)) { + //Get classes for order's products + $result = db_query("SELECT DISTINCT type FROM {node} WHERE nid IN(%s)", join(",", $order_product_ids)); + while ($row = db_fetch_array($result)) $temp_classes[] = "'". db_escape_string($row["type"]) ."'"; + } + $classes_clause = sprintf("d.filter_type<>%d OR dcl.class IN(%s)", + FILTER_TYPE_CLASS, join(",", $temp_classes) + ); + + //Create codes clause + $escaped_codes_string = NULL; + if (!empty($order->uc_discounts_codes)) { + //Create IN string of product node IDs in order + $escaped_codes = array(); + foreach ($order->uc_discounts_codes as $code) $escaped_codes[] = "'". db_escape_string($code) ."'"; + $escaped_codes_string = join(",", $escaped_codes); + + $codes_clause = sprintf(" OR d.discount_id IN( SELECT discount_id FROM {uc_discounts_codes} WHERE code IN(%s) )", + $escaped_codes_string + ); + } + else $codes_clause = ""; + + //Create roles clause + $auth_rid = ($order->uid != 0) ? DRUPAL_AUTHENTICATED_RID : DRUPAL_ANONYMOUS_RID; + $roles_clause = sprintf(" OR d.discount_id IN(SELECT dr.discount_id FROM {uc_discounts_roles} dr" . ", {users_roles} ur WHERE (dr.role_id=ur.rid AND ur.uid=%d) OR dr.role_id=%d OR dr.role_id=%d)", + $order->uid, ALL_ROLES, $auth_rid + ); + + //Add warnings for expired discounts with codes (if necessary) + if (!empty($order->uc_discounts_codes)) { + $query = sprintf("SELECT DISTINCT d.*, dc.code code FROM {uc_discounts} d LEFT JOIN {uc_discounts_products} dp ON d.discount_id=dp.discount_id LEFT JOIN {uc_discounts_terms} dt ON d.discount_id=dt.discount_id LEFT JOIN {uc_discounts_skus} ds ON d.discount_id=ds.discount_id @@ -1090,18 +1095,18 @@ AND (%s) AND (d.has_expiration<>0 AND d.expiration<=%d) ORDER BY weight", $escaped_codes_string, $roles_clause, $product_ids_clause, - $term_ids_clause, $skus_clause, $classes_clause, time() - ); - uc_discounts_log("query=". $query); - $result = db_query($query); - while ($discount = db_fetch_object($result)) { - $warnings[] = t('The discount for code "@code" has expired.', - array("@code" => $discount->code) - ); - } - } + $term_ids_clause, $skus_clause, $classes_clause, time() + ); + uc_discounts_log("query=". $query); + $result = db_query($query); + while ($discount = db_fetch_object($result)) { + $warnings[] = t('The discount for code "@code" has expired.', + array("@code" => $discount->code) + ); + } + } - $query = sprintf("SELECT DISTINCT d.* FROM {uc_discounts} d + $query = sprintf("SELECT DISTINCT d.* FROM {uc_discounts} d LEFT JOIN {uc_discounts_products} dp ON d.discount_id=dp.discount_id LEFT JOIN {uc_discounts_terms} dt ON d.discount_id=dt.discount_id LEFT JOIN {uc_discounts_skus} ds ON d.discount_id=ds.discount_id @@ -1112,433 +1117,433 @@ AND (%s) AND (d.has_expiration=0 OR d.expiration>%d) ORDER BY weight", $codes_clause, $roles_clause, $product_ids_clause, - $term_ids_clause, $skus_clause, $classes_clause, time() - ); - uc_discounts_log("query=". $query); - $result = db_query($query); - - $total_discount_amount = 0; - $discounts = array(); - // Appears to check if order qualifies for each discount then applies discount. Functionality should be separated, no? - while ($discount = db_fetch_object($result)) { - //Get code for discount (if one exists) - $discount->code = NULL; - if (!empty($escaped_codes_string)) { - $query = sprintf("SELECT code FROM {uc_discounts_codes} WHERE code IN(%s) AND discount_id=%d", - $escaped_codes_string, $discount->discount_id - ); - $row = db_fetch_array(db_query($query)); - if (!empty($row)) { - $discount->code = $row["code"]; - } - } - - //The query handled valid codes and expiration, this block must: - // check max uses (if applicable) - // check if discount is being combined and can be combined - // check if order qualifies (type, requires_single_product_to_qualify, required_product, can_be_combined_with_other_discounts) - // determine number of times to apply discount - - //If this discount has a max uses amount, check max uses - if ($discount->max_uses > 0) { - $row = db_fetch_array(db_query("SELECT COUNT(*) as uses_count FROM {uc_discounts_uses} WHERE discount_id=%d", - $discount->discount_id - )); - if ($row["uses_count"] >= $discount->max_uses) { - //If this is a coded discount, add error message - if (!is_null($warnings) && !is_null($discount->code)) { - $warnings[] = t('The discount for code "@code" has reached its max number of uses.', - array("@code" => $discount->code) - ); - } - continue; - } - - $discount->uses_count = $row["uses_count"]; - } - - //If this discount has a max uses per user amount, check max uses per user - if ($discount->max_uses_per_user > 0) { - $row = db_fetch_array(db_query("SELECT COUNT(*) as user_uses_count FROM {uc_discounts_uses} WHERE discount_id=%d AND user_id=%d", - $discount->discount_id, $order->uid - )); - if ($row["user_uses_count"] >= $discount->max_uses_per_user) { - //If this is a coded discount, add warning message - if (!is_null($warnings) && !is_null($discount->code)) { - $warnings[] = t('The discount for code "@code" has reached its max number of uses.', - array("@code" => $discount->code) - ); - } - continue; - } - - $discount->user_uses_count = $row["user_uses_count"]; - } - - //If code exists and this discount has a max uses per code amount, check max uses per code - if (!is_null($discount->code) && ($discount->max_uses_per_code > 0)) { - $row = db_fetch_array(db_query("SELECT COUNT(*) as code_uses_count FROM {uc_discounts_uses} WHERE discount_id=%d AND code='%s'", - $discount->discount_id, $discount->code - )); - if ($row["code_uses_count"] >= $discount->max_uses_per_code) { - //Add warning message - if (!is_null($warnings)) { - $warnings[] = t('The discount code "@code" has reached its max number of uses.', - array("@code" => $discount->code) - ); - } - continue; - } - - $discount->code_uses_count = $row["code_uses_count"]; - } - - //If there are applied discounts, check if discount is being combined and can be combined - if (count($discounts) > 0) { - if (!$discount->can_be_combined_with_other_discounts) { - //If this is a coded discount, add error message - if (!is_null($warnings) && !is_null($discount->code)) { - $warnings[] = t('The discount for code "@code" cannot be combined with other discounts.', - array("@code" => $discount->code) - ); - } - continue; - } - - // Check if the first discount can't be combined - if (!$discounts[0]->can_be_combined_with_other_discounts) { - //If first discount was a coded discount, add error message (only print warning if both - //discounts have codes) - if (!is_null($warnings) && !empty($discounts[0]->code) && !is_null($discount->code)) { - $warnings[] = t('The discount for code "@code" cannot be combined with other discounts.', - array("@code" => $discounts[0]->code) - ); - } - continue; - } - } - - //Check if order qualifies for this discount (check type, requires_single_product_to_qualify, required_product) - - //Get product IDs for discount - $discount_product_ids = get_product_ids_for_discount_object($discount); - if (in_array(ALL_PRODUCTS, $discount_product_ids)) { - $discount_product_ids = $order_product_ids; - } - - //Determine total qualifying amount of order (store in order_qualifying_amount) - //and qualifying subtotal of order (store in order_qualifying_subtotal) - - $order_qualifying_amount = 0; - $order_qualifying_subtotal = 0; - - //If discount requires a single product - if ($discount->requires_single_product_to_qualify) { - // Check if required_product is set or trust that form validation did the right thing? Check anyway... - if ($discount->required_product) { - - // Get nid of required_product - $required_product_result = db_query("SELECT DISTINCT nid from {uc_products} WHERE model=('%s')", $discount->required_product); - $required_product_id = db_result($required_product_result); - - // Check if required_product nid is in cart - if (in_array($required_product_id, $order_product_ids)) { - switch ($discount->qualifying_type) { - // Buy $50 of X product - - case QUALIFYING_TYPE_MINIMUM_PRICE: - //Determine the maximum product subtotal - $order_qualifying_amount = max($order_qualifying_amount, $order_product_id_subtotal_map[$required_product_id]); - - //Subtract already discounted amount - $order_qualifying_amount -= $total_discount_amount; - //TO DO: keep track of each item's subtotal and decrement upon applying discount - break; - - // Buy 5 of X product... - - case QUALIFYING_TYPE_MINIMUM_QUANTITY: - //Determine the maximum product quantity - $order_qualifying_amount = max($order_qualifying_amount, $order_product_id_quantity_map[$required_product_id]); - //TO DO: keep track of each item's quantity and decrement upon applying discount - break; - } - } - } - } - //Otherwise sum product subtotals or quantities - else { - switch ($discount->qualifying_type) { - case QUALIFYING_TYPE_MINIMUM_PRICE: - //Determine the total subtotal of discount's products - foreach ($discount_product_ids as $product_id) { - if (isset($order_product_id_subtotal_map[$product_id])) { - $order_qualifying_amount += $order_product_id_subtotal_map[$product_id]; - } - } - - //Subtract already discounted amount - $order_qualifying_amount -= $total_discount_amount; - break; - - case QUALIFYING_TYPE_MINIMUM_QUANTITY: - //Determine the total quantity of discount's products - foreach ($discount_product_ids as $product_id) { - if (isset($order_product_id_quantity_map[$product_id])) { - $order_qualifying_amount += $order_product_id_quantity_map[$product_id]; - } - } - //TO DO: keep track of each item's subtotal and decrement upon applying discount - break; - } - } - - //If order does not qualify for this discount - if ($order_qualifying_amount < $discount->qualifying_amount) { - //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); - $warnings[] = t('The discount for code "@code" requires a minimum price of @qualifying_amount to qualify.', - array("@code" => $discount->code, "@qualifying_amount" => $qualifying_amount) - ); - break; - - 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) - ); - break; - } - } - continue; - } - - //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)) { - //If this is a coded discount, add error message - if (!is_null($warnings) && !is_null($discount->code)) { - $qualifying_amount_max = uc_currency_format($discount->qualifying_amount_max); - switch ($discount->qualifying_type) { - case QUALIFYING_TYPE_MINIMUM_PRICE: - $warnings[] = t('The discount for code "@code" cannot exceed the price of @qualifying_amount_max to qualify.', - array("@code" => $discount->code, "@qualifying_amount_max" => $qualifying_amount_max) - ); - break; - - case QUALIFYING_TYPE_MINIMUM_QUANTITY: - $warnings[] = t('The discount for code "@code" cannot exceed the quantity of @qualifying_amount_max to qualify.', - array("@code" => $discount->code, "@qualifying_amount_max" => $discount->qualifying_amount_max) - ); - break; - } - } - continue; - } - - //Determine number of times to apply discount - if ($discount->qualifying_amount != 0) { - $discount->times_applied = (int)($order_qualifying_amount / $discount->qualifying_amount); - } - else $discount->times_applied = 1; - if ($discount->max_times_applied != 0) { - $discount->times_applied = min($discount->times_applied, $discount->max_times_applied); - } - - //Get product IDs in order that are in discount - $order_and_discount_product_ids = array_intersect($discount_product_ids, $order_product_ids); - - //Create array of product objects in cart to which this discount gets applied. - $order_and_discount_products = array(); - foreach ($order_and_discount_product_ids as $product_id) { - if (array_key_exists($product_id, $order_product_id_product_array_map)) { - $order_and_discount_products = array_merge($order_and_discount_products, - $order_product_id_product_array_map[$product_id] - ); - } - } - - switch ($discount->discount_type) { - case DISCOUNT_TYPE_PERCENTAGE_OFF_PER_QUALIFYING_ITEM: - $order_and_discount_product_ids = array_intersect($discount_product_ids, $order_product_ids); - foreach ($order->products as $this_product) { - if (in_array($this_product->nid, $order_and_discount_product_ids)) { - $this_product_price = $this_product->price; - $product_sum = $product_sum + $this_product_price; - } - } - $discount->amount = $product_sum * $discount->discount_amount; - break; - case DISCOUNT_TYPE_FREE_ITEMS: - //The variable discount_amount is the monitary amount of discount - $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; - - //Loop until all free items have been applied or there are no more products to - //discount (discount cheapest first) - while ($free_items_remaining > 0) { - //Determine cheapest remaining qualifying item - $cheapest_product = NULL; - foreach ($order_and_discount_products as $product) { - //If this product has been fully discounted, continue - if ($product->uc_discounts_is_fully_discounted) { - continue; - } - - //If no current cheapest product exists, use this product - if (is_null($cheapest_product)) { - $cheapest_product = $product; - } - else { - //If this product is cheaper than the current cheapest product, - //use this product instead - if ($product->price < $cheapest_product->price) { - $cheapest_product = $product; - } - } - } - - //If no cheapest product could be found, there are no more products to - //discount, break - if (is_null($cheapest_product)) - break; - - //Discount up to the lesser of cheapest product quantity and free_items_remaining - $discount_count = min($cheapest_product->qty, $free_items_remaining); - - //Add current discount amount to running total - $discount_amount += $discount_count * $cheapest_product->price; - - //Mark item fully discounted - $cheapest_product->uc_discounts_is_fully_discounted = TRUE; - - $free_items_remaining -= $discount_count; - } - - $discount->amount = $discount_amount; - break; - case DISCOUNT_TYPE_PERCENTAGE_OFF: - //Always apply once - $discount->times_applied = 1; - - //If this discount uses all products and previous discount is: - // same weight as this discount - // percentage off - // products of discounts must match - //discount using same subtotal as last discount - if (count($discounts) > 0) { - $last_discount = $discounts[count($discounts) - 1]; - if (($last_discount->weight == $discount->weight) - && ($last_discount->discount_type == DISCOUNT_TYPE_PERCENTAGE_OFF) - ) { - //Last discount's and this discount's products must match exactly - $are_equal = TRUE; - $last_discount_product_ids = get_product_ids_for_discount_object($last_discount); - $this_discount_product_ids = get_product_ids_for_discount_object($discount); - //If both contain "all products" they are equal - if (in_array(ALL_PRODUCTS, $last_discount_product_ids) - && in_array(ALL_PRODUCTS, $this_discount_product_ids) - ) $are_equal = TRUE; - //Otherwise check arrays for equality - else { - foreach ($this_discount_product_ids as $product_id) { - if (!in_array($product_id, $last_discount_product_ids)) { - $are_equal = FALSE; - break; - } - } - - if ($are_equal) { - foreach ($last_discount_product_ids as $product_id) { - if (!in_array($product_id, $this_discount_product_ids)) { - $are_equal = FALSE; - break; - } - } - } - } - - 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; - break; - } - } - } - - //Start patch from lutegrass: - //This fixes the problem where a percent discount does not apply to all products - //(but doesn't fix the problem where the products being discounted have already been discounted - //in full, or the case where the cart consists only of the products included in this discount) - // Get qualifying products -- ignore "all products" selection - $discount_product_ids = get_product_ids_for_discount_object($discount, TRUE); - - // Do we have any products - if (count($discount_product_ids) > 0) { - $discounted_products_amount = 0; - foreach ($order_and_discount_products as $product) { - $discounted_products_amount += $product->price * $product->qty; - } - $discount->amount = $discounted_products_amount * $discount->discount_amount; - // Discount the subtotal so far - } - else { - $discount->amount = max($order_subtotal - $total_discount_amount, 0) * $discount->discount_amount; - } - //End patch from lutegrass - break; - - case DISCOUNT_TYPE_FIXED_AMOUNT_OFF: - $discount->amount = $discount->discount_amount * $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; - break; - } + $term_ids_clause, $skus_clause, $classes_clause, time() + ); + uc_discounts_log("query=". $query); + $result = db_query($query); + + $total_discount_amount = 0; + $discounts = array(); + // Appears to check if order qualifies for each discount then applies discount. Functionality should be separated, no? + while ($discount = db_fetch_object($result)) { + //Get code for discount (if one exists) + $discount->code = NULL; + if (!empty($escaped_codes_string)) { + $query = sprintf("SELECT code FROM {uc_discounts_codes} WHERE code IN(%s) AND discount_id=%d", + $escaped_codes_string, $discount->discount_id + ); + $row = db_fetch_array(db_query($query)); + if (!empty($row)) { + $discount->code = $row["code"]; + } + } + + //The query handled valid codes and expiration, this block must: + // check max uses (if applicable) + // check if discount is being combined and can be combined + // check if order qualifies (type, requires_single_product_to_qualify, required_product, can_be_combined_with_other_discounts) + // determine number of times to apply discount + + //If this discount has a max uses amount, check max uses + if ($discount->max_uses > 0) { + $row = db_fetch_array(db_query("SELECT COUNT(*) as uses_count FROM {uc_discounts_uses} WHERE discount_id=%d", + $discount->discount_id + )); + if ($row["uses_count"] >= $discount->max_uses) { + //If this is a coded discount, add error message + if (!is_null($warnings) && !is_null($discount->code)) { + $warnings[] = t('The discount for code "@code" has reached its max number of uses.', + array("@code" => $discount->code) + ); + } + continue; + } + + $discount->uses_count = $row["uses_count"]; + } + + //If this discount has a max uses per user amount, check max uses per user + if ($discount->max_uses_per_user > 0) { + $row = db_fetch_array(db_query("SELECT COUNT(*) as user_uses_count FROM {uc_discounts_uses} WHERE discount_id=%d AND user_id=%d", + $discount->discount_id, $order->uid + )); + if ($row["user_uses_count"] >= $discount->max_uses_per_user) { + //If this is a coded discount, add warning message + if (!is_null($warnings) && !is_null($discount->code)) { + $warnings[] = t('The discount for code "@code" has reached its max number of uses.', + array("@code" => $discount->code) + ); + } + continue; + } + + $discount->user_uses_count = $row["user_uses_count"]; + } + + //If code exists and this discount has a max uses per code amount, check max uses per code + if (!is_null($discount->code) && ($discount->max_uses_per_code > 0)) { + $row = db_fetch_array(db_query("SELECT COUNT(*) as code_uses_count FROM {uc_discounts_uses} WHERE discount_id=%d AND code='%s'", + $discount->discount_id, $discount->code + )); + if ($row["code_uses_count"] >= $discount->max_uses_per_code) { + //Add warning message + if (!is_null($warnings)) { + $warnings[] = t('The discount code "@code" has reached its max number of uses.', + array("@code" => $discount->code) + ); + } + continue; + } + + $discount->code_uses_count = $row["code_uses_count"]; + } + + //If there are applied discounts, check if discount is being combined and can be combined + if (count($discounts) > 0) { + if (!$discount->can_be_combined_with_other_discounts) { + //If this is a coded discount, add error message + if (!is_null($warnings) && !is_null($discount->code)) { + $warnings[] = t('The discount for code "@code" cannot be combined with other discounts.', + array("@code" => $discount->code) + ); + } + continue; + } + + // Check if the first discount can't be combined + if (!$discounts[0]->can_be_combined_with_other_discounts) { + //If first discount was a coded discount, add error message (only print warning if both + //discounts have codes) + if (!is_null($warnings) && !empty($discounts[0]->code) && !is_null($discount->code)) { + $warnings[] = t('The discount for code "@code" cannot be combined with other discounts.', + array("@code" => $discounts[0]->code) + ); + } + continue; + } + } + + //Check if order qualifies for this discount (check type, requires_single_product_to_qualify, required_product) + + //Get product IDs for discount + $discount_product_ids = get_product_ids_for_discount_object($discount); + if (in_array(ALL_PRODUCTS, $discount_product_ids)) { + $discount_product_ids = $order_product_ids; + } + + //Determine total qualifying amount of order (store in order_qualifying_amount) + //and qualifying subtotal of order (store in order_qualifying_subtotal) + + $order_qualifying_amount = 0; + $order_qualifying_subtotal = 0; + + //If discount requires a single product + if ($discount->requires_single_product_to_qualify) { + // Check if required_product is set or trust that form validation did the right thing? Check anyway... + if ($discount->required_product) { + + // Get nid of required_product + $required_product_result = db_query("SELECT DISTINCT nid from {uc_products} WHERE model=('%s')", $discount->required_product); + $required_product_id = db_result($required_product_result); + + // Check if required_product nid is in cart + if (in_array($required_product_id, $order_product_ids)) { + switch ($discount->qualifying_type) { + // Buy $50 of X product + + case QUALIFYING_TYPE_MINIMUM_PRICE: + //Determine the maximum product subtotal + $order_qualifying_amount = max($order_qualifying_amount, $order_product_id_subtotal_map[$required_product_id]); + + //Subtract already discounted amount + $order_qualifying_amount -= $total_discount_amount; + //TO DO: keep track of each item's subtotal and decrement upon applying discount + break; + + // Buy 5 of X product... + + case QUALIFYING_TYPE_MINIMUM_QUANTITY: + //Determine the maximum product quantity + $order_qualifying_amount = max($order_qualifying_amount, $order_product_id_quantity_map[$required_product_id]); + //TO DO: keep track of each item's quantity and decrement upon applying discount + break; + } + } + } + } + //Otherwise sum product subtotals or quantities + else { + switch ($discount->qualifying_type) { + case QUALIFYING_TYPE_MINIMUM_PRICE: + //Determine the total subtotal of discount's products + foreach ($discount_product_ids as $product_id) { + if (isset($order_product_id_subtotal_map[$product_id])) { + $order_qualifying_amount += $order_product_id_subtotal_map[$product_id]; + } + } + + //Subtract already discounted amount + $order_qualifying_amount -= $total_discount_amount; + break; + + case QUALIFYING_TYPE_MINIMUM_QUANTITY: + //Determine the total quantity of discount's products + foreach ($discount_product_ids as $product_id) { + if (isset($order_product_id_quantity_map[$product_id])) { + $order_qualifying_amount += $order_product_id_quantity_map[$product_id]; + } + } + //TO DO: keep track of each item's subtotal and decrement upon applying discount + break; + } + } + + //If order does not qualify for this discount + if ($order_qualifying_amount < $discount->qualifying_amount) { + //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); + $warnings[] = t('The discount for code "@code" requires a minimum price of @qualifying_amount to qualify.', + array("@code" => $discount->code, "@qualifying_amount" => $qualifying_amount) + ); + break; + + 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) + ); + break; + } + } + continue; + } + + //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)) { + //If this is a coded discount, add error message + if (!is_null($warnings) && !is_null($discount->code)) { + $qualifying_amount_max = uc_currency_format($discount->qualifying_amount_max); + switch ($discount->qualifying_type) { + case QUALIFYING_TYPE_MINIMUM_PRICE: + $warnings[] = t('The discount for code "@code" cannot exceed the price of @qualifying_amount_max to qualify.', + array("@code" => $discount->code, "@qualifying_amount_max" => $qualifying_amount_max) + ); + break; + + case QUALIFYING_TYPE_MINIMUM_QUANTITY: + $warnings[] = t('The discount for code "@code" cannot exceed the quantity of @qualifying_amount_max to qualify.', + array("@code" => $discount->code, "@qualifying_amount_max" => $discount->qualifying_amount_max) + ); + break; + } + } + continue; + } + + //Determine number of times to apply discount + if ($discount->qualifying_amount != 0) { + $discount->times_applied = (int)($order_qualifying_amount / $discount->qualifying_amount); + } + else $discount->times_applied = 1; + if ($discount->max_times_applied != 0) { + $discount->times_applied = min($discount->times_applied, $discount->max_times_applied); + } + + //Get product IDs in order that are in discount + $order_and_discount_product_ids = array_intersect($discount_product_ids, $order_product_ids); + + //Create array of product objects in cart to which this discount gets applied. + $order_and_discount_products = array(); + foreach ($order_and_discount_product_ids as $product_id) { + if (array_key_exists($product_id, $order_product_id_product_array_map)) { + $order_and_discount_products = array_merge($order_and_discount_products, + $order_product_id_product_array_map[$product_id] + ); + } + } + + switch ($discount->discount_type) { + case DISCOUNT_TYPE_PERCENTAGE_OFF_PER_QUALIFYING_ITEM: + $order_and_discount_product_ids = array_intersect($discount_product_ids, $order_product_ids); + foreach ($order->products as $this_product) { + if (in_array($this_product->nid, $order_and_discount_product_ids)) { + $this_product_price = $this_product->price; + $product_sum = $product_sum + $this_product_price; + } + } + $discount->amount = $product_sum * $discount->discount_amount; + break; + case DISCOUNT_TYPE_FREE_ITEMS: + //The variable discount_amount is the monitary amount of discount + $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; + + //Loop until all free items have been applied or there are no more products to + //discount (discount cheapest first) + while ($free_items_remaining > 0) { + //Determine cheapest remaining qualifying item + $cheapest_product = NULL; + foreach ($order_and_discount_products as $product) { + //If this product has been fully discounted, continue + if ($product->uc_discounts_is_fully_discounted) { + continue; + } + + //If no current cheapest product exists, use this product + if (is_null($cheapest_product)) { + $cheapest_product = $product; + } + else { + //If this product is cheaper than the current cheapest product, + //use this product instead + if ($product->price < $cheapest_product->price) { + $cheapest_product = $product; + } + } + } + + //If no cheapest product could be found, there are no more products to + //discount, break + if (is_null($cheapest_product)) + break; + + //Discount up to the lesser of cheapest product quantity and free_items_remaining + $discount_count = min($cheapest_product->qty, $free_items_remaining); + + //Add current discount amount to running total + $discount_amount += $discount_count * $cheapest_product->price; + + //Mark item fully discounted + $cheapest_product->uc_discounts_is_fully_discounted = TRUE; + + $free_items_remaining -= $discount_count; + } + + $discount->amount = $discount_amount; + break; + case DISCOUNT_TYPE_PERCENTAGE_OFF: + //Always apply once + $discount->times_applied = 1; + + //If this discount uses all products and previous discount is: + // same weight as this discount + // percentage off + // products of discounts must match + //discount using same subtotal as last discount + if (count($discounts) > 0) { + $last_discount = $discounts[count($discounts) - 1]; + if (($last_discount->weight == $discount->weight) + && ($last_discount->discount_type == DISCOUNT_TYPE_PERCENTAGE_OFF) + ) { + //Last discount's and this discount's products must match exactly + $are_equal = TRUE; + $last_discount_product_ids = get_product_ids_for_discount_object($last_discount); + $this_discount_product_ids = get_product_ids_for_discount_object($discount); + //If both contain "all products" they are equal + if (in_array(ALL_PRODUCTS, $last_discount_product_ids) + && in_array(ALL_PRODUCTS, $this_discount_product_ids) + ) $are_equal = TRUE; + //Otherwise check arrays for equality + else { + foreach ($this_discount_product_ids as $product_id) { + if (!in_array($product_id, $last_discount_product_ids)) { + $are_equal = FALSE; + break; + } + } + + if ($are_equal) { + foreach ($last_discount_product_ids as $product_id) { + if (!in_array($product_id, $this_discount_product_ids)) { + $are_equal = FALSE; + break; + } + } + } + } + + 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; + break; + } + } + } + + //Start patch from lutegrass: + //This fixes the problem where a percent discount does not apply to all products + //(but doesn't fix the problem where the products being discounted have already been discounted + //in full, or the case where the cart consists only of the products included in this discount) + // Get qualifying products -- ignore "all products" selection + $discount_product_ids = get_product_ids_for_discount_object($discount, TRUE); + + // Do we have any products + if (count($discount_product_ids) > 0) { + $discounted_products_amount = 0; + foreach ($order_and_discount_products as $product) { + $discounted_products_amount += $product->price * $product->qty; + } + $discount->amount = $discounted_products_amount * $discount->discount_amount; + // Discount the subtotal so far + } + else { + $discount->amount = max($order_subtotal - $total_discount_amount, 0) * $discount->discount_amount; + } + //End patch from lutegrass + break; + + case DISCOUNT_TYPE_FIXED_AMOUNT_OFF: + $discount->amount = $discount->discount_amount * $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; + break; + } - if (!is_null($messages)) { - $options = array("@short_description" => $discount->short_description, + if (!is_null($messages)) { + $options = array("@short_description" => $discount->short_description, "@code" => $discount->code, "@times_applied" => $discount->times_applied, "@discount_amount" => uc_currency_format($discount->amount), "@time_string" => $time_string, - ); - if (!is_null($discount->code)) { - if ($discount->times_applied == 1) $messages[] = t("The discount, '@short_description', with code '@code' was applied for a discount of @discount_amount.", - $options - ); - else $messages[] = t("The discount, '@short_description', with code '@code' was applied @times_applied times for a discount of @discount_amount.", - $options - ); - } - else { - if ($discount->times_applied == 1) $messages[] = t("The discount, '@short_description', was applied for a discount of @discount_amount.", - $options - ); - else $messages[] = t("The discount, '@short_description', was applied @times_applied times for a discount of @discount_amount.", - $options - ); - } - } - - //Round the discount to two places - $discount->amount = round($discount->amount, 2); - - //Add this discount's amount to running total - $total_discount_amount += $discount->amount; - - //Add this discount to list of discounts applied to order - $discounts[] = $discount; - } - // end of db fetch while loop - return $discounts; + ); + if (!is_null($discount->code)) { + if ($discount->times_applied == 1) $messages[] = t("The discount, '@short_description', with code '@code' was applied for a discount of @discount_amount.", + $options + ); + else $messages[] = t("The discount, '@short_description', with code '@code' was applied @times_applied times for a discount of @discount_amount.", + $options + ); + } + else { + if ($discount->times_applied == 1) $messages[] = t("The discount, '@short_description', was applied for a discount of @discount_amount.", + $options + ); + else $messages[] = t("The discount, '@short_description', was applied @times_applied times for a discount of @discount_amount.", + $options + ); + } + } + + //Round the discount to two places + $discount->amount = round($discount->amount, 2); + + //Add this discount's amount to running total + $total_discount_amount += $discount->amount; + + //Add this discount to list of discounts applied to order + $discounts[] = $discount; + } + // end of db fetch while loop + return $discounts; } /** @@ -1547,9 +1552,9 @@ * @param $product_id Node ID for product */ function get_codeless_discounts_for_product($product, $sort_column = "weight", $is_ascending_sort = TRUE) { - return get_codeless_discounts_for_product_and_quantity($product, NULL, - $sort_column, $is_ascending_sort - ); + return get_codeless_discounts_for_product_and_quantity($product, NULL, + $sort_column, $is_ascending_sort + ); } /** @@ -1558,72 +1563,72 @@ * @param $product_id Node ID for product */ function get_codeless_discounts_for_product_and_quantity($product, $quantity = NULL, $sort_column = "weight", - $is_ascending_sort = TRUE +$is_ascending_sort = TRUE ) { - if (is_null($product) || !$product) { - return array(); - } - - //If quantity was specified - if (!is_null($quantity)) { - global $user; - - //Create phony order and get discounts for order - $product->price = $product->sell_price; - $product->qty = $quantity; - $order = new stdClass(); - $order->uid = $user->uid; - $order->products = array($product); - return get_discounts_for_order($order); - } - - //Otherwise make special query - - //Get terms for product - $term_ids = array(); - $term_ids[] = ALL_TERMS; - $result = db_query("SELECT DISTINCT tid FROM {term_node} WHERE nid=%d", $product->nid); - while ($row = db_fetch_array($result)) $term_ids[] = $row["tid"]; - - //Get SKUs for product - $skus = array(); - $skus[] = "'". db_escape_string(ALL_SKUS) ."'"; - $result = db_query("SELECT DISTINCT model FROM {uc_products} WHERE nid=%d", $product->nid); - while ($row = db_fetch_array($result)) $skus[] = "'". db_escape_string($row["model"]) ."'"; - - //Get classes for product - $classes = array(); - $classes[] = "'". db_escape_string(ALL_CLASSES) ."'"; - $result = db_query("SELECT DISTINCT type FROM {node} WHERE nid=%d", $product->nid); - while ($row = db_fetch_array($result)) $classes[] = "'". db_escape_string($row["type"]) ."'"; - - //Create roles clause - global $user; - $auth_rid = ($user->uid != 0) ? DRUPAL_AUTHENTICATED_RID : DRUPAL_ANONYMOUS_RID; - $roles_clause = sprintf(" OR d.discount_id IN(SELECT dr.discount_id FROM {uc_discounts_roles} dr" . ", {users_roles} ur WHERE (dr.role_id=ur.rid AND ur.uid=%d) OR dr.role_id=%d OR dr.role_id=%d)", - $user->uid, ALL_ROLES, $auth_rid - ); - - $product_ids = array(ALL_PRODUCTS, $product->nid); - $product_ids_clause = sprintf("d.filter_type<>%d OR dp.product_id IN(%s)", - FILTER_TYPE_PRODUCTS, join(",", $product_ids) - ); - - $term_ids_clause = sprintf("d.filter_type<>%d OR dt.term_id IN(%s)", - FILTER_TYPE_TERMS, join(",", $term_ids) - ); - - $skus_clause = sprintf("d.filter_type<>%d OR ds.sku IN(%s)", - FILTER_TYPE_SKUS, join(",", $skus) - ); - - $classes_clause = sprintf("d.filter_type<>%d OR dcl.class IN(%s)", - FILTER_TYPE_CLASS, join(",", $classes) - ); + if (is_null($product) || !$product) { + return array(); + } + + //If quantity was specified + if (!is_null($quantity)) { + global $user; + + //Create phony order and get discounts for order + $product->price = $product->sell_price; + $product->qty = $quantity; + $order = new stdClass(); + $order->uid = $user->uid; + $order->products = array($product); + return get_discounts_for_order($order); + } + + //Otherwise make special query + + //Get terms for product + $term_ids = array(); + $term_ids[] = ALL_TERMS; + $result = db_query("SELECT DISTINCT tid FROM {term_node} WHERE nid=%d", $product->nid); + while ($row = db_fetch_array($result)) $term_ids[] = $row["tid"]; + + //Get SKUs for product + $skus = array(); + $skus[] = "'". db_escape_string(ALL_SKUS) ."'"; + $result = db_query("SELECT DISTINCT model FROM {uc_products} WHERE nid=%d", $product->nid); + while ($row = db_fetch_array($result)) $skus[] = "'". db_escape_string($row["model"]) ."'"; + + //Get classes for product + $classes = array(); + $classes[] = "'". db_escape_string(ALL_CLASSES) ."'"; + $result = db_query("SELECT DISTINCT type FROM {node} WHERE nid=%d", $product->nid); + while ($row = db_fetch_array($result)) $classes[] = "'". db_escape_string($row["type"]) ."'"; + + //Create roles clause + global $user; + $auth_rid = ($user->uid != 0) ? DRUPAL_AUTHENTICATED_RID : DRUPAL_ANONYMOUS_RID; + $roles_clause = sprintf(" OR d.discount_id IN(SELECT dr.discount_id FROM {uc_discounts_roles} dr" . ", {users_roles} ur WHERE (dr.role_id=ur.rid AND ur.uid=%d) OR dr.role_id=%d OR dr.role_id=%d)", + $user->uid, ALL_ROLES, $auth_rid + ); + + $product_ids = array(ALL_PRODUCTS, $product->nid); + $product_ids_clause = sprintf("d.filter_type<>%d OR dp.product_id IN(%s)", + FILTER_TYPE_PRODUCTS, join(",", $product_ids) + ); + + $term_ids_clause = sprintf("d.filter_type<>%d OR dt.term_id IN(%s)", + FILTER_TYPE_TERMS, join(",", $term_ids) + ); + + $skus_clause = sprintf("d.filter_type<>%d OR ds.sku IN(%s)", + FILTER_TYPE_SKUS, join(",", $skus) + ); + + $classes_clause = sprintf("d.filter_type<>%d OR dcl.class IN(%s)", + FILTER_TYPE_CLASS, join(",", $classes) + ); - $sort_order_string = (is_ascending_sort) ? "ASC" : "DESC"; + $sort_order_string = (is_ascending_sort) ? "ASC" : "DESC"; - $query = sprintf("SELECT d.* FROM {uc_discounts} d + $query = sprintf("SELECT d.* FROM {uc_discounts} d LEFT JOIN {uc_discounts_products} dp ON d.discount_id=dp.discount_id LEFT JOIN {uc_discounts_terms} dt ON d.discount_id=dt.discount_id LEFT JOIN {uc_discounts_skus} ds ON d.discount_id=ds.discount_id @@ -1633,80 +1638,81 @@ AND (%s) AND (%s) AND (%s) + AND (%s) AND (d.has_expiration=0 OR d.expiration>%d) ORDER BY d.%s %s", $roles_clause, $product_ids_clause, $term_ids_clause, $skus_clause, $classes_clause, time(), - $sort_column, $sort_order_string - ); - uc_discounts_log("query=". $query); - $result = db_query($query); + $sort_column, $sort_order_string + ); + uc_discounts_log("query=". $query); + $result = db_query($query); - $discounts = array(); - while ($discount = db_fetch_object($result)) $discounts[] = $discount; + $discounts = array(); + while ($discount = db_fetch_object($result)) $discounts[] = $discount; - return $discounts; + return $discounts; } /** * Inserts a uc_discounts_uses row and returns its discount_use_id. */ function uc_discounts_uses_insert($discount_id, $user_id, $order_id, $code, $times_applied, $amount, - $insert_timestamp = NULL +$insert_timestamp = NULL ) { - if (is_null($insert_timestamp)) { - $insert_timestamp = time(); - } - - $query = "INSERT INTO {uc_discounts_uses}(discount_id, user_id, order_id, code, times_applied, amount, insert_timestamp)" . " VALUES(%d, %d, %d, '%s', %d, %f, %d)"; - uc_discounts_log("query=". $query); - db_query($query, $discount_id, $user_id, $order_id, $code, $times_applied, $amount, $insert_timestamp); - return db_last_insert_id("uc_discounts_uses", "discount_use_id"); + if (is_null($insert_timestamp)) { + $insert_timestamp = time(); + } + + $query = "INSERT INTO {uc_discounts_uses}(discount_id, user_id, order_id, code, times_applied, amount, insert_timestamp)" . " VALUES(%d, %d, %d, '%s', %d, %f, %d)"; + uc_discounts_log("query=". $query); + db_query($query, $discount_id, $user_id, $order_id, $code, $times_applied, $amount, $insert_timestamp); + return db_last_insert_id("uc_discounts_uses", "discount_use_id"); } /** * Deletes all uc_discounts_uses rows for a discount. */ function uc_discounts_uses_delete_for_discount($discount_id) { - $query = "DELETE FROM {uc_discounts_uses} WHERE discount_id=%d"; - uc_discounts_log("query=". $query); - db_query($query, $discount_id); + $query = "DELETE FROM {uc_discounts_uses} WHERE discount_id=%d"; + uc_discounts_log("query=". $query); + db_query($query, $discount_id); } /** * Deletes all uc_discounts_uses rows for an order. */ function uc_discounts_uses_delete_for_order($order_id) { - $query = "DELETE FROM {uc_discounts_uses} WHERE order_id=%d"; - uc_discounts_log("query=". $query); - db_query($query, $order_id); + $query = "DELETE FROM {uc_discounts_uses} WHERE order_id=%d"; + uc_discounts_log("query=". $query); + db_query($query, $order_id); } /** * Returns order codes for order. */ function uc_discounts_order_codes_get($order_id) { - //Get order's codes from database - $row = db_fetch_array(db_query( + //Get order's codes from database + $row = db_fetch_array(db_query( "SELECT codes FROM {uc_discounts_order_codes} WHERE order_id=%d", $order_id - )); - return (!empty($row)) ? $row["codes"] : NULL; + )); + return (!empty($row)) ? $row["codes"] : NULL; } /** * Inserts a uc_discounts_order_codes row. */ function uc_discounts_order_codes_insert($order_id, $codes_string) { - $query = "INSERT INTO {uc_discounts_order_codes}(order_id, codes) VALUES(%d, '%s')"; - uc_discounts_log("query=". $query); - db_query($query, $order_id, $codes_string); + $query = "INSERT INTO {uc_discounts_order_codes}(order_id, codes) VALUES(%d, '%s')"; + uc_discounts_log("query=". $query); + db_query($query, $order_id, $codes_string); } /** * Deletes all uc_discounts_order_codes rows for an order. */ function uc_discounts_order_codes_delete($order_id) { - $query = "DELETE FROM {uc_discounts_order_codes} WHERE order_id=%d"; - uc_discounts_log("query=". $query); - db_query($query, $order_id); + $query = "DELETE FROM {uc_discounts_order_codes} WHERE order_id=%d"; + uc_discounts_log("query=". $query); + db_query($query, $order_id); } @@ -1718,24 +1724,24 @@ * Returns a string list of codes into an array of codes */ function get_codes($codes_string) { - $codes = array(); + $codes = array(); - if (empty($codes_string)) { + if (empty($codes_string)) { - return $codes; + return $codes; - } + } - $raw_codes = explode("\n", $codes_string); + $raw_codes = explode("\n", $codes_string); - foreach ($raw_codes as $raw_code) { - $code = trim($raw_code); - if (!empty($code)) { - $codes[] = $code; - } - } + foreach ($raw_codes as $raw_code) { + $code = trim($raw_code); + if (!empty($code)) { + $codes[] = $code; + } + } - return $codes; + return $codes; } /** @@ -1743,60 +1749,60 @@ * Note: returns "" if passed array is null */ function create_codes_string($codes) { - if (empty($codes)) { - return ""; - } - return join("\n", $codes); + if (empty($codes)) { + return ""; + } + return join("\n", $codes); } /** * Returns an array of qualifying types with descriptions. */ function qualifying_type_options() { - static $options = NULL; + static $options = NULL; - if (is_null($options)) { - $options = array(QUALIFYING_TYPE_MINIMUM_PRICE => t("Minimum price"), - QUALIFYING_TYPE_MINIMUM_QUANTITY => t("Minimum quantity"), - ); - } + if (is_null($options)) { + $options = array(QUALIFYING_TYPE_MINIMUM_PRICE => t("Minimum price"), + QUALIFYING_TYPE_MINIMUM_QUANTITY => t("Minimum quantity"), + ); + } - return $options; + return $options; } function qualifying_type_name($qualifying_type) { - $options = qualifying_type_options(); - return $options[$qualifying_type]; + $options = qualifying_type_options(); + return $options[$qualifying_type]; } /** * Returns an array of discount types with descriptions. */ function discount_type_options() { - static $options = NULL; + static $options = NULL; - if (is_null($options)) { - $options = array(DISCOUNT_TYPE_PERCENTAGE_OFF => t("Percent off"), - DISCOUNT_TYPE_FIXED_AMOUNT_OFF => t("Fixed amount off"), - DISCOUNT_TYPE_FIXED_AMOUNT_OFF_PER_QUALIFYING_ITEM => t("Fixed amount off per qualifying item"), - DISCOUNT_TYPE_FREE_ITEMS => t("Free items"), - DISCOUNT_TYPE_PERCENTAGE_OFF_PER_QUALIFYING_ITEM => t("Percentage off per qualifying item"), - ); - } + if (is_null($options)) { + $options = array(DISCOUNT_TYPE_PERCENTAGE_OFF => t("Percent off"), + DISCOUNT_TYPE_FIXED_AMOUNT_OFF => t("Fixed amount off"), + DISCOUNT_TYPE_FIXED_AMOUNT_OFF_PER_QUALIFYING_ITEM => t("Fixed amount off per qualifying item"), + DISCOUNT_TYPE_FREE_ITEMS => t("Free items"), + DISCOUNT_TYPE_PERCENTAGE_OFF_PER_QUALIFYING_ITEM => t("Percentage off per qualifying item"), + ); + } - return $options; + return $options; } function discount_type_name($discount_type) { - $options = discount_type_options(); - return $options[$discount_type]; + $options = discount_type_options(); + return $options[$discount_type]; } function uc_discounts_add_to_existing_map_number_value(&$a, $key, $value) { - $a[$key] = (array_key_exists($key, $a)) ? $a[$key] + $value : $value; + $a[$key] = (array_key_exists($key, $a)) ? $a[$key] + $value : $value; } function uc_discounts_log($s) { - // error_log($s); + // error_log($s); } Index: .buildpath =================================================================== RCS file: .buildpath diff -N .buildpath --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ .buildpath 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,7 @@ + + + + + + + Index: .project =================================================================== RCS file: .project diff -N .project --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ .project 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,28 @@ + + + uc_discounts_alt + + + + + + org.eclipse.wst.jsdt.core.javascriptValidator + + + + + org.eclipse.wst.validation.validationbuilder + + + + + org.eclipse.dltk.core.scriptbuilder + + + + + + org.eclipse.php.core.PHPNature + org.eclipse.wst.jsdt.core.jsNature + +