Cart fixes
This commit is contained in:
parent
4d0bc20820
commit
e2bac8a34e
|
|
@ -9,6 +9,14 @@ return [
|
||||||
'default_rate' => '10',
|
'default_rate' => '10',
|
||||||
'type' => 'per_unit',
|
'type' => 'per_unit',
|
||||||
'class' => 'Webkul\Shipping\Carriers\FlatRate',
|
'class' => 'Webkul\Shipping\Carriers\FlatRate',
|
||||||
|
],
|
||||||
|
|
||||||
|
'free' => [
|
||||||
|
'code' => 'free',
|
||||||
|
'title' => 'Free Shipping',
|
||||||
|
'description' => 'This is a free shipping',
|
||||||
|
'active' => true,
|
||||||
|
'class' => 'Webkul\Shipping\Carriers\Free',
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,59 +3,94 @@
|
||||||
namespace Webkul\Cart;
|
namespace Webkul\Cart;
|
||||||
|
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
|
|
||||||
use Webkul\Cart\Repositories\CartRepository;
|
use Webkul\Cart\Repositories\CartRepository;
|
||||||
use Webkul\Cart\Repositories\CartItemRepository;
|
use Webkul\Cart\Repositories\CartItemRepository;
|
||||||
|
use Webkul\Cart\Repositories\CartAddressRepository;
|
||||||
use Webkul\Customer\Repositories\CustomerRepository;
|
use Webkul\Customer\Repositories\CustomerRepository;
|
||||||
|
|
||||||
use Webkul\Product\Repositories\ProductRepository;
|
use Webkul\Product\Repositories\ProductRepository;
|
||||||
|
|
||||||
use Cookie;
|
use Cookie;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Facade for all
|
* Facade for all the methods to be implemented in Cart.
|
||||||
* the methods to be
|
|
||||||
* implemented in Cart.
|
|
||||||
*
|
*
|
||||||
* @author Prashant Singh <prashant.singh852@webkul.com>
|
* @author Prashant Singh <prashant.singh852@webkul.com>
|
||||||
* @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
|
* @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
|
||||||
*/
|
*/
|
||||||
class Cart {
|
class Cart {
|
||||||
|
|
||||||
protected $cart; //cart repository instance
|
/**
|
||||||
|
* CartRepository model
|
||||||
|
*
|
||||||
|
* @var mixed
|
||||||
|
*/
|
||||||
|
protected $cart;
|
||||||
|
|
||||||
protected $cartItem; //cart_item repository instance
|
/**
|
||||||
|
* CartItemRepository model
|
||||||
|
*
|
||||||
|
* @var mixed
|
||||||
|
*/
|
||||||
|
protected $cartItem;
|
||||||
|
|
||||||
protected $customer; //customer repository instance
|
/**
|
||||||
|
* CustomerRepository model
|
||||||
|
*
|
||||||
|
* @var mixed
|
||||||
|
*/
|
||||||
|
protected $customer;
|
||||||
|
|
||||||
protected $product; //product repository instance
|
/**
|
||||||
|
* CartAddressRepository model
|
||||||
|
*
|
||||||
|
* @var mixed
|
||||||
|
*/
|
||||||
|
protected $cartAddress;
|
||||||
|
|
||||||
public function __construct(CartRepository $cart,
|
/**
|
||||||
CartItemRepository $cartItem,
|
* ProductRepository model
|
||||||
CustomerRepository $customer,
|
*
|
||||||
ProductRepository $product) {
|
* @var mixed
|
||||||
|
*/
|
||||||
|
protected $product;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new controller instance.
|
||||||
|
*
|
||||||
|
* @param Webkul\Cart\Repositories\CartRepository $cart
|
||||||
|
* @param Webkul\Cart\Repositories\CartItemRepository $cartItem
|
||||||
|
* @param Webkul\Cart\Repositories\CartAddressRepository $cartAddress
|
||||||
|
* @param Webkul\Customer\Repositories\CustomerRepository $customer
|
||||||
|
* @param Webkul\Product\Repositories\ProductRepository $product
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function __construct(
|
||||||
|
CartRepository $cart,
|
||||||
|
CartItemRepository $cartItem,
|
||||||
|
CartAddressRepository $cartAddress,
|
||||||
|
CustomerRepository $customer,
|
||||||
|
ProductRepository $product)
|
||||||
|
{
|
||||||
$this->customer = $customer;
|
$this->customer = $customer;
|
||||||
|
|
||||||
$this->cart = $cart;
|
$this->cart = $cart;
|
||||||
|
|
||||||
$this->cartItem = $cartItem;
|
$this->cartItem = $cartItem;
|
||||||
|
|
||||||
|
$this->cartAddress = $cartAddress;
|
||||||
|
|
||||||
$this->product = $product;
|
$this->product = $product;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create new cart
|
* Create new cart instance with the current item added.
|
||||||
* instance with the
|
|
||||||
* current item added.
|
|
||||||
*
|
*
|
||||||
* @param Integer $id
|
* @param integer $id
|
||||||
* @param Mixed $data
|
* @param array $data
|
||||||
*
|
*
|
||||||
* @return Mixed
|
* @return Response
|
||||||
*/
|
*/
|
||||||
public function createNewCart($id, $data) {
|
public function createNewCart($id, $data)
|
||||||
|
{
|
||||||
$cartData['channel_id'] = core()->getCurrentChannel()->id;
|
$cartData['channel_id'] = core()->getCurrentChannel()->id;
|
||||||
|
|
||||||
if(auth()->guard('customer')->check()) {
|
if(auth()->guard('customer')->check()) {
|
||||||
|
|
@ -84,23 +119,22 @@ class Cart {
|
||||||
return redirect()->back();
|
return redirect()->back();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
session()->flash('error', 'Some error occured');
|
session()->flash('error', 'Some error occured');
|
||||||
|
|
||||||
return redirect()->back();
|
return redirect()->back();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add Items in a
|
* Add Items in a cart with some cart and item details.
|
||||||
* cart with some
|
|
||||||
* cart and item
|
|
||||||
* details.
|
|
||||||
*
|
*
|
||||||
* @param @id
|
* @param @id
|
||||||
* @param $data
|
* @param $data
|
||||||
*
|
*
|
||||||
* @return Mixed
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function add($id, $data) {
|
public function add($id, $data)
|
||||||
|
{
|
||||||
|
|
||||||
// session()->forget('cart');
|
// session()->forget('cart');
|
||||||
// return redirect()->back();
|
// return redirect()->back();
|
||||||
|
|
@ -153,26 +187,24 @@ class Cart {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* use detach to remove the
|
* Use detach to remove the current product from cart tables
|
||||||
* current product from cart tables
|
|
||||||
*
|
*
|
||||||
* @param Integer $id
|
* @param Integer $id
|
||||||
* @return Mixed
|
* @return Mixed
|
||||||
*/
|
*/
|
||||||
public function remove($id) {
|
public function remove($id)
|
||||||
|
{
|
||||||
|
|
||||||
dd("Removing Item from Cart");
|
dd("Removing Item from Cart");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This function handles
|
* This function handles when guest has some of cart products and then logs in.
|
||||||
* when guest has some of
|
|
||||||
* cart products and then
|
|
||||||
* logs in.
|
|
||||||
*
|
*
|
||||||
* @return Redirect
|
* @return Response
|
||||||
*/
|
*/
|
||||||
public function mergeCart() {
|
public function mergeCart()
|
||||||
|
{
|
||||||
if(session()->has('cart')) {
|
if(session()->has('cart')) {
|
||||||
$cart = session()->get('cart');
|
$cart = session()->get('cart');
|
||||||
|
|
||||||
|
|
@ -222,4 +254,80 @@ class Cart {
|
||||||
return redirect()->back();
|
return redirect()->back();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns cart
|
||||||
|
*
|
||||||
|
* @return Mixed
|
||||||
|
*/
|
||||||
|
public function getCart()
|
||||||
|
{
|
||||||
|
if(!$cart = session()->get('cart'))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return $cart;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save customer address
|
||||||
|
*
|
||||||
|
* @return Mixed
|
||||||
|
*/
|
||||||
|
public function saveCustomerAddress($data)
|
||||||
|
{
|
||||||
|
if(!$cart = $this->getCart())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
$billingAddress = $data['billing'];
|
||||||
|
$shippingAddress = $data['shipping'];
|
||||||
|
$billingAddress['cart_id'] = $shippingAddress['cart_id'] = $cart->id;
|
||||||
|
|
||||||
|
if($billingAddressModel = $cart->biling_address) {
|
||||||
|
$this->cartAddress->update($billingAddress, $billingAddressModel->id);
|
||||||
|
|
||||||
|
if($shippingAddress = $cart->shipping_address) {
|
||||||
|
if(isset($billingAddress['use_for_shipping']) && $billingAddress['use_for_shipping']) {
|
||||||
|
$this->cartAddress->update($billingAddress, $shippingAddress->id);
|
||||||
|
} else {
|
||||||
|
$this->cartAddress->update($shippingAddress, $shippingAddress->id);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(isset($billingAddress['use_for_shipping']) && $billingAddress['use_for_shipping']) {
|
||||||
|
$this->cartAddress->create(array_merge($billingAddress, ['address_type' => 'shipping']));
|
||||||
|
} else {
|
||||||
|
$this->cartAddress->create(array_merge($shippingAddress, ['address_type' => 'shipping']));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$this->cartAddress->create(array_merge($billingAddress, ['address_type' => 'billing']));
|
||||||
|
|
||||||
|
if(isset($billingAddress['use_for_shipping']) && $billingAddress['use_for_shipping']) {
|
||||||
|
$this->cartAddress->create(array_merge($billingAddress, ['address_type' => 'shipping']));
|
||||||
|
} else {
|
||||||
|
$this->cartAddress->create(array_merge($shippingAddress, ['address_type' => 'shipping']));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save shipping method for cart
|
||||||
|
*
|
||||||
|
* @param string $shippingMethodCode
|
||||||
|
* @return Mixed
|
||||||
|
*/
|
||||||
|
public function saveShippingMethod($shippingMethodCode)
|
||||||
|
{
|
||||||
|
if(!$cart = $this->getCart())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
foreach($cart->shipping_rates as $rate) {
|
||||||
|
if($rate->method != $shippingMethodCode) {
|
||||||
|
$rate->delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -15,6 +15,9 @@ class CreateCartAddress extends Migration
|
||||||
{
|
{
|
||||||
Schema::create('cart_address', function (Blueprint $table) {
|
Schema::create('cart_address', function (Blueprint $table) {
|
||||||
$table->increments('id');
|
$table->increments('id');
|
||||||
|
$table->string('first_name');
|
||||||
|
$table->string('last_name');
|
||||||
|
$table->string('email');
|
||||||
$table->string('address1');
|
$table->string('address1');
|
||||||
$table->string('address2')->nullable();
|
$table->string('address2')->nullable();
|
||||||
$table->string('country');
|
$table->string('country');
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ use Illuminate\Support\Facades\Schema;
|
||||||
use Illuminate\Database\Schema\Blueprint;
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
use Illuminate\Database\Migrations\Migration;
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
|
||||||
class CreateCartShipping extends Migration
|
class CreateCartShippingRatesTable extends Migration
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Run the migrations.
|
* Run the migrations.
|
||||||
|
|
@ -13,7 +13,7 @@ class CreateCartShipping extends Migration
|
||||||
*/
|
*/
|
||||||
public function up()
|
public function up()
|
||||||
{
|
{
|
||||||
Schema::create('cart_shipping', function (Blueprint $table) {
|
Schema::create('cart_shipping_rates', function (Blueprint $table) {
|
||||||
$table->increments('id');
|
$table->increments('id');
|
||||||
$table->string('carrier');
|
$table->string('carrier');
|
||||||
$table->string('carrier_title');
|
$table->string('carrier_title');
|
||||||
|
|
@ -21,8 +21,6 @@ class CreateCartShipping extends Migration
|
||||||
$table->string('method_title');
|
$table->string('method_title');
|
||||||
$table->string('method_description')->nullable();
|
$table->string('method_description')->nullable();
|
||||||
$table->double('price')->nullable();
|
$table->double('price')->nullable();
|
||||||
$table->integer('cart_id')->nullable()->unsigned();
|
|
||||||
$table->foreign('cart_id')->references('id')->on('cart');
|
|
||||||
$table->integer('cart_address_id')->nullable()->unsigned();
|
$table->integer('cart_address_id')->nullable()->unsigned();
|
||||||
$table->foreign('cart_address_id')->references('id')->on('cart_address');
|
$table->foreign('cart_address_id')->references('id')->on('cart_address');
|
||||||
$table->timestamps();
|
$table->timestamps();
|
||||||
|
|
@ -36,6 +34,6 @@ class CreateCartShipping extends Migration
|
||||||
*/
|
*/
|
||||||
public function down()
|
public function down()
|
||||||
{
|
{
|
||||||
Schema::dropIfExists('cart_shipping');
|
Schema::dropIfExists('cart_shipping_rates');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -4,17 +4,12 @@ namespace Webkul\Cart\Http\Controllers;
|
||||||
|
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Http\Response;
|
use Illuminate\Http\Response;
|
||||||
|
|
||||||
use Webkul\Cart\Repositories\CartRepository;
|
use Webkul\Cart\Repositories\CartRepository;
|
||||||
use Webkul\Cart\Repositories\CartItemRepository;
|
use Webkul\Cart\Repositories\CartItemRepository;
|
||||||
|
|
||||||
use Webkul\Product\Repositories\ProductRepository;
|
use Webkul\Product\Repositories\ProductRepository;
|
||||||
|
|
||||||
use Webkul\Customer\Repositories\CustomerRepository;
|
use Webkul\Customer\Repositories\CustomerRepository;
|
||||||
|
|
||||||
use Webkul\Product\Product\ProductImage;
|
use Webkul\Product\Product\ProductImage;
|
||||||
use Webkul\Product\Product\View as ProductView;
|
use Webkul\Product\Product\View as ProductView;
|
||||||
|
|
||||||
use Cart;
|
use Cart;
|
||||||
use Cookie;
|
use Cookie;
|
||||||
|
|
||||||
|
|
@ -47,9 +42,16 @@ class CartController extends Controller
|
||||||
|
|
||||||
protected $productView;
|
protected $productView;
|
||||||
|
|
||||||
public function __construct(CartRepository $cart, CartItemRepository $cartItem, CustomerRepository $customer, ProductRepository $product, ProductImage $productImage, ProductView $productView) {
|
public function __construct(
|
||||||
|
CartRepository $cart,
|
||||||
|
CartItemRepository $cartItem,
|
||||||
|
CustomerRepository $customer,
|
||||||
|
ProductRepository $product,
|
||||||
|
ProductImage $productImage,
|
||||||
|
ProductView $productView
|
||||||
|
) {
|
||||||
|
|
||||||
$this->middleware('customer')->except(['add', 'remove', 'test']);
|
// $this->middleware('customer')->except(['add', 'remove', 'test']);
|
||||||
|
|
||||||
$this->customer = $customer;
|
$this->customer = $customer;
|
||||||
|
|
||||||
|
|
@ -66,6 +68,19 @@ class CartController extends Controller
|
||||||
$this->_config = request('_config');
|
$this->_config = request('_config');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method to populate
|
||||||
|
* the cart page which
|
||||||
|
* will be populated
|
||||||
|
* before the checkout
|
||||||
|
* process.
|
||||||
|
*
|
||||||
|
* @return Mixed
|
||||||
|
*/
|
||||||
|
public function index() {
|
||||||
|
return view($this->_config['view'])->with('cart', Cart::getCart());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function for guests
|
* Function for guests
|
||||||
* user to add the product
|
* user to add the product
|
||||||
|
|
@ -107,67 +122,6 @@ class CartController extends Controller
|
||||||
return redirect()->back();
|
return redirect()->back();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Method to populate
|
|
||||||
* the cart page which
|
|
||||||
* will be populated
|
|
||||||
* before the checkout
|
|
||||||
* process.
|
|
||||||
*
|
|
||||||
* @return Mixed
|
|
||||||
*/
|
|
||||||
public function beforeCheckout() {
|
|
||||||
if(auth()->guard('customer')->check()) {
|
|
||||||
$cart = $this->cart->findOneByField('customer_id', auth()->guard('customer')->user()->id);
|
|
||||||
|
|
||||||
if(isset($cart)) {
|
|
||||||
$cart = $this->cart->findOneByField('id', 144);
|
|
||||||
|
|
||||||
$cartItems = $this->cart->items($cart['id']);
|
|
||||||
|
|
||||||
$products = array();
|
|
||||||
|
|
||||||
foreach($cartItems as $cartItem) {
|
|
||||||
$image = $this->productImage->getGalleryImages($cartItem->product);
|
|
||||||
|
|
||||||
if(isset($image[0]['small_image_url'])) {
|
|
||||||
$products[$cartItem->product->id] = [$cartItem->product->name, $cartItem->price, $image[0]['small_image_url'], $cartItem->quantity];
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$products[$cartItem->product->id] = [$cartItem->product->name, $cartItem->price, 'null', $cartItem->quantity];
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if(session()->has('cart')) {
|
|
||||||
$cart = session()->get('cart');
|
|
||||||
|
|
||||||
if(isset($cart)) {
|
|
||||||
$cart = $this->cart->findOneByField('id', 144);
|
|
||||||
|
|
||||||
$cartItems = $this->cart->items($cart['id']);
|
|
||||||
|
|
||||||
$products = array();
|
|
||||||
|
|
||||||
foreach($cartItems as $cartItem) {
|
|
||||||
$image = $this->productImage->getGalleryImages($cartItem->product);
|
|
||||||
|
|
||||||
if(isset($image[0]['small_image_url'])) {
|
|
||||||
$products[$cartItem->product->id] = [$cartItem->product->name, $cartItem->price, $image[0]['small_image_url'], $cartItem->quantity];
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$products[$cartItem->product->id] = [$cartItem->product->name, $cartItem->price, 'null', $cartItem->quantity];
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return view($this->_config['view'])->with('products', $products);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method will return
|
* This method will return
|
||||||
* the quantities from
|
* the quantities from
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,10 @@ class CheckoutController extends Controller
|
||||||
*/
|
*/
|
||||||
public function index()
|
public function index()
|
||||||
{
|
{
|
||||||
return view($this->_config['view']);
|
if(!$cart = Cart::getCart())
|
||||||
|
return redirect()->route('shop.checkout.cart.index');
|
||||||
|
|
||||||
|
return view($this->_config['view'])->with('cart', $cart);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -54,11 +57,10 @@ class CheckoutController extends Controller
|
||||||
*/
|
*/
|
||||||
public function saveAddress(CustomerAddressForm $request)
|
public function saveAddress(CustomerAddressForm $request)
|
||||||
{
|
{
|
||||||
if(!Cart::saveCustomerAddress(request()->all())) {
|
if(!Cart::saveCustomerAddress(request()->all()) || !$rates = Shipping::collectRates())
|
||||||
// return response()->json(['redirect_url' => route('store.home')], 403)
|
return response()->json(['redirect_url' => route('shop.checkout.cart.index')], 403);
|
||||||
}
|
|
||||||
|
|
||||||
return response()->json(Shipping::collectRates());
|
return response()->json($rates);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -70,13 +70,9 @@ class CartComposer
|
||||||
$view->with('cart', $products);
|
$view->with('cart', $products);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if(session()->has('cart')) {
|
if($cart = session()->get('cart')) {
|
||||||
$cart = session()->get('cart');
|
|
||||||
|
|
||||||
if(isset($cart)) {
|
if(isset($cart)) {
|
||||||
$cart = $this->cart->findOneByField('id', 144);
|
$cartItems = $cart->items($cart['id']);
|
||||||
|
|
||||||
$cartItems = $this->cart->items($cart['id']);
|
|
||||||
|
|
||||||
$products = array();
|
$products = array();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ namespace Webkul\Cart\Models;
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
use Webkul\Product\Models\Product;
|
use Webkul\Product\Models\Product;
|
||||||
use Webkul\Cart\Models\CartAddress;
|
use Webkul\Cart\Models\CartAddress;
|
||||||
use Webkul\Cart\Models\CartShipping;
|
use Webkul\Cart\Models\CartShippingRate;
|
||||||
|
|
||||||
class Cart extends Model
|
class Cart extends Model
|
||||||
{
|
{
|
||||||
|
|
@ -28,10 +28,42 @@ class Cart extends Model
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the shipping for the cart.
|
* Get the biling address for the cart.
|
||||||
*/
|
*/
|
||||||
public function shipping()
|
public function biling_address()
|
||||||
{
|
{
|
||||||
return $this->hasMany(CartShipping::class);
|
return $this->addresses()->where('address_type', 'billing');
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
/**
|
||||||
|
* Get all of the attributes for the attribute groups.
|
||||||
|
*/
|
||||||
|
public function getBilingAddressAttribute()
|
||||||
|
{
|
||||||
|
return $this->biling_address()->first();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the shipping address for the cart.
|
||||||
|
*/
|
||||||
|
public function shipping_address()
|
||||||
|
{
|
||||||
|
return $this->addresses()->where('address_type', 'shipping');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all of the attributes for the attribute groups.
|
||||||
|
*/
|
||||||
|
public function getShippingAddressAttribute()
|
||||||
|
{
|
||||||
|
return $this->shipping_address()->first();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the shipping rates for the cart.
|
||||||
|
*/
|
||||||
|
public function shipping_rates()
|
||||||
|
{
|
||||||
|
return $this->hasManyThrough(CartShippingRate::class, CartAddress::class, 'cart_id', 'cart_address_id');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -3,8 +3,19 @@
|
||||||
namespace Webkul\Cart\Models;
|
namespace Webkul\Cart\Models;
|
||||||
|
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use Webkul\Cart\Models\CartShippingRate;
|
||||||
|
|
||||||
class CartAddress extends Model
|
class CartAddress extends Model
|
||||||
{
|
{
|
||||||
|
protected $table = 'cart_address';
|
||||||
}
|
|
||||||
|
protected $fillable = ['first_name', 'last_name', 'email', 'address1', 'address2', 'city', 'state', 'postcode', 'country', 'email', 'phone', 'address_type', 'cart_id'];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the shipping rates for the cart address.
|
||||||
|
*/
|
||||||
|
public function shipping_rates()
|
||||||
|
{
|
||||||
|
return $this->hasMany(CartShippingRate::class);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,10 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Webkul\Cart\Models;
|
|
||||||
|
|
||||||
use Illuminate\Database\Eloquent\Model;
|
|
||||||
|
|
||||||
class CartShipping extends Model
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Webkul\Cart\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use Webkul\Cart\Models\CartAddress;
|
||||||
|
|
||||||
|
class CartShippingRate extends Model
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Get the post that owns the comment.
|
||||||
|
*/
|
||||||
|
public function shipping_address()
|
||||||
|
{
|
||||||
|
return $this->belongsTo(CartAddress::class);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Webkul\Cart\Repositories;
|
||||||
|
|
||||||
|
use Webkul\Core\Eloquent\Repository;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cart Address Reposotory
|
||||||
|
*
|
||||||
|
* @author Prashant Singh <prashant.singh852@webkul.com>
|
||||||
|
* @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
|
||||||
|
*/
|
||||||
|
|
||||||
|
class CartAddressRepository extends Repository
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Specify Model class name
|
||||||
|
*
|
||||||
|
* @return Mixed
|
||||||
|
*/
|
||||||
|
function model()
|
||||||
|
{
|
||||||
|
return 'Webkul\Cart\Models\CartAddress';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -140,7 +140,8 @@ class Core
|
||||||
|
|
||||||
$channel = $this->getCurrentChannel();
|
$channel = $this->getCurrentChannel();
|
||||||
|
|
||||||
$currencyCode = $channel->base_currency;
|
$currencyCode = $channel->base_currency->code;
|
||||||
|
// $currencyCode = $channel->base_currency;
|
||||||
|
|
||||||
return currency($price, $currencyCode);
|
return currency($price, $currencyCode);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
namespace Webkul\Shipping\Carriers;
|
namespace Webkul\Shipping\Carriers;
|
||||||
|
|
||||||
use Config;
|
use Config;
|
||||||
use Webkul\Cart\Models\CartShipping;
|
use Webkul\Cart\Models\CartShippingRate;
|
||||||
use Webkul\Shipping\Facades\Shipping;
|
use Webkul\Shipping\Facades\Shipping;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -19,12 +19,17 @@ class FlatRate extends AbstractShipping
|
||||||
*/
|
*/
|
||||||
protected $code = 'flatrate';
|
protected $code = 'flatrate';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns rate for flatrate
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
public function calculate()
|
public function calculate()
|
||||||
{
|
{
|
||||||
if(!$this->isAvailable())
|
if(!$this->isAvailable())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
$object = new CartShipping;
|
$object = new CartShippingRate;
|
||||||
|
|
||||||
$object->carrier = 'flatrate';
|
$object->carrier = 'flatrate';
|
||||||
$object->carrier_title = $this->getConfigData('title');
|
$object->carrier_title = $this->getConfigData('title');
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,43 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Webkul\Shipping\Carriers;
|
||||||
|
|
||||||
|
use Config;
|
||||||
|
use Webkul\Cart\Models\CartShippingRate;
|
||||||
|
use Webkul\Shipping\Facades\Shipping;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class Rate.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class Free extends AbstractShipping
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Payment method code
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $code = 'free';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns rate for flatrate
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function calculate()
|
||||||
|
{
|
||||||
|
if(!$this->isAvailable())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
$object = new CartShippingRate;
|
||||||
|
|
||||||
|
$object->carrier = 'free';
|
||||||
|
$object->carrier_title = $this->getConfigData('title');
|
||||||
|
$object->method = 'free_free';
|
||||||
|
$object->method_title = $this->getConfigData('title');
|
||||||
|
$object->method_description = $this->getConfigData('description');
|
||||||
|
$object->price = 0;
|
||||||
|
|
||||||
|
return $object;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
namespace Webkul\Shipping;
|
namespace Webkul\Shipping;
|
||||||
|
|
||||||
use Illuminate\Support\Facades\Config;
|
use Illuminate\Support\Facades\Config;
|
||||||
|
use Webkul\Cart\Facades\Cart;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class Shipping.
|
* Class Shipping.
|
||||||
|
|
@ -10,10 +11,25 @@ use Illuminate\Support\Facades\Config;
|
||||||
*/
|
*/
|
||||||
class Shipping
|
class Shipping
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Rates
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
protected $rates = [];
|
protected $rates = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collects rate from available shipping methods
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
public function collectRates()
|
public function collectRates()
|
||||||
{
|
{
|
||||||
|
if(!$cart = Cart::getCart())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
$this->removeAllShippingRates();
|
||||||
|
|
||||||
foreach(Config::get('carriers') as $shippingMethod) {
|
foreach(Config::get('carriers') as $shippingMethod) {
|
||||||
$object = new $shippingMethod['class'];
|
$object = new $shippingMethod['class'];
|
||||||
|
|
||||||
|
|
@ -26,12 +42,53 @@ class Shipping
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->saveAllShippingRates();
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'jump_to_section' => 'shipping',
|
'jump_to_section' => 'shipping',
|
||||||
'html' => view('shop::checkout.onepage.shipping', ['shippingRateGroups' => $this->getGroupedAllShippingRates()])->render()
|
'html' => view('shop::checkout.onepage.shipping', ['shippingRateGroups' => $this->getGroupedAllShippingRates()])->render()
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Persist shipping rate to database
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function removeAllShippingRates()
|
||||||
|
{
|
||||||
|
if(!$cart = Cart::getCart())
|
||||||
|
return;
|
||||||
|
|
||||||
|
foreach($cart->shipping_rates()->get() as $rate) {
|
||||||
|
$rate->delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Persist shipping rate to database
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function saveAllShippingRates()
|
||||||
|
{
|
||||||
|
if(!$cart = Cart::getCart())
|
||||||
|
return;
|
||||||
|
|
||||||
|
$shippingAddress = $cart->shipping_address;
|
||||||
|
|
||||||
|
foreach($this->rates as $rate) {
|
||||||
|
$rate->cart_address_id = $shippingAddress->id;
|
||||||
|
|
||||||
|
$rate->save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns shipping rates, grouped by shipping method
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
public function getGroupedAllShippingRates()
|
public function getGroupedAllShippingRates()
|
||||||
{
|
{
|
||||||
$rates = [];
|
$rates = [];
|
||||||
|
|
|
||||||
|
|
@ -10,16 +10,16 @@ Route::group(['middleware' => ['web']], function () {
|
||||||
'view' => 'shop::products.index'
|
'view' => 'shop::products.index'
|
||||||
]);
|
]);
|
||||||
|
|
||||||
Route::get('/checkout', 'Webkul\Cart\Http\Controllers\CheckoutController@index')->defaults('_config', [
|
Route::get('/checkout/cart', 'Webkul\Cart\Http\Controllers\CartController@index')->defaults('_config', [
|
||||||
|
'view' => 'shop::checkout.cart.index'
|
||||||
|
])->name('shop.checkout.cart.index');
|
||||||
|
|
||||||
|
Route::get('/checkout/onepage', 'Webkul\Cart\Http\Controllers\CheckoutController@index')->defaults('_config', [
|
||||||
'view' => 'shop::checkout.onepage'
|
'view' => 'shop::checkout.onepage'
|
||||||
])->name('shop.checkout');
|
])->name('shop.checkout.onepage.index');
|
||||||
|
|
||||||
Route::get('test', 'Webkul\Cart\Http\Controllers\CartController@test');
|
Route::get('test', 'Webkul\Cart\Http\Controllers\CartController@test');
|
||||||
|
|
||||||
Route::get('cart', 'Webkul\Cart\Http\Controllers\CartController@beforeCheckout')->defaults('_config', [
|
|
||||||
'view' => 'shop::store.cart.index'
|
|
||||||
]);
|
|
||||||
|
|
||||||
Route::post('/checkout/save-address', 'Webkul\Cart\Http\Controllers\CheckoutController@saveAddress')->name('shop.checkout.save-address');
|
Route::post('/checkout/save-address', 'Webkul\Cart\Http\Controllers\CheckoutController@saveAddress')->name('shop.checkout.save-address');
|
||||||
|
|
||||||
Route::post('/checkout/save-shipping', 'Webkul\Cart\Http\Controllers\CheckoutController@saveShipping')->name('shop.checkout.save-shipping');
|
Route::post('/checkout/save-shipping', 'Webkul\Cart\Http\Controllers\CheckoutController@saveShipping')->name('shop.checkout.save-shipping');
|
||||||
|
|
|
||||||
|
|
@ -60,7 +60,8 @@ return [
|
||||||
|
|
||||||
'checkout' => [
|
'checkout' => [
|
||||||
'cart' => [
|
'cart' => [
|
||||||
|
'title' => 'Shopping Cart',
|
||||||
|
'empty' => 'Shopping Cart Is Empty',
|
||||||
],
|
],
|
||||||
|
|
||||||
'onepage' => [
|
'onepage' => [
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,141 @@
|
||||||
|
@extends('shop::layouts.master')
|
||||||
|
|
||||||
|
@section('page_title')
|
||||||
|
{{ __('shop::app.checkout.cart.title') }}
|
||||||
|
@stop
|
||||||
|
|
||||||
|
@section('content-wrapper')
|
||||||
|
|
||||||
|
@inject ('productImageHelper', 'Webkul\Product\Product\ProductImage')
|
||||||
|
|
||||||
|
<section class="cart">
|
||||||
|
|
||||||
|
@if ($cart)
|
||||||
|
|
||||||
|
<div class="title">
|
||||||
|
{{ __('shop::app.checkout.cart.title') }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="cart-content">
|
||||||
|
|
||||||
|
<div class="left-side">
|
||||||
|
|
||||||
|
@foreach($cart->items as $item)
|
||||||
|
|
||||||
|
<?php
|
||||||
|
$product = $item->product;
|
||||||
|
|
||||||
|
$productBaseImage = $productImageHelper->getProductBaseImage($product);
|
||||||
|
?>
|
||||||
|
|
||||||
|
<div class="item">
|
||||||
|
<div style="margin-right: 15px;">
|
||||||
|
<img class="item-image" src="{{ $productBaseImage['medium_image_url'] }}" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="item-details">
|
||||||
|
|
||||||
|
<div class="item-title">
|
||||||
|
{{ $product->name }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="price">
|
||||||
|
<span class="main-price">
|
||||||
|
{{ $item->price }}
|
||||||
|
</span>
|
||||||
|
<span class="real-price">
|
||||||
|
$25.00
|
||||||
|
</span>
|
||||||
|
<span class="discount">
|
||||||
|
10% Off
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="summary" >
|
||||||
|
Color : Gray, Size : S
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="misc">
|
||||||
|
<div class="qty-text">Quantity</div>
|
||||||
|
<div class="box">{{ $item->quantity }}</div>
|
||||||
|
<span class="remove">Remove</span>
|
||||||
|
<span class="towishlist">Move to Wishlist</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
@endforeach
|
||||||
|
|
||||||
|
<div class="misc-controls">
|
||||||
|
<span>Continue Shopping</span>
|
||||||
|
<button class="btn btn-lg btn-primary">PROCEED TO CHECKOUT</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="right-side">
|
||||||
|
<div class="price-section">
|
||||||
|
<div class="title">
|
||||||
|
Price Detail
|
||||||
|
</div>
|
||||||
|
<div class="all-item-details">
|
||||||
|
@foreach($cart->items as $item)
|
||||||
|
<div class="item-details">
|
||||||
|
<span class="name">{{ $item->product->name }}</span>
|
||||||
|
<span class="price">$ {{ $item->price }}</span>
|
||||||
|
</div>
|
||||||
|
@endforeach
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="horizontal-rule"></div>
|
||||||
|
|
||||||
|
<div class="total-details">
|
||||||
|
<span class="name">Amount Payable</span>
|
||||||
|
<span class="amount">$75.00</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="coupon-section">
|
||||||
|
|
||||||
|
<span class="title">Apply Coupon</span>
|
||||||
|
|
||||||
|
<div class="control-group">
|
||||||
|
<input type="text" class="control coupon-input" placeholder="Coupon Code" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button class="btn btn-md btn-primary">Apply</button>
|
||||||
|
|
||||||
|
<div class="coupon-details">
|
||||||
|
<div class="title">Coupon Used</div>
|
||||||
|
<div class="coupon">
|
||||||
|
<span class="name">Coupon 1</span>
|
||||||
|
<span class="discount">$15</span>
|
||||||
|
</div>
|
||||||
|
<div class="coupon">
|
||||||
|
<span class="name">Coupon 2</span>
|
||||||
|
<span class="discount">$5</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="horizontal-rule"></div>
|
||||||
|
|
||||||
|
<div class="after-coupon-amount">
|
||||||
|
<span class="name">Amount Payable</span>
|
||||||
|
<span class="amount">$75.00</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@else
|
||||||
|
|
||||||
|
<div class="title">
|
||||||
|
{{ __('shop::app.checkout.cart.empty') }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@endif
|
||||||
|
</section>
|
||||||
|
|
||||||
|
@endsection
|
||||||
|
|
@ -124,7 +124,7 @@
|
||||||
|
|
||||||
@foreach (country()->all() as $code => $country)
|
@foreach (country()->all() as $code => $country)
|
||||||
|
|
||||||
<option value="{{ $country}}">{{ $country }}</option>
|
<option value="{{ $code }}">{{ $country }}</option>
|
||||||
|
|
||||||
@endforeach
|
@endforeach
|
||||||
</select>
|
</select>
|
||||||
|
|
@ -264,7 +264,7 @@
|
||||||
|
|
||||||
@foreach (country()->all() as $code => $country)
|
@foreach (country()->all() as $code => $country)
|
||||||
|
|
||||||
<option value="{{ $country}}">{{ $country }}</option>
|
<option value="{{ $code }}">{{ $country }}</option>
|
||||||
|
|
||||||
@endforeach
|
@endforeach
|
||||||
</select>
|
</select>
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
<input v-validate="'required'" type="radio" id="{{ $rate->method }}" name="shipping_method" value="{{ $rate->method }}" v-model="selected_shipping_method">
|
<input v-validate="'required'" type="radio" id="{{ $rate->method }}" name="shipping_method" value="{{ $rate->method }}" v-model="selected_shipping_method">
|
||||||
<label class="radio-view" for="{{ $rate->method }}"></label>
|
<label class="radio-view" for="{{ $rate->method }}"></label>
|
||||||
{{ $rate->method_title }}
|
{{ $rate->method_title }}
|
||||||
<b>{{ $rate->price }}</b>
|
<b>{{ core()->currency($rate->price) }}</b>
|
||||||
</span>
|
</span>
|
||||||
@endforeach
|
@endforeach
|
||||||
|
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue