public function calculateGrandTotal() { // calulate promo codes and group discounts //we need to tally up the cart, apply discounts, TAX that TOTAL somehow (different tax clases come into play), then add shipping //grab our discounts $cartDiscounts = $this->getOrderDiscounts(); //reset totals $this->total_discounts = 0; $this->shipping_total = 0; $this->shipping_total_before_discounts = 0; $this->shippingDiscount = 0; $this->surcharge_total = 0; $this->subtotal = 0; $this->total = 0; $this->grand_total = 0; $this->tax = 0; $validateDiscountMessage = ''; //eDebug($this->surcharge_total); //hate doing double loops, but we need to have the subtotal figured out already for //doing the straight dollar disoount calculations below for ($i = 0; $i < count($this->orderitem); $i++) { // figure out the amount of the discount /*if (!empty($this->product_discounts)) { $discount_amount = ($this->orderitem[$i]->products_price * ($this->product_discounts * .01)); // change the price of the orderitem..this is needed for when we calculate tax below. $this->orderitem[$i]->products_price = $this->orderitem[$i]->products_price - $discount_amount; // keep a tally of the total amount being subtracted by this discount. $this->total_discounts += $discount_amount; }*/ //$this->orderitem[$i]->products_price = $this->orderitem[$i]->getPriceWithOptions(); // * $this->orderitem[$i]->quantity; $this->orderitem[$i]->products_price_adjusted = $this->orderitem[$i]->products_price; //$this->orderitem[$i]->products_price_original = $this->orderitem[$i]->product->getPrice(); $this->subtotal += $this->orderitem[$i]->products_price * $this->orderitem[$i]->quantity; $this->surcharge_total += $this->orderitem[$i]->product->getSurcharge() * $this->orderitem[$i]->quantity; } for ($i = 0; $i < count($this->orderitem); $i++) { //only allowing one discount for now, but in future we'll need to process //multiple and accomdate the "weight" and 'allow other discounts' type settings //this foreach will only fire once as of now, and will only hit on one or the other //TODO: We need to use produce_price_adjusted in the loops to accomodate for more than one disocunt //otherwise it's just resetting them now instead of adding them foreach ($cartDiscounts as $od) { //do not calculate invalid discounts, but don't remove either $discount = new discounts($od->discounts_id); /*$validateDiscountMessage = $discount->validateDiscount(); if($validateDiscountMessage != '') break;*/ //percentage discount if ($discount->action_type == 3) { $discount_amount = round($this->orderitem[$i]->products_price * ($discount->discount_percent / 100), 2); // change the price of the orderitem..this is needed for when we calculate tax below. $this->orderitem[$i]->products_price_adjusted = $this->orderitem[$i]->products_price - $discount_amount; // keep a tally of the total amount being subtracted by this discount. $this->total_discounts += $discount_amount * $this->orderitem[$i]->quantity; } //straight $$ discount if ($discount->action_type == 4) { $this->total_discounts = $discount->discount_amount; //what % of the order is this product with all it's quantity $percentOfTotalOrder = $this->orderitem[$i]->products_price * $this->orderitem[$i]->quantity / $this->subtotal; //figoure out how much that'll be and what each quanityt piece will bare $discountAmountPerItem = round($percentOfTotalOrder * $discount->discount_amount / $this->orderitem[$i]->quantity, 2); //$discount_amount = $this->orderitem[$i]->products_price * ($discount->discount_percent / 100); // change the price of the orderitem..this is needed for when we calculate tax below. $this->orderitem[$i]->products_price_adjusted = $this->orderitem[$i]->products_price - $discountAmountPerItem; // keep a tally of the total amount being subtracted by this discount. //$this->total_discounts += $discountAmountPerItem * $this->orderitem[$i]->quantity; //eDebug($discountAmountPerItem); } } // calculate the tax for this product $taxclass = new taxclass($this->orderitem[$i]->product->tax_class_id); $this->orderitem[$i]->products_tax = $taxclass->getProductTax($this->orderitem[$i]); $this->tax += $this->orderitem[$i]->products_tax * $this->orderitem[$i]->quantity; //save out the order item $this->orderitem[$i]->save(); } // add the "cart discounts" - percentage for sure, but straight can work also should be added after the final total is calculated, //including tax but not shipping // $this->updateOrderDiscounts(); /*foreach ($cartDiscounts as $od) { $discount = new discounts($od->discounts_id); if ($discount->action_type == 4) { $this->total_discounts += $discount->discount_amount; } } */ // calculate the shipping costs - need to check shipping discounts here in the future $estimate_shipping = false; if ($this->shipping_required) { $shippingmethods = $this->getShippingMethods(); if (count($shippingmethods) > 0) { foreach ($shippingmethods as $sm_id) { $method = new shippingmethod($sm_id, true); if ($method->requiresShipping($this)) { /* //need to implement handling $shippingCalc = new shippingcalculator($method->shippingcalculator_id); $calc = new $shippingCalc->calculator_name($method->shippingcalculator_id); eDebug($calc,true);*/ $this->shipping_total += $method->shipping_cost; // + $method->calculator->getHandling(); } } } else { $estimate_shipping = true; } } $this->shipping_total_before_discounts = $this->shipping_total; if (isset($cartDiscounts)) { foreach ($cartDiscounts as $od) { $discount = new discounts($od->discounts_id); $this->shipping_total = $discount->calculateShippingTotal($this->shipping_total); } } $this->shippingDiscount = $this->shipping_total_before_discounts - $this->shipping_total; //check here to make sure we don't discount ourselves into oblivion $orderTotalPreDiscounts = $this->subtotal + $this->tax + $this->shipping_total; if ($this->total_discounts > $orderTotalPreDiscounts) { $this->total_discounts = $orderTotalPreDiscounts; } $this->total = $this->subtotal - $this->total_discounts; if ($estimate_shipping) { $this->shipping_total = shipping::estimateShipping($this); } // figure out which tax zones apply to this order. $this->taxzones = taxclass::getCartTaxZones($this); $this->grand_total = $this->subtotal - $this->total_discounts + $this->tax + $this->shipping_total + $this->surcharge_total; //if($validateDiscountMessage != '') flash('message',$validateDiscountMessage); //eDebug($this, true); }