diff --git a/packages/Webkul/Admin/src/DataGrids/CustomerDataGrid.php b/packages/Webkul/Admin/src/DataGrids/CustomerDataGrid.php index 0ac003829..592b0f5b4 100644 --- a/packages/Webkul/Admin/src/DataGrids/CustomerDataGrid.php +++ b/packages/Webkul/Admin/src/DataGrids/CustomerDataGrid.php @@ -122,23 +122,23 @@ class CustomerDataGrid 'type' => 'string', 'label' => 'Name', ], + [ + 'name' => 'email', + 'alias' => 'customerEmail', + 'type' => 'string', + 'label' => 'Email', + ], [ 'name' => 'phone', 'alias' => 'customerPhone', 'type' => 'number', 'label' => 'Phone', ], - [ - 'name' => 'email', - 'alias' => 'customerEmail', - 'type' => 'string', - 'label' => 'Comment', - ], [ 'name' => 'customer_group_id', 'alias' => 'customerGroupId', - 'type' => 'number', - 'label' => 'Status', + 'type' => 'string', + 'label' => 'Customer Group', ], ], diff --git a/packages/Webkul/Admin/src/DataGrids/CustomerReviewDataGrid.php b/packages/Webkul/Admin/src/DataGrids/CustomerReviewDataGrid.php index f28a22b61..fff921c47 100644 --- a/packages/Webkul/Admin/src/DataGrids/CustomerReviewDataGrid.php +++ b/packages/Webkul/Admin/src/DataGrids/CustomerReviewDataGrid.php @@ -100,7 +100,7 @@ class CustomerReviewDataGrid ], [ 'name' => 'status', - 'alias' => 'countryStatus', + 'alias' => 'reviewStatus', 'type' => 'number', 'label' => 'Status', 'sortable' => true, @@ -113,7 +113,7 @@ class CustomerReviewDataGrid 'filterable' => [ [ 'name' => 'id', - 'alias' => 'countryId', + 'alias' => 'reviewId', 'type' => 'number', 'label' => 'ID', ], @@ -137,9 +137,9 @@ class CustomerReviewDataGrid ], [ 'name' => 'status', - 'alias' => 'countryStatus', - 'type' => 'number', - 'label' => 'Code', + 'alias' => 'reviewStatus', + 'type' => 'string', + 'label' => 'Status', ], ], diff --git a/packages/Webkul/Admin/src/Http/Controllers/Sales/OrderController.php b/packages/Webkul/Admin/src/Http/Controllers/Sales/OrderController.php index 84b192988..887f28a50 100644 --- a/packages/Webkul/Admin/src/Http/Controllers/Sales/OrderController.php +++ b/packages/Webkul/Admin/src/Http/Controllers/Sales/OrderController.php @@ -67,4 +67,21 @@ class OrderController extends Controller return view($this->_config['view'], compact('order')); } -} + + /** + * Cancel action for the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function cancel($id) + { + if($this->order->cancel($id)) { + session()->flash('success', trans('Order canceled successfully.')); + } else { + session()->flash('error', trans('Order can not be canceled.')); + } + + return redirect()->back(); + } +} \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Http/routes.php b/packages/Webkul/Admin/src/Http/routes.php index 5dab660b7..fe3d873a9 100644 --- a/packages/Webkul/Admin/src/Http/routes.php +++ b/packages/Webkul/Admin/src/Http/routes.php @@ -49,10 +49,6 @@ Route::group(['middleware' => ['web']], function () { 'view' => 'admin::customers.orders.index' ])->name('admin.customer.orders.index'); - Route::get('customer/reviews', 'Webkul\Product\Http\Controllers\ReviewController@index')->defaults('_config',[ - 'view' => 'admin::customers.review.index' - ])->name('admin.customer.review.index'); - Route::get('customer/create', 'Webkul\Core\Http\Controllers\CustomerController@create')->defaults('_config',[ 'view' => 'admin::customers.create' ])->name('admin.customer.create'); @@ -61,14 +57,6 @@ Route::group(['middleware' => ['web']], function () { 'redirect' => 'admin.customer.index' ])->name('admin.customer.store'); - Route::get('customer/reviews/edit/{id}', 'Webkul\Product\Http\Controllers\ReviewController@edit')->defaults('_config',[ - 'view' => 'admin::customers.review.edit' - ])->name('admin.customer.review.edit'); - - Route::put('customer/reviews/edit/{id}', 'Webkul\Product\Http\Controllers\ReviewController@update')->defaults('_config', [ - 'redirect' => 'admin.customer.review.index' - ])->name('admin.customer.review.update'); - Route::get('customer/edit/{id}', 'Webkul\Core\Http\Controllers\CustomerController@edit')->defaults('_config',[ 'view' => 'admin::customers.edit' ])->name('admin.customer.edit'); @@ -77,6 +65,18 @@ Route::group(['middleware' => ['web']], function () { 'redirect' => 'admin.customer.index' ])->name('admin.customer.update'); + Route::get('reviews', 'Webkul\Product\Http\Controllers\ReviewController@index')->defaults('_config',[ + 'view' => 'admin::customers.review.index' + ])->name('admin.customer.review.index'); + + Route::get('reviews/edit/{id}', 'Webkul\Product\Http\Controllers\ReviewController@edit')->defaults('_config',[ + 'view' => 'admin::customers.review.edit' + ])->name('admin.customer.review.edit'); + + Route::put('reviews/edit/{id}', 'Webkul\Product\Http\Controllers\ReviewController@update')->defaults('_config', [ + 'redirect' => 'admin.customer.review.index' + ])->name('admin.customer.review.update'); + // Sales Routes Route::prefix('sales')->group(function () { // Sales Order Routes @@ -88,6 +88,10 @@ Route::group(['middleware' => ['web']], function () { 'view' => 'admin::sales.orders.view' ])->name('admin.sales.orders.view'); + Route::get('/orders/cancel/{order_id}', 'Webkul\Admin\Http\Controllers\Sales\OrderController@cancel')->defaults('_config', [ + 'view' => 'admin::sales.orders.cancel' + ])->name('admin.sales.orders.cancel'); + // Sales Invoices Routes Route::get('/invoices', 'Webkul\Admin\Http\Controllers\Sales\InvoiceController@index')->defaults('_config', [ diff --git a/packages/Webkul/Admin/src/Resources/assets/sass/app.scss b/packages/Webkul/Admin/src/Resources/assets/sass/app.scss index cba8a969a..77b325653 100644 --- a/packages/Webkul/Admin/src/Resources/assets/sass/app.scss +++ b/packages/Webkul/Admin/src/Resources/assets/sass/app.scss @@ -586,6 +586,17 @@ body { } } + .table { + .qty-row { + display: block; + margin-bottom: 5px; + + &:last-child { + margin-bottom: 0; + } + } + } + .sale-summary { margin-top: 2%; height: 130px; @@ -594,11 +605,18 @@ body { tr { td { - padding: 3px 8px; + padding: 5px 8px; } &.bold { font-weight: 600; + font-size: 15px; + } + + &.border { + td { + border-bottom: 1px solid $border-color; + } } } } diff --git a/packages/Webkul/Admin/src/Resources/lang/en/app.php b/packages/Webkul/Admin/src/Resources/lang/en/app.php index b3ec36ae5..721bf7771 100644 --- a/packages/Webkul/Admin/src/Resources/lang/en/app.php +++ b/packages/Webkul/Admin/src/Resources/lang/en/app.php @@ -73,6 +73,7 @@ return [ 'orders' => [ 'title' => 'Orders', 'view-title' => 'Order #:order_id', + 'cancel-btn-title' => 'Cancel', 'shipment-btn-title' => 'Ship', 'invoice-btn-title' => 'Invoice', 'info' => 'Information', @@ -102,6 +103,9 @@ return [ 'product-name' => 'Product Name', 'qty' => 'Qty', 'item-status' => 'Item Status', + 'item-invoice' => 'Invoiced (:qty_invoiced)', + 'item-shipped' => 'shipped (:qty_shipped)', + 'item-canceled' => 'Canceled (:qty_canceled)', 'price' => 'Price', 'total' => 'Total', 'subtotal' => 'Subtotal', @@ -110,7 +114,11 @@ return [ 'tax-percent' => 'Tax Percent', 'tax-amount' => 'Tax Amount', 'discount-amount' => 'Discount Amount', - 'grand-total' => 'Grand Total' + 'grand-total' => 'Grand Total', + 'total-paid' => 'Total Paid', + 'total-refunded' => 'Total Refunded', + 'total-due' => 'Total Due', + 'cancel-confirm-msg' => 'Are you sure you want to cancel this order ?' ], 'invoices' => [ 'id' => 'Id', @@ -397,7 +405,8 @@ return [ 'email' => 'Email', 'date_of_birth' => 'Date of Birth', 'phone' => 'Phone', - 'customer_group' => 'Customer Group' + 'customer_group' => 'Customer Group', + 'save-btn-title' => 'Save Customer' ], 'reviews' => [ 'title' => 'Title', diff --git a/packages/Webkul/Admin/src/Resources/views/catalog/products/field-types/select.blade.php b/packages/Webkul/Admin/src/Resources/views/catalog/products/field-types/select.blade.php index 3571a6a0c..a7f48a639 100644 --- a/packages/Webkul/Admin/src/Resources/views/catalog/products/field-types/select.blade.php +++ b/packages/Webkul/Admin/src/Resources/views/catalog/products/field-types/select.blade.php @@ -2,10 +2,24 @@ code) ?: $product[$attribute->code] ?> - @foreach($attribute->options as $option) - - @endforeach + @if($attribute->code != 'tax_category_id') + + @foreach($attribute->options as $option) + + @endforeach + + @else + + + + @foreach(app('Webkul\Tax\Repositories\TaxCategoryRepository')->all() as $taxCategory) + + @endforeach + + @endif \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/customers/create.blade.php b/packages/Webkul/Admin/src/Resources/views/customers/create.blade.php index ebdd9e812..97bbd7b33 100644 --- a/packages/Webkul/Admin/src/Resources/views/customers/create.blade.php +++ b/packages/Webkul/Admin/src/Resources/views/customers/create.blade.php @@ -15,7 +15,7 @@
@@ -25,56 +25,52 @@
@csrf() - -
+
+ + + @{{ errors.first('first_name') }} +
-
- - - @{{ errors.first('first_name') }} -
+
+ + + @{{ errors.first('last_name') }} +
-
- - - @{{ errors.first('last_name') }} -
+
+ + + @{{ errors.first('email') }} +
-
- - - @{{ errors.first('email') }} -
+
+ + + @{{ errors.first('gender') }} +
-
- - -
+
+ + +
-
- - -
+
+ + + @{{ errors.first('phone') }} +
-
- - -
- -
- - -
- -
-
+
+ + +
diff --git a/packages/Webkul/Admin/src/Resources/views/customers/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/customers/edit.blade.php index 0ea37bc67..639ac370d 100644 --- a/packages/Webkul/Admin/src/Resources/views/customers/edit.blade.php +++ b/packages/Webkul/Admin/src/Resources/views/customers/edit.blade.php @@ -13,7 +13,7 @@
@@ -28,37 +28,42 @@
-
- - +
+ + + @{{ errors.first('first_name') }} +
+ +
+ + + @{{ errors.first('last_name') }} +
+ +
+ + + @{{ errors.first('email') }}
- - -
- -
- - -
- -
- - + @{{ errors.first('gender') }}
- +
-
+
- + + @{{ errors.first('phone') }}
diff --git a/packages/Webkul/Admin/src/Resources/views/customers/review/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/customers/review/edit.blade.php index d2ad88652..98e1bc6f2 100644 --- a/packages/Webkul/Admin/src/Resources/views/customers/review/edit.blade.php +++ b/packages/Webkul/Admin/src/Resources/views/customers/review/edit.blade.php @@ -43,7 +43,7 @@
- + @foreach($taxRates->all() as $taxRate) diff --git a/packages/Webkul/Attribute/src/Database/Seeders/AttributeTableSeeder.php b/packages/Webkul/Attribute/src/Database/Seeders/AttributeTableSeeder.php index 65ffab144..368e15cd1 100644 --- a/packages/Webkul/Attribute/src/Database/Seeders/AttributeTableSeeder.php +++ b/packages/Webkul/Attribute/src/Database/Seeders/AttributeTableSeeder.php @@ -61,7 +61,7 @@ class AttributeTableSeeder extends Seeder 'en' => [ 'name' => 'Tax Category' ], - 'type' => 'text', + 'type' => 'select', 'position' => 4, 'is_unique' => 0, 'is_required' => 0, diff --git a/packages/Webkul/Attribute/src/Models/Attribute.php b/packages/Webkul/Attribute/src/Models/Attribute.php index 650606293..a57d5a3a7 100644 --- a/packages/Webkul/Attribute/src/Models/Attribute.php +++ b/packages/Webkul/Attribute/src/Models/Attribute.php @@ -10,7 +10,7 @@ class Attribute extends TranslatableModel { public $translatedAttributes = ['name']; - protected $fillable = ['code', 'admin_name', 'type', 'position', 'is_required', 'is_unique', 'value_per_locale', 'value_per_channel', 'is_filterable', 'is_configurable', 'is_visible_on_front']; + protected $fillable = ['code', 'admin_name', 'type', 'position', 'is_required', 'is_unique', 'value_per_locale', 'value_per_channel', 'is_filterable', 'is_configurable', 'is_visible_on_front', 'is_user_defined']; protected $with = ['options']; diff --git a/packages/Webkul/Checkout/src/Cart.php b/packages/Webkul/Checkout/src/Cart.php index 2d8e3bb84..287b5cecc 100644 --- a/packages/Webkul/Checkout/src/Cart.php +++ b/packages/Webkul/Checkout/src/Cart.php @@ -8,6 +8,7 @@ use Webkul\Checkout\Repositories\CartItemRepository; use Webkul\Checkout\Repositories\CartAddressRepository; use Webkul\Customer\Repositories\CustomerRepository; use Webkul\Product\Repositories\ProductRepository; +use Webkul\Tax\Repositories\TaxCategoryRepository; use Webkul\Checkout\Models\CartPayment; /** @@ -54,6 +55,13 @@ class Cart { */ protected $product; + /** + * TaxCategoryRepository model + * + * @var mixed + */ + protected $taxCategory; + /** * Create a new controller instance. * @@ -62,6 +70,7 @@ class Cart { * @param Webkul\Checkout\Repositories\CartAddressRepository $cartAddress * @param Webkul\Customer\Repositories\CustomerRepository $customer * @param Webkul\Product\Repositories\ProductRepository $product + * @param Webkul\Product\Repositories\TaxCategoryRepository $taxCategory * @return void */ public function __construct( @@ -69,7 +78,9 @@ class Cart { CartItemRepository $cartItem, CartAddressRepository $cartAddress, CustomerRepository $customer, - ProductRepository $product) + ProductRepository $product, + TaxCategoryRepository $taxCategory + ) { $this->customer = $customer; @@ -80,6 +91,8 @@ class Cart { $this->cartAddress = $cartAddress; $this->product = $product; + + $this->taxCategory = $taxCategory; } /** @@ -564,7 +577,11 @@ class Cart { $cart = null; if(auth()->guard('customer')->check()) { - $cart = $this->cart->findOneByField('customer_id', auth()->guard('customer')->user()->id); + $cart = $this->cart->findOneWhere([ + 'customer_id' => auth()->guard('customer')->user()->id, + 'is_active' => 1 + ]); + } elseif(session()->has('cart')) { $cart = $this->cart->find(session()->get('cart')->id); } @@ -659,6 +676,8 @@ class Cart { } } + // If customer is guest, than save shipping address's email and name in cart as customer details + return true; } @@ -718,20 +737,15 @@ class Cart { if(!$cart = $this->getCart()) return false; - $this->calulateItemsTax(); + $this->calculateItemsTax(); - $cart->grand_total = 0; - $cart->base_grand_total = 0; - - $cart->sub_total = 0; - $cart->base_sub_total = 0; - - $cart->tax_total = 0; - $cart->base_tax_total = 0; + $cart->grand_total = $cart->base_grand_total = 0; + $cart->sub_total = $cart->base_sub_total = 0; + $cart->tax_total = $cart->base_tax_total = 0; foreach ($cart->items()->get() as $item) { - $cart->grand_total = (float) $cart->grand_total + $item->total; - $cart->base_grand_total = (float) $cart->base_grand_total + $item->base_total; + $cart->grand_total = (float) $cart->grand_total + $item->total + $item->tax_amount; + $cart->base_grand_total = (float) $cart->base_grand_total + $item->base_total + $item->base_tax_amount; $cart->sub_total = (float) $cart->sub_total + $item->total; $cart->base_sub_total = (float) $cart->base_sub_total + $item->base_total; @@ -762,12 +776,46 @@ class Cart { * * @return void */ - public function calulateItemsTax() + public function calculateItemsTax() { $cart = $this->getCart(); + if(!$shippingAddress = $cart->shipping_address) + return; + foreach ($cart->items()->get() as $item) { - $product = $item->product; + $taxCategory = $this->taxCategory->find($item->product->tax_category_id); + + if(!$taxCategory) + continue; + + $taxRates = $taxCategory->tax_rates()->where([ + 'state' => $shippingAddress->state, + 'country' => $shippingAddress->country, + ])->orderBy('tax_rate', 'desc')->get(); + + foreach($taxRates as $rate) { + $haveTaxRate = false; + + if(!$rate->is_zip) { + if($rate->zip_code == '*' || $rate->zip_code == $shippingAddress->postcode) { + $haveTaxRate = true; + } + } else { + if($shippingAddress->postcode >= $rate->zip_code && $shippingAddress->postcode <= $rate->zip_code) { + $haveTaxRate = true; + } + } + + if($haveTaxRate) { + $item->tax_percent = $rate->tax_rate; + $item->tax_amount = ($item->total * $rate->tax_rate) / 100; + $item->base_tax_amount = ($item->base_total * $rate->tax_rate) / 100; + + $item->save(); + break; + } + } } } @@ -848,7 +896,7 @@ class Cart { 'customer_email' => $data['customer_email'], 'customer_first_name' => $data['customer_first_name'], 'customer_last_name' => $data['customer_last_name'], - 'customer' => auth()->guard('customer')->check() ? auth()->guard('customer')->user : null, + 'customer' => auth()->guard('customer')->check() ? auth()->guard('customer')->user() : null, 'shipping_method' => $data['selected_shipping_rate']['method'], 'shipping_title' => $data['selected_shipping_rate']['carrier_title'] . ' - ' . $data['selected_shipping_rate']['method_title'], diff --git a/packages/Webkul/Core/src/Eloquent/Repository.php b/packages/Webkul/Core/src/Eloquent/Repository.php index 7ca98083e..9d92bbabe 100644 --- a/packages/Webkul/Core/src/Eloquent/Repository.php +++ b/packages/Webkul/Core/src/Eloquent/Repository.php @@ -46,6 +46,42 @@ abstract class Repository extends BaseRepository { return $model->first(); } + /** + * Find data by id + * + * @param $id + * @param array $columns + * + * @return mixed + */ + public function find($id, $columns = ['*']) + { + $this->applyCriteria(); + $this->applyScope(); + $model = $this->model->find($id, $columns); + $this->resetModel(); + + return $this->parserResult($model); + } + + /** + * Find data by id + * + * @param $id + * @param array $columns + * + * @return mixed + */ + public function findOrFail($id, $columns = ['*']) + { + $this->applyCriteria(); + $this->applyScope(); + $model = $this->model->findOrFail($id, $columns); + $this->resetModel(); + + return $this->parserResult($model); + } + /** * @return mixed */ diff --git a/packages/Webkul/Core/src/Http/Controllers/CustomerController.php b/packages/Webkul/Core/src/Http/Controllers/CustomerController.php index 3ec3076e5..17c8ead1d 100644 --- a/packages/Webkul/Core/src/Http/Controllers/CustomerController.php +++ b/packages/Webkul/Core/src/Http/Controllers/CustomerController.php @@ -84,11 +84,11 @@ class CustomerController extends Controller public function store(Request $request) { $request->validate([ - 'first_name' => 'string|required', 'last_name' => 'string|required', - 'email' => 'email|required', - + 'gender' => 'required', + 'phone' => 'nullable|numeric', + 'email' => 'required|unique:customers,email' ]); $data=$request->all(); @@ -102,7 +102,6 @@ class CustomerController extends Controller session()->flash('success', 'Customer created successfully.'); return redirect()->route($this->_config['redirect']); - } /** @@ -129,6 +128,13 @@ class CustomerController extends Controller */ public function update(Request $request, $id) { + $request->validate([ + 'first_name' => 'string|required', + 'last_name' => 'string|required', + 'gender' => 'required', + 'phone' => 'nullable|numeric', + 'email' => 'required|unique:customers,email,'. $id + ]); $this->customer->update(request()->all(),$id); @@ -136,6 +142,4 @@ class CustomerController extends Controller return redirect()->route($this->_config['redirect']); } - - } diff --git a/packages/Webkul/Customer/src/Http/Controllers/OrdersController.php b/packages/Webkul/Customer/src/Http/Controllers/OrdersController.php index e35943d2e..11fe6054f 100644 --- a/packages/Webkul/Customer/src/Http/Controllers/OrdersController.php +++ b/packages/Webkul/Customer/src/Http/Controllers/OrdersController.php @@ -5,6 +5,7 @@ namespace Webkul\Customer\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Http\Response; use Webkul\Customer\Repositories\CustomerRepository; +use Webkul\Sales\Repositories\OrderRepository; use Auth; /** @@ -25,26 +26,18 @@ class OrdersController extends Controller */ protected $_config; protected $customer; + protected $order; - public function __construct(CustomerRepository $customer) + public function __construct(CustomerRepository $customer ,OrderRepository $order) { $this->middleware('customer'); $this->_config = request('_config'); $this->customer = $customer; - } - /** - * For taking the customer - * to the dashboard after - * authentication - * @return view - */ - private function getCustomer($id) { - $customer = collect($this->customer->findOneWhere(['id'=>$id])); - return $customer; + $this->order = $order; } public function index() { @@ -56,6 +49,13 @@ class OrdersController extends Controller } public function orders() { - return view($this->_config['view']); + + $id = auth()->guard('customer')->user()->id; + + $orders = $this->order->customerOrder($id); + + return view($this->_config['view'],compact('orders')); } } + + diff --git a/packages/Webkul/Customer/src/Models/Customer.php b/packages/Webkul/Customer/src/Models/Customer.php index b3e9ca1b6..bb6589d57 100644 --- a/packages/Webkul/Customer/src/Models/Customer.php +++ b/packages/Webkul/Customer/src/Models/Customer.php @@ -5,6 +5,7 @@ namespace Webkul\Customer\Models; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; use Webkul\Customer\Models\CustomersGroups; +use Webkul\Sales\Models\Order; // use Webkul\User\Notifications\AdminResetPassword; @@ -37,6 +38,4 @@ class Customer extends Authenticatable { return $this->belongsTo(CustomersGroups::class); } - - } diff --git a/packages/Webkul/Product/src/Repositories/ProductRepository.php b/packages/Webkul/Product/src/Repositories/ProductRepository.php index b67cedf64..beb6a2cb0 100644 --- a/packages/Webkul/Product/src/Repositories/ProductRepository.php +++ b/packages/Webkul/Product/src/Repositories/ProductRepository.php @@ -159,9 +159,9 @@ class ProductRepository extends Repository $attributes = $product->attribute_family->custom_attributes; foreach ($attributes as $attribute) { - if(!isset($data[$attribute->code]) || !$data[$attribute->code]) + if(!isset($data[$attribute->code]) || ($attribute->code == 'boolean' && !$data[$attribute->code])) continue; - + $attributeValue = $this->attributeValue->findOneWhere([ 'product_id' => $product->id, 'attribute_id' => $attribute->id, diff --git a/packages/Webkul/Sales/src/Database/Migrations/2018_09_27_113207_create_order_items_table.php b/packages/Webkul/Sales/src/Database/Migrations/2018_09_27_113207_create_order_items_table.php index 930724305..42d004e8d 100644 --- a/packages/Webkul/Sales/src/Database/Migrations/2018_09_27_113207_create_order_items_table.php +++ b/packages/Webkul/Sales/src/Database/Migrations/2018_09_27_113207_create_order_items_table.php @@ -26,6 +26,7 @@ class CreateOrderItemsTable extends Migration $table->integer('qty_ordered')->default(0)->nullable(); $table->integer('qty_shipped')->default(0)->nullable(); $table->integer('qty_invoiced')->default(0)->nullable(); + $table->integer('qty_canceled')->default(0)->nullable(); $table->integer('qty_refunded')->default(0)->nullable(); $table->decimal('price', 12,4)->default(0); diff --git a/packages/Webkul/Sales/src/Models/Order.php b/packages/Webkul/Sales/src/Models/Order.php index 9bb83b3f5..5254f7d8c 100644 --- a/packages/Webkul/Sales/src/Models/Order.php +++ b/packages/Webkul/Sales/src/Models/Order.php @@ -7,11 +7,12 @@ use Webkul\Sales\Contracts\Order as OrderContract; class Order extends Model implements OrderContract { - protected $guarded = ['id', 'items', 'shipping_address', 'billing_address', 'channel', 'payment', 'created_at', 'updated_at']; + protected $guarded = ['id', 'items', 'shipping_address', 'billing_address', 'customer', 'channel', 'payment', 'created_at', 'updated_at']; protected $statusLabel = [ 'pending' => 'Pending', 'processing' => 'Processing', + 'completed' => 'Completed', 'canceled' => 'Canceled', 'closed' => 'Closed', ]; @@ -31,6 +32,22 @@ class Order extends Model implements OrderContract return $this->statusLabel[$this->status]; } + /** + * Return base total due amount + */ + public function getBaseTotalDueAttribute() + { + return $this->base_grand_total - $this->base_grand_total_invoiced; + } + + /** + * Return total due amount + */ + public function getTotalDueAttribute() + { + return $this->grand_total - $this->base_total_invoiced; + } + /** * Get the order items record associated with the order. */ @@ -143,4 +160,18 @@ class Order extends Model implements OrderContract return false; } + + /** + * Checks if order could can canceled on not + */ + public function canCancel() + { + foreach($this->items as $item) { + if ($item->qty_to_cancel > 0) { + return true; + } + } + + return false; + } } \ No newline at end of file diff --git a/packages/Webkul/Sales/src/Models/OrderAddress.php b/packages/Webkul/Sales/src/Models/OrderAddress.php index 73f88c680..827e499a9 100644 --- a/packages/Webkul/Sales/src/Models/OrderAddress.php +++ b/packages/Webkul/Sales/src/Models/OrderAddress.php @@ -4,7 +4,6 @@ namespace Webkul\Sales\Models; use Illuminate\Database\Eloquent\Model; use Webkul\Sales\Contracts\OrderAddress as OrderAddressContract; -use Webkul\Customer\Models\Customer; class OrderAddress extends Model implements OrderAddressContract { @@ -19,7 +18,7 @@ class OrderAddress extends Model implements OrderAddressContract { return $this->first_name . ' ' . $this->last_name; } - + /** * Get the customer record associated with the order. */ diff --git a/packages/Webkul/Sales/src/Models/OrderItem.php b/packages/Webkul/Sales/src/Models/OrderItem.php index 789bd61bd..08ad131cb 100644 --- a/packages/Webkul/Sales/src/Models/OrderItem.php +++ b/packages/Webkul/Sales/src/Models/OrderItem.php @@ -13,14 +13,21 @@ class OrderItem extends Model implements OrderItemContract * Get remaining qty for shipping. */ public function getQtyToShipAttribute() { - return $this->qty_ordered - $this->qty_shipped - $this->qty_refunded; + return $this->qty_ordered - $this->qty_shipped - $this->qty_refunded - $this->qty_canceled; } /** * Get remaining qty for invoice. */ public function getQtyToInvoiceAttribute() { - return $this->qty_ordered - $this->qty_invoiced - $this->qty_refunded; + return $this->qty_ordered - $this->qty_invoiced - $this->qty_canceled; + } + + /** + * Get remaining qty for cancel. + */ + public function getQtyToCancelAttribute() { + return $this->qty_ordered - $this->qty_canceled - $this->qty_invoiced; } /** diff --git a/packages/Webkul/Sales/src/Repositories/InvoiceRepository.php b/packages/Webkul/Sales/src/Repositories/InvoiceRepository.php index 3837f2b42..74ff4bb6a 100644 --- a/packages/Webkul/Sales/src/Repositories/InvoiceRepository.php +++ b/packages/Webkul/Sales/src/Repositories/InvoiceRepository.php @@ -138,8 +138,8 @@ class InvoiceRepository extends Repository 'base_price' => $childOrderItem->base_price, 'total' => $childOrderItem->price * $qty, 'base_total' => $childOrderItem->base_price * $qty, - 'tax_amount' => ( ($childOrderItem->tax_amount / $childOrderItem->qty_ordered) * $qty ), - 'base_tax_amount' => ( ($childOrderItem->base_tax_amount / $childOrderItem->qty_ordered) * $qty ), + 'tax_amount' => 0, + 'base_tax_amount' => 0, 'product_id' => $childOrderItem->product_id, 'product_type' => $childOrderItem->product_type, 'additional' => $childOrderItem->additional, @@ -153,7 +153,7 @@ class InvoiceRepository extends Repository $this->order->collectTotals($order); - $this->order->updateOrderStatus($order->id); + $this->order->updateOrderStatus($order); } catch (\Exception $e) { DB::rollBack(); diff --git a/packages/Webkul/Sales/src/Repositories/OrderRepository.php b/packages/Webkul/Sales/src/Repositories/OrderRepository.php index d72e8c86e..445199220 100644 --- a/packages/Webkul/Sales/src/Repositories/OrderRepository.php +++ b/packages/Webkul/Sales/src/Repositories/OrderRepository.php @@ -71,7 +71,7 @@ class OrderRepository extends Repository public function create(array $data) { DB::beginTransaction(); - + try { Event::fire('checkout.order.save.before', $data); @@ -97,7 +97,7 @@ class OrderRepository extends Repository $order->payment()->create($data['payment']); $order->addresses()->create($data['shipping_address']); - + $order->addresses()->create($data['billing_address']); foreach($data['items'] as $item) { @@ -114,7 +114,7 @@ class OrderRepository extends Repository throw $e; } - + DB::commit(); Event::fire('checkout.order.save.after', $order); @@ -122,6 +122,30 @@ class OrderRepository extends Repository return $order; } + /** + * @param int $orderId + * @return mixed + */ + public function cancel($orderId) + { + $order = $this->findOrFail($orderId); + + if(!$order->canCancel()) + return false; + + foreach($order->items as $item) { + if($item->qty_to_cancel) { + $item->qty_canceled += $item->qty_to_cancel; + + $item->save(); + } + } + + $this->updateOrderStatus($order); + + return true; + } + /** * @inheritDoc */ @@ -135,12 +159,94 @@ class OrderRepository extends Repository } /** - * @param int $orderId + * @param mixed $order * @return void */ - public function updateOrderStatus(int $orderId) + public function isInCompletedState($order) { - $order = $this->find($orderId); + $totalQtyOrdered = 0; + $totalQtyInvoiced = 0; + $totalQtyShipped = 0; + $totalQtyRefunded = 0; + $totalQtyCanceled = 0; + + foreach($order->items as $item) { + $totalQtyOrdered += $item->qty_ordered; + $totalQtyInvoiced += $item->qty_invoiced; + $totalQtyShipped += $item->qty_shipped; + $totalQtyRefunded += $item->qty_refunded; + $totalQtyCanceled += $item->qty_canceled; + } + + if($totalQtyOrdered != ($totalQtyRefunded + $totalQtyCanceled) && + $totalQtyOrdered == $totalQtyInvoiced + $totalQtyRefunded + $totalQtyCanceled && + $totalQtyOrdered == $totalQtyShipped + $totalQtyRefunded + $totalQtyCanceled) + return true; + + return false; + } + + /** + * @param mixed $order + * @return void + */ + public function isInCanceledState($order) + { + $totalQtyOrdered = 0; + $totalQtyCanceled = 0; + + foreach($order->items as $item) { + $totalQtyOrdered += $item->qty_ordered; + $totalQtyCanceled += $item->qty_canceled; + } + + if($totalQtyOrdered == $totalQtyCanceled) + return true; + + return false; + } + + /** + * @param mixed $order + * @return void + */ + public function isInClosedState($order) + { + $totalQtyOrdered = 0; + $totalQtyRefunded = 0; + $totalQtyCanceled = 0; + + foreach($order->items as $item) { + $totalQtyOrdered += $item->qty_ordered; + $totalQtyRefunded += $item->qty_refunded; + $totalQtyCanceled += $item->qty_canceled; + } + + if($totalQtyOrdered == $totalQtyRefunded + $totalQtyCanceled) + return true; + + return false; + } + + /** + * @param mixed $order + * @return void + */ + public function updateOrderStatus($order) + { + $status = 'processing'; + + if($this->isInCompletedState($order)) + $status = 'completed'; + + if($this->isInCanceledState($order)) + $status = 'canceled'; + + if($this->isInClosedState($order)) + $status = 'closed'; + + $order->status = $status; + $order->save(); } /** @@ -180,4 +286,13 @@ class OrderRepository extends Repository return $order; } + + /** + * @param int $customerId + * @return void + */ + public function customerOrder($customerId) + { + return $this->model->where('customer_id',$customerId)->get(); + } } \ No newline at end of file diff --git a/packages/Webkul/Sales/src/Repositories/ShipmentRepository.php b/packages/Webkul/Sales/src/Repositories/ShipmentRepository.php index 337db3169..fa80b5051 100644 --- a/packages/Webkul/Sales/src/Repositories/ShipmentRepository.php +++ b/packages/Webkul/Sales/src/Repositories/ShipmentRepository.php @@ -127,7 +127,7 @@ class ShipmentRepository extends Repository $this->orderItem->update(['qty_shipped' => $orderItem->qty_shipped + $qty], $orderItem->id); } - $this->order->updateOrderStatus($order->id); + $this->order->updateOrderStatus($order); } catch (\Exception $e) { DB::rollBack(); diff --git a/packages/Webkul/Shop/src/Http/routes.php b/packages/Webkul/Shop/src/Http/routes.php index f6d4b96c0..597295d7c 100644 --- a/packages/Webkul/Shop/src/Http/routes.php +++ b/packages/Webkul/Shop/src/Http/routes.php @@ -178,7 +178,7 @@ Route::group(['middleware' => ['web']], function () { /* Reviews route */ Route::get('reviews', 'Webkul\Customer\Http\Controllers\CustomerController@reviews')->defaults('_config', [ - 'view' => 'shop::customers.account.reviews.reviews' + 'view' => 'shop::customers.account.reviews.index' ])->name('customer.reviews.index'); }); }); diff --git a/packages/Webkul/Shop/src/Resources/assets/images/Expand-Light-On.svg b/packages/Webkul/Shop/src/Resources/assets/images/Expand-Light-On.svg new file mode 100644 index 000000000..7b38bfe7f --- /dev/null +++ b/packages/Webkul/Shop/src/Resources/assets/images/Expand-Light-On.svg @@ -0,0 +1,12 @@ + + + + Expand-Light-On + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/packages/Webkul/Shop/src/Resources/assets/images/Expand-Light.svg b/packages/Webkul/Shop/src/Resources/assets/images/Expand-Light.svg new file mode 100644 index 000000000..745e57d6e --- /dev/null +++ b/packages/Webkul/Shop/src/Resources/assets/images/Expand-Light.svg @@ -0,0 +1,12 @@ + + + + Expand-Light + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/packages/Webkul/Shop/src/Resources/assets/js/components/category-item.vue b/packages/Webkul/Shop/src/Resources/assets/js/components/category-item.vue index 5bfd4b903..96c3aca5e 100644 --- a/packages/Webkul/Shop/src/Resources/assets/js/components/category-item.vue +++ b/packages/Webkul/Shop/src/Resources/assets/js/components/category-item.vue @@ -1,10 +1,11 @@ +