ysession = $session; $this->yinstance = sprintf('%s.%s', 'cart', 'shipping_extras'); if($this->getShippingExtra('shipping_price')){ $this->shipping = floatval($this->getShippingExtra('shipping_price')); } if($this->getShippingExtra('shipping_country_id')){ $this->shipping_country_id = $this->getShippingExtra('shipping_country_id'); } parent::__construct($session, $events); if($this->shipping_country_id == 0){ $shippingCountry = ShippingCountry::first(); $this->shipping_country_id = $shippingCountry->id; } if($this->shipping == 0){ self::instance('shopping')->setShippingCountryWithPrice($this->shipping_country_id); } } public static function getTaxRate() { return config('cart.tax'); } public function putShippingExtra($key, $value){ $content = $this->getYContent(); $content->put($key, $value); $this->ysession->put($this->yinstance, $content); } public function getShippingExtra($key){ $content = $this->getYContent(); if ($content->has($key)){ return $content->get($key); } return false; } public function getShippingCountryName(){ $shippingCountry = ShippingCountry::find($this->shipping_country_id); if($shippingCountry && $shippingCountry->country){ return $shippingCountry->country->getLocated(); } return ""; } public function getShippingCountryCountryId() { $shippingCountry = ShippingCountry::find($this->shipping_country_id); if($shippingCountry && $shippingCountry->country){ return $shippingCountry->country->id; } return 1; //default DE } public function getShippingCountryId() { return $this->shipping_country_id; } public function getYContent() { if (is_null($this->ysession->get($this->yinstance))) { return new Collection([]); } return $this->ysession->get($this->yinstance); } public function reCalculateShippingPrice(){ $this->calculateShippingPrice(); } public function setShippingCountryWithPrice($shipping_country_id) { $this->shipping_country_id = $shipping_country_id; $this->putShippingExtra('shipping_country_id', $shipping_country_id); $this->calculateShippingPrice(); } private function calculateShippingPrice(){ $shippingCountry = ShippingCountry::find($this->shipping_country_id); $shipping = $shippingCountry->shipping; if(intval($this->weight()) == 0){ $price = $shipping->prices->first(); $price->price = 0; }else{ //first by price $price = $this->shippingPriceByTotal($shipping->prices, floatval($this->total(2, '.', ','))); //sec by weight if(!$price){ $price = $this->shippingPriceByWeight($shipping->prices, intval($this->weight())); } //default if(!$price){ $price = $shipping->prices->first(); } } if($price){ $this->shipping = floatval($price->price); $this->putShippingExtra('shipping_price', $this->shipping); } } private function shippingPriceByTotal($prices, $total){ foreach ($prices as $price){ if($price->total_from > 0 && $price->total_to > 0){ if($total >= $price->total_from && $total <= $price->total_to){ return $price; } } } return false; } private function shippingPriceByWeight($prices, $weight){ foreach ($prices as $price){ if($price->weight_from > 0 && $price->weight_to > 0){ if($weight >= $price->weight_from && $weight <= $price->weight_to){ return $price; } } } return false; } /** * @param null $decimals * @param null $decimalPoint * @param null $thousandSeperator * @return string */ public function shipping($decimals = null, $decimalPoint = null, $thousandSeperator = null) { return $this->numberFormat($this->shipping, $decimals, $decimalPoint, $thousandSeperator); } // private function shippingTax($taxRate = -19){ return ($this->shipping * ($taxRate / 100)); } private function shippingSub($taxRate){ return ($this->shipping + $this->shippingTax($taxRate)); } public function subtotalWithShipping($decimals = null, $decimalPoint = null, $thousandSeperator = null) { $taxRate =config('cart.tax'); $total = (float) ($this->total(2, '.', '')) + $this->shipping; $totalTax = $total/ (100 + $taxRate) * $taxRate; return $this->numberFormat(($total - $totalTax), $decimals, $decimalPoint, $thousandSeperator); } public function taxWithShipping($decimals = null, $decimalPoint = null, $thousandSeperator = null) { $taxRate =config('cart.tax'); $total = (float) ($this->total(2, '.', '')) + $this->shipping; $totalTax = $total/ (100 + $taxRate) * $taxRate; return $this->numberFormat($totalTax, $decimals, $decimalPoint, $thousandSeperator); } public function totalWithShipping($decimals = null, $decimalPoint = null, $thousandSeperator = null) { $total = (float) ($this->total(2, '.', '')) + $this->shipping; return $this->numberFormat($total, $decimals, $decimalPoint, $thousandSeperator); } /** * Get the total price of the items in the cart. * * @param int $decimals * @param string $decimalPoint * @param string $thousandSeperator * @return string */ public function weight($decimals = null, $decimalPoint = null, $thousandSeperator = null) { $content = $this->getContent(); $total = $content->reduce(function ($total, CartItem $cartItem) { return $total + ($cartItem->options->weight ? intval($cartItem->options->weight*$cartItem->qty) : 0); }, 0); return $total; } /** * Get the total price of the items in the cart. * * @param int $decimals * @param string $decimalPoint * @param string $thousandSeperator * @return string */ public function total($decimals = null, $decimalPoint = null, $thousandSeperator = null) { $content = $this->getContent(); $total = $content->reduce(function ($total, CartItem $cartItem) { return $total + ($cartItem->qty * $cartItem->price); }, 0); return $this->numberFormat($total, $decimals, $decimalPoint, $thousandSeperator); } /** * Get the total tax of the items in the cart. * * @param int $decimals * @param string $decimalPoint * @param string $thousandSeperator * @return float */ public function tax($decimals = null, $decimalPoint = null, $thousandSeperator = null) { $content = $this->getContent(); $tax = $content->reduce(function ($tax, CartItem $cartItem) { $priceTax = $cartItem->price / (100 + $cartItem->taxRate) * $cartItem->taxRate; return $tax + ($cartItem->qty * $priceTax); }, 0); return $this->numberFormat($tax, $decimals, $decimalPoint, $thousandSeperator); } /** * Get the subtotal (total - tax) of the items in the cart. * * @param int $decimals * @param string $decimalPoint * @param string $thousandSeperator * @return float */ public function subtotal($decimals = null, $decimalPoint = null, $thousandSeperator = null) { $content = $this->getContent(); $subTotal = $content->reduce(function ($subTotal, CartItem $cartItem) { $priceTax = $cartItem->price / (100 + $cartItem->taxRate) * $cartItem->taxRate; return $subTotal + ($cartItem->qty * ($cartItem->price - $priceTax)); }, 0); return $this->numberFormat($subTotal, $decimals, $decimalPoint, $thousandSeperator); } public function destroy() { $this->ysession->remove($this->yinstance); parent::destroy(); } /** * Get the Formated number * * @param $value * @param $decimals * @param $decimalPoint * @param $thousandSeperator * @return string */ protected function numberFormat($value, $decimals, $decimalPoint, $thousandSeperator) { if(is_null($decimals)){ $decimals = is_null(config('cart.format.decimals')) ? 2 : config('cart.format.decimals'); } if(is_null($decimalPoint)){ $decimalPoint = is_null(config('cart.format.decimal_point')) ? '.' : config('cart.format.decimal_point'); } if(is_null($thousandSeperator)){ $thousandSeperator = is_null(config('cart.format.thousand_seperator')) ? ',' : config('cart.format.thousand_seperator'); } return number_format($value, $decimals, $decimalPoint, $thousandSeperator); } }