You are here

function uc_discounts_uc_order in Ubercart Discounts (Alternative) 7.2

Implements hook_uc_order().

Manages loading and saving of discounts associated with orders.

1 call to uc_discounts_uc_order()
uc_discounts_apply in uc_discounts/uc_discounts.module
Applies the discounts to an order by creating the necessary line items.

File

uc_discounts/uc_discounts.module, line 236

Code

function uc_discounts_uc_order($op, $order, $arg2) {
  switch ($op) {
    case 'load':

      // Get order's codes from database.
      $order->uc_discounts_codes = uc_discounts_get_codes_for_order($order->order_id);
      break;
    case 'save':

      // If discount line items need updating.
      if (!empty($order->uc_discounts_line_items_need_updating)) {

        // Delete existing order codes.
        uc_discounts_order_codes_delete($order->order_id);

        // Save order's discount codes as string.
        if (!empty($order->uc_discounts_codes)) {
          $codes_string = uc_discounts_codes_to_str($order->uc_discounts_codes);
          $new_discount_order_code = array(
            'order_id' => $order->order_id,
            'codes' => $codes_string,
          );
          drupal_write_record('uc_discounts_order_codes', $new_discount_order_code);
        }

        // Get order line items.
        if (is_array($order->line_items)) {
          $existing_line_items = $order->line_items;
        }
        else {
          $existing_line_items = uc_order_load_line_items($order, TRUE);
        }

        // Use new_order_line_items to populate $order->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"] == UC_DISCOUNTS_LINE_ITEM_TYPE) {
            uc_order_delete_line_item($line_item["line_item_id"]);
          }
          else {
            $new_order_line_items[] = $line_item;
          }
        }

        // Add discount line items.
        if (!empty($order->uc_discounts_line_items)) {
          foreach ($order->uc_discounts_line_items as $line_item) {
            if ($line_item['amount'] != 0) {
              uc_order_line_item_add($order->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).
        $order->line_items = $new_order_line_items;
        $order->uc_discounts_line_items_need_updating = FALSE;

        // Force tax recalculation. Currently unused but may be required if line
        // item weights change.
        // module_invoke("uc_taxes", "order", "save", $order, "");
      }
      break;
    case 'update':

      // If status changes to 'canceled' then delete order discount uses.
      if ($arg2 == 'canceled' && $order->order_status != 'canceled') {
        uc_discounts_uses_delete_for_order($order->order_id);
      }
      break;
    case 'submit':

      // Ensure stored discounts are accurate by recalculating and comparing
      // stored amounts.
      $result = uc_discounts_apply($order, FALSE, TRUE);
      return array(
        array(
          'pass' => $result['success'],
          'message' => $result['message'],
        ),
      );
    case 'delete':

      // Delete existing order codes.
      uc_discounts_order_codes_delete($order->order_id);

      // @todo Determine if uses should be deleted or put global setting in for
      // user to decide.
      break;
  }
}