/** * * Returns an object with the total cost of shipping for this method and the array of geozones * * @param unknown_type $shipping_method_id * @param array $geozones * @param unknown_type $orderItems * @param unknown_type $order_id */ protected function getTotal($shipping_method_id, $geozones, $orderItems, $geozones_taxes) { $return = new JObject(); $return->shipping_rate_id = '0'; $return->shipping_rate_price = '0.00000'; $return->shipping_rate_handling = '0.00000'; $return->shipping_tax_rates = '0.00000'; $return->shipping_tax_total = '0.00000'; $rate_exists = false; $geozone_rates = array(); //include custom modals $this->includeCustomModel('ShippingMethods'); $this->includeCustomModel('ShippingRates'); // cast product_id as an array $orderItems = (array) $orderItems; // determine the shipping method type $this->includeCustomTables('shipping_standard'); $this->includeCustomTables(); $shippingmethod = JTable::getInstance('ShippingMethods', 'Table'); $shippingmethod->load($shipping_method_id); if (empty($shippingmethod->shipping_method_id)) { // TODO if this is an object, setError, otherwise return false, or 0.000? $return->setError(JText::_('K2STORE_UNDEFINED_SHIPPING_METHOD')); return $return; } //initiliase cart helper $carthelper = new K2StoreHelperCart(); //initliase cart model JModelLegacy::addIncludePath(JPATH_SITE . '/components/com_k2store/models'); $cart_model = new K2StoreModelMyCart(); switch ($shippingmethod->shipping_method_type) { case "2": // 2 = per order - price based // Get the total of the order, and find the rate for that $total = 0; // foreach ($orderItems as $item) // { // $total += $item->orderitem_final_price; // } $order_ships = false; $products = $cart_model->getDataNew(); foreach ($products as $product) { //check if shipping is enabled for this item if (!empty($product['shipping'])) { $order_ships = true; $total += $product['total']; // product total } } if ($order_ships) { foreach ($geozones as $geozone) { unset($rate); $geozone_id = $geozone->geozone_id; if (empty($geozone_rates[$geozone_id]) || !is_array($geozone_rates[$geozone_id])) { $geozone_rates[$geozone_id] = array(); } // JModelLegacy::addIncludePath( JPATH_ADMINISTRATOR.'/components/com_k2store/models' ); $model = JModelLegacy::getInstance('ShippingRates', 'K2StoreModel'); $model->setState('filter_shippingmethod', $shipping_method_id); $model->setState('filter_geozone', $geozone_id); $model->setState('filter_weight', $total); // Use weight as total $items = $model->getList(); if (count($items) < 1) { //return JTable::getInstance('ShippingRates', 'Table'); } else { $rate = $items[0]; $geozone_rates[$geozone_id]['0'] = $rate; // if $rate->shipping_rate_id is empty, then no real rate was found if (!empty($rate->shipping_rate_id)) { $rate_exists = true; } $geozone_rates[$geozone_id]['0']->qty = '1'; $geozone_rates[$geozone_id]['0']->shipping_method_type = $shippingmethod->shipping_method_type; } } } break; case "1": // 1 = per order - quantity based // first, get the total quantity of shippable items for the entire order // then, figure out the rate for this number of items (use the weight range field) + geozone // 1 = per order - quantity based // first, get the total quantity of shippable items for the entire order // then, figure out the rate for this number of items (use the weight range field) + geozone case "0": // 0 = per order - flat rate // 0 = per order - flat rate case "5": // 5 = per order - weight based // if any of the products in the order require shipping $sum_weight = 0; $count_shipped_items = 0; $order_ships = false; $products = $cart_model->getDataNew(); foreach ($products as $product) { //check if shipping is enabled for this item if (!empty($product['shipping'])) { $product_id = $product['product_id']; $order_ships = true; $sum_weight += $product['weight_total']; // we already have a weight total. So we dont have to multiply weight*quantity again $count_shipped_items += $product['quantity']; } } if ($order_ships) { foreach ($geozones as $geozone) { unset($rate); $geozone_id = $geozone->geozone_id; if (empty($geozone_rates[$geozone_id]) || !is_array($geozone_rates[$geozone_id])) { $geozone_rates[$geozone_id] = array(); } switch ($shippingmethod->shipping_method_type) { case "0": // don't use weight, just do flat rate for entire order // regardless of weight and regardless of the number of items $rate = $this->getRate($shipping_method_id, $geozone_id, $product_id); break; case "1": // get the shipping rate for the entire order using the count of all products in the order that ship $rate = $this->getRate($shipping_method_id, $geozone_id, $product_id, '1', $count_shipped_items); break; default: // get the shipping rate for the entire order using the sum weight of all products in the order that ship $rate = $this->getRate($shipping_method_id, $geozone_id, $product_id, '1', $sum_weight); break; } $geozone_rates[$geozone_id]['0'] = $rate; // if $rate->shipping_rate_id is empty, then no real rate was found if (!empty($rate->shipping_rate_id)) { $rate_exists = true; } $geozone_rates[$geozone_id]['0']->qty = '1'; $geozone_rates[$geozone_id]['0']->shipping_method_type = $shippingmethod->shipping_method_type; } } break; case "6": case "4": case "3": // 6 = per item - price based, a percentage of the product's price // 4 = per item - weight based // 3 = per item - flat rate $rates = array(); $products = $cart_model->getDataNew(); foreach ($products as $product) { // print_r($item); $pid = $product['product_id']; $qty = $product['quantity']; $hash = $product['key']; foreach ($geozones as $geozone) { unset($rate); $geozone_id = $geozone->geozone_id; if (empty($geozone_rates[$geozone_id]) || !is_array($geozone_rates[$geozone_id])) { $geozone_rates[$geozone_id] = array(); } // $geozone_rates[$geozone_id][$pid] contains the shipping rate object for ONE product_id at this geozone. // You need to multiply by the quantity later $rate = $this->getRate($shipping_method_id, $geozone_id, $pid, $shippingmethod->shipping_method_type); //price per item if ($shippingmethod->shipping_method_type == '6') { // the rate is a percentage of the product's price $rate->shipping_rate_price = $rate->shipping_rate_price / 100 * $item->orderitem_final_price; $geozone_rates[$geozone_id][$hash] = $rate; $geozone_rates[$geozone_id][$hash]->shipping_method_type = $shippingmethod->shipping_method_type; $geozone_rates[$geozone_id][$hash]->qty = '1'; // If the method_type == 6, qty should be 1 (we don't need to multiply later, in the "calc for the entire method", since this is a percentage of the orderitem_final_price) //weight per item //if weight based per item, we need to use weight. //Per product weight (including the option weight) is already present in the products array. So pass it. } elseif ($shippingmethod->shipping_method_type == '4') { $rate = $this->getRate($shipping_method_id, $geozone_id, $pid, '1', $product['weight']); $geozone_rates[$geozone_id][$hash] = $rate; $geozone_rates[$geozone_id][$hash]->shipping_method_type = $shippingmethod->shipping_method_type; $geozone_rates[$geozone_id][$hash]->qty = $qty; } else { //obviously, this is flat rate per item $geozone_rates[$geozone_id][$hash] = $rate; $geozone_rates[$geozone_id][$hash]->shipping_method_type = $shippingmethod->shipping_method_type; $geozone_rates[$geozone_id][$hash]->qty = $qty; } // if $rate->shipping_rate_id is empty, then no real rate was found if (!empty($rate->shipping_rate_id)) { $rate_exists = true; } } } break; default: $this->setError(JText::_('K2STORE_INVALID_SHIPPING_METHOD_TYPE')); return false; break; } if (!$rate_exists) { $this->setError(JText::_('K2STORE_NO_RATE_FOUND')); return false; } $shipping_tax_rates = array(); $shipping_method_price = 0; $shipping_method_handling = 0; $shipping_method_tax_total = 0; $j2tax = new K2StoreTax(); // now calc tax for the entire method foreach ($geozone_rates as $geozone_id => $geozone_rate_array) { foreach ($geozone_rate_array as $geozone_rate) { if ($shippingmethod->tax_class_id) { /* $tax_rates = $this->getGeozoneTax( $shippingmethod->tax_class_id, $geozone_id ); if($tax_rates) { $shipping_tax_rates[$geozone_id] = 0; foreach($tax_rates as $tax_rate) { $shipping_tax_rates[$geozone_id] += $tax_rate->tax_percent; $shipping_method_tax_total += ($shipping_tax_rates[$geozone_id]/100) * (($geozone_rate->shipping_rate_price * $geozone_rate->qty ) + $geozone_rate->shipping_rate_handling); } } */ $value = $geozone_rate->shipping_rate_price * $geozone_rate->qty + $geozone_rate->shipping_rate_handling; $tax_rates = $j2tax->getRates($shippingmethod->tax_class_id); $shipping_tax_rates[$geozone_id] = 0; foreach ($tax_rates as $tax_rate) { $shipping_tax_rates[$geozone_id] += $tax_rate['rate']; } $shipping_method_tax_total += $j2tax->getTax($value, $shippingmethod->tax_class_id); } $shipping_method_price += $geozone_rate->shipping_rate_price * $geozone_rate->qty; $shipping_method_handling += $geozone_rate->shipping_rate_handling; } } // return formatted object $return->shipping_rate_price = $shipping_method_price; $return->shipping_rate_handling = $shipping_method_handling; $return->shipping_tax_rates = $shipping_tax_rates; $return->shipping_tax_total = $shipping_method_tax_total; $return->shipping_method_id = $shipping_method_id; $return->shipping_method_name = $shippingmethod->shipping_method_name; // print_r($return); return $return; }
function getTotals() { $app = JFactory::getApplication(); $session = JFactory::getSession(); $tax = new K2StoreTax(); $products = $this->getDataNew(); $total_data = array(); $total = 0; //products $total_data['products'] = $products; //sub total $total_data['subtotal'] = K2StoreHelperCart::getSubtotal(); $total += $total_data['subtotal']; //taxes $tax_data = array(); $taxes = K2StoreHelperCart::getTaxes(); //coupon if ($session->has('coupon', 'k2store')) { $coupon_info = K2StoreHelperCart::getCoupon($session->get('coupon', '', 'k2store')); if ($coupon_info) { $discount_total = 0; if (!$coupon_info->product) { $sub_total = K2StoreHelperCart::getSubTotal(); } else { $sub_total = 0; foreach ($products as $product) { if (in_array($product['product_id'], $coupon_info->product)) { $sub_total += $product['total']; } } } if ($coupon_info->value_type == 'F') { $coupon_info->value = min($coupon_info->value, $sub_total); } foreach ($products as $product) { $discount = 0; if (!$coupon_info->product) { $status = true; } else { if (in_array($product['product_id'], $coupon_info->product)) { $status = true; } else { $status = false; } } if ($status) { if ($coupon_info->value_type == 'F') { $discount = $coupon_info->value * ($product['total'] / $sub_total); } elseif ($coupon_info->value_type == 'P') { $discount = $product['total'] / 100 * $coupon_info->value; } if ($product['tax_profile_id']) { $tax_rates = $this->tax->getRateArray($product['total'] - ($product['total'] - $discount), $product['tax_profile_id']); foreach ($tax_rates as $tax_rate) { // if ($tax_rate['value_type'] == 'P') { $taxes[$tax_rate['taxrate_id']] -= $tax_rate['amount']; // } } } } $discount_total += $discount; } $total_data['coupon'] = array('title' => JText::sprintf('K2STORE_COUPON_TITLE', $session->get('coupon', '', 'k2store')), 'value' => -$discount_total); //$total_data['coupon'] = $coupon_data; //less the coupon discount in the total $total -= $discount_total; } } if ($session->has('shipping_values', 'k2store')) { $shipping = $session->get('shipping_values', array(), 'k2store'); if (count($shipping) && isset($shipping['shipping_name'])) { $total_data['shipping_amount'] = $shipping['shipping_price'] + $shipping['shipping_extra']; $total_data['shipping_tax'] = $shipping['shipping_tax']; $total_data['shipping_total'] = $shipping['shipping_price'] + $shipping['shipping_extra'] + $shipping['shipping_tax']; $total_data['shipping_name'] = $shipping['shipping_name']; $total += $total_data['shipping_total']; } } $total_data['total_without_tax'] = $total; //taxes foreach ($taxes as $key => $value) { if ($value > 0) { $tax_data[] = array('title' => $this->tax->getRateName($key), 'percent' => $tax->getPercent($key), 'value' => $value); $total += $value; } } $total_data['taxes'] = $tax_data; $total_data['total'] = $total; return $total_data; }
/** * Calculates the per_order coupon discount for the order * and the total post-tax/shipping discount * and sets order->order_discount * * @return unknown_type */ function calculateDiscountTotals() { $this->_taxes = K2StoreHelperCart::getTaxes(); $session = JFactory::getSession(); $tax = new K2StoreTax(); JModelLegacy::addIncludePath(JPATH_SITE . '/components/com_k2store/models'); $model = JModelLegacy::getInstance('MyCart', 'K2StoreModel'); $products = $model->getDataNew(); if ($session->has('coupon', 'k2store')) { $coupon_info = K2StoreHelperCart::getCoupon($session->get('coupon', '', 'k2store')); if ($coupon_info) { $discount_total = 0; if (!$coupon_info->product) { $sub_total = K2StoreHelperCart::getSubTotal(); } else { $sub_total = 0; foreach ($products as $product) { if (in_array($product['product_id'], $coupon_info->product)) { $sub_total += $product['total']; } } } if ($coupon_info->value_type == 'F') { $coupon_info->value = min($coupon_info->value, $sub_total); } foreach ($products as $product) { $discount = 0; if (!$coupon_info->product) { $status = true; } else { if (in_array($product['product_id'], $coupon_info->product)) { $status = true; } else { $status = false; } } if ($status) { if ($coupon_info->value_type == 'F') { $discount = $coupon_info->value * ($product['total'] / $sub_total); } elseif ($coupon_info->value_type == 'P') { $discount = $product['total'] / 100 * $coupon_info->value; } if ($product['tax_profile_id']) { $tax_rates = $tax->getRateArray($product['total'] - ($product['total'] - $discount), $product['tax_profile_id']); foreach ($tax_rates as $tax_rate) { // if ($tax_rate['value_type'] == 'P') { $this->_taxes[$tax_rate['taxrate_id']] -= $tax_rate['amount']; // } } } } $discount_total += $discount; } } } // store the total amount of the discount //set the total as equal to the order_subtotal + order_tax if its greater than the sum of the two $this->order_discount = $discount_total > $this->order_subtotal + $this->order_tax ? $this->order_subtotal + $this->order_tax : $discount_total; }
public static function getTotal() { $total = 0; JModelLegacy::addIncludePath(JPATH_SITE . '/components/com_k2store/models'); $model = JModelLegacy::getInstance('Mycart', 'K2StoreModel'); $products = $model->getDataNew(); $t = new K2StoreTax(); $tax_amount = 0; foreach ($products as $product) { //calculate the tax $tax_amount = $t->getProductTax($product['price'], $product['product_id']); if ($tax_amount) { $total += ($product['price'] + $tax_amount) * $product['quantity']; } else { $total += $product['price'] * $product['quantity']; } } return $total; }