260 lines
No EOL
7.9 KiB
PHP
260 lines
No EOL
7.9 KiB
PHP
<?php
|
|
namespace App\Services;
|
|
|
|
use App\Models\ShippingCountry;
|
|
use \Gloudemans\Shoppingcart\Cart;
|
|
use Gloudemans\Shoppingcart\CartItem;
|
|
use Illuminate\Session\SessionManager;
|
|
use Illuminate\Contracts\Events\Dispatcher;
|
|
use Illuminate\Support\Collection;
|
|
|
|
|
|
class Yard extends Cart
|
|
{
|
|
private $shipping = 0;
|
|
private $shipping_country_id = 7; //default de
|
|
private $ysession;
|
|
private $yinstance;
|
|
|
|
public function __construct(SessionManager $session, Dispatcher $events)
|
|
{
|
|
$this->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 == 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 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 setShippingCountryWithPrice($shipping_country_id)
|
|
{
|
|
$this->shipping_country_id = $shipping_country_id;
|
|
$this->putShippingExtra('shipping_country_id', $shipping_country_id);
|
|
|
|
if($shipping_country_id > 0){
|
|
$shippingCountry = ShippingCountry::find($shipping_country_id);
|
|
$shipping = $shippingCountry->shipping;
|
|
if($this->weight()){
|
|
//blance by weigt
|
|
}
|
|
$price = $shipping->prices->first();
|
|
if($price){
|
|
$this->shipping = floatval($price->price);
|
|
$this->putShippingExtra('shipping_price', $this->shipping);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* @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 = floatval($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 = floatval($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 = floatval($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) : 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);
|
|
}
|
|
} |