/**
  * Hack: separate tax for each product in $order object
  * HACK START
  */
 function uc_dibsflex_recalculate_tax($order)
 {
     global $user;
     if (is_numeric($order)) {
         $order = uc_order_load($order);
         $account = user_load(array('uid' => $order->uid));
     } elseif ((int) $order->uid) {
         $account = user_load(array('uid' => intval($order->uid)));
     } else {
         $account = $user;
     }
     if (!is_object($order)) {
         return array();
     }
     if (empty($order->delivery_postal_code)) {
         $order->delivery_postal_code = $order->billing_postal_code;
     }
     if (empty($order->delivery_zone)) {
         $order->delivery_zone = $order->billing_zone;
     }
     if (empty($order->delivery_country)) {
         $order->delivery_country = $order->billing_country;
     }
     $order->taxes = array();
     if (isset($order->order_status)) {
         $state = uc_order_status_data($order->order_status, 'state');
         $use_same_rates = in_array($state, array('payment_received', 'completed'));
     } else {
         $use_same_rates = FALSE;
     }
     $arguments = array('order' => array('#entity' => 'uc_order', '#title' => t('Order'), '#data' => $order), 'tax' => array('#entity' => 'tax', '#title' => t('Tax rule')), 'account' => array('#entity' => 'user', '#title' => t('User'), '#data' => $account));
     $predicates = ca_load_trigger_predicates('calculate_taxes');
     foreach (uc_taxes_rate_load() as $tax) {
         if ($use_same_rates) {
             foreach ((array) $order->line_items as $old_line) {
                 if ($old_line['type'] == 'tax' && $old_line['data']['tax_id'] == $tax->id) {
                     $tax->rate = $old_line['data']['tax_rate'];
                     break;
                 }
             }
         }
         $arguments['tax']['#data'] = $tax;
         if (ca_evaluate_conditions($predicates['uc_taxes_' . $tax->id], $arguments)) {
             $line_item = $this->uc_dibsflex_action_apply_tax($order, $tax);
             if ($line_item) {
                 $order->taxes[$line_item->id] = $line_item;
             }
         }
     }
     return $order->taxes;
 }
Esempio n. 2
0
/**
 * Calculates tax line items for an order.
 *
 * @param $order
 *   An order object or an order id.
 *
 * @return
 *   An array of tax line item objects keyed by a module-specific id.
 */
function hook_uc_calculate_tax($order)
{
    if (!is_object($order)) {
        return array();
    }
    if (empty($order->delivery_postal_code)) {
        $order->delivery_postal_code = $order->billing_postal_code;
    }
    if (empty($order->delivery_zone)) {
        $order->delivery_zone = $order->billing_zone;
    }
    if (empty($order->delivery_country)) {
        $order->delivery_country = $order->billing_country;
    }
    $order->taxes = array();
    if (isset($order->order_status)) {
        $state = uc_order_status_data($order->order_status, 'state');
        $use_same_rates = in_array($state, array('payment_received', 'completed'));
    } else {
        $use_same_rates = FALSE;
    }
    foreach (uc_taxes_rate_load() as $tax) {
        if ($use_same_rates) {
            foreach ((array) $order->line_items as $old_line) {
                if ($old_line['type'] == 'tax' && $old_line['data']['tax_id'] == $tax->id) {
                    $tax->rate = $old_line['data']['tax_rate'];
                    break;
                }
            }
        }
        $set = rules_config_load('uc_taxes_' . $tax->id);
        if ($set->execute($order)) {
            $line_item = uc_taxes_apply_tax($order, $tax);
            if ($line_item) {
                $order->taxes[$line_item->id] = $line_item;
            }
        }
    }
    return $order->taxes;
}
Esempio n. 3
0
/**
 * Calculate tax line items for an order.
 *
 * @param $order
 *   An order object or an order id.
 * @return
 *   An array of tax line items keyed by a module-specific id.
 */
function hook_calculate_tax($order)
{
    global $user;
    if (is_numeric($order)) {
        $order = uc_order_load($order);
        $account = user_load(array('uid' => $order->uid));
    } else {
        if ((int) $order->uid) {
            $account = user_load(array('uid' => intval($order->uid)));
        } else {
            $account = $user;
        }
    }
    if (!is_object($order)) {
        return array();
    }
    if (empty($order->delivery_postal_code)) {
        $order->delivery_postal_code = $order->billing_postal_code;
    }
    if (empty($order->delivery_zone)) {
        $order->delivery_zone = $order->billing_zone;
    }
    if (empty($order->delivery_country)) {
        $order->delivery_country = $order->billing_country;
    }
    if (is_array($order->line_items)) {
        foreach ($order->line_items as $i => $line) {
            if (substr($line['type'], 0, 4) == 'tax_' && substr($line['type'], 5) != 'subtotal') {
                unset($order->line_items[$i]);
            }
        }
    }
    $_SESSION['taxes'] = array();
    $taxes = uc_taxes_rate_load();
    foreach ($taxes as $tax) {
        // Gotta pass a fake line_item entity for the data to be saved to $_SESSION.
        workflow_ng_invoke_event('calculate_tax_' . $tax->id, $order, $tax, $account, array());
        //$order->line_items[] = array('type' => 'tax', 'amount' => $_SESSION['taxes'][$tax->id]['amount']);
    }
    $order->taxes = $_SESSION['taxes'];
    unset($_SESSION['taxes']);
    //array_unshift($order->taxes, array('id' => 'subtotal', 'name' => t('Subtotal excluding taxes'), 'amount' => $amount, 'weight' => -10));
    return $order->taxes;
}