diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php
index a0067907d..51792b28d 100755
--- a/app/Http/Kernel.php
+++ b/app/Http/Kernel.php
@@ -31,6 +31,8 @@ class Kernel extends HttpKernel
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
+ \Webkul\SAASCustomizer\Http\Middleware\ValidatesDomain::class,
+ \Webkul\ShowPriceAfterLogin\Http\Middleware\ShowShopAfterLogin::class
],
'api' => [
diff --git a/composer.json b/composer.json
index e4e0e4b2f..9c16b61f3 100755
--- a/composer.json
+++ b/composer.json
@@ -20,6 +20,7 @@
"doctrine/dbal": "^2.9@dev",
"fideloper/proxy": "^4.0",
"flynsarmy/db-blade-compiler": "*",
+ "guzzlehttp/guzzle": "^6.3@dev",
"intervention/image": "^2.4",
"intervention/imagecache": "^2.3",
"kalnoy/nestedset": "^4.3",
@@ -30,6 +31,7 @@
"nwidart/laravel-modules": "^3.2",
"prettus/l5-repository": "^2.6",
"propaganistas/laravel-intl": "^2.0",
+ "stripe/stripe-php": "6.0",
"tymon/jwt-auth": "dev-develop"
},
"require-dev": {
@@ -88,7 +90,16 @@
"Webkul\\Sales\\": "packages/Webkul/Sales/src",
"Webkul\\Tax\\": "packages/Webkul/Tax/src",
"Webkul\\API\\": "packages/Webkul/API",
- "Webkul\\Discount\\": "packages/Webkul/Discount/src"
+ "Webkul\\Discount\\": "packages/Webkul/Discount/src",
+ "Webkul\\CustomerDocument\\": "packages/Webkul/CustomerDocument",
+ "Webkul\\BulkAddToCart\\": "packages/Webkul/BulkAddToCart",
+ "Webkul\\SAASCustomizer\\": "packages/Webkul/SAASCustomizer/src",
+ "Webkul\\AdminAuthCheck\\": "packages/Webkul/AdminAuthCheck/src",
+ "Webkul\\StripeConnect\\": "packages/Webkul/StripeConnect/src",
+ "Webkul\\CustomerCreditMax\\": "packages/Webkul/CustomerCreditMax",
+ "Webkul\\CustomerGroupCatalog\\": "packages/Webkul/CustomerGroupCatalog",
+ "Webkul\\ShowPriceAfterLogin\\": "packages/Webkul/ShowPriceAfterLogin/src",
+ "Webkul\\SAASPreOrder\\": "packages/Webkul/SAASPreOrder/src"
}
},
"autoload-dev": {
diff --git a/config/app.php b/config/app.php
index b15029bdc..c2ff96bcf 100755
--- a/config/app.php
+++ b/config/app.php
@@ -52,7 +52,7 @@ return [
|
*/
- 'url' => env('APP_URL', 'http://localhost'),
+ 'url' => env('APP_URL', 'http://bagsaas.com'),
/*
|--------------------------------------------------------------------------
@@ -245,7 +245,16 @@ return [
Webkul\Sales\Providers\SalesServiceProvider::class,
Webkul\Tax\Providers\TaxServiceProvider::class,
Webkul\API\Providers\APIServiceProvider::class,
- Webkul\Discount\Providers\DiscountServiceProvider::class
+ Webkul\Discount\Providers\DiscountServiceProvider::class,
+ Webkul\CustomerDocument\Providers\CustomerDocumentServiceProvider::class,
+ Webkul\BulkAddToCart\Providers\BulkAddToCartServiceProvider::class,
+ Webkul\AdminAuthCheck\Providers\AdminAuthCheckServiceProvider::class,
+ Webkul\StripeConnect\Providers\StripeConnectServiceProvider::class,
+ Webkul\CustomerGroupCatalog\Providers\CustomerGroupCatalogServiceProvider::class,
+ // Webkul\ShowPriceAfterLogin\Providers\ShowPriceAfterLoginServiceProvider::class,
+ Webkul\CustomerCreditMax\Providers\CustomerCreditMaxServiceProvider::class,
+ Webkul\SAASPreOrder\Providers\SAASPreOrderServiceProvider::class,
+ Webkul\SAASCustomizer\Providers\SAASCustomizerServiceProvider::class
],
/*
@@ -304,5 +313,6 @@ return [
'Excel' => Maatwebsite\Excel\Facades\Excel::class,
'Concord' => Konekt\Concord\Facades\Concord::class,
'Helper' => Konekt\Concord\Facades\Helper::class,
+ 'Company' => Webkul\SAASCustomizer\Facades\Company::class
],
];
\ No newline at end of file
diff --git a/config/auth.php b/config/auth.php
index 6b8c92e4b..df9f39404 100755
--- a/config/auth.php
+++ b/config/auth.php
@@ -27,6 +27,11 @@ return [
'provider' => 'admins'
],
+ 'super-admin' => [
+ 'driver' => 'session',
+ 'provider' => 'superadmins'
+ ],
+
'admin-api' => [
'driver' => 'token',
'provider' => 'admins',
@@ -42,6 +47,11 @@ return [
'admins' => [
'driver' => 'eloquent',
'model' => Webkul\User\Models\Admin::class,
+ ],
+
+ 'superadmins' => [
+ 'driver' => 'eloquent',
+ 'model' => Webkul\SAASCustomizer\Models\SuperAdmin::class
]
],
@@ -57,4 +67,4 @@ return [
'expire' => 60,
],
],
-];
+];
\ No newline at end of file
diff --git a/config/concord.php b/config/concord.php
index 96665e96c..ca5225c63 100755
--- a/config/concord.php
+++ b/config/concord.php
@@ -15,8 +15,12 @@ return [
\Webkul\Core\Providers\ModuleServiceProvider::class,
\Webkul\Customer\Providers\ModuleServiceProvider::class,
\Webkul\Inventory\Providers\ModuleServiceProvider::class,
- \Webkul\Product\Providers\ModuleServiceProvider::class,\Webkul\Sales\Providers\ModuleServiceProvider::class,
+ \Webkul\Product\Providers\ModuleServiceProvider::class,
+ \Webkul\Sales\Providers\ModuleServiceProvider::class,
\Webkul\Tax\Providers\ModuleServiceProvider::class,
- \Webkul\User\Providers\ModuleServiceProvider::class,\Webkul\Discount\Providers\ModuleServiceProvider::class
+ \Webkul\User\Providers\ModuleServiceProvider::class,
+ \Webkul\Discount\Providers\ModuleServiceProvider::class,
+ \Webkul\StripeConnect\Providers\ModuleServiceProvider::class,
+ \Webkul\SAASPreOrder\Providers\ModuleServiceProvider::class
]
];
\ No newline at end of file
diff --git a/config/purge-pool.php b/config/purge-pool.php
new file mode 100644
index 000000000..25058db0c
--- /dev/null
+++ b/config/purge-pool.php
@@ -0,0 +1,5 @@
+ @prashant-webkul
+ * @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
+ */
+class CustomerApprovalController extends Controller
+{
+ protected $_config;
+
+ public function __construct()
+ {
+ $this->_config = request('_config');
+ }
+
+ public function index()
+ {
+
+ }
+
+ public function approve()
+ {
+ dd('approving the newly created customer');
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/AdminAuthCheck/src/Listeners/LoginAuthenticationAttempt.php b/packages/Webkul/AdminAuthCheck/src/Listeners/LoginAuthenticationAttempt.php
new file mode 100644
index 000000000..a9cd8244a
--- /dev/null
+++ b/packages/Webkul/AdminAuthCheck/src/Listeners/LoginAuthenticationAttempt.php
@@ -0,0 +1,54 @@
+ @prashant-webkul
+ * @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
+ */
+class LoginAuthenticationAttempt
+{
+ protected $superAdmin;
+
+ public function __construct(SuperAdmin $superAdmin) {
+ $this->superAdmin = $superAdmin;
+ }
+
+ public function handle()
+ {
+ $company = Company::getCurrent();
+
+ if (! auth()->guard('super-admin')->check()) {
+ $credentials = request()->all();
+ $credentials['company_id'] = $company->id;
+
+ unset($credentials['_token']);
+
+ if (auth()->guard('admin')->check()) {
+ $admin = auth()->guard('admin')->user();
+
+ if (Company::getCurrent()->id != $admin->company_id) {
+ auth()->guard('admin')->logout();
+
+ throw new \Exception('invalid_admin_login', 400);
+ }
+ } else if (auth()->guard('customer')->check()) {
+ $customer = auth()->guard('customer')->user();
+
+ if (Company::getCurrent()->id != $customer->company_id) {
+ auth()->guard('customer')->logout();
+
+ if (! auth()->guard('customer')->attempt($credentials)) {
+
+ throw new \Exception('invalid_customer_login', 400);
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/AdminAuthCheck/src/Providers/AdminAuthCheckProvider.php b/packages/Webkul/AdminAuthCheck/src/Providers/AdminAuthCheckProvider.php
new file mode 100644
index 000000000..224453f11
--- /dev/null
+++ b/packages/Webkul/AdminAuthCheck/src/Providers/AdminAuthCheckProvider.php
@@ -0,0 +1,32 @@
+loadRoutesFrom(__DIR__.'/../Routes/web.php');
+
+ $this->app->bind(
+ ExceptionHandler::class,
+ Handler::class
+ );
+
+ // $this->app->register(ModuleServiceProvider::class);
+ }
+
+ public function register()
+ {
+ $this->app->register(EventServiceProvider::class);
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/AdminAuthCheck/src/Providers/EventServiceProvider.php b/packages/Webkul/AdminAuthCheck/src/Providers/EventServiceProvider.php
new file mode 100644
index 000000000..001909f5e
--- /dev/null
+++ b/packages/Webkul/AdminAuthCheck/src/Providers/EventServiceProvider.php
@@ -0,0 +1,20 @@
+ [
+ 'Webkul\AdminAuthCheck\Listeners\LoginAuthenticationAttempt'
+ ], // make use of this to stop admins logging into other sites
+ ];
+}
\ No newline at end of file
diff --git a/packages/Webkul/AdminAuthCheck/src/Providers/ModuleServiceProvider.php b/packages/Webkul/AdminAuthCheck/src/Providers/ModuleServiceProvider.php
new file mode 100644
index 000000000..3372c26ef
--- /dev/null
+++ b/packages/Webkul/AdminAuthCheck/src/Providers/ModuleServiceProvider.php
@@ -0,0 +1,11 @@
+ 'Set Category Visibility',
+];
\ No newline at end of file
diff --git a/packages/Webkul/AdminAuthCheck/src/Routes/web.php b/packages/Webkul/AdminAuthCheck/src/Routes/web.php
new file mode 100644
index 000000000..a4abe2daf
--- /dev/null
+++ b/packages/Webkul/AdminAuthCheck/src/Routes/web.php
@@ -0,0 +1,2 @@
+ 'account.bulk-add-to-cart',
+ 'name' => 'bulkaddtocart::app.products.bulk-add-to-cart',
+ 'route' =>'cart.bulk-add-to-cart.create',
+ 'sort' => 7
+ ]
+];
+
+?>
\ No newline at end of file
diff --git a/packages/Webkul/BulkAddToCart/src/Http/Controllers/BulkAddToCartController.php b/packages/Webkul/BulkAddToCart/src/Http/Controllers/BulkAddToCartController.php
new file mode 100644
index 000000000..120831c06
--- /dev/null
+++ b/packages/Webkul/BulkAddToCart/src/Http/Controllers/BulkAddToCartController.php
@@ -0,0 +1,170 @@
+
+ * @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
+ */
+class BulkAddToCartController extends Controller
+{
+ /**
+ * Contains route related configuration
+ *
+ * @var array
+ */
+ protected $_config;
+
+ /**
+ * ProductRepository object
+ *
+ * @var array
+ */
+ protected $product;
+
+ /**
+ * Create a new controller instance.
+ *
+ * @param \Webkul\Product\Repositories\ProductRepository $product
+ * @return void
+ */
+ public function __construct(Product $product)
+ {
+ $this->product = $product;
+
+ $this->_config = request('_config');
+ }
+
+ /**
+ * Show the form for creating a new resource.
+ *
+ * @return \Illuminate\Http\Response
+ */
+ public function create()
+ {
+ return view($this->_config['view']);
+ }
+
+ /**
+ * Store a newly created resource in storage.
+ *
+ * @return \Illuminate\Http\Response
+ */
+ public function store()
+ {
+ $valid_extension = ['xlsx', 'csv', 'xls', 'ods'];
+
+ if (! in_array(request()->file('file')->getClientOriginalExtension(), $valid_extension)) {
+ session()->flash('error', trans('bulkaddtocart::app.products.upload-error'));
+
+ return redirect()->back();
+ } else {
+ try {
+ $excelData = (new DataGridImport)->toArray(request()->file('file'));
+ $cart = [];
+
+ foreach ($excelData as $data) {
+ foreach ($data as $column => $uploadData) {
+ $validator = Validator::make($uploadData, [
+ 'sku' => 'required',
+ 'quantity' => 'required|numeric|min:1',
+ ]);
+
+ $product = $this->product->findOneWhere([
+ 'sku' => $uploadData['sku'],
+ ]);
+
+ if ($product) {
+ $canAdd = $product->haveSufficientQuantity($uploadData['quantity']);
+
+ if (! $canAdd) {
+ $sufficientQuantity[] = $column + 1;
+ } else if($product->type == 'simple' && $uploadData['quantity'] > 0) {
+ $cart['product'] = (string)$product->id;
+ $cart['quantity'] = (string)$uploadData['quantity'];
+ $cart['is_configurable'] = 'false';
+
+ Event::fire('checkout.cart.add.before', $cart['product']);
+
+ $result = Cart::add($cart['product'], $cart);
+
+ Event::fire('checkout.cart.add.after', $result);
+
+ Cart::collectTotals();
+ }
+ } else {
+ $skuError[] = $column + 1;
+ }
+
+ if ($validator->fails()) {
+ $failedRules[$column+1] = $validator->errors();
+ }
+ }
+ }
+
+ if (isset($failedRules)) {
+ foreach ($failedRules as $coulmn => $fail) {
+ if ($fail->first('sku')) {
+ $errorMsg[$coulmn] = $fail->first('sku');
+ } else if ($fail->first('quantity')) {
+ $errorMsg[$coulmn] = $fail->first('quantity');
+ }
+ }
+
+ foreach ($errorMsg as $key => $msg) {
+ $msg = str_replace(".", "", $msg);
+ $message[] = $msg. ' at Row ' .$key . '.';
+ }
+
+ $finalMsg[] = implode(" ", $message);
+ }
+ if (isset($skuError)) {
+ $errorRows = implode(",", $skuError);
+ $finalMsg[] = trans('bulkaddtocart::app.products.sku-error') . ' ' . $errorRows . '.';
+ }
+ if (isset($sufficientQuantity)) {
+ $errorRows = implode(",", $sufficientQuantity);
+ $finalMsg[] = trans('bulkaddtocart::app.products.quantity-error') . ' ' . $errorRows . '.';
+ }
+ if (isset($finalMsg)) {
+ $finalErrorMsg = implode(" ", $finalMsg);
+
+ session()->flash('error', $finalErrorMsg);
+
+ return redirect()->back();
+ } else {
+ session()->flash('success', trans('bulkaddtocart::app.products.upload-sucess'));
+
+ return redirect()->route($this->_config['redirect']);
+ }
+ } catch (\Exception $e) {
+ $failure = new Failure(1, 'rows', [0 => trans('bulkaddtocart::app.products.enough-row-error')]);
+
+ session()->flash('error', $failure->errors()[0]);
+
+ return redirect()->back();
+ }
+ }
+ }
+
+ /**
+ * Download Sample
+ *
+ * @return \Illuminate\Http\Response
+ */
+ public function downLoadSample()
+ {
+ return Storage::download('sample/sample.xls');
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/BulkAddToCart/src/Http/Controllers/Controller.php b/packages/Webkul/BulkAddToCart/src/Http/Controllers/Controller.php
new file mode 100644
index 000000000..47f4fa3ef
--- /dev/null
+++ b/packages/Webkul/BulkAddToCart/src/Http/Controllers/Controller.php
@@ -0,0 +1,13 @@
+ ['web', 'locale', 'theme', 'currency']], function () {
+
+ Route::prefix('customer')->group(function () {
+
+ Route::group(['middleware' => ['customer']], function () {
+
+ Route::get('bulk-add-to-cart', 'Webkul\BulkAddToCart\Http\Controllers\BulkAddToCartController@create')->defaults('_config', [
+ 'view' => 'bulkaddtocart::products.bulk-add-to-cart'
+ ])->name('cart.bulk-add-to-cart.create');
+
+ Route::post('bulk-add-to-cart', 'Webkul\BulkAddToCart\Http\Controllers\BulkAddToCartController@store')->defaults('_config', [
+ 'redirect' => 'shop.checkout.cart.index'
+ ])->name('cart.bulk-add-to-cart.store');
+
+ Route::get('download-sample', 'Webkul\BulkAddToCart\Http\Controllers\BulkAddToCartController@downLoadSample')->defaults('_config', [
+ 'view' => 'bulkaddtocart::products.bulk-add-to-cart'
+ ])->name('cart.bulk-add-to-cart.sample.download');
+ });
+ });
+});
\ No newline at end of file
diff --git a/packages/Webkul/BulkAddToCart/src/Providers/BulkAddToCartServiceProvider.php b/packages/Webkul/BulkAddToCart/src/Providers/BulkAddToCartServiceProvider.php
new file mode 100644
index 000000000..f9f096835
--- /dev/null
+++ b/packages/Webkul/BulkAddToCart/src/Providers/BulkAddToCartServiceProvider.php
@@ -0,0 +1,45 @@
+loadRoutesFrom(__DIR__ . '/../Http/routes.php');
+
+ $this->loadTranslationsFrom(__DIR__ . '/../Resources/lang', 'bulkaddtocart');
+
+ $this->loadViewsFrom(__DIR__ . '/../Resources/views', 'bulkaddtocart');
+ }
+
+ /**
+ * Register services.
+ *
+ * @return void
+ */
+ public function register()
+ {
+ $this->registerConfig();
+ }
+
+ /**
+ * Register package config.
+ *
+ * @return void
+ */
+ protected function registerConfig()
+ {
+ $this->mergeConfigFrom(
+ dirname(__DIR__) . '/Config/menu.php', 'menu.customer'
+ );
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/BulkAddToCart/src/Resources/lang/en/app.php b/packages/Webkul/BulkAddToCart/src/Resources/lang/en/app.php
new file mode 100644
index 000000000..f50ca79c5
--- /dev/null
+++ b/packages/Webkul/BulkAddToCart/src/Resources/lang/en/app.php
@@ -0,0 +1,17 @@
+ [
+ 'bulk-add-to-cart' => 'Bulk Add to Cart',
+ 'file' => 'File',
+ 'submit' => 'Submit',
+ 'upload-sucess' => 'Products Sucessfully added to Cart',
+ 'quantity-error' => 'Products have not sufficient quantity at row',
+ 'upload-error' => 'The file must be a file of type: xls, xlsx, csv, ods.',
+ 'enough-row-error' => 'file has not enough rows',
+ 'sku-error' => 'Invalid SKU at row',
+ 'allowed-type' => 'Allowed Type :',
+ 'file-type' => 'csv, xls, xlsx, ods.',
+ 'download-sample' => 'Download Sample'
+ ],
+];
\ No newline at end of file
diff --git a/packages/Webkul/BulkAddToCart/src/Resources/views/products/bulk-add-to-cart.blade.php b/packages/Webkul/BulkAddToCart/src/Resources/views/products/bulk-add-to-cart.blade.php
new file mode 100644
index 000000000..d024f5a67
--- /dev/null
+++ b/packages/Webkul/BulkAddToCart/src/Resources/views/products/bulk-add-to-cart.blade.php
@@ -0,0 +1,50 @@
+@extends('shop::layouts.master')
+
+@section('page_title')
+ {{ __('bulkaddtocart::app.products.bulk-add-to-cart') }}
+@endsection
+
+@section('content-wrapper')
+
+
+ @include('shop::customers.account.partials.sidemenu')
+
+
+
+
+
{{ __('bulkaddtocart::app.products.bulk-add-to-cart') }}
+
+
+
+
+
+
+
+
+
{{ __('bulkaddtocart::app.products.download-sample') }}
+
+
+
+
+
+
+
+
+
+
+@endsection
\ No newline at end of file
diff --git a/packages/Webkul/CustomerCreditMax/src/Config/system.php b/packages/Webkul/CustomerCreditMax/src/Config/system.php
new file mode 100644
index 000000000..2a74ae81b
--- /dev/null
+++ b/packages/Webkul/CustomerCreditMax/src/Config/system.php
@@ -0,0 +1,23 @@
+ 'customer.settings.credit_max',
+ 'name' => 'customercreditmax::app.admin.system.credit-max',
+ 'sort' => 4,
+ 'fields' => [
+ [
+ 'name' => 'status',
+ 'title' => 'customercreditmax::app.admin.system.use-credit-max',
+ 'type' => 'boolean',
+ 'channel_based' => true
+ ], [
+ 'name' => 'amount',
+ 'title' => 'customercreditmax::app.admin.system.max-credit-amount',
+ 'type' => 'text',
+ 'validation' => 'decimal',
+ 'channel_based' => true
+ ]
+ ],
+ ]
+];
\ No newline at end of file
diff --git a/packages/Webkul/CustomerCreditMax/src/Listeners/Cart.php b/packages/Webkul/CustomerCreditMax/src/Listeners/Cart.php
new file mode 100644
index 000000000..25a6d7f55
--- /dev/null
+++ b/packages/Webkul/CustomerCreditMax/src/Listeners/Cart.php
@@ -0,0 +1,68 @@
+
+ * @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
+ */
+class Cart
+{
+ /**
+ * OrderRepository object
+ *
+ * @var Product
+ */
+ protected $orderRepository;
+
+ /**
+ * Create a new cart event listener instance.
+ *
+ * @param Webkul\Sales\Repositories\OrderRepository $orderRepository
+ * @return void
+ */
+ public function __construct(OrderRepository $orderRepository)
+ {
+ $this->orderRepository = $orderRepository;
+ }
+
+ /**
+ * Return current logged in customer
+ *
+ * @return Customer | Boolean
+ */
+ public function getCurrentCustomerGuard()
+ {
+ $guard = request()->has('token') ? 'api' : 'customer';
+
+ return auth()->guard($guard);
+ }
+
+ /**
+ * Checks if customer credit amount exceeded or not
+ *
+ * @param mixed $cartItem
+ */
+ public function cartItemAddBefore($productId)
+ {
+ if (! core()->getConfigData('customer.settings.credit_max.status') || ! $this->getCurrentCustomerGuard()->check())
+ return;
+
+ $baseGrandTotal = $this->orderRepository->scopeQuery(function ($query) {
+ return $query->where('orders.customer_id', $this->getCurrentCustomerGuard()->user()->id);
+ })->sum('base_grand_total');
+
+ $baseGrandTotalInvoiced = $this->orderRepository->scopeQuery(function ($query) {
+ return $query->where('orders.customer_id', $this->getCurrentCustomerGuard()->user()->id);
+ })->sum('base_grand_total_invoiced');
+
+ if ( ($baseGrandTotal - $baseGrandTotalInvoiced) >= core()->getConfigData('customer.settings.credit_max.amount'))
+ throw new \Exception('You available credit limit has been exceeded. Please you pay your pending invoice.');
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/CustomerCreditMax/src/Providers/CustomerCreditMax.php b/packages/Webkul/CustomerCreditMax/src/Providers/CustomerCreditMax.php
new file mode 100755
index 000000000..0649134c0
--- /dev/null
+++ b/packages/Webkul/CustomerCreditMax/src/Providers/CustomerCreditMax.php
@@ -0,0 +1,33 @@
+loadTranslationsFrom(__DIR__ . '/../Resources/lang', 'customercreditmax');
+
+ $this->app->register(EventServiceProvider::class);
+ }
+
+ /**
+ * Register services.
+ *
+ * @return void
+ */
+ public function register()
+ {
+ $this->mergeConfigFrom(
+ dirname(__DIR__) . '/Config/system.php', 'core'
+ );
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/CustomerCreditMax/src/Providers/EventServiceProvider.php b/packages/Webkul/CustomerCreditMax/src/Providers/EventServiceProvider.php
new file mode 100644
index 000000000..01ea52aea
--- /dev/null
+++ b/packages/Webkul/CustomerCreditMax/src/Providers/EventServiceProvider.php
@@ -0,0 +1,19 @@
+ [
+ 'system' => [
+ 'credit-max' => 'Credit Max',
+ 'use-credit-max' => 'Use Credit Max',
+ 'max-credit-amount' => 'Max Credit Amount'
+ ]
+ ]
+];
\ No newline at end of file
diff --git a/packages/Webkul/CustomerDocument/composer.json b/packages/Webkul/CustomerDocument/composer.json
new file mode 100644
index 000000000..383539bb4
--- /dev/null
+++ b/packages/Webkul/CustomerDocument/composer.json
@@ -0,0 +1,24 @@
+{
+ "name": "bagisto/customer-document",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Rahul Shukla",
+ "email": "rahulshukla517@webkul.com"
+ }
+ ],
+ "autoload": {
+ "psr-4": {
+ "Webkul\\CustomerDocument\\": "src/"
+ }
+ },
+ "extra": {
+ "laravel": {
+ "providers": [
+ "Webkul\\CustomerDocument\\CustomerDocumentServiceProvider"
+ ],
+ "aliases": {}
+ }
+ },
+ "minimum-stability": "dev"
+}
\ No newline at end of file
diff --git a/packages/Webkul/CustomerDocument/src/Config/menu.php b/packages/Webkul/CustomerDocument/src/Config/menu.php
new file mode 100644
index 000000000..b469239ea
--- /dev/null
+++ b/packages/Webkul/CustomerDocument/src/Config/menu.php
@@ -0,0 +1,12 @@
+ 'account.documents',
+ 'name' => 'customerdocument::app.admin.customers.documents',
+ 'route' =>'customer.documents.index',
+ 'sort' => 6
+ ]
+];
+
+?>
\ No newline at end of file
diff --git a/packages/Webkul/CustomerDocument/src/Contracts/CustomerDocument.php b/packages/Webkul/CustomerDocument/src/Contracts/CustomerDocument.php
new file mode 100644
index 000000000..44ca2e742
--- /dev/null
+++ b/packages/Webkul/CustomerDocument/src/Contracts/CustomerDocument.php
@@ -0,0 +1,7 @@
+increments('id');
+ $table->string('name');
+ $table->text('description')->nullable();
+ $table->string('path');
+ $table->integer('customer_id')->unsigned();
+ $table->foreign('customer_id')->references('id')->on('customers')->onDelete('cascade');
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('customer_documents');
+ }
+}
diff --git a/packages/Webkul/CustomerDocument/src/Http/Controllers/Controller.php b/packages/Webkul/CustomerDocument/src/Http/Controllers/Controller.php
new file mode 100644
index 000000000..ec04aa1e9
--- /dev/null
+++ b/packages/Webkul/CustomerDocument/src/Http/Controllers/Controller.php
@@ -0,0 +1,13 @@
+
+ * @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
+ */
+class DocumentController extends Controller
+{
+ /**
+ * Contains route related configuration
+ *
+ * @var array
+ */
+ protected $_config;
+
+ /**
+ * CustomerDocumentRepository object
+ *
+ * @var array
+ */
+ protected $customerDocument;
+
+ /**
+ * Create a new controller instance.
+ *
+ * @param \Webkul\Customer\Repositories\CustomerDocumentRepository $customerDocument
+ */
+ public function __construct(CustomerDocumentRepository $customerDocument)
+ {
+ $this->_config = request('_config');
+
+ $this->customerDocument = $customerDocument;
+ }
+
+ /**
+ * Display a listing of the resource.
+ *
+ * @return \Illuminate\Http\Response
+ */
+ public function index()
+ {
+ $documents = $this->customerDocument->findWhere(['customer_id' => auth()->guard('customer')->user()->id]);
+
+ return view($this->_config['view'], compact('documents'));
+ }
+
+ /**
+ * upload document
+ *
+ * @return \Illuminate\Http\Response
+ */
+ public function upload()
+ {
+ $valid_extension = ['xlsx', 'csv', 'xls', 'ods', 'png', 'jpeg', 'zip'];
+
+ if (! in_array(request()->file('file')->getClientOriginalExtension(), $valid_extension)) {
+ session()->flash('error', trans('customerdocument::app.admin.customers.upload-error'));
+
+ return redirect()->back();
+ } else {
+ try {
+ $data = request()->all();
+
+ if (request()->hasFile('file')) {
+ $dir = 'customer';
+ $document['path'] = request()->file('file')->store($dir);
+ }
+
+ $document['customer_id'] = $data['customer_id'];
+ $document['name'] = $data['name'];
+ $document['description'] = $data['description'];
+
+ $this->customerDocument->create($document);
+
+ session()->flash('success', trans('customerdocument::app.admin.customers.upload-success'));
+
+ return redirect()->back();
+ } catch (\Exception $e) {
+ session()->flash('error', $e);
+
+ return redirect()->back();
+ }
+ }
+ }
+
+ /**
+ * download the file for the specified resource.
+ *
+ * @param int $id
+ * @return \Illuminate\Http\Response
+ */
+ public function download($id)
+ {
+ $document = $this->customerDocument->findOrfail($id);
+
+ return Storage::download($document['path'], $document['name']);
+ }
+
+ /**
+ * Remove the specified resource from storage..
+ *
+ * @param int $id
+ * @return \Illuminate\Http\Response
+ */
+ public function delete($id)
+ {
+ $document = $this->customerDocument->findOrfail($id);
+
+ $this->customerDocument->delete($id);
+
+ Storage::delete($document['path']);
+
+ session()->flash('success', trans('customerdocument::app.admin.customers.delete-success'));
+
+ return redirect()->back();
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/CustomerDocument/src/Http/admin-routes.php b/packages/Webkul/CustomerDocument/src/Http/admin-routes.php
new file mode 100644
index 000000000..303622754
--- /dev/null
+++ b/packages/Webkul/CustomerDocument/src/Http/admin-routes.php
@@ -0,0 +1,26 @@
+ ['web']], function () {
+
+ Route::prefix('admin')->group(function () {
+
+ Route::group(['middleware' => ['admin']], function () {
+
+ //document Management Routes
+ Route::post('upload-document', 'Webkul\CustomerDocument\Http\Controllers\DocumentController@upload')->defaults('_config', [
+ 'redirect' => 'admin.customer.index'
+ ])->name('admin.customer.document.upload');
+
+ Route::get('download-document/{id}', 'Webkul\CustomerDocument\Http\Controllers\DocumentController@download')->defaults('_config', [
+ 'redirect' => 'admin.customer.index'
+ ])->name('admin.customer.document.download');
+
+ Route::get('delete-document/{id}', 'Webkul\CustomerDocument\Http\Controllers\DocumentController@delete')->defaults('_config', [
+ 'redirect' => 'admin.customer.index'
+ ])->name('admin.customer.document.delete');
+
+ });
+
+ });
+
+});
diff --git a/packages/Webkul/CustomerDocument/src/Http/front-routes.php b/packages/Webkul/CustomerDocument/src/Http/front-routes.php
new file mode 100644
index 000000000..51aa04022
--- /dev/null
+++ b/packages/Webkul/CustomerDocument/src/Http/front-routes.php
@@ -0,0 +1,21 @@
+ ['web', 'locale', 'theme', 'currency']], function () {
+
+ Route::prefix('customer')->group(function () {
+
+ Route::group(['middleware' => ['customer']], function () {
+
+ Route::prefix('account')->group(function () {
+
+ Route::get('documents', 'Webkul\CustomerDocument\Http\Controllers\DocumentController@index')->defaults('_config', [
+ 'view' => 'customerdocument::shop.customers.document'
+ ])->name('customer.documents.index');
+
+ Route::get('download-document/{id}', 'Webkul\CustomerDocument\Http\Controllers\DocumentController@download')->defaults('_config', [
+ 'redirect' => 'admin.customer.index'
+ ])->name('customer.document.download');
+ });
+ });
+ });
+});
\ No newline at end of file
diff --git a/packages/Webkul/CustomerDocument/src/Models/CustomerDocument.php b/packages/Webkul/CustomerDocument/src/Models/CustomerDocument.php
new file mode 100644
index 000000000..d95a1c4c8
--- /dev/null
+++ b/packages/Webkul/CustomerDocument/src/Models/CustomerDocument.php
@@ -0,0 +1,13 @@
+loadRoutesFrom(__DIR__ . '/../Http/admin-routes.php');
+
+ $this->loadRoutesFrom(__DIR__ . '/../Http/front-routes.php');
+
+ $this->loadTranslationsFrom(__DIR__ . '/../Resources/lang', 'customerdocument');
+
+ $this->loadViewsFrom(__DIR__ . '/../Resources/views', 'customerdocument');
+
+ $this->loadMigrationsFrom(__DIR__ . '/../Database/migrations');
+
+ $this->app->register(ModuleServiceProvider::class);
+
+ $this->app->register(EventServiceProvider::class);
+ }
+
+ /**
+ * Register services.
+ *
+ * @return void
+ */
+ public function register()
+ {
+ $this->registerConfig();
+ }
+
+ /**
+ * Register package config.
+ *
+ * @return void
+ */
+ protected function registerConfig()
+ {
+ $this->mergeConfigFrom(
+ dirname(__DIR__) . '/Config/menu.php', 'menu.customer'
+ );
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/CustomerDocument/src/Providers/EventServiceProvider.php b/packages/Webkul/CustomerDocument/src/Providers/EventServiceProvider.php
new file mode 100644
index 000000000..0feff68cc
--- /dev/null
+++ b/packages/Webkul/CustomerDocument/src/Providers/EventServiceProvider.php
@@ -0,0 +1,21 @@
+addTemplate('customerdocument::admin.customers.upload');
+ });
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/CustomerDocument/src/Providers/ModuleServiceProvider.php b/packages/Webkul/CustomerDocument/src/Providers/ModuleServiceProvider.php
new file mode 100644
index 000000000..49aaf5ace
--- /dev/null
+++ b/packages/Webkul/CustomerDocument/src/Providers/ModuleServiceProvider.php
@@ -0,0 +1,12 @@
+
+ * @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
+ */
+class CustomerDocumentRepository extends Repository
+{
+ /**
+ * Specify Model class name
+ *
+ * @return mixed
+ */
+
+ function model()
+ {
+ return 'Webkul\CustomerDocument\Contracts\CustomerDocument';
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/CustomerDocument/src/Resources/lang/en/app.php b/packages/Webkul/CustomerDocument/src/Resources/lang/en/app.php
new file mode 100644
index 000000000..62b076968
--- /dev/null
+++ b/packages/Webkul/CustomerDocument/src/Resources/lang/en/app.php
@@ -0,0 +1,21 @@
+[
+ 'customers' => [
+ 'documents' => 'Documents',
+ 'add-document' => 'Add Document',
+ 'submit' => 'Submit',
+ 'file' => 'File',
+ 'name' => 'Name',
+ 'download' => 'Download',
+ 'upload-success' => 'Document uploaded successfully.',
+ 'delete-success' => 'Document deleted successfully.',
+ 'empty' => 'You Do not Have Any Documents.',
+ 'allowed-type' => 'Allowed Type :',
+ 'file-type' => 'csv, xls, xlsx, ods, png, jpeg, zip.',
+ 'upload-error' => 'The file must be a file of type: csv, xls, xlsx, ods, png, jpeg, zip.',
+ 'description' => 'Description'
+ ],
+ ],
+];
\ No newline at end of file
diff --git a/packages/Webkul/CustomerDocument/src/Resources/views/admin/customers/upload.blade.php b/packages/Webkul/CustomerDocument/src/Resources/views/admin/customers/upload.blade.php
new file mode 100644
index 000000000..001f05989
--- /dev/null
+++ b/packages/Webkul/CustomerDocument/src/Resources/views/admin/customers/upload.blade.php
@@ -0,0 +1,87 @@
+findWhere(['customer_id' => $customer->id]);
+
+?>
+
+
+
+
+
+ {{ __('customerdocument::app.admin.customers.add-document') }}
+
+
+
+
+
+
+ {{ __('customerdocument::app.admin.customers.name') }}
+ {{ __('customerdocument::app.admin.customers.description') }}
+ {{ __('customerdocument::app.admin.customers.download') }}
+
+
+
+
+
+ @foreach ($documents as $document)
+
+ {{ $document->name }}
+ {{ $document->description }}
+
+
+
+
+
+
+
+
+
+
+
+ @endforeach
+
+
+
+
+
+
+
+
+ {{ __('customerdocument::app.admin.customers.add-document') }}
+
+
+
\ No newline at end of file
diff --git a/packages/Webkul/CustomerDocument/src/Resources/views/shop/customers/document.blade.php b/packages/Webkul/CustomerDocument/src/Resources/views/shop/customers/document.blade.php
new file mode 100644
index 000000000..abbf73d19
--- /dev/null
+++ b/packages/Webkul/CustomerDocument/src/Resources/views/shop/customers/document.blade.php
@@ -0,0 +1,57 @@
+@extends('shop::layouts.master')
+
+@section('page_title')
+ {{ __('customerdocument::app.admin.customers.documents') }}
+@endsection
+
+@section('content-wrapper')
+
+
+ @include('shop::customers.account.partials.sidemenu')
+
+
+
+
+
{{ __('customerdocument::app.admin.customers.documents') }}
+
+
+
+
+
+ @if ($documents->count())
+
+
+
+
+ {{ __('customerdocument::app.admin.customers.name') }}
+ {{ __('customerdocument::app.admin.customers.description') }}
+ {{ __('customerdocument::app.admin.customers.download') }}
+
+
+
+
+
+ @foreach ($documents as $document)
+
+ {{ $document->name }}
+ {{ $document->description }}
+
+
+
+
+
+
+ @endforeach
+
+
+
+ @else
+
+ {{ __('customerdocument::app.admin.customers.empty') }}
+
+ @endif
+
+
+
+
+@endsection
\ No newline at end of file
diff --git a/packages/Webkul/CustomerGroupCatalog/src/Database/Migrations/2019_06_14_171024_create_customer_group_products_table.php b/packages/Webkul/CustomerGroupCatalog/src/Database/Migrations/2019_06_14_171024_create_customer_group_products_table.php
new file mode 100644
index 000000000..461b1eeeb
--- /dev/null
+++ b/packages/Webkul/CustomerGroupCatalog/src/Database/Migrations/2019_06_14_171024_create_customer_group_products_table.php
@@ -0,0 +1,34 @@
+integer('customer_group_id')->unsigned();
+ $table->integer('product_id')->unsigned();
+
+ $table->foreign('customer_group_id')->references('id')->on('customer_groups')->onDelete('cascade');
+ $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('customer_group_products');
+ }
+}
diff --git a/packages/Webkul/CustomerGroupCatalog/src/Database/Migrations/2019_06_14_171240_create_customer_group_categories_table.php b/packages/Webkul/CustomerGroupCatalog/src/Database/Migrations/2019_06_14_171240_create_customer_group_categories_table.php
new file mode 100644
index 000000000..6886b95ad
--- /dev/null
+++ b/packages/Webkul/CustomerGroupCatalog/src/Database/Migrations/2019_06_14_171240_create_customer_group_categories_table.php
@@ -0,0 +1,34 @@
+integer('customer_group_id')->unsigned();
+ $table->integer('category_id')->unsigned();
+
+ $table->foreign('customer_group_id')->references('id')->on('customer_groups')->onDelete('cascade');
+ $table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('customer_group_categories');
+ }
+}
diff --git a/packages/Webkul/CustomerGroupCatalog/src/Http/Controllers/Admin/CustomerGroupController.php b/packages/Webkul/CustomerGroupCatalog/src/Http/Controllers/Admin/CustomerGroupController.php
new file mode 100644
index 000000000..d9d813eec
--- /dev/null
+++ b/packages/Webkul/CustomerGroupCatalog/src/Http/Controllers/Admin/CustomerGroupController.php
@@ -0,0 +1,139 @@
+
+ * @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
+ */
+class CustomerGroupController extends Controller
+{
+ /**
+ * Contains route related configuration
+ *
+ * @var array
+ */
+ protected $_config;
+
+ /**
+ * CustomerGroupRepository object
+ *
+ * @var object
+ */
+ protected $customerGroupRepository;
+
+ /**
+ * ProductRepository object
+ *
+ * @var object
+ */
+ protected $productRepository;
+
+ /**
+ * CategoryRepository object
+ *
+ * @var object
+ */
+ protected $categoryRepository;
+
+ /**
+ * Create a new controller instance.
+ *
+ * @param \Webkul\Customer\Repositories\CustomerGroupRepository $customerGroupRepositor;
+ * @param \Webkul\Product\Repositories\ProductRepository $productRepository;
+ * @param \Webkul\Category\Repositories\CategoryRepository $categoryRepository;
+ * @return void
+ */
+ public function __construct(
+ CustomerGroupRepository $customerGroupRepository,
+ ProductRepository $productRepository,
+ CategoryRepository $categoryRepository
+ )
+ {
+ $this->_config = request('_config');
+
+ $this->customerGroupRepository = $customerGroupRepository;
+
+ $this->productRepository = $productRepository;
+
+ $this->categoryRepository = $categoryRepository;
+ }
+
+ /**
+ * Search for catalog
+ *
+ * @return \Illuminate\Http\Response
+ */
+ public function search()
+ {
+ $results = [];
+
+ if (request()->input('type') == 'products') {
+ foreach ($this->productRepository->searchProductByAttribute(request()->input('query')) as $row) {
+ $results[] = [
+ 'id' => $row->product_id,
+ 'name' => $row->name,
+ ];
+ }
+ } else {
+ foreach ($this->categoryRepository->search(request()->input('query')) as $row) {
+ $results[] = [
+ 'id' => $row->id,
+ 'name' => $row->name,
+ ];
+ }
+ }
+
+ return response()->json($results);
+ }
+
+ /**
+ * Store a newly created resource in storage.
+ *
+ * @return \Illuminate\Http\Response
+ */
+ public function store()
+ {
+ $this->validate(request(), [
+ 'name' => 'string|required',
+ ]);
+
+ $data = request()->all();
+
+ $data['is_user_defined'] = 1;
+
+ $this->customerGroupRepository->create($data);
+
+ session()->flash('success', trans('admin::app.response.create-success', ['name' => 'Customer Group']));
+
+ return redirect()->route($this->_config['redirect']);
+ }
+
+ /**
+ * Update the specified resource in storage.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @param int $id
+ * @return \Illuminate\Http\Response
+ */
+ public function update(Request $request, $id)
+ {
+ $this->validate(request(), [
+ 'name' => 'string|required',
+ ]);
+
+ $this->customerGroupRepository->update(request()->all(), $id);
+
+ session()->flash('success', trans('admin::app.response.update-success', ['name' => 'Customer Group']));
+
+ return redirect()->route($this->_config['redirect']);
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/CustomerGroupCatalog/src/Http/admin-routes.php b/packages/Webkul/CustomerGroupCatalog/src/Http/admin-routes.php
new file mode 100644
index 000000000..2e57739b0
--- /dev/null
+++ b/packages/Webkul/CustomerGroupCatalog/src/Http/admin-routes.php
@@ -0,0 +1,23 @@
+ ['web']], function () {
+
+ Route::prefix('admin')->group(function () {
+
+ Route::group(['middleware' => ['admin']], function () {
+
+ //Seller routes
+ Route::get('groups/catalog/search', 'Webkul\CustomerGroupCatalog\Http\Controllers\Admin\CustomerGroupController@search')->name('admin.customer_group_catalog.search.catalog');
+
+ Route::post('groups/create', 'Webkul\CustomerGroupCatalog\Http\Controllers\Admin\CustomerGroupController@store')->defaults('_config',[
+ 'redirect' => 'admin.groups.index'
+ ])->name('admin.customer_group_catalog.store');
+
+ Route::put('groups/edit/{id}', 'Webkul\CustomerGroupCatalog\Http\Controllers\Admin\CustomerGroupController@update')->defaults('_config',[
+ 'redirect' => 'admin.groups.index'
+ ])->name('admin.customer_group_catalog.update');
+ });
+
+ });
+
+});
\ No newline at end of file
diff --git a/packages/Webkul/CustomerGroupCatalog/src/Models/CustomerGroup.php b/packages/Webkul/CustomerGroupCatalog/src/Models/CustomerGroup.php
new file mode 100644
index 000000000..08e59b146
--- /dev/null
+++ b/packages/Webkul/CustomerGroupCatalog/src/Models/CustomerGroup.php
@@ -0,0 +1,26 @@
+belongsToMany(ProductProxy::modelClass(), 'customer_group_products');
+ }
+
+ /**
+ * The categories that belong to the customer group.
+ */
+ public function categories()
+ {
+ return $this->belongsToMany(CategoryProxy::modelClass(), 'customer_group_categories');
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/CustomerGroupCatalog/src/Providers/CustomerGroupCatalogServiceProvider.php b/packages/Webkul/CustomerGroupCatalog/src/Providers/CustomerGroupCatalogServiceProvider.php
new file mode 100755
index 000000000..e6841097a
--- /dev/null
+++ b/packages/Webkul/CustomerGroupCatalog/src/Providers/CustomerGroupCatalogServiceProvider.php
@@ -0,0 +1,37 @@
+loadRoutesFrom(__DIR__ . '/../Http/admin-routes.php');
+
+ $this->loadMigrationsFrom(__DIR__ . '/../Database/Migrations');
+
+ $this->loadTranslationsFrom(__DIR__ . '/../Resources/lang', 'customergroupcatalog');
+
+ $this->publishes([
+ __DIR__ . '/../Resources/views/admin/customers/groups' => resource_path('views/vendor/admin/customers/groups'),
+ __DIR__ . '/../Resources/views/shop/products' => resource_path('views/vendor/shop/products'),
+ __DIR__ . '/../Resources/views/shop/layouts' => resource_path('views/vendor/shop/layouts'),
+ ]);
+ }
+
+ /**
+ * Register services.
+ *
+ * @return void
+ */
+ public function register()
+ {
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/CustomerGroupCatalog/src/Repositories/CategoryRepository.php b/packages/Webkul/CustomerGroupCatalog/src/Repositories/CategoryRepository.php
new file mode 100644
index 000000000..b96166c7b
--- /dev/null
+++ b/packages/Webkul/CustomerGroupCatalog/src/Repositories/CategoryRepository.php
@@ -0,0 +1,70 @@
+
+ * @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
+ */
+class CategoryRepository extends BaseCategoryRepository
+{
+ /**
+ * Search Category
+ *
+ * @return Collection
+ */
+ public function search($term)
+ {
+ return $this->getModel()->join('category_translations', function ($join) {
+ $join->on('categories.id', 'category_translations.category_id')
+ ->where('category_translations.locale', app()->getLocale())
+ ->where('category_translations.name', 'like', '%' . urldecode(request()->input('query')) . '%');
+ })
+ ->select('categories.*')
+ ->groupBy('categories.id')
+ ->get();
+ }
+
+ /**
+ * get visible category tree
+ *
+ * @param integer $id
+ * @return mixed
+ */
+ public function getVisibleCategoryTree($id = null)
+ {
+ static $categories = [];
+
+ if(array_key_exists($id, $categories))
+ return $categories[$id];
+
+ $customer = auth()->guard(request()->has('token') ? 'api' : 'customer')->user();
+
+ $categoryIds = [];
+
+ if (! $customer) {
+ $categoryIds = app('Webkul\CustomerGroupCatalog\Repositories\CustomerGroupRepository')->findOneByField('code', 'guest')->categories()->pluck('id');
+ } else {
+ if ($customer->group) {
+ $categoryIds = app('Webkul\CustomerGroupCatalog\Repositories\CustomerGroupRepository')->find($customer->group->id)->categories()->pluck('id');
+ }
+ }
+
+ if (count($categoryIds)) {
+ $categories[$id] = $id
+ ? $this->model::orderBy('position', 'ASC')->where('status', 1)->whereIn('id', $categoryIds)->descendantsOf($id)->toTree()
+ : $this->model::orderBy('position', 'ASC')->where('status', 1)->whereIn('id', $categoryIds)->get()->toTree();
+ } else {
+ $categories[$id] = $id
+ ? $this->model::orderBy('position', 'ASC')->where('status', 1)->descendantsOf($id)->toTree()
+ : $this->model::orderBy('position', 'ASC')->where('status', 1)->get()->toTree();
+ }
+
+ return $categories[$id];
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/CustomerGroupCatalog/src/Repositories/CustomerGroupRepository.php b/packages/Webkul/CustomerGroupCatalog/src/Repositories/CustomerGroupRepository.php
new file mode 100755
index 000000000..8772764e3
--- /dev/null
+++ b/packages/Webkul/CustomerGroupCatalog/src/Repositories/CustomerGroupRepository.php
@@ -0,0 +1,102 @@
+
+ * @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
+ */
+class CustomerGroupRepository extends Repository
+{
+ /**
+ * Specify Model class name
+ *
+ * @return mixed
+ */
+ function model()
+ {
+ return 'Webkul\CustomerGroupCatalog\Models\CustomerGroup';
+ }
+
+ /**
+ * @param array $data
+ * @return mixed
+ */
+ public function create(array $data)
+ {
+ $group = parent::create($data);
+
+ if (isset($data['products'])) {
+ $group->products()->sync($data['products']);
+ } else {
+ $group->products()->sync([]);
+ }
+
+ if (isset($data['categories'])) {
+ $group->categories()->sync($data['categories']);
+ } else {
+ $group->categories()->sync([]);
+ }
+
+ return $group;
+ }
+
+ /**
+ * @param array $data
+ * @param $id
+ * @param string $attribute
+ * @return mixed
+ */
+ public function update(array $data, $id, $attribute = "id")
+ {
+ parent::update($data, $id, $attribute);
+
+ $group = $this->find($id);
+
+ if (isset($data['products'])) {
+ $group->products()->sync($data['products']);
+ } else {
+ $group->products()->sync([]);
+ }
+
+ if (isset($data['categories'])) {
+ $group->categories()->sync($data['categories']);
+ } else {
+ $group->categories()->sync([]);
+ }
+
+ return ;
+ }
+
+ /**
+ * @return Collection
+ */
+ public function getProducts($group)
+ {
+ $products = [];
+
+ foreach ($this->find($group->id)->products as $product) {
+ $products[] = ['id' => $product->id, 'name' => $product->name];
+ }
+
+ return $products;
+ }
+
+ /**
+ * @return Collection
+ */
+ public function getCategories($group)
+ {
+ $categories = [];
+
+ foreach ($this->find($group->id)->categories as $category) {
+ $categories[] = ['id' => $category->id, 'name' => $category->name];
+ }
+
+ return $categories;
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/CustomerGroupCatalog/src/Resources/lang/en/app.php b/packages/Webkul/CustomerGroupCatalog/src/Resources/lang/en/app.php
new file mode 100644
index 000000000..e59dc2c4b
--- /dev/null
+++ b/packages/Webkul/CustomerGroupCatalog/src/Resources/lang/en/app.php
@@ -0,0 +1,13 @@
+ [
+ 'groups' => [
+ 'general' => 'General',
+ 'linked-product-categories' => 'Linked Products and Categories',
+ 'categories' => 'Categories',
+ 'products' => 'Products',
+ 'search-hint' => 'Start typing name'
+ ]
+ ]
+];
\ No newline at end of file
diff --git a/packages/Webkul/CustomerGroupCatalog/src/Resources/views/admin/customers/groups/create.blade.php b/packages/Webkul/CustomerGroupCatalog/src/Resources/views/admin/customers/groups/create.blade.php
new file mode 100644
index 000000000..7b6624eb0
--- /dev/null
+++ b/packages/Webkul/CustomerGroupCatalog/src/Resources/views/admin/customers/groups/create.blade.php
@@ -0,0 +1,211 @@
+@extends('admin::layouts.content')
+
+@section('page_title')
+ {{ __('admin::app.customers.groups.add-title') }}
+@stop
+
+@section('content')
+
+@stop
+
+@push('scripts')
+
+
+
+
+@endpush
\ No newline at end of file
diff --git a/packages/Webkul/CustomerGroupCatalog/src/Resources/views/admin/customers/groups/edit.blade.php b/packages/Webkul/CustomerGroupCatalog/src/Resources/views/admin/customers/groups/edit.blade.php
new file mode 100644
index 000000000..6671b9b39
--- /dev/null
+++ b/packages/Webkul/CustomerGroupCatalog/src/Resources/views/admin/customers/groups/edit.blade.php
@@ -0,0 +1,227 @@
+@extends('admin::layouts.content')
+
+@section('page_title')
+ {{ __('admin::app.customers.groups.edit-title') }}
+@stop
+
+@section('content')
+
+@stop
+
+@push('scripts')
+
+
+
+
+@endpush
\ No newline at end of file
diff --git a/packages/Webkul/CustomerGroupCatalog/src/Resources/views/shop/layouts/footer/footer.blade.php b/packages/Webkul/CustomerGroupCatalog/src/Resources/views/shop/layouts/footer/footer.blade.php
new file mode 100755
index 000000000..2f8532d59
--- /dev/null
+++ b/packages/Webkul/CustomerGroupCatalog/src/Resources/views/shop/layouts/footer/footer.blade.php
@@ -0,0 +1,94 @@
+
diff --git a/packages/Webkul/CustomerGroupCatalog/src/Resources/views/shop/layouts/header/nav-menu/navmenu.blade.php b/packages/Webkul/CustomerGroupCatalog/src/Resources/views/shop/layouts/header/nav-menu/navmenu.blade.php
new file mode 100755
index 000000000..e65090536
--- /dev/null
+++ b/packages/Webkul/CustomerGroupCatalog/src/Resources/views/shop/layouts/header/nav-menu/navmenu.blade.php
@@ -0,0 +1,137 @@
+{!! view_render_event('bagisto.shop.layout.header.category.before') !!}
+
+getVisibleCategoryTree(core()->getCurrentChannel()->root_category_id) as $category) {
+ if ($category->slug)
+ array_push($categories, $category);
+}
+
+?>
+
+
+
+{!! view_render_event('bagisto.shop.layout.header.category.after') !!}
+
+
+@push('scripts')
+
+
+
+
+
+
+
+
+
+
+
+@endpush
\ No newline at end of file
diff --git a/packages/Webkul/CustomerGroupCatalog/src/Resources/views/shop/products/index.blade.php b/packages/Webkul/CustomerGroupCatalog/src/Resources/views/shop/products/index.blade.php
new file mode 100755
index 000000000..347e23722
--- /dev/null
+++ b/packages/Webkul/CustomerGroupCatalog/src/Resources/views/shop/products/index.blade.php
@@ -0,0 +1,128 @@
+@extends('shop::layouts.master')
+
+@section('page_title')
+ {{ $category->meta_title ?? $category->name }}
+@stop
+
+@section('seo')
+
+
+@stop
+
+@section('content-wrapper')
+ @inject ('productRepository', 'Webkul\Product\Repositories\ProductRepository')
+
+
+ {!! view_render_event('bagisto.shop.products.index.before', ['category' => $category]) !!}
+
+
+
+ @if (in_array($category->display_mode, [null, 'products_only', 'products_and_description']))
+ @include ('shop::products.list.layered-navigation')
+ @endif
+
+
display_mode == 'description_only') style="width: 100%" @endif>
+
+ @if (!is_null($category->image))
+
+ @endif
+
+
+ @if (in_array($category->display_mode, [null, 'description_only', 'products_and_description']))
+ @if ($category->description)
+
+ {!! $category->description !!}
+
+ @endif
+ @endif
+
+ @if (in_array($category->display_mode, [null, 'products_only', 'products_and_description']))
+ getAll($category->id); ?>
+
+ @if ($products->count())
+
+ @include ('shop::products.list.toolbar')
+
+ @inject ('toolbarHelper', 'Webkul\Product\Helpers\Toolbar')
+
+ @if ($toolbarHelper->getCurrentMode() == 'grid')
+
+ @foreach ($products as $productFlat)
+
+ @include ('shop::products.list.card', ['product' => $productFlat])
+
+ @endforeach
+
+ @else
+
+ @foreach ($products as $productFlat)
+
+ @include ('shop::products.list.card', ['product' => $productFlat])
+
+ @endforeach
+
+ @endif
+
+ {!! view_render_event('bagisto.shop.products.index.pagination.before', ['category' => $category]) !!}
+
+
+ {{ $products->appends(request()->input())->links() }}
+
+
+ {!! view_render_event('bagisto.shop.products.index.pagination.after', ['category' => $category]) !!}
+
+ @else
+
+
+
{{ __('shop::app.products.whoops') }}
+
+
+ {{ __('shop::app.products.empty') }}
+
+
+
+ @endif
+ @endif
+
+
+
+ {!! view_render_event('bagisto.shop.products.index.after', ['category' => $category]) !!}
+
+@stop
+
+@push('scripts')
+
+@endpush
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/.gitignore b/packages/Webkul/SAASCustomizer/.gitignore
new file mode 100755
index 000000000..30bc16279
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/.gitignore
@@ -0,0 +1 @@
+/node_modules
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/composer.json b/packages/Webkul/SAASCustomizer/composer.json
new file mode 100755
index 000000000..52beeea54
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/composer.json
@@ -0,0 +1,27 @@
+{
+ "name": "bagisto/laravel-Saas",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Prashant Singh",
+ "email": "prashant.singh852@webkul.com"
+ }
+ ],
+ "require": {
+ "konekt/concord": "^1.2"
+ },
+ "autoload": {
+ "psr-4": {
+ "Webkul\\SAASCustomizer\\": "src/"
+ }
+ },
+ "extra": {
+ "laravel": {
+ "providers": [
+ "Webkul\\SAASCustomizer\\Providers\\SAASCustomizerServiceProvider"
+ ],
+ "aliases": {}
+ }
+ },
+ "minimum-stability": "dev"
+}
diff --git a/packages/Webkul/SAASCustomizer/customization-readme.md b/packages/Webkul/SAASCustomizer/customization-readme.md
new file mode 100644
index 000000000..d79035f54
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/customization-readme.md
@@ -0,0 +1,31 @@
+# Requirements:
+
+1. SaaS-based system on Bagisto with all the core features .
+2. Seller Creation with their own store and domain
+3. Stripe Connect as payment, where the connect is under our Stripe account.
+4. Seller functionality : Own Admin dashboard, Create/Edit Products, Checked Order status and Completion, Edit/Create Customers, Add Notes on Customer
+5. Create discount rules
+6. The seller should approve customers who sign up
+7. Platform locale in English
+8. The seller should control which categories or products a specific customer can see.
+9. Upload CSV/Excel file with SKU,Quantity for bulk add to cart
+10. Customers should be logged in to see prices and buy.
+11. The seller should make custom prices for customers. So this customer gets 10% of all products.
+12. The seller can upload PDF and images documents to a page, where the customer can download them.
+13. The seller can upload documents to a customer, where the customer can see their documents on their account.
+14. It should be possible to add credit max on the customer, so if the customer has unpaid invoices of xxx dollars, they cannot buy any more, before the invoices are paid.
+15. Pre Order and Backorder products
+
+# Installation Steps:
+
+* Inside the project root '.env' have 'app_url' parameter which must be set as your main domain.
+* Then run the command 'php artisan saas:install'
+* Open the main domain you would be only be able to see the registration page.
+
+* There should only be a commission/fee on every transaction, made with Stripe. Not on products.
+
+There is the Stripe fee 2.9% + 30cent, and there is our platform fee, which we can set in Stripe(it is going to be 2%). We would like them to be shown as a total service fee in the totals on the cart. So if the customer is buying a product to 100$
+The will see subtotal of 100$, shipping: 3$, service fee 5,347 $. ((103*2,9%+2%)+0,30)-103 = 5,347$
+We would like that the Seller can choose from their backend settings, who should pay the service fee. Is it the customer, so the amount will be 108,347 $ for the customer, and the Seller will get 103$ after fees.
+
+If the Seller should pay the fees, the amount will be 103$ for the customer and the payout for the Seller will be 103-5,347$ = 97,653$
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/package.json b/packages/Webkul/SAASCustomizer/package.json
new file mode 100755
index 000000000..2d948db6a
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/package.json
@@ -0,0 +1,25 @@
+{
+ "private": true,
+ "scripts": {
+ "dev": "npm run development",
+ "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
+ "watch": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
+ "watch-poll": "cross-env npm run watch -- --watch-poll --progress",
+ "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
+ "prod": "npm run production",
+ "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
+ },
+ "devDependencies": {
+ "axios": "^0.18",
+ "cross-env": "^5.1.4",
+ "laravel-mix": "^2.1",
+ "laravel-mix-merge-manifest": "^0.1.1",
+ "jquery": "^3.2",
+ "vue": "^2.1.10"
+ },
+ "dependencies": {
+ "vee-validate": "2.0.0-rc.26",
+ "vue-flatpickr": "^2.3.0",
+ "vue-slider-component": "^2.7.5"
+ }
+}
diff --git a/packages/Webkul/SAASCustomizer/publishable/saas/assets/css/saas.css b/packages/Webkul/SAASCustomizer/publishable/saas/assets/css/saas.css
new file mode 100644
index 000000000..4dfe841f5
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/publishable/saas/assets/css/saas.css
@@ -0,0 +1 @@
+@import url(https://fonts.googleapis.com/css?family=Montserrat:400,500);html{font-family:montserrat,sans-serif}::-webkit-input-placeholder{font-family:montserrat,sans-serif}::-ms-input-placeholder{font-family:montserrat,sans-serif}::placeholder{font-family:montserrat,sans-serif}.mt-30{margin-top:30px}.mt-60{margin-top:60px}.mt-90{margin-top:90px}.content-container{width:100%;min-height:100vh;height:auto}.form-container{width:420px;margin-left:auto;margin-right:auto}.form-container .brand-logo{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:100%}.form-container .step-one button,.form-container .step-three button,.form-container .step-two button{width:150px;margin-left:calc(50% - 75px)}.registration{padding:10px;-webkit-box-shadow:0 2px 25px 0 rgba(0,0,0,.15);box-shadow:0 2px 25px 0 rgba(0,0,0,.15)}.registration .control-group .control{width:100%}.step-navigator{margin-top:15px;margin-bottom:15px;width:100%}.step-list{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.step-list .step-item{cursor:pointer;height:64px;width:64px;border:1px solid #c7c7c7;border-radius:50%;text-align:center;padding-top:24px}.step-list .step-item.active{border:1px solid blue}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/publishable/saas/assets/js/saas.js b/packages/Webkul/SAASCustomizer/publishable/saas/assets/js/saas.js
new file mode 100644
index 000000000..6102aa371
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/publishable/saas/assets/js/saas.js
@@ -0,0 +1 @@
+!function(n){var t={};function r(e){if(t[e])return t[e].exports;var o=t[e]={i:e,l:!1,exports:{}};return n[e].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=n,r.c=t,r.d=function(n,t,e){r.o(n,t)||Object.defineProperty(n,t,{configurable:!1,enumerable:!0,get:e})},r.n=function(n){var t=n&&n.__esModule?function(){return n.default}:function(){return n};return r.d(t,"a",t),t},r.o=function(n,t){return Object.prototype.hasOwnProperty.call(n,t)},r.p="/",r(r.s=0)}({0:function(n,t,r){r("J66Q"),n.exports=r("MT9B")},J66Q:function(n,t){},MT9B:function(n,t){}});
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/publishable/saas/assets/mix-manifest.json b/packages/Webkul/SAASCustomizer/publishable/saas/assets/mix-manifest.json
new file mode 100644
index 000000000..07bd8464a
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/publishable/saas/assets/mix-manifest.json
@@ -0,0 +1,4 @@
+{
+ "/js/saas.js": "/js/saas.js?id=245497d286e5c4f9d97d",
+ "/css/saas.css": "/css/saas.css?id=a62abbc117a7478bace8"
+}
diff --git a/packages/Webkul/SAASCustomizer/readme.md b/packages/Webkul/SAASCustomizer/readme.md
new file mode 100644
index 000000000..f52e14fbc
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/readme.md
@@ -0,0 +1,70 @@
+# Introduction:
+Bagisto SAAS extension is eCommerce virtual mall, where multiple-vendor can sign-up and create their own e-commerce store with their personalized domain name. SAAS extension will help you in appealing sellers to get registered with your business and use common resources such as Payment gateways, Shipping methods, etc.
+
+Get involved and control your mall by managing commissions directly from single place, control on customer signups, super cool super admin panel to manage sellers, activate/deactivate your sellers from super admin panel too and lots more.
+
+
+# Feature of Laravel ecommerce SAAS Module
+
+* Easy to Setup and manage SAAS based eCommerce solution.
+* Scaling your business is now directly proportional to no. of sellers.
+* Separate admin panel for each seller.
+* Ability of seller to change domain at will.
+* Easily manageable orders.
+* Faster updates will bring lots of demanding features.
+
+# Requirements
+* Bagisto v0.1.6 or higher.
+
+# Note
+ 1. Do not install bagisto till you configure this extension initially w/ it.
+ 2. Before proceeding this extension you need to copy files from zip
+file to root location of your Bagisto installed inside it
+ 3. Do not try to seed the database with command 'php artisan db:seed'
+
+# Installation
+* Run the command from root in terminal 'composer create-project'
+* Find '.env' file in root directory and change the APP_URL param to domain,
+ex: www.example.com and do not forget to configure Mail and DB parameters inside .env file
+* Run the following commands:
+
+```
+php artisan migrate (will take a while)
+php artisan storage:link
+php artisan vendor:publish
+```
+* Do couple of entries in root composer.json in psr-4 object:
+
+```
+'Webkul\SAASCustomizer\": "packages/Webkul/SAASCustomizer/src',
+'Webkul\CustomerCustomizer\": "packages/Webkul/CustomerCustomizer/src'
+```
+* Another entry inside file('app/Http/Kernel.php',):
+In this file you can find an array 'middlewareGroups' inside it there is
+a key named 'web' inside it do an entry:
+
+```
+Webkul\SAASCustomizer\Http\Middleware\ValidatesDomain::class'
+```
+* Find a file auth.php present inside config folder from root and do the following entries:
+```
+'super-admin' => [
+ 'driver' => 'session',
+ 'provider' => 'superadmins'
+]
+```
+> insert the above code in 'guards' array.
+
+```
+'superadmins' => [
+ 'driver' => 'eloquent',
+ 'model' => Webkul\SAASCustomizer\Models\SuperAdmin::class
+]
+```
+> insert the above code in 'providers' array.
+
+* Run the command from root in terminal 'composer dump-autoload'.
+* In your terminal now type command 'php artisan SAAS:install', to generate the super admin credentials
+* Access super admin panel using:
+www.domain.com/super/login
+* Run your SAAS based store.
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Commands/Console/GenerateSU.php b/packages/Webkul/SAASCustomizer/src/Commands/Console/GenerateSU.php
new file mode 100644
index 000000000..73bdd8367
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Commands/Console/GenerateSU.php
@@ -0,0 +1,117 @@
+company = $company;
+ $this->details = $details;
+ $this->admin = $admin;
+ $this->role = $role;
+ }
+
+ /**
+ * Does the all sought of lifting required to be performed for
+ * generating a super user
+ */
+ public function handle()
+ {
+ $this->comment('Generating super user for the system....');
+
+ $email = $this->ask('Please enter email?');
+
+ $data = [
+ 'email' => $email
+ ];
+
+ $validator = Validator::make($data, [
+ 'email' => 'required|email',
+ ]);
+
+ if($validator->fails()) {
+ $this->comment('Email invalid, please enter try again.');
+
+ return false;
+ }
+
+ unset($data);
+
+ $this->comment('You entered = '. $email);
+
+ $password = $this->ask('Please enter password?');
+ $data = [
+ 'password' => $password
+ ];
+
+ $validator = Validator::make($data, [
+ 'password' => 'required|string|min:6'
+ ]);
+
+ if ($validator->fails()) {
+ $this->comment('Password invalid, make sure password is atleast 6 characters of length.');
+
+ return false;
+ }
+
+ $this->comment('You entered = '. $password);
+
+ unset($data);
+
+ if ($this->confirm('Do you wish to continue?')) {
+ $result = $this->generateSuperUserCompany($email, $password);
+
+ if ($result) {
+ $this->comment('Super user for the system is created');
+ } else {
+ $this->comment('Super user for the system already exists, please contact support@bagisto.com for troubleshooting.');
+ }
+
+ } else {
+ $this->comment('Please try creating the super user again');
+ }
+ }
+
+ public function generateSuperUserCompany($email, $password)
+ {
+ $super_admin = \DB::select('select * from super_admins');
+
+ if(count($super_admin)) {
+ return false;
+ }
+
+ $data = [
+ 'email' => $email,
+ 'password' => bcrypt($password),
+ ];
+
+ \DB::insert('insert into super_admins (id, email, password, created_at, updated_at) values (?, ?, ?, ?, ?)', [1, $data['email'], $data['password'], now(), now()]);
+
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Company.php b/packages/Webkul/SAASCustomizer/src/Company.php
new file mode 100644
index 000000000..a08d64114
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Company.php
@@ -0,0 +1,133 @@
+company = $company;
+ }
+
+ public function isAllowed()
+ {
+ $primaryServerName = config('app.url');
+
+ if (isset($_SERVER['SERVER_NAME']))
+ $currentURL = $_SERVER['SERVER_NAME'];
+ else
+ $currentURL = $primaryServerName;
+
+ $primaryServerNameWithoutProtocol = null;
+
+ if (str_contains($primaryServerName, 'http://')) {
+ $primaryServerNameWithoutProtocol = explode('http://', $primaryServerName)[1];
+ } else if (str_contains($primaryServerName, 'https://')) {
+ $primaryServerNameWithoutProtocol = explode('https://', $primaryServerName)[1];
+ }
+
+ if ($currentURL == $primaryServerNameWithoutProtocol) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ protected function getAllRegisteredDomains()
+ {
+ $domains = $this->company->all();
+
+ return $domains;
+ }
+
+ public function getCurrent()
+ {
+ $superAdmin = new SuperAdmin;
+
+ $primaryServerName = config('app.url');
+
+ if (isset($_SERVER['SERVER_NAME']))
+ $currentURL = $_SERVER['SERVER_NAME'];
+ else
+ $currentURL = $primaryServerName;
+
+ if (str_contains($primaryServerName, 'http://')) {
+ $primaryServerNameWithoutProtocol = explode('http://', $primaryServerName)[1];
+ } else if (str_contains($primaryServerName, 'https://')) {
+ $primaryServerNameWithoutProtocol = explode('https://', $primaryServerName)[1];
+ }
+
+ if (str_contains($currentURL, 'http://')) {
+ $currentURL = explode('http://', $currentURL)[1];
+ } else if (str_contains($currentURL, 'http://')) {
+ $currentURL = explode('http://', $currentURL)[1];
+ }
+
+ if ($currentURL == $primaryServerNameWithoutProtocol) {
+ if (session()->has('company')) {
+ $company = session()->get('company');
+ } else {
+ $company = 'super-company';
+
+ session()->put('company', $company);
+ }
+
+ return $company;
+ } else {
+ if (session()->has('company')) {
+ $company = session()->get('company');
+ }else {
+ $company = $this->company->findWhere(['domain' => $currentURL])->first();
+
+ if ($company->is_active == 0) {
+ throw new \Exception('company_blocked_by_administrator', 400);
+ }
+
+ session()->put('company', $company);
+ }
+
+ return $company;
+ }
+ }
+
+ /**
+ * Returns if there are companies
+ * already created
+ */
+ public function count()
+ {
+ return $this->company->findWhere([['id', '>', '0']])->count();
+ }
+
+ public function getPrimaryUrl()
+ {
+ if (str_contains(env('APP_URL'), 'http://')) {
+ $primaryServerNameWithoutProtocol = explode('http://', env('APP_URL'))[1];
+ } else if (str_contains($primaryServerName, 'https://')) {
+ $primaryServerNameWithoutProtocol = explode('https://', env('APP_URL'))[1];
+ }
+
+ return $primaryServerNameWithoutProtocol;
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Config/super-menu.php b/packages/Webkul/SAASCustomizer/src/Config/super-menu.php
new file mode 100644
index 000000000..c2b354f59
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Config/super-menu.php
@@ -0,0 +1,11 @@
+ 'company',
+ 'name' => 'saas::app.menu.companies',
+ 'route' => 'super.companies.index',
+ 'sort' => 1,
+ 'icon-class' => 'settings-icon',
+ ]
+];
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/DataGrids/CompaniesDataGrid.php b/packages/Webkul/SAASCustomizer/src/DataGrids/CompaniesDataGrid.php
new file mode 100644
index 000000000..56805f74f
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/DataGrids/CompaniesDataGrid.php
@@ -0,0 +1,92 @@
+ @prashant-webkul
+ * @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
+ */
+class CompaniesDataGrid extends DataGrid
+{
+ protected $index = 'id'; //the column that needs to be treated as index column
+
+ protected $sortOrder = 'desc'; //asc or desc
+
+ public function prepareQueryBuilder()
+ {
+ $queryBuilder = DB::table('companies')
+ ->select('id')
+ ->addSelect('id', 'name', 'domain', 'is_active');
+
+ $this->setQueryBuilder($queryBuilder);
+ }
+
+ public function addColumns()
+ {
+ $this->addColumn([
+ 'index' => 'id',
+ 'label' => trans('admin::app.datagrid.id'),
+ 'type' => 'number',
+ 'searchable' => false,
+ 'sortable' => true,
+ 'filterable' => true
+ ]);
+
+ $this->addColumn([
+ 'index' => 'name',
+ 'label' => trans('admin::app.datagrid.name'),
+ 'type' => 'string',
+ 'searchable' => false,
+ 'sortable' => true,
+ 'filterable' => true
+ ]);
+
+ $this->addColumn([
+ 'index' => 'domain',
+ 'label' => trans('saas::app.datagrid.domain'),
+ 'type' => 'string',
+ 'searchable' => false,
+ 'sortable' => true,
+ 'filterable' => true
+ ]);
+
+ $this->addColumn([
+ 'index' => 'is_active',
+ 'label' => trans('admin::app.datagrid.status'),
+ 'type' => 'boolean',
+ 'searchable' => false,
+ 'sortable' => true,
+ 'filterable' => true,
+ 'closure' => true,
+ 'wrapper' => function ($row) {
+ if ($row->is_active ==1) {
+ return ' ';
+ } else {
+ return ' ';
+ }
+ }
+ ]);
+ }
+
+ public function prepareActions()
+ {
+ $this->addAction([
+ 'type' => 'View',
+ 'method' => 'GET', //use post only for redirects only
+ 'route' => 'super.companies.show-stats',
+ 'icon' => 'icon eye-icon'
+ ]);
+
+ $this->addAction([
+ 'type' => 'View',
+ 'method' => 'GET', //use post only for redirects only
+ 'route' => 'super.companies.edit',
+ 'icon' => 'icon pencil-lg-icon'
+ ]);
+ }
+}
diff --git a/packages/Webkul/SAASCustomizer/src/Database/DatabaseManager.php b/packages/Webkul/SAASCustomizer/src/Database/DatabaseManager.php
new file mode 100644
index 000000000..a5fce3b71
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Database/DatabaseManager.php
@@ -0,0 +1,48 @@
+guard('super-admin')->check()) {
+ if (count(explode('as', $table)) == 1) {
+ if ($table == 'companies' || $table == 'country_states' || $table == 'countries') {
+
+ return $this->query()->from($table);
+ } else {
+ return $this->query()->from($table)->where($table . '.company_id', $company->id);
+ }
+ } else if (count(explode('as', $table)) == 2) {
+ $name = explode('as', $table);
+ $tempName = trim($name[0]);
+
+ if ($tempName == 'companies' || $tempName == 'country_states' || $tempName == 'countries') {
+ return $this->query()->from($table);
+ } else {
+ return $this->query()->from($table)->where(trim($name[1]) . '.company_id', $company->id);
+ }
+ } else {
+ throw \Exception('Unusual Entities');
+ }
+ } else {
+ return $this->query()->from($table);
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Database/Eloquent/Builder.php b/packages/Webkul/SAASCustomizer/src/Database/Eloquent/Builder.php
new file mode 100644
index 000000000..e4a6a9b9d
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Database/Eloquent/Builder.php
@@ -0,0 +1,14 @@
+increments('id');
+ $table->string('name')->unique();
+ $table->string('email')->nullable();
+ $table->string('username')->unique();
+ $table->string('logo')->nullable();
+ $table->string('domain')->unique();
+ $table->string('city')->nullable();
+ $table->string('state')->nullable();
+ $table->string('zip_code')->nullable();
+ $table->string('country')->nullable();
+ $table->text('address1')->nullable();
+ $table->text('address2')->nullable();
+ $table->text('description')->nullable();
+ $table->json('more_info')->nullable();
+ $table->boolean('is_active')->default(1);
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('companies');
+ }
+}
diff --git a/packages/Webkul/SAASCustomizer/src/Database/Migrations/2019_03_26_152524_alter_all_unique_contraints.php b/packages/Webkul/SAASCustomizer/src/Database/Migrations/2019_03_26_152524_alter_all_unique_contraints.php
new file mode 100644
index 000000000..79aab3101
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Database/Migrations/2019_03_26_152524_alter_all_unique_contraints.php
@@ -0,0 +1,248 @@
+dropUnique('attributes_code_unique');
+ $table->integer('company_id')->unsigned();
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ $table->unique(['code', 'company_id'], 'attribute_company_code_unique_index');
+ });
+
+ Schema::table('attribute_families', function (Blueprint $table) {
+ $table->integer('company_id')->unsigned()->after('id');
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ });
+
+ Schema::table('attribute_groups', function (Blueprint $table) {
+ $table->dropForeign(['attribute_family_id']);
+ $table->dropUnique('attribute_groups_attribute_family_id_name_unique');
+ $table->integer('company_id')->unsigned();
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ $table->foreign('attribute_family_id')->references('id')->on('attribute_families')->onDelete('cascade');
+ $table->unique(['attribute_family_id', 'name', 'company_id'], 'attribute_family_id_name_company_id_unique_index');
+ });
+
+ // Category package migration alterations
+ Schema::table('categories', function (Blueprint $table) {
+ $table->integer('company_id')->unsigned()->after('id');
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ });
+
+ Schema::table('category_translations', function (Blueprint $table) {
+ $table->dropForeign(['category_id']);
+ $table->dropUnique('category_translations_category_id_slug_locale_unique');
+ $table->integer('company_id')->unsigned();
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ $table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade');
+ $table->unique(['category_id', 'slug', 'locale', 'company_id'], 'id_slug_locale_company_id_unique_index');
+ });
+
+ // Checkout package migration alterations
+ Schema::table('cart', function (Blueprint $table) {
+ $table->integer('company_id')->unsigned()->after('id');
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ });
+
+ // Core package migration alterations
+ Schema::table('channels', function (Blueprint $table) {
+ $table->integer('company_id')->unsigned()->after('id');
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ });
+
+ Schema::table('core_config', function (Blueprint $table) {
+ $table->integer('company_id')->unsigned()->after('id');
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ });
+
+ Schema::table('currencies', function (Blueprint $table) {
+ $table->integer('company_id')->unsigned()->after('id');
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ });
+
+ Schema::table('currency_exchange_rates', function(Blueprint $table) {
+ $table->dropForeign(['target_currency']);
+ $table->dropUnique('currency_exchange_rates_target_currency_unique');
+ $table->integer('company_id')->unsigned();
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ $table->foreign('target_currency')->references('id')->on('currencies')->onDelete('cascade');
+ $table->unique(['target_currency', 'company_id'], 'target_currency_company_id_unique_id');
+ });
+
+ Schema::table('locales', function(Blueprint $table) {
+ $table->dropUnique('locales_code_unique');
+ $table->integer('company_id')->unsigned();
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ $table->unique(['code', 'company_id'], 'code_company_id_unqiue_index');
+ });
+
+ Schema::table('sliders', function (Blueprint $table) {
+ $table->integer('company_id')->unsigned()->after('id');
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ });
+
+ Schema::table('subscribers_list', function (Blueprint $table) {
+ $table->integer('company_id')->unsigned()->after('id');
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ });
+
+ // customer package table alterations
+ Schema::table('customers', function (Blueprint $table) {
+ $table->dropUnique('customers_email_unique');
+ $table->integer('company_id')->unsigned()->after('id');
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ $table->unique(['email', 'company_id']);
+ });
+
+ // Schema::table('customer_password_resets', function (Blueprint $table) {
+ // $table->integer('company_id')->unsigned()->after('email');
+ // $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ // });
+
+ Schema::table('customer_addresses', function (Blueprint $table) {
+ $table->integer('company_id')->unsigned()->after('id');
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ });
+
+ Schema::table('customer_groups', function (Blueprint $table) {
+ $table->integer('company_id')->unsigned()->after('id');
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ });
+
+ Schema::table('wishlist', function (Blueprint $table) {
+ $table->integer('company_id')->unsigned()->after('id');
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ });
+
+ // Inventory package table alterations
+ Schema::table('inventory_sources', function (Blueprint $table) {
+ $table->dropUnique('inventory_sources_code_unique');
+ $table->integer('company_id')->unsigned();
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ $table->unique(['code', 'company_id'], 'code_company_id_unique');
+ });
+
+ // product package table alterations
+ Schema::table('products', function (Blueprint $table) {
+ $table->dropUnique('products_sku_unique');
+ $table->integer('company_id')->unsigned();
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ $table->unique(['sku', 'company_id'], 'sku_company_id_unique');
+ });
+
+ Schema::table('product_flat', function (Blueprint $table) {
+ $table->dropForeign(['product_id']);
+ $table->dropUnique('product_flat_unique_index');
+ $table->integer('company_id')->unsigned();
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');
+ $table->unique(['product_id', 'channel', 'locale', 'company_id'], 'product_flat_unique_index');
+ });
+
+ Schema::table('product_attribute_values', function (Blueprint $table) {
+ $table->dropUnique('chanel_locale_attribute_value_index_unique');
+ $table->integer('company_id')->unsigned();
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ $table->unique(['channel', 'locale', 'attribute_id', 'product_id', 'company_id'], 'channel_locale_attr_id_product_id_company_unique');
+ });
+
+ Schema::table('product_inventories', function (Blueprint $table) {
+ $table->integer('company_id')->unsigned();
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ });
+
+ Schema::table('product_reviews', function (Blueprint $table) {
+ $table->integer('company_id')->unsigned()->after('id');
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ });
+
+ // sales package table alterations
+ Schema::table('invoices', function (Blueprint $table) {
+ $table->integer('company_id')->unsigned()->after('id');
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ });
+
+ Schema::table('invoice_items', function (Blueprint $table) {
+ $table->integer('company_id')->unsigned()->after('id');
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ });
+
+ Schema::table('orders', function (Blueprint $table) {
+ $table->integer('company_id')->unsigned()->after('id');
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ });
+
+ Schema::table('order_items', function (Blueprint $table) {
+ $table->integer('company_id')->unsigned()->after('id');
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ });
+
+ Schema::table('order_address', function (Blueprint $table) {
+ $table->integer('company_id')->unsigned()->after('id');
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ });
+
+ Schema::table('order_payment', function (Blueprint $table) {
+ $table->integer('company_id')->unsigned()->after('id');
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ });
+
+ Schema::table('shipments', function (Blueprint $table) {
+ $table->integer('company_id')->unsigned()->after('id');
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ });
+
+ // Schema::table('shipment_items', function (Blueprint $table) {
+ // $table->integer('company_id')->unsigned()->after('id');
+ // $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ // });
+
+ // tax package table alterations
+ Schema::table('tax_categories', function (Blueprint $table) {
+ $table->dropUnique('tax_categories_code_unique');
+ $table->dropUnique('tax_categories_name_unique');
+ $table->integer('company_id')->unsigned();
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ $table->unique(['name', 'company_id']);
+ $table->unique(['code', 'company_id']);
+ });
+
+ Schema::table('tax_rates', function (Blueprint $table) {
+ $table->dropUnique('tax_rates_identifier_unique');
+ $table->integer('company_id')->unsigned();
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ $table->unique(['identifier', 'company_id']);
+ });
+
+ Schema::table('roles', function (Blueprint $table) {
+ $table->integer('company_id')->unsigned()->after('id');
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ });
+
+ Schema::table('admins', function (Blueprint $table) {
+ $table->integer('company_id')->unsigned()->after('id');
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Database/Migrations/2019_04_05_105951_create_company_personal_details_table.php b/packages/Webkul/SAASCustomizer/src/Database/Migrations/2019_04_05_105951_create_company_personal_details_table.php
new file mode 100644
index 000000000..fe2ad3b39
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Database/Migrations/2019_04_05_105951_create_company_personal_details_table.php
@@ -0,0 +1,38 @@
+increments('id');
+ $table->string('first_name')->nullable();
+ $table->string('last_name')->nullable();
+ $table->string('email')->nullable()->unique();
+ $table->string('skype')->nullable();
+ $table->integer('company_id')->unsigned();
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ $table->json('more_info')->nullable();
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('company_personal_details');
+ }
+}
diff --git a/packages/Webkul/SAASCustomizer/src/Database/Migrations/2019_05_20_102233_create_super_admins_table.php b/packages/Webkul/SAASCustomizer/src/Database/Migrations/2019_05_20_102233_create_super_admins_table.php
new file mode 100644
index 000000000..465963f60
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Database/Migrations/2019_05_20_102233_create_super_admins_table.php
@@ -0,0 +1,35 @@
+enum('id', [1])->unique();
+ $table->string('email');
+ $table->string('password');
+ $table->boolean('status')->default(1);
+ $table->string('remember_token')->nullable();
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('super_admins');
+ }
+}
diff --git a/packages/Webkul/SAASCustomizer/src/Database/Migrations/2019_06_11_164314_alter_catalog_rules_tables.php b/packages/Webkul/SAASCustomizer/src/Database/Migrations/2019_06_11_164314_alter_catalog_rules_tables.php
new file mode 100644
index 000000000..a9e4ea5f1
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Database/Migrations/2019_06_11_164314_alter_catalog_rules_tables.php
@@ -0,0 +1,32 @@
+integer('company_id')->unsigned()->after('id');
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ //
+ }
+}
diff --git a/packages/Webkul/SAASCustomizer/src/Exceptions/Handler.php b/packages/Webkul/SAASCustomizer/src/Exceptions/Handler.php
new file mode 100644
index 000000000..b87a8c660
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Exceptions/Handler.php
@@ -0,0 +1,108 @@
+ 'Resource not found',
+ 403 => '403 forbidden Error',
+ 401 => 'Unauthenticated',
+ 500 => '500 Internal Server Error',
+ ];
+
+ /**
+ * Render an exception into an HTTP response.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @param \Exception $exception
+ * @return \Illuminate\Http\Response
+ */
+ public function render($request, Exception $exception)
+ {
+ $path = 'saas';
+
+ if ($exception->getMessage() == 'domain_not_found') {
+ return $this->response($path, 500, 'Domain Not Found');
+ }
+
+ if ($exception->getMessage() == 'company_blocked_by_administrator') {
+ return $this->response($path, 400, 'This seller is blocked');
+ }
+
+ if ($exception->getMessage() == 'not_allowed_to_visit_this_section') {
+ return $this->response($path, 400, 'You are not allowed to use this section');
+ }
+
+ if ($exception->getMessage() == 'invalid_admin_login' || $exception->getMessage() == 'invalid_customer_login') {
+ return $this->responseCustom($path, 400, 'auth', 'Authentication Error');
+ }
+
+ if ($exception instanceof HttpException) {
+ $statusCode = in_array($exception->getStatusCode(), [401, 403, 404, 503]) ? $exception->getStatusCode() : 500;
+
+ return $this->response($path, $statusCode);
+ } else if ($exception instanceof ModelNotFoundException) {
+ return $this->response($path, 404);
+ } else if ($exception instanceof PDOException) {
+ return $this->response($path, 500);
+ }
+
+ return parent::render($request, $exception);
+ }
+
+ /**
+ * Convert an authentication exception into a response.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @param \Illuminate\Auth\AuthenticationException $exception
+ * @return \Illuminate\Http\Response
+ */
+ protected function unauthenticated($request, AuthenticationException $exception)
+ {
+ if ($request->expectsJson()) {
+ return response()->json(['error' => $this->jsonErrorMessages[401]], 401);
+ }
+
+ return redirect()->guest(route('super.session.index'));
+ }
+
+ private function isAdminUri()
+ {
+ return strpos($_SERVER['REQUEST_URI'], 'super') !== false ? true : false;
+ }
+
+ private function response($path, $statusCode, $message = null)
+ {
+ if (request()->expectsJson()) {
+ return response()->json([
+ 'error' => isset($this->jsonErrorMessages[$statusCode])
+ ? $this->jsonErrorMessages[$statusCode]
+ : 'Something went wrong, please try again later.'
+ ], $statusCode);
+ }
+
+ return response()->view("{$path}::errors.{$statusCode}", ['message' => $message, 'status' => $statusCode], $statusCode);
+ }
+
+ private function responseCustom($path, $statusCode, $view, $message = null)
+ {
+ if (request()->expectsJson()) {
+ return response()->json([
+ 'error' => isset($this->jsonErrorMessages[$statusCode])
+ ? $this->jsonErrorMessages[$statusCode]
+ : 'Something went wrong, please try again later.'
+ ], $statusCode);
+ }
+
+ return response()->view("{$path}::errors.{$view}", ['message' => $message, 'status' => $statusCode], $statusCode);
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Facades/Company.php b/packages/Webkul/SAASCustomizer/src/Facades/Company.php
new file mode 100644
index 000000000..b8a4fdfb0
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Facades/Company.php
@@ -0,0 +1,18 @@
+company = Company::getCurrent();
+ $this->category = $category;
+ $this->inventory = $inventory;
+ $this->locale = $locale;
+ $this->currency = $currency;
+ $this->channel = $channel;
+ $this->attribute = $attribute;
+ $this->attributeFamily = $attributeFamily;
+ $this->attributeGroup = $attributeGroup;
+ $this->customerGroup = $customerGroup;
+ }
+
+ /**
+ * Prepare data for the customer groups
+ */
+ public function prepareCustomerGroupData()
+ {
+ $this->company = Company::getCurrent();
+
+ $data = [
+ 'code' => 'guest',
+ 'name' => 'Guest',
+ 'is_user_defined' => 0,
+ ];
+
+ $customerGroup0 = $this->customerGroup->create($data);
+
+ // default customer group 1
+ $data = [
+ 'id' => 1,
+ 'code' => 'general',
+ 'name' => 'General',
+ 'is_user_defined' => 0,
+ 'company_id' => $this->company->id
+ ];
+
+ $customerGroup1 = $this->customerGroup->create($data);
+
+ // default customer group 2
+ $data = [
+ 'id' => 2,
+ 'code' => 'wholesale',
+ 'name' => 'Wholesale',
+ 'is_user_defined' => 0,
+ 'company_id' => $this->company->id
+ ];
+
+ $customerGroup2 = $this->customerGroup->create($data);
+
+ return ['default' => $customerGroup1, 'wholesale' => $customerGroup2];
+ }
+
+ /**
+ * Prepares category data
+ */
+ public function prepareCategoryData()
+ {
+ $this->company = Company::getCurrent();
+
+ $data = [
+ 'position' => '1',
+ 'image' => NULL,
+ 'status' => '1',
+ 'parent_id' => NULL,
+ 'name' => 'Root',
+ 'slug' => 'root',
+ 'description' => 'Root',
+ 'meta_title' => '',
+ 'meta_description' => '',
+ 'meta_keywords' => '',
+ 'locale' => 'all',
+ 'company_id' => $this->company->id
+ ];
+
+ $category = $this->category->create($data);
+
+ return $category;
+ }
+
+ /**
+ * Prepares data for a default inventory
+ */
+ public function prepareInventoryData()
+ {
+ $this->company = Company::getCurrent();
+
+ $data = [
+ 'code' => 'default',
+ 'name' => 'Default',
+ 'contact_name' => 'Detroit Warehouse',
+ 'contact_email' => 'warehouse@example.com',
+ 'contact_number' => '9876543210',
+ 'status' => 1,
+ 'country' => 'US',
+ 'state' => 'MI',
+ 'street' => '12th Street',
+ 'city' => 'Detroit',
+ 'postcode' => '48127',
+ 'company_id' => $this->company->id
+ ];
+
+ return $this->inventory->create($data);
+ }
+
+ /**
+ * Creates a default locale
+ */
+ public function prepareLocaleData()
+ {
+ $this->company = Company::getCurrent();
+
+ $data = [
+ 'code' => 'en',
+ 'name' => 'English',
+ 'company_id' => $this->company->id
+ ];
+
+ return $this->locale->create($data);
+ }
+
+ /**
+ * Prepares a default currency
+ */
+ public function prepareCurrencyData()
+ {
+ $this->company = Company::getCurrent();
+
+ $data = [
+ 'code' => 'USD',
+ 'name' => 'US Dollar',
+ 'company_id' => $this->company->id
+ ];
+
+ return $this->currency->create($data);
+ }
+
+ /**
+ * Prepares a default channel
+ */
+ public function prepareChannelData()
+ {
+ $this->company = Company::getCurrent();
+
+ $inventorySource = $this->inventory->findOneWhere(['company_id' => $this->company->id]);
+ $locale = $this->locale->findOneWhere(['company_id' => $this->company->id]);
+ $currency = $this->currency->findOneWhere(['company_id' => $this->company->id]);
+ $category = $this->category->findOneWhere(['company_id' => $this->company->id]);
+
+ $data = [
+ 'code' => 'default',
+ 'name' => 'Default Channel',
+ 'description' => 'Default Channel',
+ "inventory_sources" => [
+ 0 => $inventorySource->id
+ ],
+ "root_category_id" => $category->id,
+ 'hostname' => $this->company->domain,
+ 'locales' => [
+ 0 => $locale->id
+ ],
+ "default_locale_id" => $locale->id,
+
+ 'currencies' => [
+ 0 => $currency->id
+ ],
+
+ 'base_currency_id' => $currency->id,
+ 'theme' => 'default',
+
+ 'home_page_content' => '@include("shop::home.slider") @include("shop::home.featured-products") @include("shop::home.new-products")
',
+
+ 'footer_content' => '',
+
+ 'company_id' => $this->company->id
+ ];
+
+ return $this->channel->create($data);
+
+ // $newChannel->locales()->sync($data['locales']);
+
+ // $newChannel->currencies()->sync($data['currencies']);
+
+ // $newChannel->inventory_sources()->sync($data['inventory_sources']);
+
+ // $this->uploadImages($data, $channel);
+
+ // $this->uploadImages($data, $channel, 'favicon');
+ }
+
+ /**
+ * Prepare Attribute Data
+ */
+ public function prepareAttributeData()
+ {
+ $this->company = Company::getCurrent();
+
+ $sku = ['code' => 'sku','admin_name' => 'SKU','type' => 'text','validation' => NULL,'position' => '1','is_required' => '1','is_unique' => '1','value_per_locale' => '0','value_per_channel' => '0','is_filterable' => '0','is_configurable' => '0','is_user_defined' => '0','is_visible_on_front' => '0', 'company_id' => $this->company->id, 'en' => ['name' => 'SKU']];
+
+ $this->attribute->create($sku);
+
+ $name = ['code' => 'name', 'admin_name' => 'Name', 'type' => 'text', 'validation' => NULL, 'position' => '2', 'is_required' => '1', 'is_unique' => '0', 'value_per_locale' => '1', 'value_per_channel' => '1', 'is_filterable' => '0', 'is_configurable' => '0', 'is_user_defined' => '0', 'is_visible_on_front' => '0', 'company_id' => $this->company->id,'en' => ['name' => 'Name']];
+
+ $this->attribute->create($name);
+
+ $url_key = ['code' => 'url_key', 'admin_name' => 'URL Key', 'type' => 'text', 'validation' => NULL, 'position' => '3', 'is_required' => '1', 'is_unique' => '1', 'value_per_locale' => '0', 'value_per_channel' => '0', 'is_filterable' => '0', 'is_configurable' => '0', 'is_user_defined' => '0', 'is_visible_on_front' => '0', 'company_id' => $this->company->id, 'en' => ['name' => 'URL Key']];
+
+ $this->attribute->create($url_key);
+
+ $taxCategoryId = ['code' => 'tax_category_id', 'admin_name' => 'Tax Category', 'type' => 'select', 'validation' => NULL, 'position' => '4', 'is_required' => '0', 'is_unique' => '0', 'value_per_locale' => '0', 'value_per_channel' => '1', 'is_filterable' => '0', 'is_configurable' => '0', 'is_user_defined' => '0', 'is_visible_on_front' => '0', 'company_id' => $this->company->id, 'en' => ['name' => 'Tax Category']];
+
+ $this->attribute->create($taxCategoryId);
+
+ $new = ['code' => 'new', 'admin_name' => 'New', 'type' => 'boolean', 'validation' => NULL, 'position' => '5', 'is_required' => '0', 'is_unique' => '0', 'value_per_locale' => '0', 'value_per_channel' => '0', 'is_filterable' => '0','is_configurable' => '0', 'is_user_defined' => '0', 'is_visible_on_front' => '0', 'company_id' => $this->company->id, 'en' => ['name' => 'New']];
+
+ $this->attribute->create($new);
+
+ $featured = ['id' => '6', 'code' => 'featured', 'admin_name' => 'Featured', 'type' => 'boolean', 'validation' => NULL, 'position' => '6', 'is_required' => '0', 'is_unique' => '0', 'value_per_locale' => '0', 'value_per_channel' => '0', 'is_filterable' => '0', 'is_configurable' => '0', 'is_user_defined' => '0', 'is_visible_on_front' => '0', 'company_id' => 1, 'en' => ['name' => 'Featured']];
+
+ $this->attribute->create($featured);
+
+ $visibleIndividually = ['code' => 'visible_individually','admin_name' => 'Visible Individually','type' => 'boolean','validation' => NULL,'position' => '7','is_required' => '1','is_unique' => '0','value_per_locale' => '0','value_per_channel' => '0','is_filterable' => '0','is_configurable' => '0','is_user_defined' => '0','is_visible_on_front' => '0', 'company_id' => $this->company->id, 'en' => ['name' => 'Visible Individually']];
+
+ $this->attribute->create($visibleIndividually);
+
+ $status = ['code' => 'status','admin_name' => 'Status','type' => 'boolean','validation' => NULL,'position' => '8','is_required' => '1','is_unique' => '0','value_per_locale' => '0','value_per_channel' => '0','is_filterable' => '0','is_configurable' => '0','is_user_defined' => '0','is_visible_on_front' => '0', 'company_id' => $this->company->id, 'en' => ['name' => 'Status']];
+
+ $this->attribute->create($status);
+
+ $shortDesc = ['code' => 'short_description','admin_name' => 'Short Description','type' => 'textarea','validation' => NULL,'position' => '9','is_required' => '1','is_unique' => '0','value_per_locale' => '1','value_per_channel' => '1','is_filterable' => '0','is_configurable' => '0','is_user_defined' => '0','is_visible_on_front' => '0', 'company_id' => $this->company->id, 'en' => ['name' => 'Short Description']];
+
+ $this->attribute->create($shortDesc);
+
+ $desc = ['code' => 'description','admin_name' => 'Description','type' => 'textarea','validation' => NULL,'position' => '10','is_required' => '1','is_unique' => '0','value_per_locale' => '1','value_per_channel' => '1','is_filterable' => '0','is_configurable' => '0','is_user_defined' => '0','is_visible_on_front' => '0', 'company_id' => $this->company->id, 'en' => ['name' => 'Description']];
+
+ $this->attribute->create($desc);
+
+ $price = ['code' => 'price','admin_name' => 'Price','type' => 'price','validation' => 'decimal','position' => '11','is_required' => '1','is_unique' => '0','value_per_locale' => '0','value_per_channel' => '0','is_filterable' => '1','is_configurable' => '0','is_user_defined' => '0','is_visible_on_front' => '0', 'company_id' => $this->company->id, 'en' => ['name' => 'Price']];
+
+ $this->attribute->create($price);
+
+ $cost = ['code' => 'cost','admin_name' => 'Cost','type' => 'price','validation' => 'decimal','position' => '12','is_required' => '0','is_unique' => '0','value_per_locale' => '0','value_per_channel' => '1','is_filterable' => '0','is_configurable' => '0','is_user_defined' => '1','is_visible_on_front' => '0', 'company_id' => 1, 'en' => ['name' => 'Cost']];
+
+ $this->attribute->create($cost);
+
+ $specialPrice = ['code' => 'special_price','admin_name' => 'Special Price','type' => 'price','validation' => 'decimal','position' => '13','is_required' => '0','is_unique' => '0','value_per_locale' => '0','value_per_channel' => '0','is_filterable' => '0','is_configurable' => '0','is_user_defined' => '0','is_visible_on_front' => '0', 'company_id' => $this->company->id, 'en' => ['name' => 'Special Price']];
+
+ $this->attribute->create($specialPrice);
+
+ $specialFrom = ['code' => 'special_price_from','admin_name' => 'Special Price From','type' => 'date','validation' => NULL,'position' => '14','is_required' => '0','is_unique' => '0','value_per_locale' => '0','value_per_channel' => '1','is_filterable' => '0','is_configurable' => '0','is_user_defined' => '0','is_visible_on_front' => '0', 'company_id' => $this->company->id, 'en' => ['name' => 'Special Price From']];
+
+ $this->attribute->create($specialFrom);
+
+ $specialTo = ['code' => 'special_price_to','admin_name' => 'Special Price To','type' => 'date','validation' => NULL,'position' => '15','is_required' => '0','is_unique' => '0','value_per_locale' => '0','value_per_channel' => '1','is_filterable' => '0','is_configurable' => '0','is_user_defined' => '0','is_visible_on_front' => '0', 'company_id' => $this->company->id, 'en' => ['name' => 'Special Price To']];
+
+ $this->attribute->create($specialTo);
+
+ $metaTitle = ['code' => 'meta_title','admin_name' => 'Meta Title','type' => 'textarea','validation' => NULL,'position' => '16','is_required' => '0','is_unique' => '0','value_per_locale' => '1','value_per_channel' => '1','is_filterable' => '0','is_configurable' => '0','is_user_defined' => '0','is_visible_on_front' => '0', 'company_id' => $this->company->id, 'en' => ['name' => 'Meta Title']];
+
+ $this->attribute->create($metaTitle);
+
+ $metaKeywords = ['code' => 'meta_keywords','admin_name' => 'Meta Keywords','type' => 'textarea','validation' => NULL,'position' => '17','is_required' => '0','is_unique' => '0','value_per_locale' => '1','value_per_channel' => '1','is_filterable' => '0', 'is_configurable' => '0','is_user_defined' => '0','is_visible_on_front' => '0','company_id' => $this->company->id, 'en' => ['name' => 'Meta Keywords']];
+
+ $this->attribute->create($metaKeywords);
+
+ $metaDesc = ['code' => 'meta_description','admin_name' => 'Meta Description','type' => 'textarea','validation' => NULL,'position' => '18','is_required' => '0','is_unique' => '0','value_per_locale' => '1','value_per_channel' => '1','is_filterable' => '0','is_configurable' => '0','is_user_defined' => '1','is_visible_on_front' => '0', 'company_id' => $this->company->id, 'en' => ['name' => 'Meta Description']];
+
+ $this->attribute->create($metaDesc);
+
+ $width = ['code' => 'width','admin_name' => 'Width','type' => 'text','validation' => 'decimal','position' => '19','is_required' => '0','is_unique' => '0','value_per_locale' => '0','value_per_channel' => '0','is_filterable' => '0','is_configurable' => '0','is_user_defined' => '1','is_visible_on_front' => '0', 'company_id' => $this->company->id, 'en' => ['name' => 'Width']];
+
+ $this->attribute->create($width);
+
+ $height = ['code' => 'height','admin_name' => 'Height','type' => 'text','validation' => 'decimal','position' => '20','is_required' => '0','is_unique' => '0','value_per_locale' => '0','value_per_channel' => '0','is_filterable' => '0','is_configurable' => '0','is_user_defined' => '1','is_visible_on_front' => '0', 'company_id' => $this->company->id, 'en' => ['name' => 'Height']];
+
+ $this->attribute->create($height);
+
+ $depth = ['code' => 'depth','admin_name' => 'Depth','type' => 'text','validation' => 'decimal','position' => '21','is_required' => '0','is_unique' => '0','value_per_locale' => '0','value_per_channel' => '0','is_filterable' => '0','is_configurable' => '0','is_user_defined' => '1','is_visible_on_front' => '0', 'company_id' => $this->company->id, 'en' => ['name' => 'Depth']];
+
+ $this->attribute->create($depth);
+
+ $weight = ['code' => 'weight','admin_name' => 'Weight','type' => 'text','validation' => 'decimal','position' => '22','is_required' => '1','is_unique' => '0','value_per_locale' => '0','value_per_channel' => '0','is_filterable' => '0','is_configurable' => '0','is_user_defined' => '0','is_visible_on_front' => '0','company_id' => $this->company->id, 'en' => ['name' => 'Weight']];
+
+ $this->attribute->create($weight);
+
+ $color = ['code' => 'color','admin_name' => 'Color','type' => 'select','validation' => NULL,'position' => '23','is_required' => '0','is_unique' => '0','value_per_locale' => '0','value_per_channel' => '0','is_filterable' => '1','is_configurable' => '1','is_user_defined' => '1','is_visible_on_front' => '0', 'company_id' => $this->company->id, 'en' => ['name' => 'Color'], 'options' => [
+ 'option_0' => ['admin_name' => 'Red', 'en' => ['label' => 'Red'], 'sort_order' => '1'],
+ 'option_1' => ['admin_name' => 'Green', 'en' => ['label' => 'Green'],'sort_order' => '2'],
+ 'option_2' => ['admin_name' => 'Yellow', 'en' => ['label' => 'Yellow'], 'sort_order' => '3'],
+ 'option_3' => ['admin_name' => 'Black', 'en' => ['label' => 'Black'], 'sort_order' => '4'],
+ 'option_4' => ['admin_name' => 'White', 'en' => ['label' => 'White'], 'sort_order' => '5']
+ ]];
+
+ $this->attribute->create($color);
+
+ $size = ['code' => 'size','admin_name' => 'Size','type' => 'select','validation' => NULL,'position' => '24','is_required' => '0','is_unique' => '0','value_per_locale' => '0','value_per_channel' => '0','is_filterable' => '1','is_configurable' => '1','is_user_defined' => '1','is_visible_on_front' => '0', 'company_id' => $this->company->id, 'en' => ['name' => 'Size'], 'options' => [
+ 'option_0' => ['id' => '6','admin_name' => 'S', 'en' => ['label' => 'S'], 'sort_order' => '1'],
+ 'option_1' => ['id' => '7','admin_name' => 'M', 'en' => ['label' => 'M'], 'sort_order' => '2'],
+ 'option_2' => ['id' => '8','admin_name' => 'L', 'en' => ['label' => 'L'], 'sort_order' => '3'],
+ 'option_3' => ['id' => '9','admin_name' => 'XL', 'en' => ['label' => 'XL'], 'sort_order' => '4']
+ ]];
+
+ $this->attribute->create($size);
+
+ return true;
+ }
+
+ /**
+ * To prepare the attribute family
+ */
+ public function prepareAttributeFamilyData()
+ {
+ $this->company = Company::getCurrent();
+
+ $data = ['code' => 'default', 'name' => 'Default', 'status' => '0', 'is_user_defined' => '1', 'company_id' => $this->company->id];
+
+ $attributeFamily = $this->attributeFamily->create($data);
+
+ return $attributeFamily;
+ }
+
+ /**
+ * To prepare the attribute group mappings
+ */
+ public function prepareAttributeGroupData()
+ {
+ $this->company = Company::getCurrent();
+
+ $attributeFamily = $this->attributeFamily->findOneWhere(['company_id' => $this->company->id]);
+ $attributes = $this->attribute->all();
+
+ $group1 = ['sku', 'name', 'url_key', 'tax_category_id', 'new', 'featured', 'visible_individually', 'status', 'color', 'size'];
+ $group2 = ['short_description', 'description'];
+ $group3 = ['meta_title', 'meta_keywords', 'meta_description'];
+ $group4 = ['price', 'cost', 'special_price', 'special_price_from', 'special_price_to'];
+ $group5 = ['width', 'height', 'depth', 'weight'];
+
+ // creating group 1
+ $this->attributeGroup->create(['name' => 'General', 'position' => '1', 'is_user_defined' => '0', 'attribute_family_id' => $attributeFamily->id, 'company_id' => $this->company->id]);
+
+ $attributeGroup = $this->attributeGroup->findOneWhere(['name' => 'General']);
+
+ $i = 1;
+ foreach($group1 as $code) {
+ $i++;
+
+ foreach ($attributes as $value) {
+ if($value->code == $code) {
+ DB::table('attribute_group_mappings')->insert([
+ ['attribute_id' => $value->id, 'attribute_group_id' => $attributeGroup->id, 'position' => $i]
+ ]);
+ }
+ }
+ }
+
+ // creating group 2
+ $g2 = $this->attributeGroup->create(['name' => 'Description', 'position' => '2', 'is_user_defined' => '0', 'attribute_family_id' => $attributeFamily->id, 'company_id' => $this->company->id]);
+
+ $attributeGroup = $this->attributeGroup->findOneWhere(['name' => 'Description']);
+
+ $i = 1;
+ foreach($group2 as $code) {
+ $i++;
+
+ foreach ($attributes as $value) {
+ if($value->code == $code) {
+ DB::table('attribute_group_mappings')->insert([
+ ['attribute_id' => $value->id, 'attribute_group_id' => $attributeGroup->id, 'position' => $i]
+ ]);
+ }
+ }
+ }
+
+ // creating group 3
+ $g3 = $this->attributeGroup->create(['name' => 'Meta Description', 'position' => '3', 'is_user_defined' => '0', 'attribute_family_id' => $attributeFamily->id, 'company_id' => $this->company->id]);
+
+ $attributeGroup = $this->attributeGroup->findOneWhere(['name' => 'Meta Description']);
+
+ $i = 1;
+ foreach($group3 as $code) {
+ $i++;
+
+ foreach ($attributes as $value) {
+ if($value->code == $code) {
+ DB::table('attribute_group_mappings')->insert([
+ ['attribute_id' => $value->id, 'attribute_group_id' => $attributeGroup->id, 'position' => $i]
+ ]);
+ }
+ }
+ }
+
+ // creating group 4
+ $g4 = $this->attributeGroup->create(['name' => 'Price', 'position' => '4', 'is_user_defined' => '0', 'attribute_family_id' => $attributeFamily->id, 'company_id' => $this->company->id]);
+
+ $attributeGroup = $this->attributeGroup->findOneWhere(['name' => 'Price']);
+
+ $i = 1;
+ foreach($group4 as $code) {
+ $i++;
+
+ foreach ($attributes as $value) {
+ if($value->code == $code) {
+ DB::table('attribute_group_mappings')->insert([
+ ['attribute_id' => $value->id, 'attribute_group_id' => $attributeGroup->id, 'position' => $i]
+ ]);
+ }
+ }
+ }
+
+ // creating group 5
+ $g5 = $this->attributeGroup->create(['name' => 'Shipping', 'position' => '5', 'is_user_defined' => '0', 'attribute_family_id' => $attributeFamily->id, 'company_id' => $this->company->id]);
+
+ $attributeGroup = $this->attributeGroup->findOneWhere(['name' => 'Shipping']);
+
+ $i = 1;
+ foreach($group5 as $code) {
+ $i++;
+
+ foreach ($attributes as $value) {
+ if($value->code == $code) {
+ DB::table('attribute_group_mappings')->insert([
+ ['attribute_id' => $value->id, 'attribute_group_id' => $attributeGroup->id, 'position' => $i]
+ ]);
+ }
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * To prepare the country state data for
+ * admin and customers country & state fields
+ * auto population
+ */
+ public function prepareCountryStateData()
+ {
+ $countries = json_decode(file_get_contents(base_path().'/packages/Webkul/Core/src/Data/countries.json'), true);
+
+ DB::table('countries')->insert($countries);
+
+ $states = json_decode(file_get_contents(base_path().'/packages/Webkul/Core/src/Data/states.json'), true);
+
+ DB::table('country_states')->insert($states);
+
+ return true;
+ }
+
+ /**
+ * It will store a check in the companies
+ * that all the necessary data had been
+ * inserted successfully or not
+ *
+ * @param boolean seedCompleted
+ */
+ public function setInstallationCompleteParam()
+ {
+ $this->seedCompleted = true;
+
+ $info = [
+ 'company_created' => true,
+ 'seeded' => true,
+ ];
+
+ $info = json_encode($info);
+
+ $this->company->update([
+ 'more_info' => $info
+ ]);
+
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Helpers/StatsPurger.php b/packages/Webkul/SAASCustomizer/src/Helpers/StatsPurger.php
new file mode 100644
index 000000000..aba932432
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Helpers/StatsPurger.php
@@ -0,0 +1,77 @@
+category = $category;
+ $this->inventory = $inventory;
+ $this->locale = $locale;
+ $this->currency = $currency;
+ $this->channel = $channel;
+ $this->attribute = $attribute;
+ $this->attributeFamily = $attributeFamily;
+ $this->attributeGroup = $attributeGroup;
+ $this->customerGroup = $customerGroup;
+ $this->product = $product;
+ }
+
+ public function getAggregates($companyId)
+ {
+ $products = DB::table('products')->where('company_id', '=', $companyId)->count();
+ $attributes = DB::table('attributes')->where('company_id', '=', $companyId)->count();
+ $customers = DB::table('customers')->where('company_id', '=', $companyId)->count();
+ $customerGroups = DB::table('customer_groups')->where('company_id', '=', $companyId)->count();
+ $categories = DB::table('categories')->where('company_id', '=', $companyId)->count();
+
+ return [
+ 'products' => $products,
+ 'attributes' => $attributes,
+ 'customers' => $customers,
+ 'customer-groups' => $customerGroups,
+ 'categories' => $categories
+ ];
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Http/Controllers/CompanyController.php b/packages/Webkul/SAASCustomizer/src/Http/Controllers/CompanyController.php
new file mode 100644
index 000000000..64826d1dc
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Http/Controllers/CompanyController.php
@@ -0,0 +1,234 @@
+ @prashant-webkul
+ * @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
+ */
+class CompanyController extends Controller
+{
+ protected $attribute;
+ protected $_config;
+ protected $details;
+ protected $admin;
+ protected $role;
+ protected $dataSeed;
+ protected $companyStats;
+
+ public function __construct(CompanyRepository $company, CompanyDetailsRepository $details, Admin $admin, Role $role, DataPurger $dataSeed, StatsPurger $companyStats)
+ {
+ $this->company = $company;
+ $this->details = $details;
+ $this->admin = $admin;
+ $this->role = $role;
+ $this->dataSeed = $dataSeed;
+ $this->companyStats = $companyStats;
+ $this->_config = request('_config');
+
+ if (! Company::isAllowed()) {
+ abort(404);
+ }
+ }
+
+ public function showCompanyStats($id)
+ {
+ $aggregates = $this->companyStats->getAggregates($id);
+
+ $company = $this->company->find($id);
+
+ return view('saas::companies.company.index')->with('company', [$company, $aggregates]);
+ }
+
+ public function create()
+ {
+ if (session()->has('company')) {
+ session()->regenerate();
+ session()->forget('company');
+ }
+
+ return view($this->_config['view']);
+ }
+
+ protected function store()
+ {
+ $validator = Validator::make(Request::all(), [
+ 'email' => 'required|email|max:191|unique:admins,email',
+ 'password' => 'required|string|confirmed|min:6',
+ 'username' => 'required|alpha_num|min:3|max:64',
+ 'first_name' => 'required|string|max:191',
+ 'last_name' => 'nullable|string|max:191',
+ 'phone_no' => 'required|digits_between:10,11',
+ 'org_name' => 'required|string|max:191'
+ ]);
+
+ $data = Request::all();
+
+ $authEmail = $data['email'];
+ unset($data['email']);
+
+ if ($validator->fails()) {
+ return response()->json(['success' => false, 'errors' => $validator->errors()], 403);
+ }
+
+ $validator = Validator::make(Request::all(), [
+ 'username' => 'not_in:www,http,https,WWW,HTTP,HTTPS'
+ ]);
+
+ if ($validator->fails()) {
+ return response()->json([
+ 'success' => false,
+ 'errors' => $validator->errors()
+ ], 403);
+ }
+
+ if (strtolower($data['username']) == 'www' || strtolower($data['username']) == 'http' || strtolower($data['username']) == 'https') {
+ session()->flash('warning', 'Illegal subdomain name');
+ }
+
+ $data['name'] = $data['org_name'];
+ unset($data['org_name']);
+
+ $primaryServerName = config('app.url');
+
+ if (str_contains($primaryServerName, 'http://')) {
+ $primaryServerNameWithoutProtocol = explode('http://', $primaryServerName)[1];
+ } else if (str_contains($primaryServerName, 'https://')) {
+ $primaryServerNameWithoutProtocol = explode('https://', $primaryServerName)[1];
+ }
+
+ $data['domain'] = strtolower($data['username']). '.' . $primaryServerNameWithoutProtocol;
+
+ $validator = Validator::make($data, [
+ 'domain' => 'required|unique:companies,domain'
+ ]);
+
+ if ($validator->fails()) {
+ return response()->json(['success' => false, 'errors' => $validator->errors()], 403);
+ }
+
+ $company = $this->company->create($data);
+
+ if ($company) {
+ $info = [
+ 'created' => true,
+ 'seeded' => false
+ ];
+
+ $info = json_encode($info);
+
+ $company->update([
+ 'extra_info' => $info
+ ]);
+
+ $data['password'] = bcrypt($data['password']);
+ $data['name'] = $data['first_name'].' '.$data['last_name'];
+ $data['status'] = 1;
+
+ //creates a new full privilege role when new company is registered
+ $role = $this->role->create([
+ 'name' => 'Administrator',
+ 'description' => 'Administrator role',
+ 'permission_type' => 'all',
+ 'company_id' => $company->id
+ ]);
+
+ $data['role_id'] = $role->id;
+ $data['email'] = $authEmail;
+ $data['company_id'] = $company->id;
+
+ //creates a new full privilege admin with newly created role above
+ $this->admin->create($data);
+
+ //creates the personal details record for the company
+ $this->details->create($data);
+
+ if (session()->has('company')) {
+ session()->forget('company');
+
+ session()->put('company', $company);
+ } else {
+ session()->put('company', $company);
+ }
+
+ return response()->json([
+ 'success' => true, 'redirect' => $data['domain']
+ ], 200);
+ } else {
+ return response()->json([
+ 'success' => false
+ ], 403);
+ }
+ }
+
+ public function edit($id)
+ {
+ $company = $this->company->findOrFail($id);
+
+ return view('saas::companies.company.edit')->with('company', $company);
+ }
+
+ public function update($id)
+ {
+ $this->validate(request(), [
+ 'email' => 'required|email|max:191|unique:companies,email,'.$id,
+ 'name' => 'required|string|max:191|unique:companies,name,'.$id,
+ 'domain' => 'required|string|max:191|unique:companies,domain,'.$id,
+ 'is_active' => 'required|boolean'
+ ]);
+
+ $data = request()->all();
+
+ $company = $this->company->findOrFail($id);
+
+ if ($company) {
+ $result = $company->update($data);
+
+ if ($result) {
+ session()->flash('success', 'Company Updated Successfully');
+ } else {
+ session()->flash('warning', 'Something went wrong');
+ }
+ } else {
+ session()->flash('warning', 'Something went wrong');
+ }
+
+ return redirect()->back();
+ }
+
+ protected function changeStatus($id)
+ {
+ $company = $this->company->find($id);
+
+ if ($company->is_active == 0) {
+ $company->update([
+ 'is_active' => 1
+ ]);
+
+ session()->flash('success', 'Company successfully activated');
+ } else {
+ $company->update([
+ 'is_active' => 0
+ ]);
+
+ session()->flash('warning', 'Company successfully deactivated');
+ }
+
+ return redirect()->back();
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Http/Controllers/Controller.php b/packages/Webkul/SAASCustomizer/src/Http/Controllers/Controller.php
new file mode 100755
index 000000000..b991f412d
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Http/Controllers/Controller.php
@@ -0,0 +1,13 @@
+ @prashant-webkul
+ * @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
+ */
+class PurgeController extends Controller
+{
+ protected $dataSeed;
+
+ public function __construct(DataPurger $dataSeed)
+ {
+ $this->dataSeed = $dataSeed;
+ $this->_config = request('_config');
+ }
+
+ public function seedDatabase()
+ {
+ if (session()->has('company')) {
+ session()->forget('company');
+ session()->regenerate();
+ }
+
+ $this->dataSeed->prepareLocaleData();
+ $this->dataSeed->prepareCategoryData(); //translation table not getting populated
+ $this->dataSeed->prepareInventoryData();
+ $this->dataSeed->prepareCurrencyData();
+ $this->dataSeed->prepareChannelData();
+
+ // need to get executed only first time
+ if (Company::count() == 1)
+ $this->dataSeed->prepareCountryStateData();
+
+ $this->dataSeed->prepareCustomerGroupData();
+ $this->dataSeed->prepareAttributeData();
+ $this->dataSeed->prepareAttributeFamilyData();
+ $this->dataSeed->prepareAttributeGroupData();
+
+ Event::fire('new.company.registered');
+
+ $this->dataSeed->setInstallationCompleteParam();
+ session()->flash('success', 'Store Created Successfully');
+
+ return redirect()->route('shop.home.index');
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Http/Controllers/SuperUserController.php b/packages/Webkul/SAASCustomizer/src/Http/Controllers/SuperUserController.php
new file mode 100644
index 000000000..7ff5fd08d
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Http/Controllers/SuperUserController.php
@@ -0,0 +1,69 @@
+ @prashant-webkul
+ * @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
+ */
+class SuperUserController extends Controller
+{
+ public function __construct()
+ {
+ $this->middleware('auth:super-admin', ['only' => ['list']]);
+ }
+
+ /**
+ * To show the login screen
+ */
+ public function index()
+ {
+ if (! auth()->guard('super-admin')->check()) {
+ return view('saas::companies.auth.login');
+ } else {
+ return redirect()->route('super.session.index');
+ }
+ }
+
+ public function store()
+ {
+ $this->validate(request(), [
+ 'email' => 'required|email',
+ 'password' => 'required'
+ ]);
+
+ if (! auth()->guard('super-admin')->attempt(request(['email', 'password']))) {
+ session()->flash('error', trans('admin::app.users.users.login-error'));
+
+ return redirect()->route('super.session.index');
+ }
+
+ session()->flash('success', 'Logged in successfully');
+
+ return redirect()->route('super.companies.index');
+ }
+
+ public function list()
+ {
+ return view('saas::companies.index');
+ }
+
+ /**
+ * Remove the specified resource from storage.
+ *
+ * @param int $id
+ * @return \Illuminate\Http\Response
+ */
+ public function destroy()
+ {
+ auth()->guard('super-admin')->logout();
+
+ return redirect()->route('super.session.index');
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Http/Middleware/ValidatesDomain.php b/packages/Webkul/SAASCustomizer/src/Http/Middleware/ValidatesDomain.php
new file mode 100644
index 000000000..a39cec879
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Http/Middleware/ValidatesDomain.php
@@ -0,0 +1,83 @@
+company = $company;
+ }
+
+ /**
+ * Handle an incoming request.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @param \Closure $next
+ * @return mixed
+ */
+ public function handle($request, Closure $next)
+ {
+ $primaryServerName = config('app.url');
+
+ $currentURL = $_SERVER['SERVER_NAME'];
+
+ $params['domain'] = $currentURL;
+
+ $validator = Validator::make($params, [
+ 'domain' => 'required|ip'
+ ]);
+
+ if (str_contains($primaryServerName, 'http://')) {
+ $primaryServerNameWithoutProtocol = explode('http://', $primaryServerName)[1];
+ } else if (str_contains($primaryServerName, 'https://')) {
+ $primaryServerNameWithoutProtocol = explode('https://', $primaryServerName)[1];
+ }
+
+ //restricts the IP address usage to access the system
+ if ($validator->fails()) {
+ //case where IP validation fails
+ if (str_contains($currentURL, 'http://')) {
+ $currentURL = explode('http://', $currentURL)[1];
+ } else if (str_contains($currentURL, 'http://')) {
+ $currentURL = explode('http://', $currentURL)[1];
+ }
+ } else {
+ //case where IP validation passes then it should redirect to the main domain
+ return redirect()->route('company.home.index');
+ }
+
+ if ($currentURL == $primaryServerNameWithoutProtocol) {
+ if (request()->is('company/*') || request()->is('super/*')) {
+ return $next($request);
+ } else {
+ return redirect()->route('company.create.index');
+ }
+ } else {
+ if ((request()->is('company/*') || request()->is('super/*')) && ! request()->is('company/seed-data')) {
+ throw new \Exception('not_allowed_to_visit_this_section', 400);
+ } else {
+ $company = $this->company->findWhere(['domain' => $currentURL]);
+
+ if (count($company) == 1) {
+ return $next($request);
+ } else if (count($company) == 0) {
+ throw new \Exception('domain_not_found', 400);
+ } else {
+ return $next($request);
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Listeners/CompanyRegistered.php b/packages/Webkul/SAASCustomizer/src/Listeners/CompanyRegistered.php
new file mode 100644
index 000000000..7dc5d9bb8
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Listeners/CompanyRegistered.php
@@ -0,0 +1,25 @@
+
+ * @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
+ */
+class CompanyRegistered
+{
+ public function handle()
+ {
+ $company = Company::getCurrent();
+
+ foreach(config('purge-pool') as $key => $pool) {
+ $poolInstance = app($pool);
+
+ $poolInstance->createPreOrderData($company->id);
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Models/Attribute/Attribute.php b/packages/Webkul/SAASCustomizer/src/Models/Attribute/Attribute.php
new file mode 100644
index 000000000..8e83a4dcd
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Models/Attribute/Attribute.php
@@ -0,0 +1,29 @@
+guard('super-admin')->check() || ! isset($company->id)) {
+ return new \Illuminate\Database\Eloquent\Builder($query);
+ } else {
+ return new \Illuminate\Database\Eloquent\Builder($query->where('attributes' . '.company_id', $company->id));
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Models/Attribute/AttributeFamily.php b/packages/Webkul/SAASCustomizer/src/Models/Attribute/AttributeFamily.php
new file mode 100755
index 000000000..ea11afed6
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Models/Attribute/AttributeFamily.php
@@ -0,0 +1,27 @@
+guard('super-admin')->check() || ! isset($company->id)) {
+ return new \Illuminate\Database\Eloquent\Builder($query);
+ } else {
+ return new \Illuminate\Database\Eloquent\Builder($query->where('attribute_families' . '.company_id', $company->id));
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Models/Attribute/AttributeGroup.php b/packages/Webkul/SAASCustomizer/src/Models/Attribute/AttributeGroup.php
new file mode 100755
index 000000000..c093338f9
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Models/Attribute/AttributeGroup.php
@@ -0,0 +1,29 @@
+guard('super-admin')->check() || ! isset($company->id)) {
+ return new \Illuminate\Database\Eloquent\Builder($query);
+ } else {
+ return new \Illuminate\Database\Eloquent\Builder($query->where('attribute_groups' . '.company_id', $company->id));
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Models/Attribute/AttributeOption.php b/packages/Webkul/SAASCustomizer/src/Models/Attribute/AttributeOption.php
new file mode 100755
index 000000000..83b435090
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Models/Attribute/AttributeOption.php
@@ -0,0 +1,20 @@
+guard('super-admin')->check() || ! isset($company->id)) {
+ return new QueryBuilder($query);
+ } else {
+ return new QueryBuilder($query->where('company_id', $company->id));
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Models/Category/CategoryTranslation.php b/packages/Webkul/SAASCustomizer/src/Models/Category/CategoryTranslation.php
new file mode 100755
index 000000000..aabdf4cb3
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Models/Category/CategoryTranslation.php
@@ -0,0 +1,29 @@
+where('category_translations' . '.company_id', $company->id));
+ // } else {
+ // return new \Illuminate\Database\Eloquent\Builder($query->where('category_translations' . '.company_id', null));
+ // }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Models/Checkout/Cart.php b/packages/Webkul/SAASCustomizer/src/Models/Checkout/Cart.php
new file mode 100755
index 000000000..02fc71c19
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Models/Checkout/Cart.php
@@ -0,0 +1,27 @@
+guard('super-admin')->check() || ! isset($company->id)) {
+ return new \Illuminate\Database\Eloquent\Builder($query);
+ } else {
+ return new \Illuminate\Database\Eloquent\Builder($query->where('cart' . '.company_id', $company->id));
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Models/Checkout/CartAddress.php b/packages/Webkul/SAASCustomizer/src/Models/Checkout/CartAddress.php
new file mode 100755
index 000000000..d99a015ee
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Models/Checkout/CartAddress.php
@@ -0,0 +1,22 @@
+hasOne(CompanyDetails::class);
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Models/CompanyDetails.php b/packages/Webkul/SAASCustomizer/src/Models/CompanyDetails.php
new file mode 100644
index 000000000..6776b912f
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Models/CompanyDetails.php
@@ -0,0 +1,17 @@
+guard('super-admin')->check() || ! isset($company->id)) {
+ return new \Illuminate\Database\Eloquent\Builder($query);
+ } else {
+ return new \Illuminate\Database\Eloquent\Builder($query->where('channels' . '.company_id', $company->id));
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Models/Core/CoreConfig.php b/packages/Webkul/SAASCustomizer/src/Models/Core/CoreConfig.php
new file mode 100755
index 000000000..29a185898
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Models/Core/CoreConfig.php
@@ -0,0 +1,27 @@
+guard('super-admin')->check() || ! isset($company->id)) {
+ return new \Illuminate\Database\Eloquent\Builder($query);
+ } else {
+ return new \Illuminate\Database\Eloquent\Builder($query->where('core_config' . '.company_id', $company->id));
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Models/Core/Currency.php b/packages/Webkul/SAASCustomizer/src/Models/Core/Currency.php
new file mode 100755
index 000000000..bd411bcc7
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Models/Core/Currency.php
@@ -0,0 +1,27 @@
+guard('super-admin')->check() || ! isset($company->id)) {
+ return new \Illuminate\Database\Eloquent\Builder($query);
+ } else {
+ return new \Illuminate\Database\Eloquent\Builder($query->where('currencies' . '.company_id', $company->id));
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Models/Core/CurrencyExchangeRate.php b/packages/Webkul/SAASCustomizer/src/Models/Core/CurrencyExchangeRate.php
new file mode 100755
index 000000000..96664a82d
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Models/Core/CurrencyExchangeRate.php
@@ -0,0 +1,27 @@
+guard('super-admin')->check() || ! isset($company->id)) {
+ return new \Illuminate\Database\Eloquent\Builder($query);
+ } else {
+ return new \Illuminate\Database\Eloquent\Builder($query->where('currency_exchange_rates' . '.company_id', $company->id));
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Models/Core/Locale.php b/packages/Webkul/SAASCustomizer/src/Models/Core/Locale.php
new file mode 100755
index 000000000..742b74f2a
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Models/Core/Locale.php
@@ -0,0 +1,28 @@
+guard('super-admin')->check() || ! isset($company->id)) {
+ return new \Illuminate\Database\Eloquent\Builder($query);
+ } else {
+ return new \Illuminate\Database\Eloquent\Builder($query->where('locales' . '.company_id', $company->id));
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Models/Core/Slider.php b/packages/Webkul/SAASCustomizer/src/Models/Core/Slider.php
new file mode 100755
index 000000000..845e18e99
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Models/Core/Slider.php
@@ -0,0 +1,27 @@
+guard('super-admin')->check() || ! isset($company->id)) {
+ return new \Illuminate\Database\Eloquent\Builder($query);
+ } else {
+ return new \Illuminate\Database\Eloquent\Builder($query->where('sliders' . '.company_id', $company->id));
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Models/Core/SubscribersList.php b/packages/Webkul/SAASCustomizer/src/Models/Core/SubscribersList.php
new file mode 100755
index 000000000..24a059c29
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Models/Core/SubscribersList.php
@@ -0,0 +1,27 @@
+guard('super-admin')->check() || ! isset($company->id)) {
+ return new \Illuminate\Database\Eloquent\Builder($query);
+ } else {
+ return new \Illuminate\Database\Eloquent\Builder($query->where('subscribers_list' . '.company_id', $company->id));
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Models/Customer/Customer.php b/packages/Webkul/SAASCustomizer/src/Models/Customer/Customer.php
new file mode 100755
index 000000000..eeba8ebb9
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Models/Customer/Customer.php
@@ -0,0 +1,27 @@
+guard('super-admin')->check() || ! isset($company->id)) {
+ return new \Illuminate\Database\Eloquent\Builder($query);
+ } else {
+ return new \Illuminate\Database\Eloquent\Builder($query->where('customers' . '.company_id', $company->id));
+ }
+ }
+}
diff --git a/packages/Webkul/SAASCustomizer/src/Models/Customer/CustomerAddress.php b/packages/Webkul/SAASCustomizer/src/Models/Customer/CustomerAddress.php
new file mode 100755
index 000000000..5a264fd2d
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Models/Customer/CustomerAddress.php
@@ -0,0 +1,28 @@
+guard('super-admin')->check() || ! isset($company->id)) {
+ return new \Illuminate\Database\Eloquent\Builder($query);
+ } else {
+ return new \Illuminate\Database\Eloquent\Builder($query->where('customer_addresses' . '.company_id', $company->id));
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Models/Customer/CustomerGroup.php b/packages/Webkul/SAASCustomizer/src/Models/Customer/CustomerGroup.php
new file mode 100755
index 000000000..e7e20599c
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Models/Customer/CustomerGroup.php
@@ -0,0 +1,27 @@
+guard('super-admin')->check() || ! isset($company->id)) {
+ return new \Illuminate\Database\Eloquent\Builder($query);
+ } else {
+ return new \Illuminate\Database\Eloquent\Builder($query->where('customer_groups' . '.company_id', $company->id));
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Models/Customer/Wishlist.php b/packages/Webkul/SAASCustomizer/src/Models/Customer/Wishlist.php
new file mode 100755
index 000000000..ccb4d0ca7
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Models/Customer/Wishlist.php
@@ -0,0 +1,29 @@
+guard('super-admin')->check() || ! isset($company->id)) {
+ return new \Illuminate\Database\Eloquent\Builder($query);
+ } else {
+ return new \Illuminate\Database\Eloquent\Builder($query->where('wishlist' . '.company_id', $company->id));
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Models/Discount/CartRule.php b/packages/Webkul/SAASCustomizer/src/Models/Discount/CartRule.php
new file mode 100644
index 000000000..c923e1b66
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Models/Discount/CartRule.php
@@ -0,0 +1,27 @@
+guard('super-admin')->check() || ! isset($company->id)) {
+ return new \Illuminate\Database\Eloquent\Builder($query);
+ } else {
+ return new \Illuminate\Database\Eloquent\Builder($query->where('cart_rules' . '.company_id', $company->id));
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Models/Inventory/InventorySource.php b/packages/Webkul/SAASCustomizer/src/Models/Inventory/InventorySource.php
new file mode 100755
index 000000000..00cc86c7a
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Models/Inventory/InventorySource.php
@@ -0,0 +1,27 @@
+guard('super-admin')->check() || ! isset($company->id)) {
+ return new \Illuminate\Database\Eloquent\Builder($query);
+ } else {
+ return new \Illuminate\Database\Eloquent\Builder($query->where('inventory_sources' . '.company_id', $company->id));
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Models/Product/Product.php b/packages/Webkul/SAASCustomizer/src/Models/Product/Product.php
new file mode 100755
index 000000000..3400c3333
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Models/Product/Product.php
@@ -0,0 +1,27 @@
+guard('super-admin')->check() || ! isset($company->id)) {
+ return new \Illuminate\Database\Eloquent\Builder($query);
+ } else {
+ return new \Illuminate\Database\Eloquent\Builder($query->where('products' . '.company_id', $company->id));
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Models/Product/ProductAttributeValue.php b/packages/Webkul/SAASCustomizer/src/Models/Product/ProductAttributeValue.php
new file mode 100755
index 000000000..aed510c1c
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Models/Product/ProductAttributeValue.php
@@ -0,0 +1,21 @@
+guard('super-admin')->check() || ! isset($company->id)) {
+ return new \Illuminate\Database\Eloquent\Builder($query);
+ } else {
+ return new \Illuminate\Database\Eloquent\Builder($query->where('product_flat' . '.company_id', $company->id));
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Models/Product/ProductImage.php b/packages/Webkul/SAASCustomizer/src/Models/Product/ProductImage.php
new file mode 100755
index 000000000..ca4a18ae6
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Models/Product/ProductImage.php
@@ -0,0 +1,21 @@
+guard('super-admin')->check() || ! isset($company->id)) {
+ return new \Illuminate\Database\Eloquent\Builder($query);
+ } else {
+ return new \Illuminate\Database\Eloquent\Builder($query->where('product_inventories' . '.company_id', $company->id));
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Models/Product/ProductOrderedInventory.php b/packages/Webkul/SAASCustomizer/src/Models/Product/ProductOrderedInventory.php
new file mode 100644
index 000000000..a72e4f284
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Models/Product/ProductOrderedInventory.php
@@ -0,0 +1,21 @@
+guard('super-admin')->check() || ! isset($company->id)) {
+ return new \Illuminate\Database\Eloquent\Builder($query);
+ } else {
+ return new \Illuminate\Database\Eloquent\Builder($query->where('product_reviews' . '.company_id', $company->id));
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Models/Sales/Invoice.php b/packages/Webkul/SAASCustomizer/src/Models/Sales/Invoice.php
new file mode 100755
index 000000000..004f8eb9c
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Models/Sales/Invoice.php
@@ -0,0 +1,27 @@
+guard('super-admin')->check() || ! isset($company->id)) {
+ return new \Illuminate\Database\Eloquent\Builder($query);
+ } else {
+ return new \Illuminate\Database\Eloquent\Builder($query->where('invoices' . '.company_id', $company->id));
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Models/Sales/InvoiceItem.php b/packages/Webkul/SAASCustomizer/src/Models/Sales/InvoiceItem.php
new file mode 100755
index 000000000..fc92be1e8
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Models/Sales/InvoiceItem.php
@@ -0,0 +1,27 @@
+guard('super-admin')->check() || ! isset($company->id)) {
+ return new \Illuminate\Database\Eloquent\Builder($query);
+ } else {
+ return new \Illuminate\Database\Eloquent\Builder($query->where('invoice_items' . '.company_id', $company->id));
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Models/Sales/Order.php b/packages/Webkul/SAASCustomizer/src/Models/Sales/Order.php
new file mode 100755
index 000000000..e456167f7
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Models/Sales/Order.php
@@ -0,0 +1,27 @@
+guard('super-admin')->check() || ! isset($company->id)) {
+ return new \Illuminate\Database\Eloquent\Builder($query);
+ } else {
+ return new \Illuminate\Database\Eloquent\Builder($query->where('orders' . '.company_id', $company->id));
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Models/Sales/OrderAddress.php b/packages/Webkul/SAASCustomizer/src/Models/Sales/OrderAddress.php
new file mode 100755
index 000000000..d5d7cb4be
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Models/Sales/OrderAddress.php
@@ -0,0 +1,27 @@
+guard('super-admin')->check() || ! isset($company->id)) {
+ return new \Illuminate\Database\Eloquent\Builder($query);
+ } else {
+ return new \Illuminate\Database\Eloquent\Builder($query->where('order_address' . '.company_id', $company->id));
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Models/Sales/OrderItem.php b/packages/Webkul/SAASCustomizer/src/Models/Sales/OrderItem.php
new file mode 100755
index 000000000..265c083b4
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Models/Sales/OrderItem.php
@@ -0,0 +1,27 @@
+guard('super-admin')->check() || ! isset($company->id)) {
+ return new \Illuminate\Database\Eloquent\Builder($query);
+ } else {
+ return new \Illuminate\Database\Eloquent\Builder($query->where('order_items' . '.company_id', $company->id));
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Models/Sales/OrderPayment.php b/packages/Webkul/SAASCustomizer/src/Models/Sales/OrderPayment.php
new file mode 100755
index 000000000..25f6fcb39
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Models/Sales/OrderPayment.php
@@ -0,0 +1,27 @@
+guard('super-admin')->check() || ! isset($company->id)) {
+ return new \Illuminate\Database\Eloquent\Builder($query);
+ } else {
+ return new \Illuminate\Database\Eloquent\Builder($query->where('order_payment' . '.company_id', $company->id));
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Models/Sales/Shipment.php b/packages/Webkul/SAASCustomizer/src/Models/Sales/Shipment.php
new file mode 100755
index 000000000..6de5aba03
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Models/Sales/Shipment.php
@@ -0,0 +1,26 @@
+guard('super-admin')->check() || ! isset($company->id)) {
+ return new \Illuminate\Database\Eloquent\Builder($query);
+ } else {
+ return new \Illuminate\Database\Eloquent\Builder($query->where('shipments' . '.company_id', $company->id));
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Models/Sales/ShipmentItem.php b/packages/Webkul/SAASCustomizer/src/Models/Sales/ShipmentItem.php
new file mode 100755
index 000000000..40616890c
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Models/Sales/ShipmentItem.php
@@ -0,0 +1,28 @@
+guard('super-admin')->check() || ! isset($company->id)) {
+ return new \Illuminate\Database\Eloquent\Builder($query);
+ } else {
+ return new \Illuminate\Database\Eloquent\Builder($query->where('shipment_items' . '.company_id', $company->id));
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Models/StripeConnect/StripeConnect.php b/packages/Webkul/SAASCustomizer/src/Models/StripeConnect/StripeConnect.php
new file mode 100644
index 000000000..c0124f2a0
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Models/StripeConnect/StripeConnect.php
@@ -0,0 +1,27 @@
+guard('super-admin')->check() || ! isset($company->id)) {
+ return new \Illuminate\Database\Eloquent\Builder($query);
+ } else {
+ return new \Illuminate\Database\Eloquent\Builder($query->where('stripe_companies' . '.company_id', $company->id));
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Models/SuperAdmin.php b/packages/Webkul/SAASCustomizer/src/Models/SuperAdmin.php
new file mode 100644
index 000000000..7f18d8046
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Models/SuperAdmin.php
@@ -0,0 +1,25 @@
+guard('super-admin')->check() || ! isset($company->id)) {
+ return new \Illuminate\Database\Eloquent\Builder($query);
+ } else {
+ return new \Illuminate\Database\Eloquent\Builder($query->where('tax_categories' . '.company_id', $company->id));
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Models/Tax/TaxMap.php b/packages/Webkul/SAASCustomizer/src/Models/Tax/TaxMap.php
new file mode 100755
index 000000000..edfc19709
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Models/Tax/TaxMap.php
@@ -0,0 +1,19 @@
+guard('super-admin')->check() || ! isset($company->id)) {
+ return new \Illuminate\Database\Eloquent\Builder($query);
+ } else {
+ return new \Illuminate\Database\Eloquent\Builder($query->where('tax_rates' . '.company_id', $company->id));
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Models/User/Admin.php b/packages/Webkul/SAASCustomizer/src/Models/User/Admin.php
new file mode 100755
index 000000000..7bb89f68d
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Models/User/Admin.php
@@ -0,0 +1,36 @@
+guard('super-admin')->check() || ! isset($company->id)) {
+ return new \Illuminate\Database\Eloquent\Builder($query);
+ } else {
+ return new \Illuminate\Database\Eloquent\Builder($query->where('admins' . '.company_id', $company->id));
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Models/User/Role.php b/packages/Webkul/SAASCustomizer/src/Models/User/Role.php
new file mode 100755
index 000000000..df08164cd
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Models/User/Role.php
@@ -0,0 +1,30 @@
+guard('super-admin')->check() || ! isset($company->id)) {
+ return new \Illuminate\Database\Eloquent\Builder($query);
+ } else {
+ return new \Illuminate\Database\Eloquent\Builder($query->where('roles' . '.company_id', $company->id));
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/Attribute/AttributeFamilyObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/Attribute/AttributeFamilyObserver.php
new file mode 100755
index 000000000..585f3f1a6
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/Attribute/AttributeFamilyObserver.php
@@ -0,0 +1,17 @@
+guard('super-admin')->check()) {
+ $model->company_id = Company::getCurrent()->id;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/Attribute/AttributeGroupObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/Attribute/AttributeGroupObserver.php
new file mode 100755
index 000000000..4ad9953bb
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/Attribute/AttributeGroupObserver.php
@@ -0,0 +1,17 @@
+guard('super-admin')->check()) {
+ $model->company_id = Company::getCurrent()->id;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/Attribute/AttributeObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/Attribute/AttributeObserver.php
new file mode 100644
index 000000000..373166f17
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/Attribute/AttributeObserver.php
@@ -0,0 +1,17 @@
+guard('super-admin')->check()) {
+ $model->company_id = Company::getCurrent()->id;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/Attribute/AttributeOptionObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/Attribute/AttributeOptionObserver.php
new file mode 100755
index 000000000..772af5a1a
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/Attribute/AttributeOptionObserver.php
@@ -0,0 +1,15 @@
+guard('super-admin')->check()) {
+ $model->company_id = Company::getCurrent()->id;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/Category/CategoryTranslationObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/Category/CategoryTranslationObserver.php
new file mode 100755
index 000000000..48401125f
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/Category/CategoryTranslationObserver.php
@@ -0,0 +1,17 @@
+guard('super-admin')->check()) {
+ $model->company_id = Company::getCurrent()->id;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/Checkout/CartAddressObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/Checkout/CartAddressObserver.php
new file mode 100755
index 000000000..9fa15b4d8
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/Checkout/CartAddressObserver.php
@@ -0,0 +1,14 @@
+guard('super-admin')->check()) {
+ $model->company_id = Company::getCurrent()->id;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/Checkout/CartPaymentObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/Checkout/CartPaymentObserver.php
new file mode 100755
index 000000000..b5cabeb88
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/Checkout/CartPaymentObserver.php
@@ -0,0 +1,14 @@
+guard('super-admin')->check()) {
+ if ($model->count() == 0) {
+ $model->company_id = Company::getCurrent()->id;
+ } else {
+ session()->flash('error', 'Creating more than one channel is not allowed');
+
+ abort(404);
+ }
+ }
+ }
+
+ public function updating(Channel $channel)
+ {
+ if (! auth()->guard('super-admin')->check()) {
+ if ($channel->hostname != Company::getCurrent()->domain) {
+ session()->flash('warning', 'Kindly contact admin to change your hostname');
+
+ abort(404);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/Core/CoreConfigObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/Core/CoreConfigObserver.php
new file mode 100755
index 000000000..18d7f693f
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/Core/CoreConfigObserver.php
@@ -0,0 +1,17 @@
+guard('super-admin')->check()) {
+ $model->company_id = Company::getCurrent()->id;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/Core/CurrencyExchangeRate.php b/packages/Webkul/SAASCustomizer/src/Observers/Core/CurrencyExchangeRate.php
new file mode 100755
index 000000000..1a4602a90
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/Core/CurrencyExchangeRate.php
@@ -0,0 +1,17 @@
+guard('super-admin')->check()) {
+ $model->company_id = Company::getCurrent()->id;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/Core/CurrencyObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/Core/CurrencyObserver.php
new file mode 100755
index 000000000..29093a218
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/Core/CurrencyObserver.php
@@ -0,0 +1,17 @@
+guard('super-admin')->check()) {
+ $model->company_id = Company::getCurrent()->id;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/Core/LocaleObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/Core/LocaleObserver.php
new file mode 100755
index 000000000..1845d5da9
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/Core/LocaleObserver.php
@@ -0,0 +1,32 @@
+guard('super-admin')->check()) {
+ if ($model->count() == 0) {
+ $model->company_id = Company::getCurrent()->id;
+ } else {
+ session()->flash('error', 'Creating locale other than English is not allowed');
+
+ abort(404);
+ }
+ }
+ }
+
+ public function deleting(Locale $model)
+ {
+ if ($model->count() == 1) {
+ session()->flash('error', 'Cannot delete the Locale');
+ }
+
+ return false;
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/Core/SliderObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/Core/SliderObserver.php
new file mode 100755
index 000000000..626804026
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/Core/SliderObserver.php
@@ -0,0 +1,17 @@
+guard('super-admin')->check()) {
+ $model->company_id = Company::getCurrent()->id;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/Core/SubscribersListObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/Core/SubscribersListObserver.php
new file mode 100755
index 000000000..3927f0c28
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/Core/SubscribersListObserver.php
@@ -0,0 +1,17 @@
+guard('super-admin')->check()) {
+ $model->company_id = Company::getCurrent()->id;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/Customer/CustomerAddressObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/Customer/CustomerAddressObserver.php
new file mode 100755
index 000000000..8688abc8a
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/Customer/CustomerAddressObserver.php
@@ -0,0 +1,17 @@
+guard('super-admin')->check()) {
+ $model->company_id = Company::getCurrent()->id;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/Customer/CustomerGroupObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/Customer/CustomerGroupObserver.php
new file mode 100755
index 000000000..88502367f
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/Customer/CustomerGroupObserver.php
@@ -0,0 +1,17 @@
+guard('super-admin')->check()) {
+ $model->company_id = Company::getCurrent()->id;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/Customer/CustomerObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/Customer/CustomerObserver.php
new file mode 100755
index 000000000..da4047acd
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/Customer/CustomerObserver.php
@@ -0,0 +1,17 @@
+guard('super-admin')->check()) {
+ $model->company_id = Company::getCurrent()->id;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/Customer/WishlistObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/Customer/WishlistObserver.php
new file mode 100755
index 000000000..8231249b4
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/Customer/WishlistObserver.php
@@ -0,0 +1,17 @@
+guard('super-admin')->check()) {
+ $model->company_id = Company::getCurrent()->id;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/Discount/CartRuleObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/Discount/CartRuleObserver.php
new file mode 100644
index 000000000..d0e24586c
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/Discount/CartRuleObserver.php
@@ -0,0 +1,17 @@
+guard('super-admin')->check()) {
+ $model->company_id = Company::getCurrent()->id;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/Inventory/InventorySourceObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/Inventory/InventorySourceObserver.php
new file mode 100755
index 000000000..c097a23c4
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/Inventory/InventorySourceObserver.php
@@ -0,0 +1,17 @@
+guard('super-admin')->check()) {
+ $model->company_id = Company::getCurrent()->id;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/Product/ProductAttributeValueObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/Product/ProductAttributeValueObserver.php
new file mode 100755
index 000000000..987cf6a27
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/Product/ProductAttributeValueObserver.php
@@ -0,0 +1,17 @@
+guard('super-admin')->check()) {
+ $model->company_id = Company::getCurrent()->id;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/Product/ProductFlatObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/Product/ProductFlatObserver.php
new file mode 100644
index 000000000..b1cf611e1
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/Product/ProductFlatObserver.php
@@ -0,0 +1,17 @@
+guard('super-admin')->check()) {
+ $model->company_id = Company::getCurrent()->id;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/Product/ProductImageObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/Product/ProductImageObserver.php
new file mode 100755
index 000000000..dcf8f2efb
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/Product/ProductImageObserver.php
@@ -0,0 +1,17 @@
+guard('super-admin')->check()) {
+ // $model->company_id = Company::getCurrent()->id;
+ // }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/Product/ProductInventoryObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/Product/ProductInventoryObserver.php
new file mode 100755
index 000000000..6eb7221a7
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/Product/ProductInventoryObserver.php
@@ -0,0 +1,17 @@
+guard('super-admin')->check()) {
+ $model->company_id = Company::getCurrent()->id;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/Product/ProductObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/Product/ProductObserver.php
new file mode 100755
index 000000000..eeb66731d
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/Product/ProductObserver.php
@@ -0,0 +1,17 @@
+guard('super-admin')->check()) {
+ $model->company_id = Company::getCurrent()->id;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/Product/ProductOrderedInventoryObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/Product/ProductOrderedInventoryObserver.php
new file mode 100644
index 000000000..568a56dd9
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/Product/ProductOrderedInventoryObserver.php
@@ -0,0 +1,14 @@
+guard('super-admin')->check()) {
+ $model->company_id = Company::getCurrent()->id;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/Product/ProductSalableInventoryObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/Product/ProductSalableInventoryObserver.php
new file mode 100644
index 000000000..d43283012
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/Product/ProductSalableInventoryObserver.php
@@ -0,0 +1,14 @@
+guard('super-admin')->check()) {
+ $model->company_id = Company::getCurrent()->id;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/Sales/InvoiceObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/Sales/InvoiceObserver.php
new file mode 100755
index 000000000..304b1fa42
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/Sales/InvoiceObserver.php
@@ -0,0 +1,17 @@
+guard('super-admin')->check()) {
+ $model->company_id = Company::getCurrent()->id;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/Sales/OrderAddressObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/Sales/OrderAddressObserver.php
new file mode 100755
index 000000000..737153040
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/Sales/OrderAddressObserver.php
@@ -0,0 +1,17 @@
+guard('super-admin')->check()) {
+ $model->company_id = Company::getCurrent()->id;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/Sales/OrderItemInventoryObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/Sales/OrderItemInventoryObserver.php
new file mode 100755
index 000000000..c41fb3d40
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/Sales/OrderItemInventoryObserver.php
@@ -0,0 +1,17 @@
+guard('super-admin')->check()) {
+ $model->company_id = Company::getCurrent()->id;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/Sales/OrderItemObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/Sales/OrderItemObserver.php
new file mode 100755
index 000000000..f8ad1ca50
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/Sales/OrderItemObserver.php
@@ -0,0 +1,17 @@
+guard('super-admin')->check()) {
+ $model->company_id = Company::getCurrent()->id;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/Sales/OrderObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/Sales/OrderObserver.php
new file mode 100755
index 000000000..253f278ae
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/Sales/OrderObserver.php
@@ -0,0 +1,17 @@
+guard('super-admin')->check()) {
+ $model->company_id = Company::getCurrent()->id;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/Sales/OrderPaymentObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/Sales/OrderPaymentObserver.php
new file mode 100755
index 000000000..f29aa2906
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/Sales/OrderPaymentObserver.php
@@ -0,0 +1,17 @@
+guard('super-admin')->check()) {
+ $model->company_id = Company::getCurrent()->id;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/Sales/ShipmentItemObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/Sales/ShipmentItemObserver.php
new file mode 100755
index 000000000..be48d8846
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/Sales/ShipmentItemObserver.php
@@ -0,0 +1,17 @@
+guard('super-admin')->check()) {
+ // $model->company_id = Company::getCurrent()->id;
+ // }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/Sales/ShipmentObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/Sales/ShipmentObserver.php
new file mode 100755
index 000000000..673166373
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/Sales/ShipmentObserver.php
@@ -0,0 +1,16 @@
+guard('super-admin')->check()) {
+ $model->company_id = Company::getCurrent()->id;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/StripeConnect/StripeConnectObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/StripeConnect/StripeConnectObserver.php
new file mode 100644
index 000000000..93e73b65a
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/StripeConnect/StripeConnectObserver.php
@@ -0,0 +1,17 @@
+guard('super-admin')->check()) {
+ $model->company_id = Company::getCurrent()->id;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/Tax/TaxCategoryObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/Tax/TaxCategoryObserver.php
new file mode 100755
index 000000000..20bd17286
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/Tax/TaxCategoryObserver.php
@@ -0,0 +1,17 @@
+guard('super-admin')->check()) {
+ $model->company_id = Company::getCurrent()->id;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/Tax/TaxRateObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/Tax/TaxRateObserver.php
new file mode 100755
index 000000000..9697c449b
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/Tax/TaxRateObserver.php
@@ -0,0 +1,17 @@
+guard('super-admin')->check()) {
+ $model->company_id = Company::getCurrent()->id;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/User/AdminObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/User/AdminObserver.php
new file mode 100755
index 000000000..00d4e3de9
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/User/AdminObserver.php
@@ -0,0 +1,19 @@
+company_id)) {
+ $model->company_id = Company::getCurrent()->id;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Observers/User/RoleObserver.php b/packages/Webkul/SAASCustomizer/src/Observers/User/RoleObserver.php
new file mode 100755
index 000000000..2214fd267
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Observers/User/RoleObserver.php
@@ -0,0 +1,19 @@
+company_id)) {
+ $model->company_id = Company::getCurrent()->id;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Providers/EventServiceProvider.php b/packages/Webkul/SAASCustomizer/src/Providers/EventServiceProvider.php
new file mode 100644
index 000000000..ee16a2bb2
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Providers/EventServiceProvider.php
@@ -0,0 +1,19 @@
+loadRoutesFrom(__DIR__.'/../Routes/web.php');
+
+ $this->loadTranslationsFrom(__DIR__ . '/../Resources/lang', 'saas');
+
+ $this->loadMigrationsFrom(__DIR__ . '/../Database/Migrations');
+
+ $this->loadViewsFrom(__DIR__ . '/../Resources/views', 'saas');
+
+ //over ride system's default validation
+ $this->registerPresenceVerifier();
+
+ //over ride system's default validation DB presence verifier
+ $this->registerValidationFactory();
+
+ //model observer for all the core models of Bagisto
+ $this->bootModelObservers();
+
+ //over ride all existing core models of Bagisto
+ $this->overrideModels();
+
+ $this->app->bind(
+ ExceptionHandler::class,
+ Handler::class
+ );
+
+ $this->composeView();
+
+ $this->app->register(EventServiceProvider::class);
+
+ $this->app->register(ModuleServiceProvider::class);
+ }
+
+ /**
+ * Compose View
+ */
+ public function composeView()
+ {
+ view()->composer(['saas::companies.layouts.nav-left', 'saas::companies.layouts.nav-aside'], function ($view) {
+ $tree = Tree::create();
+
+ foreach (config('menu.super-admin') as $index => $item) {
+ $tree->add($item, 'menu');
+ }
+
+ $tree->items = core()->sortItems($tree->items);
+
+ $view->with('menu', $tree);
+ });
+ }
+
+ /**
+ * Register services.
+ *
+ * @return void
+ */
+ public function register()
+ {
+ $this->registerConfig();
+
+ $this->registerFacades();
+
+ //override DB facade
+ $this->app->singleton('db', function ($app) {
+ return new \Webkul\SAASCustomizer\Database\DatabaseManager($app, $app['db.factory']);
+ });
+
+ $this->commands($this->commands);
+ }
+
+ public function registerConfig()
+ {
+ $this->mergeConfigFrom(
+ dirname(__DIR__) . '/Config/super-menu.php', 'menu.super-admin'
+ );
+ }
+
+ /**
+ * Register the validation factory.
+ *
+ * @return void
+ */
+ protected function registerValidationFactory()
+ {
+ $this->app->singleton('validator', function ($app) {
+ $validator = new \Illuminate\Validation\Factory($app['translator'], $app);
+
+ // The validation presence verifier is responsible for determining the existence of
+ // values in a given data collection which is typically a relational database or
+ // other persistent data stores. It is used to check for "uniqueness" as well.
+ if (isset($app['db'], $app['validation.presence'])) {
+ $validator->setPresenceVerifier($app['validation.presence']);
+ }
+
+ return $validator;
+ });
+ }
+
+ /**
+ * Register the database presence verifier.
+ *
+ * @return void
+ */
+ protected function registerPresenceVerifier()
+ {
+ $this->app->singleton('validation.presence', function ($app) {
+ return new \Webkul\SAASCustomizer\Validation\DatabasePresenceVerifier($app['db']);
+ });
+ }
+
+
+ /**
+ * Register Bouncer as a singleton.
+ *
+ * @return void
+ */
+ protected function registerFacades()
+ {
+ $loader = AliasLoader::getInstance();
+ $loader->alias('company', CompanyFacade::class);
+
+ $this->app->singleton('company', function () {
+ return app()->make(Company::class);
+ });
+ }
+
+ /**
+ * Override the existing models
+ */
+ public function overrideModels()
+ {
+ // Attribute Models Starts
+ $this->app->concord->registerModel(\Webkul\Attribute\Contracts\Attribute::class, \Webkul\SAASCustomizer\Models\Attribute\Attribute::class);
+ $this->app->concord->registerModel(\Webkul\Attribute\Contracts\AttributeFamily::class, \Webkul\SAASCustomizer\Models\Attribute\AttributeFamily::class);
+ $this->app->concord->registerModel(\Webkul\Attribute\Contracts\AttributeGroup::class, \Webkul\SAASCustomizer\Models\Attribute\AttributeGroup::class);
+ $this->app->concord->registerModel(\Webkul\Attribute\Contracts\AttributeOption::class, \Webkul\SAASCustomizer\Models\Attribute\AttributeOption::class);
+ $this->app->concord->registerModel(\Webkul\Attribute\Contracts\AttributeOptionTranslation::class, \Webkul\SAASCustomizer\Models\Attribute\AttributeOptionTranslation::class);
+ $this->app->concord->registerModel(\Webkul\Attribute\Contracts\AttributeTranslation::class, \Webkul\SAASCustomizer\Models\Attribute\AttributeTranslation::class);
+
+ // Category Models Starts
+ $this->app->concord->registerModel(\Webkul\Category\Contracts\Category::class, \Webkul\SAASCustomizer\Models\Category\Category::class);
+ $this->app->concord->registerModel(\Webkul\Category\Contracts\CategoryTranslation::class, \Webkul\SAASCustomizer\Models\Category\CategoryTranslation::class);
+
+ // Checkout Models Starts
+ $this->app->concord->registerModel(\Webkul\Checkout\Contracts\Cart::class, \Webkul\SAASCustomizer\Models\Checkout\Cart::class);
+ $this->app->concord->registerModel(\Webkul\Checkout\Contracts\CartAddress::class, \Webkul\SAASCustomizer\Models\Checkout\CartAddress::class);
+ $this->app->concord->registerModel(\Webkul\Checkout\Contracts\CartItem::class, \Webkul\SAASCustomizer\Models\Checkout\CartItem::class);
+ $this->app->concord->registerModel(\Webkul\Checkout\Contracts\CartPayment::class, \Webkul\SAASCustomizer\Models\Checkout\CartPayment::class);
+ $this->app->concord->registerModel(\Webkul\Checkout\Contracts\CartShippingRate::class, \Webkul\SAASCustomizer\Models\Checkout\CartShippingRate::class);
+
+ // Core Models Starts
+ $this->app->concord->registerModel(\Webkul\Core\Contracts\Channel::class, \Webkul\SAASCustomizer\Models\Core\Channel::class);
+ $this->app->concord->registerModel(\Webkul\Core\Contracts\CoreConfig::class, \Webkul\SAASCustomizer\Models\Core\CoreConfig::class);
+ $this->app->concord->registerModel(\Webkul\Core\Contracts\Currency::class, \Webkul\SAASCustomizer\Models\Core\Currency::class);
+ $this->app->concord->registerModel(\Webkul\Core\Contracts\CurrencyExchangeRate::class, \Webkul\SAASCustomizer\Models\Core\CurrencyExchangeRate::class);
+ $this->app->concord->registerModel(\Webkul\Core\Contracts\Locale::class, \Webkul\SAASCustomizer\Models\Core\Locale::class);
+ $this->app->concord->registerModel(\Webkul\Core\Contracts\Slider::class, \Webkul\SAASCustomizer\Models\Core\Slider::class);
+ $this->app->concord->registerModel(\Webkul\Core\Contracts\SubscribersList::class, \Webkul\SAASCustomizer\Models\Core\SubscribersList::class);
+
+ // Customer Models Starts
+ $this->app->concord->registerModel(\Webkul\Customer\Contracts\Customer::class, \Webkul\SAASCustomizer\Models\Customer\Customer::class);
+ $this->app->concord->registerModel(\Webkul\Customer\Contracts\CustomerAddress::class, \Webkul\SAASCustomizer\Models\Customer\CustomerAddress::class);
+ $this->app->concord->registerModel(\Webkul\Customer\Contracts\CustomerGroup::class, \Webkul\SAASCustomizer\Models\Customer\CustomerGroup::class);
+ $this->app->concord->registerModel(\Webkul\Customer\Contracts\Wishlist::class, \Webkul\SAASCustomizer\Models\Customer\Wishlist::class);
+
+ // Inventory Models Starts
+ $this->app->concord->registerModel(\Webkul\Inventory\Contracts\InventorySource::class, \Webkul\SAASCustomizer\Models\Inventory\InventorySource::class);
+
+ // Product Models Starts
+ $this->app->concord->registerModel(\Webkul\Product\Contracts\Product::class, \Webkul\SAASCustomizer\Models\Product\Product::class);
+ $this->app->concord->registerModel(\Webkul\Product\Contracts\ProductAttributeValue::class, \Webkul\SAASCustomizer\Models\Product\ProductAttributeValue::class);
+ $this->app->concord->registerModel(\Webkul\Product\Contracts\ProductFlat::class, \Webkul\SAASCustomizer\Models\Product\ProductFlat::class);
+ $this->app->concord->registerModel(\Webkul\Product\Contracts\ProductImage::class, \Webkul\SAASCustomizer\Models\Product\ProductImage::class);
+ $this->app->concord->registerModel(\Webkul\Product\Contracts\ProductInventory::class, \Webkul\SAASCustomizer\Models\Product\ProductInventory::class);
+
+ $this->app->concord->registerModel(\Webkul\Product\Contracts\ProductOrderedInventory::class, \Webkul\SAASCustomizer\Models\Product\ProductOrderedInventory::class);
+ $this->app->concord->registerModel(\Webkul\Product\Contracts\ProductReview::class, \Webkul\SAASCustomizer\Models\Product\ProductReview::class);
+
+ // Sales Models Starts
+ $this->app->concord->registerModel(\Webkul\Sales\Contracts\Invoice::class, \Webkul\SAASCustomizer\Models\Sales\Invoice::class);
+ $this->app->concord->registerModel(\Webkul\Sales\Contracts\InvoiceItem::class, \Webkul\SAASCustomizer\Models\Sales\InvoiceItem::class);
+ $this->app->concord->registerModel(\Webkul\Sales\Contracts\Order::class, \Webkul\SAASCustomizer\Models\Sales\Order::class);
+ $this->app->concord->registerModel(\Webkul\Sales\Contracts\OrderAddress::class, \Webkul\SAASCustomizer\Models\Sales\OrderAddress::class);
+ $this->app->concord->registerModel(\Webkul\Sales\Contracts\OrderItem::class, \Webkul\SAASCustomizer\Models\Sales\OrderItem::class);
+ $this->app->concord->registerModel(\Webkul\Sales\Contracts\OrderPayment::class, \Webkul\SAASCustomizer\Models\Sales\OrderPayment::class);
+ $this->app->concord->registerModel(\Webkul\Sales\Contracts\Shipment::class, \Webkul\SAASCustomizer\Models\Sales\Shipment::class);
+ // $this->app->concord->registerModel(\Webkul\Sales\Contracts\ShipmentItem::class, \Webkul\SAASCustomizer\Models\Sales\ShipmentItem::class);
+
+ // Tax Models Starts
+ $this->app->concord->registerModel(\Webkul\Tax\Contracts\TaxCategory::class, \Webkul\SAASCustomizer\Models\Tax\TaxCategory::class);
+ $this->app->concord->registerModel(\Webkul\Tax\Contracts\TaxMap::class, \Webkul\SAASCustomizer\Models\Tax\TaxMap::class);
+ $this->app->concord->registerModel(\Webkul\Tax\Contracts\TaxRate::class, \Webkul\SAASCustomizer\Models\Tax\TaxRate::class);
+
+ // User Models Starts
+ $this->app->concord->registerModel(\Webkul\User\Contracts\Admin::class, \Webkul\SAASCustomizer\Models\User\Admin::class);
+ $this->app->concord->registerModel(\Webkul\User\Contracts\Role::class, \Webkul\SAASCustomizer\Models\User\Role::class);
+
+ //Stripe Connect Model
+ $this->app->concord->registerModel(\Webkul\StripeConnect\Contracts\StripeConnect::class, \Webkul\SAASCustomizer\Models\StripeConnect\StripeConnect::class);
+
+ //Discount Model
+ $this->app->concord->registerModel(\Webkul\Discount\Contracts\CartRule::class, \Webkul\SAASCustomizer\Models\Discount\CartRule::class);
+ }
+
+ /**
+ * Boot all the model observers
+ */
+ public function bootModelObservers()
+ {
+ \Webkul\SAASCustomizer\Models\Attribute\Attribute::observe(\Webkul\SAASCustomizer\Observers\Attribute\AttributeObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Attribute\AttributeFamily::observe(\Webkul\SAASCustomizer\Observers\Attribute\AttributeFamilyObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Attribute\AttributeGroup::observe(\Webkul\SAASCustomizer\Observers\Attribute\AttributeGroupObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Attribute\AttributeOption::observe(\Webkul\SAASCustomizer\Observers\Attribute\AttributeOptionObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Attribute\AttributeOptionTranslation::observe(\Webkul\SAASCustomizer\Observers\Attribute\AttributeOptionTranslationObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Attribute\AttributeTranslation::observe(\Webkul\SAASCustomizer\Observers\Attribute\AttributeTranslationObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Category\Category::observe(\Webkul\SAASCustomizer\Observers\Category\CategoryObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Category\CategoryTranslation::observe(\Webkul\SAASCustomizer\Observers\Category\CategoryTranslationObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Checkout\Cart::observe(\Webkul\SAASCustomizer\Observers\Checkout\CartObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Checkout\CartAddress::observe(\Webkul\SAASCustomizer\Observers\Checkout\CartAddressObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Checkout\CartItem::observe(\Webkul\SAASCustomizer\Observers\Checkout\CartItemObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Checkout\CartPayment::observe(\Webkul\SAASCustomizer\Observers\Checkout\CartPaymentObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Checkout\CartShippingRate::observe(\Webkul\SAASCustomizer\Observers\Checkout\CartShippingRateObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Core\Channel::observe(\Webkul\SAASCustomizer\Observers\Core\ChannelObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Core\CoreConfig::observe(\Webkul\SAASCustomizer\Observers\Core\CoreConfigObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Core\Currency::observe(\Webkul\SAASCustomizer\Observers\Core\CurrencyObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Core\CurrencyExchangeRate::observe(\Webkul\SAASCustomizer\Observers\Core\CurrencyExchangeRateObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Core\Locale::observe(\Webkul\SAASCustomizer\Observers\Core\LocaleObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Core\Slider::observe(\Webkul\SAASCustomizer\Observers\Core\SliderObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Core\SubscribersList::observe(\Webkul\SAASCustomizer\Observers\Core\SubscribersListObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Customer\Customer::observe(\Webkul\SAASCustomizer\Observers\Customer\CustomerObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Customer\CustomerAddress::observe(\Webkul\SAASCustomizer\Observers\Customer\CustomerAddressObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Customer\CustomerGroup::observe(\Webkul\SAASCustomizer\Observers\Customer\CustomerGroupObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Customer\Wishlist::observe(\Webkul\SAASCustomizer\Observers\Customer\WishlistObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Inventory\InventorySource::observe(\Webkul\SAASCustomizer\Observers\Inventory\InventorySourceObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Product\Product::observe(\Webkul\SAASCustomizer\Observers\Product\ProductObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Product\ProductAttributeValue::observe(\Webkul\SAASCustomizer\Observers\Product\ProductAttributeValueObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Product\ProductFlat::observe(\Webkul\SAASCustomizer\Observers\Product\ProductFlatObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Product\ProductImage::observe(\Webkul\SAASCustomizer\Observers\Product\ProductImageObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Product\ProductInventory::observe(\Webkul\SAASCustomizer\Observers\Product\ProductInventoryObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Product\ProductOrderedInventory::observe(\Webkul\SAASCustomizer\Observers\Product\ProductOrderedInventoryObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Product\ProductReview::observe(\Webkul\SAASCustomizer\Observers\Product\ProductReviewObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Sales\Invoice::observe(\Webkul\SAASCustomizer\Observers\Sales\InvoiceObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Sales\InvoiceItem::observe(\Webkul\SAASCustomizer\Observers\Sales\InvoiceItemObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Sales\Order::observe(\Webkul\SAASCustomizer\Observers\Sales\OrderObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Sales\OrderAddress::observe(\Webkul\SAASCustomizer\Observers\Sales\OrderAddressObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Sales\OrderItem::observe(\Webkul\SAASCustomizer\Observers\Sales\OrderItemObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Sales\OrderPayment::observe(\Webkul\SAASCustomizer\Observers\Sales\OrderPaymentObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Sales\Shipment::observe(\Webkul\SAASCustomizer\Observers\Sales\ShipmentObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Sales\ShipmentItem::observe(\Webkul\SAASCustomizer\Observers\Sales\ShipmentObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Tax\TaxCategory::observe(\Webkul\SAASCustomizer\Observers\Tax\TaxCategoryObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Tax\TaxRate::observe(\Webkul\SAASCustomizer\Observers\Tax\TaxRateObserver::class);
+
+ \Webkul\SAASCustomizer\Models\User\Admin::observe(\Webkul\SAASCustomizer\Observers\User\AdminObserver::class);
+
+ \Webkul\SAASCustomizer\Models\User\Role::observe(\Webkul\SAASCustomizer\Observers\User\RoleObserver::class);
+
+ \Webkul\SAASCustomizer\Models\StripeConnect\StripeConnect::observe(\Webkul\SAASCustomizer\Observers\StripeConnect\StripeConnectObserver::class);
+
+ \Webkul\SAASCustomizer\Models\Discount\CartRule::observe(\Webkul\SAASCustomizer\Observers\Discount\CartRuleObserver::class);
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Repositories/CompanyDetailsRepository.php b/packages/Webkul/SAASCustomizer/src/Repositories/CompanyDetailsRepository.php
new file mode 100644
index 000000000..b1eb49503
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Repositories/CompanyDetailsRepository.php
@@ -0,0 +1,24 @@
+ @prashant-webkul
+ * @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
+ */
+class CompanyDetailsRepository extends Repository
+{
+ /**
+ * Specify Model class name
+ *
+ * @return mixed
+ */
+ function model()
+ {
+ return 'Webkul\SAASCustomizer\Models\CompanyDetails';
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Repositories/CompanyRepository.php b/packages/Webkul/SAASCustomizer/src/Repositories/CompanyRepository.php
new file mode 100644
index 000000000..84e8c8cdc
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Repositories/CompanyRepository.php
@@ -0,0 +1,24 @@
+ @prashant-webkul
+ * @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
+ */
+class CompanyRepository extends Repository
+{
+ /**
+ * Specify Model class name
+ *
+ * @return mixed
+ */
+ function model()
+ {
+ return 'Webkul\SAASCustomizer\Models\Company';
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Repositories/StripeSuperAdminRepository.php b/packages/Webkul/SAASCustomizer/src/Repositories/StripeSuperAdminRepository.php
new file mode 100644
index 000000000..03bb45515
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Repositories/StripeSuperAdminRepository.php
@@ -0,0 +1,24 @@
+ @prashant-webkul
+ * @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
+ */
+class StripeSuperAdminRepository extends Repository
+{
+ /**
+ * Specify Model class name
+ *
+ * @return mixed
+ */
+ function model()
+ {
+ return 'Webkul\SAASCustomizer\Models\StripeSuperAdmin';
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Repositories/SuperAdminRepository.php b/packages/Webkul/SAASCustomizer/src/Repositories/SuperAdminRepository.php
new file mode 100644
index 000000000..2082f9d2f
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Repositories/SuperAdminRepository.php
@@ -0,0 +1,24 @@
+ @prashant-webkul
+ * @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
+ */
+class SuperAdminRepository extends Repository
+{
+ /**
+ * Specify Model class name
+ *
+ * @return mixed
+ */
+ function model()
+ {
+ return 'Webkul\SAASCustomizer\Models\SuperAdmin';
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Resources/assets/js/app.js b/packages/Webkul/SAASCustomizer/src/Resources/assets/js/app.js
new file mode 100644
index 000000000..e69de29bb
diff --git a/packages/Webkul/SAASCustomizer/src/Resources/assets/sass/app.scss b/packages/Webkul/SAASCustomizer/src/Resources/assets/sass/app.scss
new file mode 100644
index 000000000..a282ba2cb
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Resources/assets/sass/app.scss
@@ -0,0 +1,79 @@
+@import url("https://fonts.googleapis.com/css?family=Montserrat:400,500");
+
+html {
+ font-family: "montserrat", sans-serif;
+}
+
+::placeholder {
+ font-family: "montserrat", sans-serif;
+}
+
+.mt-30 {
+ margin-top: 30px;
+}
+
+.mt-60 {
+ margin-top: 60px;
+}
+
+.mt-90 {
+ margin-top: 90px;
+}
+
+.form-container {
+ width: 420px;
+ margin-left: auto;
+ margin-right: auto;
+ padding: 10px;
+
+ .brand-logo {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+ }
+
+ .step-one, .step-two, .step-three {
+ button {
+ width: 150px;
+ margin-left: calc(50% - 75px);
+ }
+ }
+}
+
+.registration {
+ .control-group .control {
+ width: 100%;
+ }
+}
+
+.step-navigator {
+ margin-top: 30px;
+ margin-bottom: 15px;
+ width: 100%;
+}
+
+.step-list {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: space-between;
+
+ .step-item {
+ cursor: pointer;
+ height: 64px;
+ width: 64px;
+ border: 1px solid #c7c7c7;
+ border-radius: 50%;
+ text-align: center;
+ padding-top: 24px;
+ }
+
+ .step-item.active {
+ border: 1px solid blue;
+ }
+}
+
+.content {
+ padding: 25px;
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Resources/lang/en/app.php b/packages/Webkul/SAASCustomizer/src/Resources/lang/en/app.php
new file mode 100644
index 000000000..bee5df6c7
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Resources/lang/en/app.php
@@ -0,0 +1,25 @@
+ [
+ 'approve' => 'Approve New'
+ ],
+
+ 'company' => [
+ 'companies' => 'Companies'
+ ],
+
+ 'datagrid' => [
+ 'domain' => 'Domain'
+ ],
+
+ 'channel-warning' => 'Creating more than one channel is prohibited',
+
+ 'menu' => [
+ 'companies' => 'Companies'
+ ],
+
+ 'connect-stripe' => [
+ 'stripe-settings' => 'Stripe Settings'
+ ]
+];
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Resources/views/companies/auth/login.blade.php b/packages/Webkul/SAASCustomizer/src/Resources/views/companies/auth/login.blade.php
new file mode 100644
index 000000000..e16a031e4
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Resources/views/companies/auth/login.blade.php
@@ -0,0 +1,36 @@
+@extends('saas::companies.layouts.master')
+
+@section('page_title')
+ {{ __('admin::app.users.sessions.title') }}
+@stop
+
+@section('content-wrapper')
+
+@stop
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Resources/views/companies/auth/register.blade.php b/packages/Webkul/SAASCustomizer/src/Resources/views/companies/auth/register.blade.php
new file mode 100644
index 000000000..cd5bc7320
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Resources/views/companies/auth/register.blade.php
@@ -0,0 +1,267 @@
+@extends('saas::companies.layouts.master')
+
+@section('page_title')
+ Seller Registration
+@endsection
+
+@section('content-wrapper')
+
+
+ @push('scripts')
+
+
+
+ @endpush
+@endsection
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Resources/views/companies/company/edit.blade.php b/packages/Webkul/SAASCustomizer/src/Resources/views/companies/company/edit.blade.php
new file mode 100644
index 000000000..d9b72ef5f
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Resources/views/companies/company/edit.blade.php
@@ -0,0 +1,92 @@
+@extends('saas::companies.layouts.master')
+
+@section('page_title')
+ {{ __('Edit Company') }}
+@endsection
+
+@section('content-wrapper')
+
+
+ @push('scripts')
+
+
+
+ @endpush
+@endsection
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Resources/views/companies/company/index.blade.php b/packages/Webkul/SAASCustomizer/src/Resources/views/companies/company/index.blade.php
new file mode 100644
index 000000000..11fc3d8be
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Resources/views/companies/company/index.blade.php
@@ -0,0 +1,41 @@
+@extends('saas::companies.layouts.master')
+
+@section('page_title')
+ Company Stats
+@stop
+
+@section('content-wrapper')
+
+
+
+
+
+
+
+
+ No. of Products
+ No. of Customers
+ Domain
+ Owner
+ Location
+
+
+
+
+
+ {{ $company[1]['products'] }}
+ {{ $company[1]['customers'] }}
+ {{ $company[0]->domain }}
+ {{ $company[1]['products'] }}
+ {{ $company[1]['products'] }}
+
+
+
+
+
+
+@stop
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Resources/views/companies/index.blade.php b/packages/Webkul/SAASCustomizer/src/Resources/views/companies/index.blade.php
new file mode 100644
index 000000000..d5fb5fe6e
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Resources/views/companies/index.blade.php
@@ -0,0 +1,20 @@
+@extends('saas::companies.layouts.master')
+
+@section('page_title')
+ Companies
+@stop
+
+@section('content-wrapper')
+
+
+
+
+ @inject('companies', 'Webkul\SAASCustomizer\DataGrids\CompaniesDataGrid')
+ {!! $companies->render() !!}
+
+
+@stop
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Resources/views/companies/layouts/master.blade.php b/packages/Webkul/SAASCustomizer/src/Resources/views/companies/layouts/master.blade.php
new file mode 100755
index 000000000..825347488
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Resources/views/companies/layouts/master.blade.php
@@ -0,0 +1,65 @@
+
+
+
+ @yield('page_title')
+
+
+
+
+
+
+
+
+
+
+
+ @yield('head')
+
+ @yield('css')
+
+
+ getLocale() == 'ar') class="rtl" @endif style="scroll-behavior: smooth;">
+
+
+
+ @include ('saas::companies.layouts.nav-top')
+
+ @auth('super-admin')
+ @include ('saas::companies.layouts.nav-left')
+ @endauth
+
+
+ @yield('content-wrapper')
+
+
+
+
+
+
+
+
+ @stack('scripts')
+
+
+
+
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Resources/views/companies/layouts/nav-aside.blade.php b/packages/Webkul/SAASCustomizer/src/Resources/views/companies/layouts/nav-aside.blade.php
new file mode 100644
index 000000000..0d6438b2f
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Resources/views/companies/layouts/nav-aside.blade.php
@@ -0,0 +1,37 @@
+
diff --git a/packages/Webkul/SAASCustomizer/src/Resources/views/companies/layouts/nav-left.blade.php b/packages/Webkul/SAASCustomizer/src/Resources/views/companies/layouts/nav-left.blade.php
new file mode 100644
index 000000000..e5a14e54a
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Resources/views/companies/layouts/nav-left.blade.php
@@ -0,0 +1,13 @@
+
+
+
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Resources/views/companies/layouts/nav-top.blade.php b/packages/Webkul/SAASCustomizer/src/Resources/views/companies/layouts/nav-top.blade.php
new file mode 100644
index 000000000..b93ab7d27
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Resources/views/companies/layouts/nav-top.blade.php
@@ -0,0 +1,40 @@
+
+
+
+
+
+ @auth('super-admin')
+
+
+
+
+ Super Admin
+
+
+
+
+
+
+
+ @endauth
+
+
+
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Resources/views/companies/layouts/tabs.blade.php b/packages/Webkul/SAASCustomizer/src/Resources/views/companies/layouts/tabs.blade.php
new file mode 100644
index 000000000..e69de29bb
diff --git a/packages/Webkul/SAASCustomizer/src/Resources/views/errors/400.blade.php b/packages/Webkul/SAASCustomizer/src/Resources/views/errors/400.blade.php
new file mode 100644
index 000000000..a5c8134d6
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Resources/views/errors/400.blade.php
@@ -0,0 +1,34 @@
+@extends('saas::companies.layouts.master')
+
+@section('page_title')
+ 400 Bad Request
+@stop
+
+@section('content-wrapper')
+
+
+
+
+
+
+
+ {{$status}}
+
+
+
+ {{ $message }}
+
+
+
+ Bad Request
+
+
+
+
+
+
+
+
+
+@stop
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Resources/views/errors/401.blade.php b/packages/Webkul/SAASCustomizer/src/Resources/views/errors/401.blade.php
new file mode 100755
index 000000000..4caa888dd
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Resources/views/errors/401.blade.php
@@ -0,0 +1,38 @@
+@extends(auth()->guard('admin')->check() ? 'admin::layouts.master' : 'shop::layouts.master')
+
+@section('page_title')
+ {{ __('admin::app.error.401.page-title') }}
+@stop
+
+@section('content-wrapper')
+
+@stop
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Resources/views/errors/403.blade.php b/packages/Webkul/SAASCustomizer/src/Resources/views/errors/403.blade.php
new file mode 100755
index 000000000..afcc2db08
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Resources/views/errors/403.blade.php
@@ -0,0 +1,38 @@
+@extends(auth()->guard('admin')->check() ? 'admin::layouts.master' : 'shop::layouts.master')
+
+@section('page_title')
+ {{ __('admin::app.error.403.page-title') }}
+@stop
+
+@section('content-wrapper')
+
+@stop
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Resources/views/errors/404.blade.php b/packages/Webkul/SAASCustomizer/src/Resources/views/errors/404.blade.php
new file mode 100755
index 000000000..1a5de22e6
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Resources/views/errors/404.blade.php
@@ -0,0 +1,38 @@
+@extends(auth()->guard('admin')->check() ? 'admin::layouts.master' : 'shop::layouts.master')
+
+@section('page_title')
+ {{ __('admin::app.error.404.page-title') }}
+@stop
+
+@section('content-wrapper')
+
+@stop
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Resources/views/errors/500.blade.php b/packages/Webkul/SAASCustomizer/src/Resources/views/errors/500.blade.php
new file mode 100755
index 000000000..7b6933eab
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Resources/views/errors/500.blade.php
@@ -0,0 +1,34 @@
+@extends('saas::companies.layouts.master')
+
+@section('page_title')
+ {{ __('admin::app.error.500.page-title') }}
+@stop
+
+@section('content-wrapper')
+
+
+
+
+
+
+
+ {{$status}}
+
+
+
+ {{ $message }}
+
+
+
+ {{ __('admin::app.error.500.title') }}
+
+
+
+
+
+
+
+
+
+@stop
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Resources/views/errors/503.blade.php b/packages/Webkul/SAASCustomizer/src/Resources/views/errors/503.blade.php
new file mode 100644
index 000000000..8161f623a
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Resources/views/errors/503.blade.php
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+ Document
+
+
+
+
+
+
+
+
+
+
+ {{ __('admin::app.error.in-maitainace') }}
+
+
+
+ {{ __('admin::app.error.right-back') }}
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Resources/views/errors/auth.blade.php b/packages/Webkul/SAASCustomizer/src/Resources/views/errors/auth.blade.php
new file mode 100644
index 000000000..0dd4e2aae
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Resources/views/errors/auth.blade.php
@@ -0,0 +1,34 @@
+@extends('saas::companies.layouts.master')
+
+@section('page_title')
+ 400 Bad Request
+@stop
+
+@section('content-wrapper')
+
+
+
+
+
+
+
+ {{$status}}
+
+
+
+ {{ $message }}
+
+
+
+
+
+
+
+
+
+
+
+@stop
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Routes/web.php b/packages/Webkul/SAASCustomizer/src/Routes/web.php
new file mode 100644
index 000000000..98c4f1778
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Routes/web.php
@@ -0,0 +1,37 @@
+ 'web'], function () {
+ Route::prefix('company')->group(function() {
+ //create company
+ Route::get('register', 'Webkul\SAASCustomizer\Http\Controllers\CompanyController@create')->defaults('_config', [
+ 'view' => 'saas::companies.auth.register'
+ ])->name('company.create.index');
+
+ Route::post('register', 'Webkul\SAASCustomizer\Http\Controllers\CompanyController@store')->name('company.create.store');
+
+ Route::get('/seed-data', 'Webkul\SAASCustomizer\Http\Controllers\PurgeController@seedDatabase')->name('company.create.data');
+ });
+
+ Route::prefix('super')->group(function() {
+ Route::get('login', 'Webkul\SAASCustomizer\Http\Controllers\SuperUserController@index')->name('super.session.index');
+
+ Route::post('login', 'Webkul\SAASCustomizer\Http\Controllers\SuperUserController@store')->defaults('_config', [
+ 'redirect' => 'super.companies.index'
+ ])->name('super.session.create');
+
+ Route::get('logout', 'Webkul\SAASCustomizer\Http\Controllers\SuperUserController@destroy')->name('super.session.destroy');
+
+ // GET Route leading to the listing of the companies grid
+ Route::get('companies', 'Webkul\SAASCustomizer\Http\Controllers\SuperUserController@list')->name('super.companies.index');
+
+ Route::get('companies/edit/{id}', 'Webkul\SAASCustomizer\Http\Controllers\CompanyController@edit')->name('super.companies.edit');
+
+ Route::post('companies/edit/{id}', 'Webkul\SAASCustomizer\Http\Controllers\CompanyController@update')->name('super.companies.update');
+
+ // To show the stats of the registered companies
+ Route::get('companies/view/{id}', 'Webkul\SAASCustomizer\Http\Controllers\CompanyController@showCompanyStats')->name('super.companies.show-stats');
+
+ // To show the stats of the registered companies
+ Route::get('companies/status/{id}', 'Webkul\SAASCustomizer\Http\Controllers\CompanyController@changeStatus')->name('super.companies.change-status');
+ });
+});
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/src/Validation/DatabasePresenceVerifier.php b/packages/Webkul/SAASCustomizer/src/Validation/DatabasePresenceVerifier.php
new file mode 100644
index 000000000..aabc0e6de
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/src/Validation/DatabasePresenceVerifier.php
@@ -0,0 +1,27 @@
+id)) {
+ return $this->db->connection($this->connection)->table($table)->useWritePdo()->where ('company_id', '=', $company->id);
+ } else {
+ // apply the company id check dynamically here to eliminate unique validation woes
+ return $this->db->connection($this->connection)->table($table)->useWritePdo();
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASCustomizer/webpack.mix.js b/packages/Webkul/SAASCustomizer/webpack.mix.js
new file mode 100644
index 000000000..b6233a2b7
--- /dev/null
+++ b/packages/Webkul/SAASCustomizer/webpack.mix.js
@@ -0,0 +1,22 @@
+const { mix } = require("laravel-mix");
+require("laravel-mix-merge-manifest");
+
+if (mix.inProduction()) {
+ var publicPath = 'publishable/saas/assets';
+} else {
+ var publicPath = "../../../public/vendor/webkul/saas/assets";
+}
+
+mix.setPublicPath(publicPath).mergeManifest();
+mix.disableNotifications();
+
+mix.js(__dirname + "/src/Resources/assets/js/app.js", "js/saas.js")
+ // .copyDirectory( __dirname + '/src/Resources/assets/images', publicPath + '/images')
+ .sass(__dirname + "/src/Resources/assets/sass/app.scss", "css/saas.css")
+ .options({
+ processCssUrls: false
+ });
+
+if (mix.inProduction()) {
+ mix.version();
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/package.json b/packages/Webkul/SAASPreOrder/package.json
new file mode 100644
index 000000000..f080febb5
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/package.json
@@ -0,0 +1,20 @@
+{
+ "private": true,
+ "scripts": {
+ "dev": "npm run development",
+ "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
+ "watch": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
+ "watch-poll": "cross-env npm run watch -- --watch-poll --progress",
+ "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
+ "prod": "npm run production",
+ "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
+ },
+ "devDependencies": {
+ "cross-env": "^5.1.4",
+ "laravel-mix": "^2.1",
+ "laravel-mix-merge-manifest": "^0.1.1",
+ "vue": "^2.1.10"
+ },
+ "dependencies": {
+ }
+}
diff --git a/packages/Webkul/SAASPreOrder/publishable/assets/css/preorder-admin.css b/packages/Webkul/SAASPreOrder/publishable/assets/css/preorder-admin.css
new file mode 100644
index 000000000..e8dcd59ff
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/publishable/assets/css/preorder-admin.css
@@ -0,0 +1 @@
+.preorder-icon{width:48px;height:48px;display:inline-block;background-size:cover;background-image:url("../images/Icon-Preorder.svg")}.active.preorder-icon,.active .preorder-icon{background-image:url("../images/Icon-Preorder-Active.svg")}.navbar-left{width:100px}.navbar-left ul.menubar li.menu-item{padding:10px 7px}.content-container{padding-left:100px}.preorder-info{padding:15px;width:auto;border:1px solid #d3d3d3;border-left:4px solid #0031f0;margin:15px 0}.pre-order-item-info .heading{font-weight:600;margin-bottom:10px;margin-top:10px;display:block}.pre-order-item-info .row{margin-bottom:5px;padding-left:10px;display:block}.pre-order-item-info .row:last-child{margin-bottom:0}
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/publishable/assets/css/preorder.css b/packages/Webkul/SAASPreOrder/publishable/assets/css/preorder.css
new file mode 100644
index 000000000..1d6d36594
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/publishable/assets/css/preorder.css
@@ -0,0 +1 @@
+.preorder-info{padding:15px;width:auto;border:1px solid #d3d3d3;border-left:4px solid #0031f0;margin:15px 0}.pre-order-item-info .heading{font-weight:600;margin-bottom:10px;margin-top:10px;display:block}.pre-order-item-info .row{margin-bottom:5px;display:block;padding:0!important;padding-left:10px!important}.pre-order-item-info .row:last-child{margin-bottom:0}
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/publishable/assets/images/Icon-Preorder-Active.svg b/packages/Webkul/SAASPreOrder/publishable/assets/images/Icon-Preorder-Active.svg
new file mode 100644
index 000000000..b16e78546
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/publishable/assets/images/Icon-Preorder-Active.svg
@@ -0,0 +1,14 @@
+
+
+
+ Icon-Preorder-Active
+ Created with Sketch.
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/publishable/assets/images/Icon-Preorder.svg b/packages/Webkul/SAASPreOrder/publishable/assets/images/Icon-Preorder.svg
new file mode 100644
index 000000000..f5666d659
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/publishable/assets/images/Icon-Preorder.svg
@@ -0,0 +1,13 @@
+
+
+
+ Icon-Preorder
+ Created with Sketch.
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/publishable/assets/mix-manifest.json b/packages/Webkul/SAASPreOrder/publishable/assets/mix-manifest.json
new file mode 100644
index 000000000..0862fcdef
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/publishable/assets/mix-manifest.json
@@ -0,0 +1,4 @@
+{
+ "/css/preorder.css": "/css/preorder.css?id=eb619a72fbd2982b4cf1",
+ "/css/preorder-admin.css": "/css/preorder-admin.css?id=bb404f27ac5c0a5295ce"
+}
diff --git a/packages/Webkul/SAASPreOrder/src/Commands/Console/GenerateData.php b/packages/Webkul/SAASPreOrder/src/Commands/Console/GenerateData.php
new file mode 100644
index 000000000..6a317f4af
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Commands/Console/GenerateData.php
@@ -0,0 +1,196 @@
+company = $company;
+
+ $this->attribute = $attribute;
+
+ $this->attributeFamily = $attributeFamily;
+ }
+
+ /**
+ * Does the all sought of lifting required to be performed for
+ * generating a super user
+ */
+ public function handle()
+ {
+ $email = $this->ask('Please enter email?');
+
+ $data = [
+ 'email' => $email
+ ];
+
+ $validator = Validator::make($data, [
+ 'email' => 'required|email',
+ ]);
+
+ if($validator->fails()) {
+ $this->comment('Email invalid, please enter try again.');
+
+ return false;
+ }
+
+ $this->comment('You entered = '. $email);
+
+ $password = $this->ask('Please enter password?');
+
+ $data = [
+ 'password' => $password
+ ];
+
+ $validator = Validator::make($data, [
+ 'password' => 'required|string|min:6'
+ ]);
+
+ if ($validator->fails()) {
+ $this->comment('Password invalid, make sure password is atleast 6 characters of length.');
+
+ return false;
+ }
+
+ if (auth('super-admin')->attempt([
+ 'email' => $email,
+ 'password' => $password
+ ])) {
+ $this->comment('Generating preorder data....');
+
+ $this->generate();
+
+ auth()->guard('super-admin')->logout();
+
+ $this->comment('Done');
+ } else {
+ $this->comment('Wrong credentials entered');
+ }
+ }
+
+ /**
+ * Does the all sought of lifting required to be performed for
+ * generating a super user
+ */
+ public function generate()
+ {
+ $companies = $this->company->all(['id']);
+
+ if ($companies->count() == 0) {
+ $this->comment('No companies found to generate preorder data');
+
+ return false;
+ } else {
+ foreach ($companies as $company) {
+ $this->createPreOrderData($company->id);
+ }
+
+ return true;
+ }
+ }
+
+ /***
+ * Creates attributes for one company at a time
+ */
+ public function createPreOrderData($id)
+ {
+ $allowPreorderAttribute = $this->attribute->create([
+ "code" => "allow_preorder",
+ "type" => "boolean",
+ "admin_name" => "Allow Preorder",
+ "is_required" => 0,
+ "is_unique" => 0,
+ "validation" => "",
+ "value_per_locale" => 0,
+ "value_per_channel" => 1,
+ "is_filterable" => 0,
+ "is_configurable" => 0,
+ "is_visible_on_front" => 0,
+ "is_user_defined" => 1,
+ 'company_id' => $id
+ ]);
+
+ $preorderQtyAttribute = $this->attribute->create([
+ "code" => "preorder_qty",
+ "type" => "text",
+ "admin_name" => "Preorder Qty",
+ "is_required" => 0,
+ "is_unique" => 0,
+ "validation" => "numeric",
+ "value_per_locale" => 0,
+ "value_per_channel" => 1,
+ "is_filterable" => 0,
+ "is_configurable" => 0,
+ "is_visible_on_front" => 0,
+ "is_user_defined" => 1,
+ 'company_id' => $id
+ ]);
+
+ $preorderAvailabilityAttribute = $this->attribute->create([
+ "code" => "preorder_availability",
+ "type" => "date",
+ "admin_name" => "Product Availability",
+ "is_required" => 0,
+ "is_unique" => 0,
+ "validation" => "",
+ "value_per_locale" => 0,
+ "value_per_channel" => 1,
+ "is_filterable" => 0,
+ "is_configurable" => 0,
+ "is_visible_on_front" => 0,
+ "is_user_defined" => 1,
+ 'company_id' => $id
+ ]);
+
+ $attributeFamily = $this->attributeFamily->findWhere([
+ 'company_id' => $id
+ ])->first();
+
+ $generalGroup = $attributeFamily->attribute_groups()->where('name', 'General')->first();
+
+ $generalGroup->custom_attributes()->save($allowPreorderAttribute, [ 'position' => $generalGroup->custom_attributes()->count() + 1 ]);
+
+ $generalGroup->custom_attributes()->save($preorderQtyAttribute, [ 'position' => $generalGroup->custom_attributes()->count() + 2 ]);
+
+ $generalGroup->custom_attributes()->save($preorderAvailabilityAttribute, [ 'position' => $generalGroup->custom_attributes()->count() + 3 ]);
+
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/src/Config/admin-menu.php b/packages/Webkul/SAASPreOrder/src/Config/admin-menu.php
new file mode 100644
index 000000000..26ce0fb0e
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Config/admin-menu.php
@@ -0,0 +1,11 @@
+ 'preorder',
+ 'name' => 'preorder::app.admin.layouts.preorder',
+ 'route' => 'admin.preorder.preorders.index',
+ 'sort' => 3,
+ 'icon-class' => 'preorder-icon',
+ ]
+];
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/src/Config/purge-pool.php b/packages/Webkul/SAASPreOrder/src/Config/purge-pool.php
new file mode 100644
index 000000000..c63280224
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Config/purge-pool.php
@@ -0,0 +1,5 @@
+ 'Webkul\SAASPreOrder\Helpers\PreOrderDataPurger'
+];
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/src/Config/system.php b/packages/Webkul/SAASPreOrder/src/Config/system.php
new file mode 100644
index 000000000..e27ab3f61
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Config/system.php
@@ -0,0 +1,54 @@
+ 'preorder',
+ 'name' => 'preorder::app.admin.system.preorder',
+ 'sort' => 1
+ ], [
+ 'key' => 'preorder.settings',
+ 'name' => 'preorder::app.admin.system.settings',
+ 'sort' => 1,
+ ], [
+ 'key' => 'preorder.settings.general',
+ 'name' => 'preorder::app.admin.system.general',
+ 'sort' => 1,
+ 'fields' => [
+ [
+ 'name' => 'preorder_type',
+ 'title' => 'preorder::app.admin.system.preorder-type',
+ 'type' => 'select',
+ 'options' => [
+ [
+ 'title' => 'preorder::app.admin.system.partial-payment',
+ 'value' => 'partial'
+ ], [
+ 'title' => 'preorder::app.admin.system.complete-payment',
+ 'value' => 'complete'
+ ]
+ ],
+ 'channel_based' => true,
+ ], [
+ 'name' => 'percent',
+ 'title' => 'preorder::app.admin.system.preorder-percent',
+ 'type' => 'text',
+ 'validation' => 'between:0,99',
+ 'info' => 'preorder::app.admin.system.preorder-percent-info',
+ 'depends' => 'preorder_type:partial',
+ 'channel_based' => true
+ ], [
+ 'name' => 'message',
+ 'title' => 'preorder::app.admin.system.message',
+ 'type' => 'textarea',
+ 'locale_based' => true,
+ 'channel_based' => true
+ ]
+ // , [
+ // 'name' => 'enable_auto_mail',
+ // 'title' => 'preorder::app.admin.system.enable-automatic-mail',
+ // 'type' => 'boolean',
+ // 'channel_based' => true
+ // ]
+ ]
+ ]
+];
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/src/Contracts/PreOrderItem.php b/packages/Webkul/SAASPreOrder/src/Contracts/PreOrderItem.php
new file mode 100644
index 000000000..110820668
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Contracts/PreOrderItem.php
@@ -0,0 +1,7 @@
+
+ * @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
+ */
+class Order extends DataGrid
+{
+ protected $index = 'id';
+
+ protected $sortOrder = 'desc';
+
+ public function prepareQueryBuilder()
+ {
+ $queryBuilder = DB::table('orders')
+ ->leftJoin('order_address as order_address_shipping', function($leftJoin) {
+ $leftJoin->on('order_address_shipping.order_id', '=', 'orders.id')
+ ->where('order_address_shipping.address_type', 'shipping');
+ })
+ ->leftJoin('order_address as order_address_billing', function($leftJoin) {
+ $leftJoin->on('order_address_billing.order_id', '=', 'orders.id')
+ ->where('order_address_billing.address_type', 'billing');
+ })
+ ->leftJoin('pre_order_items', function($leftJoin) {
+ $leftJoin->on('pre_order_items.order_id', 'orders.id');
+ })
+ ->addSelect('orders.id', 'orders.base_sub_total', 'orders.base_grand_total', 'orders.created_at', 'channel_name', 'orders.status')
+ ->addSelect(DB::raw('CONCAT(order_address_billing.first_name, " ", order_address_billing.last_name) as billed_to'))
+ ->addSelect(DB::raw('CONCAT(order_address_shipping.first_name, " ", order_address_shipping.last_name) as shipped_to'))
+ ->addSelect(DB::raw('COUNT(pre_order_items.id) as is_preorder'))
+ ->groupBy('orders.id');
+
+ $this->addFilter('billed_to', DB::raw('CONCAT(order_address_billing.first_name, " ", order_address_billing.last_name)'));
+ $this->addFilter('shipped_to', DB::raw('CONCAT(order_address_shipping.first_name, " ", order_address_shipping.last_name)'));
+ $this->addFilter('id', 'orders.id');
+ $this->addFilter('status', 'orders.status');
+ $this->addFilter('created_at', 'orders.created_at');
+
+ $this->setQueryBuilder($queryBuilder);
+ }
+
+ public function addColumns()
+ {
+ $this->addColumn([
+ 'index' => 'id',
+ 'label' => trans('admin::app.datagrid.id'),
+ 'type' => 'number',
+ 'searchable' => false,
+ 'sortable' => true,
+ 'filterable' => true
+ ]);
+
+ $this->addColumn([
+ 'index' => 'base_sub_total',
+ 'label' => trans('admin::app.datagrid.sub-total'),
+ 'type' => 'price',
+ 'searchable' => false,
+ 'sortable' => true,
+ 'filterable' => true
+ ]);
+
+ $this->addColumn([
+ 'index' => 'base_grand_total',
+ 'label' => trans('admin::app.datagrid.grand-total'),
+ 'type' => 'price',
+ 'searchable' => false,
+ 'sortable' => true,
+ 'filterable' => true
+ ]);
+
+ $this->addColumn([
+ 'index' => 'created_at',
+ 'label' => trans('admin::app.datagrid.order-date'),
+ 'type' => 'datetime',
+ 'sortable' => true,
+ 'searchable' => false,
+ 'filterable' => true
+ ]);
+
+ $this->addColumn([
+ 'index' => 'channel_name',
+ 'label' => trans('admin::app.datagrid.channel-name'),
+ 'type' => 'string',
+ 'sortable' => true,
+ 'searchable' => true,
+ 'filterable' => true
+ ]);
+
+ $this->addColumn([
+ 'index' => 'status',
+ 'label' => trans('admin::app.datagrid.status'),
+ 'type' => 'string',
+ 'sortable' => true,
+ 'searchable' => true,
+ 'closure' => true,
+ 'filterable' => true,
+ 'wrapper' => function ($value) {
+ if ($value->status == 'processing')
+ return 'Processing ';
+ else if ($value->status == 'completed')
+ return 'Completed ';
+ else if ($value->status == "canceled")
+ return 'Canceled ';
+ else if ($value->status == "closed")
+ return 'Closed ';
+ else if ($value->status == "pending")
+ return 'Pending ';
+ else if ($value->status == "pending_payment")
+ return 'Pending Payment ';
+ else if ($value->status == "fraud")
+ return 'Fraud ';
+ }
+ ]);
+
+ $this->addColumn([
+ 'index' => 'billed_to',
+ 'label' => trans('admin::app.datagrid.billed-to'),
+ 'type' => 'string',
+ 'searchable' => true,
+ 'sortable' => true,
+ 'filterable' => true
+ ]);
+
+ $this->addColumn([
+ 'index' => 'shipped_to',
+ 'label' => trans('admin::app.datagrid.shipped-to'),
+ 'type' => 'string',
+ 'searchable' => true,
+ 'sortable' => true,
+ 'filterable' => true
+ ]);
+
+ $this->addColumn([
+ 'index' => 'is_preorder',
+ 'label' => trans('preorder::app.datagrid.order-type'),
+ 'type' => 'string',
+ 'searchable' => true,
+ 'sortable' => true,
+ 'filterable' => true,
+ 'wrapper' => function ($row) {
+ if ($row->is_preorder)
+ return trans('preorder::app.datagrid.preorder');
+ else
+ return trans('preorder::app.datagrid.normal-order');
+ }
+ ]);
+ }
+
+ public function prepareActions() {
+ $this->addAction([
+ 'type' => 'View',
+ 'method' => 'GET',
+ 'route' => 'admin.sales.orders.view',
+ 'icon' => 'icon eye-icon'
+ ]);
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/src/DataGrids/Admin/PreOrder.php b/packages/Webkul/SAASPreOrder/src/DataGrids/Admin/PreOrder.php
new file mode 100644
index 000000000..c6cc9b3a5
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/DataGrids/Admin/PreOrder.php
@@ -0,0 +1,179 @@
+
+ * @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
+ */
+class PreOrder extends DataGrid
+{
+ protected $index = 'id';
+
+ protected $sortOrder = 'desc';
+
+ public function prepareQueryBuilder()
+ {
+ $queryBuilder = DB::table('pre_order_items')
+ ->leftJoin('order_items', 'pre_order_items.order_item_id', '=', 'order_items.id')
+ ->leftJoin('orders', 'pre_order_items.order_id', '=', 'orders.id')
+ ->leftJoin('order_items as payment_order_items', 'pre_order_items.payment_order_item_id', '=', 'payment_order_items.id')
+ ->addSelect('pre_order_items.id', 'pre_order_items.order_id', 'order_items.name as product_name', 'orders.customer_email', 'order_item_id', 'preorder_type', 'pre_order_items.status', 'base_paid_amount', 'pre_order_items.email_sent', 'base_remaining_amount', 'payment_order_items.order_id as payment_order_id')
+ ->addSelect(DB::raw('CONCAT(orders.customer_first_name, " ", orders.customer_last_name) as customer_name'));
+
+ $this->addFilter('order_id', 'pre_order_items.order_id');
+ $this->addFilter('payment_order_id', 'payment_order_items.order_id');
+ $this->addFilter('product_name', 'order_items.name');
+ $this->addFilter('customer_name', DB::raw('CONCAT(orders.customer_first_name, " ", orders.customer_last_name)'));
+
+ $this->setQueryBuilder($queryBuilder);
+ }
+
+ public function addColumns()
+ {
+ $this->addColumn([
+ 'index' => 'id',
+ 'label' => trans('preorder::app.datagrid.id'),
+ 'type' => 'number',
+ 'searchable' => false,
+ 'sortable' => true,
+ 'filterable' => true
+ ]);
+
+ $this->addColumn([
+ 'index' => 'order_id',
+ 'label' => trans('preorder::app.datagrid.order-id'),
+ 'type' => 'number',
+ 'searchable' => false,
+ 'sortable' => true,
+ 'filterable' => true,
+ 'closure' => true,
+ 'wrapper' => function ($row) {
+ return '' . $row->order_id . ' ';
+ }
+ ]);
+
+ $this->addColumn([
+ 'index' => 'payment_order_id',
+ 'label' => trans('preorder::app.datagrid.payment-order-id'),
+ 'type' => 'number',
+ 'searchable' => false,
+ 'sortable' => false,
+ 'filterable' => true,
+ 'closure' => true,
+ 'wrapper' => function ($row) {
+ if ($row->payment_order_id)
+ return '' . $row->payment_order_id . ' ';
+ else
+ return 'N/A';
+ }
+ ]);
+
+ $this->addColumn([
+ 'index' => 'product_name',
+ 'label' => trans('preorder::app.datagrid.product-name'),
+ 'type' => 'string',
+ 'searchable' => true,
+ 'sortable' => true,
+ 'filterable' => true
+ ]);
+
+ $this->addColumn([
+ 'index' => 'customer_name',
+ 'label' => trans('preorder::app.datagrid.customer-name'),
+ 'type' => 'string',
+ 'searchable' => true,
+ 'sortable' => true,
+ 'filterable' => true
+ ]);
+
+ $this->addColumn([
+ 'index' => 'customer_email',
+ 'label' => trans('preorder::app.datagrid.customer-email'),
+ 'type' => 'string',
+ 'searchable' => true,
+ 'sortable' => true,
+ 'filterable' => true
+ ]);
+
+ $this->addColumn([
+ 'index' => 'base_paid_amount',
+ 'label' => trans('preorder::app.datagrid.paid-amount'),
+ 'type' => 'price',
+ 'searchable' => false,
+ 'sortable' => true,
+ 'filterable' => true
+ ]);
+
+ $this->addColumn([
+ 'index' => 'base_remaining_amount',
+ 'label' => trans('preorder::app.datagrid.remaining-amount'),
+ 'type' => 'price',
+ 'searchable' => false,
+ 'sortable' => true,
+ 'filterable' => true
+ ]);
+
+ $this->addColumn([
+ 'index' => 'preorder_type',
+ 'label' => trans('preorder::app.datagrid.preorder-type'),
+ 'type' => 'boolean',
+ 'sortable' => true,
+ 'searchable' => false,
+ 'filterable' => true,
+ 'wrapper' => function ($value) {
+ if ($value->preorder_type == 'partial')
+ return trans('preorder::app.datagrid.partial-payment');
+ else
+ return trans('preorder::app.datagrid.complete-payment');
+ }
+ ]);
+
+ $this->addColumn([
+ 'index' => 'status',
+ 'label' => trans('preorder::app.datagrid.status'),
+ 'type' => 'string',
+ 'sortable' => true,
+ 'searchable' => false,
+ 'filterable' => true,
+ 'wrapper' => function ($value) {
+ if ($value->status == 'pending')
+ return trans('preorder::app.datagrid.pending');
+ if ($value->status == 'processing')
+ return trans('preorder::app.datagrid.processing');
+ else
+ return trans('preorder::app.datagrid.completed');
+ }
+ ]);
+
+ $this->addColumn([
+ 'index' => 'email_sent',
+ 'label' => trans('preorder::app.datagrid.email-sent'),
+ 'type' => 'boolean',
+ 'searchable' => false,
+ 'sortable' => true,
+ 'filterable' => true,
+ 'wrapper' => function($value) {
+ if ($value->email_sent == 1)
+ return trans('preorder::app.datagrid.yes');
+ else
+ return trans('preorder::app.datagrid.no');
+ }
+ ]);
+ }
+
+ public function prepareMassActions()
+ {
+ $this->addMassAction([
+ 'type' => 'delete',
+ 'label' => 'Notify Customer',
+ 'action' => route('admin.preorder.preorders.notify-customer'),
+ 'method' => 'POST'
+ ]);
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/src/Database/Migrations/2019_06_04_163237_create_pre_order_items_table.php b/packages/Webkul/SAASPreOrder/src/Database/Migrations/2019_06_04_163237_create_pre_order_items_table.php
new file mode 100644
index 000000000..22bc8f8c8
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Database/Migrations/2019_06_04_163237_create_pre_order_items_table.php
@@ -0,0 +1,50 @@
+increments('id');
+ $table->string('preorder_type');
+ $table->double('preorder_percent')->default(0);
+ $table->string('token');
+ $table->string('status');
+ $table->boolean('email_sent')->default(0);
+ $table->double('paid_amount')->nullable();
+ $table->double('base_paid_amount')->nullable();
+ $table->double('base_remaining_amount')->nullable();
+
+ $table->integer('order_id')->unsigned();
+ $table->foreign('order_id')->references('id')->on('orders')->onDelete('cascade');
+
+ $table->integer('order_item_id')->unsigned();
+ $table->foreign('order_item_id')->references('id')->on('order_items')->onDelete('cascade');
+
+ $table->integer('payment_order_item_id')->nullable()->unsigned();
+ $table->foreign('payment_order_item_id')->references('id')->on('order_items')->onDelete('set null');
+
+ $table->integer('company_id')->unsigned();
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('pre_order_items');
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/src/Database/Seeders/AttributeSeeder.php b/packages/Webkul/SAASPreOrder/src/Database/Seeders/AttributeSeeder.php
new file mode 100755
index 000000000..0c35fd08e
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Database/Seeders/AttributeSeeder.php
@@ -0,0 +1,69 @@
+create([
+ "code" => "allow_preorder",
+ "type" => "boolean",
+ "admin_name" => "Allow Preorder",
+ "is_required" => 0,
+ "is_unique" => 0,
+ "validation" => "",
+ "value_per_locale" => 0,
+ "value_per_channel" => 1,
+ "is_filterable" => 0,
+ "is_configurable" => 0,
+ "is_visible_on_front" => 0,
+ "is_user_defined" => 1
+ ]);
+
+ $preorderQtyAttribute = app('Webkul\Attribute\Repositories\AttributeRepository')->create([
+ "code" => "preorder_qty",
+ "type" => "text",
+ "admin_name" => "Preorder Qty",
+ "is_required" => 0,
+ "is_unique" => 0,
+ "validation" => "numeric",
+ "value_per_locale" => 0,
+ "value_per_channel" => 1,
+ "is_filterable" => 0,
+ "is_configurable" => 0,
+ "is_visible_on_front" => 0,
+ "is_user_defined" => 1
+ ]);
+
+ $preorderAvailabilityAttribute = app('Webkul\Attribute\Repositories\AttributeRepository')->create([
+ "code" => "preorder_availability",
+ "type" => "date",
+ "admin_name" => "Product Availability",
+ "is_required" => 0,
+ "is_unique" => 0,
+ "validation" => "",
+ "value_per_locale" => 0,
+ "value_per_channel" => 1,
+ "is_filterable" => 0,
+ "is_configurable" => 0,
+ "is_visible_on_front" => 0,
+ "is_user_defined" => 1
+ ]);
+
+ $attributeFamilies = app('Webkul\Attribute\Repositories\AttributeFamilyRepository')->all();
+
+ foreach ($attributeFamilies as $attributeFamily) {
+ $generalGroup = $attributeFamily->attribute_groups()->where('name', 'General')->first();
+
+ $generalGroup->custom_attributes()->save($allowPreorderAttribute, [ 'position' => $generalGroup->custom_attributes()->count() + 1 ]);
+
+ $generalGroup->custom_attributes()->save($preorderQtyAttribute, [ 'position' => $generalGroup->custom_attributes()->count() + 2 ]);
+
+ $generalGroup->custom_attributes()->save($preorderAvailabilityAttribute, [ 'position' => $generalGroup->custom_attributes()->count() + 3 ]);
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/src/Database/Seeders/DatabaseSeeder.php b/packages/Webkul/SAASPreOrder/src/Database/Seeders/DatabaseSeeder.php
new file mode 100755
index 000000000..71d088dd4
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Database/Seeders/DatabaseSeeder.php
@@ -0,0 +1,18 @@
+call(AttributeSeeder::class);
+ }
+}
diff --git a/packages/Webkul/SAASPreOrder/src/Helpers/PreOrderDataPurger.php b/packages/Webkul/SAASPreOrder/src/Helpers/PreOrderDataPurger.php
new file mode 100644
index 000000000..694d148b9
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Helpers/PreOrderDataPurger.php
@@ -0,0 +1,98 @@
+attribute = $attribute;
+ $this->attributeFamily = $attributeFamily;
+ }
+
+ /***
+ * Creates attributes for one company at a time
+ */
+ public function createPreOrderData($id)
+ {
+ $allowPreorderAttribute = $this->attribute->create([
+ "code" => "allow_preorder",
+ "type" => "boolean",
+ "admin_name" => "Allow Preorder",
+ "is_required" => 0,
+ "is_unique" => 0,
+ "validation" => "",
+ "value_per_locale" => 0,
+ "value_per_channel" => 1,
+ "is_filterable" => 0,
+ "is_configurable" => 0,
+ "is_visible_on_front" => 0,
+ "is_user_defined" => 1,
+ 'company_id' => $id
+ ]);
+
+ $preorderQtyAttribute = $this->attribute->create([
+ "code" => "preorder_qty",
+ "type" => "text",
+ "admin_name" => "Preorder Qty",
+ "is_required" => 0,
+ "is_unique" => 0,
+ "validation" => "numeric",
+ "value_per_locale" => 0,
+ "value_per_channel" => 1,
+ "is_filterable" => 0,
+ "is_configurable" => 0,
+ "is_visible_on_front" => 0,
+ "is_user_defined" => 1,
+ 'company_id' => $id
+ ]);
+
+ $preorderAvailabilityAttribute = $this->attribute->create([
+ "code" => "preorder_availability",
+ "type" => "date",
+ "admin_name" => "Product Availability",
+ "is_required" => 0,
+ "is_unique" => 0,
+ "validation" => "",
+ "value_per_locale" => 0,
+ "value_per_channel" => 1,
+ "is_filterable" => 0,
+ "is_configurable" => 0,
+ "is_visible_on_front" => 0,
+ "is_user_defined" => 1,
+ 'company_id' => $id
+ ]);
+
+ $attributeFamilies = $this->attributeFamily->all();
+
+ foreach ($attributeFamilies as $attributeFamily) {
+ $generalGroup = $attributeFamily->attribute_groups()->where(['name' => 'General', 'company_id' => $id])->first();
+
+ $generalGroup->custom_attributes()->save($allowPreorderAttribute, [ 'position' => $generalGroup->custom_attributes()->count() + 1 ]);
+
+ $generalGroup->custom_attributes()->save($preorderQtyAttribute, [ 'position' => $generalGroup->custom_attributes()->count() + 2 ]);
+
+ $generalGroup->custom_attributes()->save($preorderAvailabilityAttribute, [ 'position' => $generalGroup->custom_attributes()->count() + 3 ]);
+ }
+
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/src/Helpers/Product.php b/packages/Webkul/SAASPreOrder/src/Helpers/Product.php
new file mode 100644
index 000000000..09897e8c9
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Helpers/Product.php
@@ -0,0 +1,60 @@
+
+ * @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
+ */
+class Product
+{
+ /**
+ * ProductRepository object
+ *
+ * @var Product
+ */
+ protected $productRepository;
+
+ /**
+ * Create a new customer event listener instance.
+ *
+ * @param Webkul\Product\Repositories\ProductRepository $productRepository
+ * @return void
+ */
+ public function __construct(
+ ProductRepository $productRepository
+ )
+ {
+ $this->productRepository = $productRepository;
+ }
+
+ /**
+ * Return preorder variants
+ *
+ * @param Product $product
+ */
+ public function getPreOrderVariants($product)
+ {
+ $config = [];
+
+ foreach ($product->variants as $variant) {
+ if ($variant->totalQuantity() < 1 && $variant->allow_preorder) {
+ $config[$variant->id] = [
+ 'preorder_qty' => $variant->preorder_qty,
+ 'availability_text' => $variant->preorder_availability && Carbon::parse($variant->preorder_availability) > Carbon::now()
+ ? trans('preorder::app.shop.products.available-on', [
+ 'date' => core()->formatDate(Carbon::parse($variant->preorder_availability), 'F d, Y')
+ ])
+ : null
+ ];
+ }
+ }
+
+ return $config;
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/src/Http/Controllers/Admin/Controller.php b/packages/Webkul/SAASPreOrder/src/Http/Controllers/Admin/Controller.php
new file mode 100644
index 000000000..c0da023a8
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Http/Controllers/Admin/Controller.php
@@ -0,0 +1,13 @@
+
+ * @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
+ */
+class PreOrderController extends Controller
+{
+ /**
+ * Contains route related configuration
+ *
+ * @var array
+ */
+ protected $_config;
+
+ /**
+ * PreOrderItemRepository object
+ *
+ * @var array
+ */
+ protected $preOrderItemRepository;
+
+ /**
+ * Create a new controller instance.
+ *
+ * @param \Webkul\SAASPreOrder\Repositories\PreOrderItemRepository $preOrderItemRepository
+ * @return void
+ */
+ public function __construct(
+ PreOrderItemRepository $preOrderItemRepository
+ )
+ {
+ $this->_config = request('_config');
+
+ $this->preOrderItemRepository = $preOrderItemRepository;
+ }
+
+ /**
+ * Method to populate the seller order page which will be populated.
+ *
+ * @return Mixed
+ */
+ public function index($url)
+ {
+ return view($this->_config['view']);
+ }
+
+ /**
+ * Mass notify customers for in stock preorder products
+ *
+ * @return response
+ */
+ public function notifyCustomer()
+ {
+ $data = request()->all();
+
+ if (! isset($data['massaction-type'])) {
+ return redirect()->back();
+ }
+
+ $preOrderItemIds = explode(',', $data['indexes']);
+
+ foreach ($preOrderItemIds as $preOrderItemId) {
+ $preOrderItem = $this->preOrderItemRepository->find($preOrderItemId);
+
+ if (! $this->preOrderItemRepository->canBeComplete($preOrderItem->order_item))
+ continue;
+
+ try {
+ Mail::send(new ProductInStockNotification($preOrderItem));
+
+ $this->preOrderItemRepository->update([
+ 'email_sent' => 1
+ ], $preOrderItem->id);
+ } catch (\Exception $e) {
+
+ }
+ }
+
+ session()->flash('success', trans('preorder::app.admin.preorders.mass-notify-success'));
+
+ return redirect()->route($this->_config['redirect']);
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/src/Http/Controllers/Shop/Controller.php b/packages/Webkul/SAASPreOrder/src/Http/Controllers/Shop/Controller.php
new file mode 100644
index 000000000..d5ac3cb8a
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Http/Controllers/Shop/Controller.php
@@ -0,0 +1,12 @@
+
+ * @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
+ */
+class PreOrderController extends Controller
+{
+ /**
+ * ProductRepository object
+ *
+ * @var array
+ */
+ protected $productRepository;
+
+ /**
+ * OrderItemRepository object
+ *
+ * @var array
+ */
+ protected $orderItemRepository;
+
+ /**
+ * PreOrderItemRepository object
+ *
+ * @var array
+ */
+ protected $preOrderItemRepository;
+
+ /**
+ * Create a new controller instance.
+ *
+ * @param Webkul\Product\Repositories\ProductRepository $productRepository
+ * @param Webkul\Sales\Repositories\OrderItemRepository $orderItemRepository
+ * @param Webkul\SAASPreOrder\Repositories\PreOrderItemRepository $preOrderItemRepository
+ * @return void
+ */
+ public function __construct(
+ ProductRepository $productRepository,
+ OrderItemRepository $orderItemRepository,
+ PreOrderItemRepository $preOrderItemRepository
+ )
+ {
+ $this->productRepository = $productRepository;
+
+ $this->orderItemRepository = $orderItemRepository;
+
+ $this->preOrderItemRepository = $preOrderItemRepository;
+ }
+
+ /**
+ * @return \Illuminate\Http\Response
+ */
+ public function complete()
+ {
+ if (request()->route('token'))
+ $preOrderItem = $this->preOrderItemRepository->findOneByField('token', request()->route('token'));
+ else
+ $preOrderItem = $this->preOrderItemRepository->find(request()->input('id'));
+
+ if (! $preOrderItem)
+ return abort(404);
+
+ $orderItem = $this->orderItemRepository->findOrFail($preOrderItem->order_item_id);
+
+ if (! $this->preOrderItemRepository->canBeComplete($orderItem)) {
+ session()->flash('error', trans('preorder::app.shop.preorders.complete-preorder-error'));
+
+ if (request()->route('token'))
+ return redirct()->route('shop.home.index');
+ else
+ return back();
+ }
+
+ $data = [];
+
+ if ($orderItem->type == 'configurable') {
+ $data = [
+ 'pre_order_payment' => true,
+ 'order_item_id' => $preOrderItem->order_item_id,
+ 'product' => $orderItem->product_id,
+ 'quantity' => $orderItem->qty_ordered,
+ 'is_configurable' => true,
+ 'selected_configurable_option' => $orderItem->child->product_id
+ ];
+
+ foreach ($this->productRepository->getSuperAttributes($orderItem->product) as $attribute) {
+ $data['super_attribute'][$attribute['id']] = $orderItem->child->product->{$attribute['code']};
+ }
+ } else {
+ $data = [
+ 'pre_order_payment' => true,
+ 'order_item_id' => $preOrderItem->order_item_id,
+ 'product' => $orderItem->product_id,
+ 'quantity' => $orderItem->qty_ordered,
+ 'is_configurable' => false,
+ ];
+ }
+
+ request()->request->add($data);
+
+ Event::fire('checkout.cart.add.before', $data['product']);
+
+ $result = Cart::add($data['product'], $data);
+
+ Event::fire('checkout.cart.add.after', $result);
+
+ return redirect()->route('shop.checkout.onepage.index');
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/src/Http/admin-routes.php b/packages/Webkul/SAASPreOrder/src/Http/admin-routes.php
new file mode 100644
index 000000000..40802f72a
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Http/admin-routes.php
@@ -0,0 +1,22 @@
+ ['web']], function () {
+
+ Route::prefix('admin')->group(function () {
+
+ Route::group(['middleware' => ['admin']], function () {
+
+ //Seller routes
+ Route::get('preorders', 'Webkul\SAASPreOrder\Http\Controllers\Admin\PreOrderController@index')->defaults('_config', [
+ 'view' => 'preorder::admin.preorders.index'
+ ])->name('admin.preorder.preorders.index');
+
+ //product massdelete
+ Route::post('preorders/notify-customer', 'Webkul\SAASPreOrder\Http\Controllers\Admin\PreOrderController@notifyCustomer')->defaults('_config', [
+ 'redirect' => 'admin.preorder.preorders.index'
+ ])->name('admin.preorder.preorders.notify-customer');
+ });
+
+ });
+
+});
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/src/Http/front-routes.php b/packages/Webkul/SAASPreOrder/src/Http/front-routes.php
new file mode 100644
index 000000000..148b7418b
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Http/front-routes.php
@@ -0,0 +1,5 @@
+ ['web', 'theme', 'locale', 'currency']], function () {
+ Route::get('/complete-preorder/{token}', 'Webkul\SAASPreOrder\Http\Controllers\Shop\PreOrderController@complete')->name('preorder.shop.preorder.complete');
+});
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/src/Listeners/Cart.php b/packages/Webkul/SAASPreOrder/src/Listeners/Cart.php
new file mode 100644
index 000000000..edfbf1d8b
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Listeners/Cart.php
@@ -0,0 +1,197 @@
+
+ * @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
+ */
+class Cart
+{
+ /**
+ * PriceHelper object
+ *
+ * @var Object
+ */
+ protected $priceHelper;
+
+ /**
+ * ProductRepository object
+ *
+ * @var Product
+ */
+ protected $productRepository;
+
+ /**
+ * PreOrderItemRepository object
+ *
+ * @var Product
+ */
+ protected $preOrderItemRepository;
+
+ /**
+ * Create a new customer event listener instance.
+ *
+ * @param Webkul\Product\Helpers\Price $priceHelper
+ * @param Webkul\Product\Repositories\ProductRepository $productRepository
+ * @param Webkul\SAASPreOrder\Repositories\PreOrderItemRepository $preOrderItemRepository
+ * @return void
+ */
+ public function __construct(
+ PriceHelper $priceHelper,
+ ProductRepository $productRepository,
+ PreOrderItemRepository $preOrderItemRepository
+ )
+ {
+ $this->priceHelper = $priceHelper;
+
+ $this->productRepository = $productRepository;
+
+ $this->preOrderItemRepository = $preOrderItemRepository;
+ }
+
+ /**
+ * Before product added to the cart
+ *
+ * @param mixed $cartItem
+ */
+ public function cartItemAddBefore($productId)
+ {
+ $data = request()->all();
+
+ if (! isset($data['pre_order_payment'])) {
+ if ($this->haveCompletePreorderProduct($productId))
+ throw new \Exception('Product can not be added with preorder payment.');
+
+ $product = $this->productRepository->find($productId);
+
+ if ($product->type == 'configurable') {
+ if (isset($data['selected_configurable_option'])) {
+ $product = $this->productRepository->find($data['selected_configurable_option']);
+ } else {
+ return;
+ }
+ }
+
+ if ($product->totalQuantity() > 0 || ! $product->allow_preorder)
+ return;
+
+ if (! isset($data['quantity']))
+ $data['quantity'] = 1;
+
+ if ($cart = CartFacade::getCart()) {
+ $cartItem = $cart->items()->where('product_id', $productId)->first();
+
+ if ($cartItem) {
+ $quantity = $cartItem->quantity + $data['quantity'];
+ } else {
+ $quantity = $data['quantity'];
+ }
+ } else {
+ $quantity = $data['quantity'];
+ }
+
+ if ($product->preorder_qty && $product->preorder_qty < $quantity)
+ throw new \Exception('Requested quantity not available for preorder.');
+ } else {
+ if ($cart = CartFacade::getCart()) {
+ $cartItem = $cart->items()->where('product_id', $productId)->first();
+
+ if ($cartItem) {
+ throw new \Exception('Invalid quantity for complete preorder payment.');
+ } else {
+ throw new \Exception('Preorder payment can not be added with other product.');
+ }
+ }
+ }
+ }
+
+ /**
+ * @param integer $productId
+ */
+ public function haveCompletePreorderProduct($productId)
+ {
+ if (! $cart = CartFacade::getCart())
+ return false;
+
+ foreach ($cart->items()->get() as $item) {
+ if (isset($item->additional['pre_order_payment']))
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Before product update to the cart
+ *
+ * @param CartItem $item
+ */
+ public function cartItemUpdateBefore($item)
+ {
+ if (isset($item->additional['pre_order_payment']))
+ throw new \Exception('Preoder payment qunatity can not be updated.');
+
+ $quantities = request()->get('qty');
+
+ $product = $item->type == 'configurable' ? $item->child->product_flat : $item->product_flat;
+
+ if ($product->totalQuantity() > 0 || ! $product->allow_preorder)
+ return;
+
+ if ($product->preorder_qty && $product->preorder_qty < $quantities[$item->id])
+ throw new \Exception('Requested quantity not available for preorder.');
+ }
+
+ /**
+ * After product added to the cart
+ *
+ * @param mixed $cartItem
+ */
+ public function cartItemAddAfter($cartItem)
+ {
+ if (! request()->input('pre_order_payment')) {
+ $product = $this->productRepository->find($cartItem->product_id);
+
+ if ($product->totalQuantity() > 0 || ! $product->allow_preorder)
+ return;
+
+ if (core()->getConfigData('preorder.settings.general.preorder_type') == 'partial') {
+ if (is_null(core()->getConfigData('preorder.settings.general.percent'))) {
+ $preOrderPercentage = 0;
+ } else {
+ $preOrderPercentage = core()->getConfigData('preorder.settings.general.percent');
+ }
+ } else {
+ $preOrderPercentage = 100;
+ }
+
+ $productPrice = $cartItem->type == 'configurable'
+ ? ($this->priceHelper->getMinimalPrice($cartItem->child->product_flat) * $preOrderPercentage) / 100
+ : ($this->priceHelper->getMinimalPrice($cartItem->product_flat) * $preOrderPercentage) / 100;
+
+ $cartItem->price = core()->convertPrice($productPrice);
+ $cartItem->base_price = $productPrice;
+ $cartItem->custom_price = $productPrice;
+
+ $cartItem->save();
+ } else {
+ $preOrderItem = $this->preOrderItemRepository->findOneByField('order_item_id', request()->input('order_item_id'));
+
+ $productPrice = $preOrderItem->base_remaining_amount / $preOrderItem->order_item->qty_ordered;
+
+ $cartItem->price = core()->convertPrice($productPrice);
+ $cartItem->base_price = $productPrice;
+ $cartItem->custom_price = $productPrice;
+
+ $cartItem->save();
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/src/Listeners/Invoice.php b/packages/Webkul/SAASPreOrder/src/Listeners/Invoice.php
new file mode 100644
index 000000000..e7494b310
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Listeners/Invoice.php
@@ -0,0 +1,59 @@
+
+ * @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
+ */
+class Invoice
+{
+ /**
+ * PreOrderItemRepository object
+ *
+ * @var Object
+ */
+ protected $preOrderItemRepository;
+
+ /**
+ * Create a new Order event listener instance.
+ *
+ * @param Webkul\SAASPreOrder\Repositories\PreOrderItemRepository $preOrderItemRepository
+ * @return void
+ */
+ public function __construct(PreOrderItemRepository $preOrderItemRepository)
+ {
+ $this->preOrderItemRepository = $preOrderItemRepository;
+ }
+
+ /**
+ * After sales invoice creation, creater marketplace invoice
+ *
+ * @param mixed $invoice
+ */
+ public function afterInvoice($invoice)
+ {
+ foreach ($invoice->items()->get() as $item) {
+ if (isset($item->additional['pre_order_payment'])) {
+ $preOrderItem = $this->preOrderItemRepository->findOneByField('order_item_id', $item->additional['order_item_id']);
+
+ $this->preOrderItemRepository->update([
+ 'status' => 'completed',
+ ], $preOrderItem->id);
+ } else {
+ $preOrderItem = $this->preOrderItemRepository->findOneByField('order_item_id', $item->order_item_id);
+
+ if (! $preOrderItem || $preOrderItem->base_remaining_amount)
+ return;
+
+ $this->preOrderItemRepository->update([
+ 'status' => 'completed',
+ ], $preOrderItem->id);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/src/Listeners/Order.php b/packages/Webkul/SAASPreOrder/src/Listeners/Order.php
new file mode 100644
index 000000000..cab5cec6a
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Listeners/Order.php
@@ -0,0 +1,99 @@
+
+ * @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
+ */
+class Order
+{
+ /**
+ * PriceHelper object
+ *
+ * @var Object
+ */
+ protected $priceHelper;
+
+ /**
+ * PreOrderItemRepository object
+ *
+ * @var Object
+ */
+ protected $preOrderItemRepository;
+
+ /**
+ * Create a new Order event listener instance.
+ *
+ * @param Webkul\Product\Helpers\Price $priceHelper
+ * @param Webkul\SAASPreOrder\Repositories\PreOrderItemRepository $preOrderItemRepository
+ * @return void
+ */
+ public function __construct(
+ PriceHelper $priceHelper,
+ PreOrderItemRepository $preOrderItemRepository
+ )
+ {
+ $this->priceHelper = $priceHelper;
+
+ $this->preOrderItemRepository = $preOrderItemRepository;
+ }
+
+ /**
+ * After sales order creation, add entry to pre_order_items order table
+ *
+ * @param mixed $order
+ */
+ public function afterPlaceOrder($order)
+ {
+ foreach ($order->items()->get() as $item) {
+ if (isset($item->additional['pre_order_payment'])) {
+ $preOrderItem = $this->preOrderItemRepository->findOneByField('order_item_id', $item->additional['order_item_id']);
+
+ $this->preOrderItemRepository->update([
+ 'status' => 'processing',
+ 'payment_order_item_id' => $item->id
+ ], $preOrderItem->id);
+ } else {
+ if ($item->product->totalQuantity() > 0 || ! $item->product->allow_preorder)
+ continue;
+
+ if (core()->getConfigData('preorder.settings.general.preorder_type') == 'partial') {
+ $preOrderType = 'partial';
+
+ if (is_null(core()->getConfigData('preorder.settings.general.percent'))) {
+ $preOrderPercentage = 0;
+ } else {
+ $preOrderPercentage = core()->getConfigData('preorder.settings.general.percent');
+ }
+ } else {
+ $preOrderType = 'complete';
+
+ $preOrderPercentage = 100;
+ }
+
+ $productPrice = $item->type == 'configurable'
+ ? $this->priceHelper->getMinimalPrice($item->child->product)
+ : $this->priceHelper->getMinimalPrice($item->product);
+
+ $this->preOrderItemRepository->create([
+ 'preorder_type' => $preOrderType,
+ 'preorder_percent' => $preOrderPercentage,
+ 'status' => 'pending',
+ 'paid_amount' => $item->total,
+ 'base_paid_amount' => $item->base_total,
+ 'base_remaining_amount' => ($productPrice * $item->qty_ordered) - $item->base_total,
+ 'order_id' => $order->id,
+ 'order_item_id' => $item->id,
+ 'token' => str_random(32)
+ ]);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/src/Mail/ProductInStockNotification.php b/packages/Webkul/SAASPreOrder/src/Mail/ProductInStockNotification.php
new file mode 100644
index 000000000..50af825b5
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Mail/ProductInStockNotification.php
@@ -0,0 +1,48 @@
+
+ * @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
+ */
+class ProductInStockNotification extends Mailable
+{
+ use Queueable, SerializesModels;
+
+ /**
+ * The order item instance.
+ *
+ * @var Order
+ */
+ public $item;
+
+ /**
+ * Create a new message instance.
+ *
+ * @return void
+ */
+ public function __construct($item)
+ {
+ $this->item = $item;
+ }
+
+ /**
+ * Build the message.
+ *
+ * @return $this
+ */
+ public function build()
+ {
+ return $this->to($this->item->order->customer_email, $this->item->order->customer_full_name)
+ ->subject(trans('preorder::app.mail.in-stock.subject'))
+ ->view('preorder::emails.in-stock');
+ }
+}
diff --git a/packages/Webkul/SAASPreOrder/src/Models/PreOrderItem.php b/packages/Webkul/SAASPreOrder/src/Models/PreOrderItem.php
new file mode 100644
index 000000000..68a2e912e
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Models/PreOrderItem.php
@@ -0,0 +1,89 @@
+ 'Pending',
+ 'processing' => 'Processing',
+ 'completed' => 'Completed'
+ ];
+
+ protected $typeLabel = [
+ 'partial' => 'Partial Payment',
+ 'complete' => 'Complete Payment'
+ ];
+
+ /**
+ * Get the order record associated with the pre order item.
+ */
+ public function order()
+ {
+ return $this->belongsTo(OrderProxy::modelClass());
+ }
+
+ /**
+ * Get the order item record associated with the pre order item.
+ */
+ public function order_item()
+ {
+ return $this->belongsTo(OrderItemProxy::modelClass());
+ }
+
+ /**
+ * Get the order item record associated with the pre order item.
+ */
+ public function payment_order_item()
+ {
+ return $this->belongsTo(OrderItemProxy::modelClass(), 'payment_order_item_id');
+ }
+
+ /**
+ * Returns the status label from status code
+ */
+ public function getStatusLabelAttribute()
+ {
+ return $this->statusLabel[$this->status];
+ }
+
+ /**
+ * Returns the type label from status code
+ */
+ public function getTypeLabelAttribute()
+ {
+ return $this->typeLabel[$this->preorder_type];
+ }
+
+ /**
+ * Create a new Eloquent query builder for the model.
+ *
+ * @param \Illuminate\Database\Query\Builder $query
+ * @return \Illuminate\Database\Eloquent\Builder|static
+ */
+ public function newEloquentBuilder($query)
+ {
+
+ $company = \Company::getCurrent();
+
+ if (auth()->guard('super-admin')->check() || ! isset($company->id)) {
+ return new \Illuminate\Database\Eloquent\Builder($query);
+ } else {
+ return new \Illuminate\Database\Eloquent\Builder($query->where('pre_order_items' . '.company_id', $company->id));
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/src/Models/PreOrderItemProxy.php b/packages/Webkul/SAASPreOrder/src/Models/PreOrderItemProxy.php
new file mode 100644
index 000000000..e5b9e8d70
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Models/PreOrderItemProxy.php
@@ -0,0 +1,10 @@
+guard('super-admin')->check()) {
+ $model->company_id = Company::getCurrent()->id;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/src/Providers/EventServiceProvider.php b/packages/Webkul/SAASPreOrder/src/Providers/EventServiceProvider.php
new file mode 100644
index 000000000..0b6d83016
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Providers/EventServiceProvider.php
@@ -0,0 +1,35 @@
+addTemplate('preorder::admin.layouts.style');
+ });
+
+ Event::listen('bagisto.shop.products.view.short_description.before', function($viewRenderEventManager) {
+ $viewRenderEventManager->addTemplate('preorder::shop.products.preorder-info');
+ });
+
+ Event::listen('checkout.cart.add.before', 'Webkul\SAASPreOrder\Listeners\Cart@cartItemAddBefore');
+
+ Event::listen('checkout.cart.update.before', 'Webkul\SAASPreOrder\Listeners\Cart@cartItemUpdateBefore');
+
+ Event::listen('checkout.cart.add.after', 'Webkul\SAASPreOrder\Listeners\Cart@cartItemAddAfter');
+
+ Event::listen('checkout.order.save.after', 'Webkul\SAASPreOrder\Listeners\Order@afterPlaceOrder');
+
+ Event::listen('sales.invoice.save.after', 'Webkul\SAASPreOrder\Listeners\Invoice@afterInvoice');
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/src/Providers/ModuleServiceProvider.php b/packages/Webkul/SAASPreOrder/src/Providers/ModuleServiceProvider.php
new file mode 100644
index 000000000..073bdebab
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Providers/ModuleServiceProvider.php
@@ -0,0 +1,12 @@
+app->register(EventServiceProvider::class);
+
+ $this->loadRoutesFrom(__DIR__ . '/../Http/admin-routes.php');
+
+ $this->loadRoutesFrom(__DIR__ . '/../Http/front-routes.php');
+
+ $this->loadMigrationsFrom(__DIR__ . '/../Database/Migrations');
+
+ $this->loadTranslationsFrom(__DIR__ . '/../Resources/lang', 'preorder');
+
+ $this->loadViewsFrom(__DIR__ . '/../Resources/views', 'preorder');
+
+ $this->publishes([
+ __DIR__ . '/../../publishable/assets' => public_path('vendor/webkul/preorder/assets'),
+ ], 'public');
+
+ $this->publishes([
+ __DIR__ . '/../Resources/views/shop/products/add-buttons.blade.php' => resource_path('views/vendor/shop/products/add-buttons.blade.php'),
+ __DIR__ . '/../Resources/views/shop/products/view/product-add.blade.php' => resource_path('views/vendor/shop/products/view/product-add.blade.php'),
+
+ __DIR__ . '/../Resources/views/admin/sales/orders' => resource_path('views/vendor/admin/sales/orders'),
+ __DIR__ . '/../Resources/views/shop/customers/account/orders' => resource_path('views/vendor/shop/customers/account/orders'),
+ ]);
+ }
+
+ /**
+ * Register services.
+ *
+ * @return void
+ */
+ public function register()
+ {
+ $this->registerConfig();
+
+ $this->registerFacades();
+ }
+
+ /**
+ * Register Bouncer as a singleton.
+ *
+ * @return void
+ */
+ protected function registerFacades()
+ {
+ $loader = AliasLoader::getInstance();
+ $loader->alias('shipping', ShippingFacade::class);
+
+ $this->app->singleton('shipping', function () {
+ return new Shipping();
+ });
+ }
+
+ /**
+ * Register package config.
+ *
+ * @return void
+ */
+ public function registerConfig()
+ {
+ $this->mergeConfigFrom(
+ dirname(__DIR__) . '/Config/system.php', 'core'
+ );
+
+ $this->mergeConfigFrom(
+ dirname(__DIR__) . '/Config/admin-menu.php', 'menu.admin'
+ );
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/src/Repositories/PreOrderItemRepository.php b/packages/Webkul/SAASPreOrder/src/Repositories/PreOrderItemRepository.php
new file mode 100755
index 000000000..c65698623
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Repositories/PreOrderItemRepository.php
@@ -0,0 +1,77 @@
+
+ * @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
+ */
+class PreOrderItemRepository extends Repository
+{
+ /**
+ * Specify Model class name
+ *
+ * @return mixed
+ */
+
+ function model()
+ {
+ return 'Webkul\SAASPreOrder\Contracts\PreOrderItem';
+ }
+
+ /**
+ * @param integer $orderId
+ * @return boolean
+ */
+ public function havePreOrderItems($orderId)
+ {
+ return $this->scopeQuery(function ($query) use ($orderId) {
+ return $query->where('pre_order_items.order_id', $orderId);
+ })->count();
+ }
+
+ /**
+ * @param OrderItem $orderItem
+ * @return boolean
+ */
+ public function canBeComplete($orderItem)
+ {
+ $preOrderItem = $this->findOneByField('order_item_id', $orderItem->id);
+
+ if (! $preOrderItem || $preOrderItem->status == 'completed')
+ return false;
+
+ if ($orderItem->type == 'configurable') {
+ $isInStock = $orderItem->child->product && $this->getProductTotalQuantity($orderItem->child->product) >= $orderItem->qty_ordered ? true : false;
+ } else {
+ $isInStock = $orderItem->product && $this->getProductTotalQuantity($orderItem->product) >= $orderItem->qty_ordered ? true : false;
+ }
+
+ return $isInStock && $orderItem->qty_invoiced == $orderItem->qty_ordered ? true : false;
+ }
+
+ /**
+ * @return integer
+ */
+ public function getProductTotalQuantity($product)
+ {
+ $total = 0;
+
+ $channelInventorySourceIds = core()->getCurrentChannel()
+ ->inventory_sources()
+ ->where('status', 1)
+ ->pluck('id');
+
+ foreach ($product->inventories as $inventory) {
+ if (is_numeric($index = $channelInventorySourceIds->search($inventory->inventory_source_id))) {
+ $total += $inventory->qty;
+ }
+ }
+
+ return $total;
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/src/Resources/assets/images/Icon-Preorder-Active.svg b/packages/Webkul/SAASPreOrder/src/Resources/assets/images/Icon-Preorder-Active.svg
new file mode 100644
index 000000000..b16e78546
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Resources/assets/images/Icon-Preorder-Active.svg
@@ -0,0 +1,14 @@
+
+
+
+ Icon-Preorder-Active
+ Created with Sketch.
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/src/Resources/assets/images/Icon-Preorder.svg b/packages/Webkul/SAASPreOrder/src/Resources/assets/images/Icon-Preorder.svg
new file mode 100644
index 000000000..f5666d659
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Resources/assets/images/Icon-Preorder.svg
@@ -0,0 +1,13 @@
+
+
+
+ Icon-Preorder
+ Created with Sketch.
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/src/Resources/assets/sass/admin.scss b/packages/Webkul/SAASPreOrder/src/Resources/assets/sass/admin.scss
new file mode 100644
index 000000000..a2dd9da32
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Resources/assets/sass/admin.scss
@@ -0,0 +1,40 @@
+@import "icons";
+
+.navbar-left {
+ width: 100px;
+
+ ul.menubar li.menu-item {
+ padding: 10px 7px;
+ }
+}
+
+.content-container {
+ padding-left: 100px;
+}
+
+.preorder-info {
+ padding: 15px;
+ width: auto;
+ border: 1px solid #d3d3d3;
+ border-left: 4px solid #0031f0;
+ margin: 15px 0;
+}
+
+.pre-order-item-info {
+ .heading {
+ font-weight: 600;
+ margin-bottom: 10px;
+ margin-top: 10px;
+ display: block;
+ }
+
+ .row {
+ margin-bottom: 5px;
+ padding-left: 10px;
+ display: block;
+
+ &:last-child {
+ margin-bottom: 0;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/src/Resources/assets/sass/app.scss b/packages/Webkul/SAASPreOrder/src/Resources/assets/sass/app.scss
new file mode 100644
index 000000000..1dc63dd13
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Resources/assets/sass/app.scss
@@ -0,0 +1,27 @@
+.preorder-info {
+ padding: 15px;
+ width: auto;
+ border: 1px solid #d3d3d3;
+ border-left: 4px solid #0031f0;
+ margin: 15px 0;
+}
+
+.pre-order-item-info {
+ .heading {
+ font-weight: 600;
+ margin-bottom: 10px;
+ margin-top: 10px;
+ display: block;
+ }
+
+ .row {
+ margin-bottom: 5px;
+ display: block;
+ padding: 0 !important;
+ padding-left: 10px !important;
+
+ &:last-child {
+ margin-bottom: 0;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/src/Resources/assets/sass/icons.scss b/packages/Webkul/SAASPreOrder/src/Resources/assets/sass/icons.scss
new file mode 100644
index 000000000..16b0ab5b0
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Resources/assets/sass/icons.scss
@@ -0,0 +1,17 @@
+.preorder-icon {
+ width: 48px;
+ height: 48px;
+ display: inline-block;
+ background-size: cover;
+ background-image: url("../images/Icon-Preorder.svg");
+}
+
+.active {
+ .preorder-icon {
+ background-image: url("../images/Icon-Preorder-Active.svg");
+ }
+
+ &.preorder-icon {
+ background-image: url("../images/Icon-Preorder-Active.svg");
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/src/Resources/lang/en/app.php b/packages/Webkul/SAASPreOrder/src/Resources/lang/en/app.php
new file mode 100644
index 000000000..fd2730703
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Resources/lang/en/app.php
@@ -0,0 +1,93 @@
+ [
+ 'products' => [
+ 'percent-to-pay' => 'Pay :percent% as Preorder.',
+ 'nothing-to-pay' => 'Nothing to pay for Preorder.',
+ 'available-on' => 'Available On: :date',
+ 'preorder' => 'Preorder',
+ 'complete-preorder-error' => 'Preorder payment not be completed.'
+ ],
+
+ 'sales' => [
+ 'orders' => [
+ 'preorder-summary' => 'This order contains preorder items',
+ 'preorder-information' => 'Preorder Information',
+ 'preorder-payment-information' => 'Preorder Payment Information',
+ 'type' => 'Type : ',
+ 'status' => 'Status : ',
+ 'payment-order' => 'Payment Order',
+ 'reference-order' => 'Reference Order'
+ ]
+ ],
+ ],
+
+ 'admin' => [
+ 'layouts' => [
+ 'preorder' => 'Preorder'
+ ],
+
+ 'preorders' => [
+ 'title' => 'Preorders',
+ 'mass-notify-success' => 'Stock notification email sent succesfully.'
+ ],
+
+ 'sales' => [
+ 'orders' => [
+ 'preorder-summary' => 'This order contains preorder items',
+ 'preorder-information' => 'Preorder Information',
+ 'preorder-payment-information' => 'Preorder Payment Information',
+ 'type' => 'Type : ',
+ 'status' => 'Status : ',
+ 'reference-order' => 'Reference Order : ',
+ 'payment-order' => 'Payment Order : '
+ ]
+ ],
+
+ 'system' => [
+ 'preorder' => 'Preorder',
+ 'settings' => 'Settings',
+ 'general' => 'General',
+ 'preorder-type' => 'Preorder Type',
+ 'partial-payment' => 'Partial Payment',
+ 'complete-payment' => 'Complete Payment',
+ 'preorder-percent' => 'Preorder Percent',
+ 'preorder-percent-info' => 'This value will be used if "Preorder Type" is selected as "Partial Payment".',
+ 'message' => 'Message',
+ 'enable-automatic-mail' => 'Enable Automatic Mail'
+ ]
+ ],
+
+ 'datagrid' => [
+ 'id' => 'Id',
+ 'order-id' => 'Order Id',
+ 'payment-order-id' => 'Payment Order Id',
+ 'product-name' => 'Product Name',
+ 'customer-name' => 'Customer Name',
+ 'customer-email' => 'Customer Email',
+ 'paid-amount' => 'Paid Amount',
+ 'remaining-amount' => 'Remaining Amount',
+ 'preorder-type' => 'Preorder Type',
+ 'status' => 'Status',
+ 'partial-payment' => 'Partial Payment',
+ 'complete-payment' => 'Complete Payment',
+ 'pending' => 'Pending',
+ 'processing' => 'Processing',
+ 'completed' => 'Completed',
+ 'email-sent' => 'Email Sent',
+ 'yes' => 'Yes',
+ 'no' => 'No',
+ 'order-type' => 'Order Type',
+ 'preorder' => 'Preorder',
+ 'normal-order' => 'Normal Order'
+ ],
+
+ 'mail' => [
+ 'in-stock' => [
+ 'subject' => 'Product in stock notification',
+ 'dear' => 'Dear :name',
+ 'info' => 'Product :name has been arrived in stock now. Click here to complete preorder.'
+ ]
+ ]
+];
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/src/Resources/views/admin/layouts/style.blade.php b/packages/Webkul/SAASPreOrder/src/Resources/views/admin/layouts/style.blade.php
new file mode 100644
index 000000000..0d93717f6
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Resources/views/admin/layouts/style.blade.php
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/src/Resources/views/admin/preorders/index.blade.php b/packages/Webkul/SAASPreOrder/src/Resources/views/admin/preorders/index.blade.php
new file mode 100644
index 000000000..dd3294ab7
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Resources/views/admin/preorders/index.blade.php
@@ -0,0 +1,26 @@
+@extends('admin::layouts.content')
+
+@section('page_title')
+ {{ __('preorder::app.admin.preorders.title') }}
+@stop
+
+@section('content-wrapper')
+
+
+
+
+
+
+ {!! app('Webkul\SAASPreOrder\DataGrids\Admin\PreOrder')->render() !!}
+
+
+
+
+@stop
diff --git a/packages/Webkul/SAASPreOrder/src/Resources/views/admin/sales/orders/index.blade.php b/packages/Webkul/SAASPreOrder/src/Resources/views/admin/sales/orders/index.blade.php
new file mode 100644
index 000000000..630e22919
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Resources/views/admin/sales/orders/index.blade.php
@@ -0,0 +1,42 @@
+@extends('admin::layouts.content')
+
+@section('page_title')
+ {{ __('admin::app.sales.orders.title') }}
+@stop
+
+@section('content')
+
+
+
+
+ @inject('orderGrid', 'Webkul\SAASPreOrder\DataGrids\Admin\Order')
+
+ {!! $orderGrid->render() !!}
+
+
+
+
+ {{ __('admin::app.export.download') }}
+
+
+
+
+
+@stop
+
+@push('scripts')
+ @include('admin::export.export', ['gridName' => $orderGrid])
+@endpush
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/src/Resources/views/admin/sales/orders/view.blade.php b/packages/Webkul/SAASPreOrder/src/Resources/views/admin/sales/orders/view.blade.php
new file mode 100644
index 000000000..adc395d8f
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Resources/views/admin/sales/orders/view.blade.php
@@ -0,0 +1,503 @@
+@extends('admin::layouts.master')
+
+@section('page_title')
+ {{ __('admin::app.sales.orders.view-title', ['order_id' => $order->id]) }}
+@stop
+
+@section('content-wrapper')
+
+
+
+
+
+
+
+
+
+
+
+ havePreOrderItems($order->id);
+ ?>
+
+ @if ($havePreOrderItems)
+
{{ __('preorder::app.admin.sales.orders.preorder-summary') }}
+ @endif
+
+
+
+
+
+
+ {{ __('admin::app.sales.orders.order-info') }}
+
+
+
+
+
+ {{ __('admin::app.sales.orders.order-date') }}
+
+
+
+ {{ $order->created_at }}
+
+
+
+
+
+ {{ __('admin::app.sales.orders.order-status') }}
+
+
+
+ {{ $order->status_label }}
+
+
+
+
+
+ {{ __('admin::app.sales.orders.channel') }}
+
+
+
+ {{ $order->channel_name }}
+
+
+
+
+
+
+
+ {{ __('admin::app.sales.orders.account-info') }}
+
+
+
+
+
+ {{ __('admin::app.sales.orders.customer-name') }}
+
+
+
+ {{ $order->customer_full_name }}
+
+
+
+
+
+ {{ __('admin::app.sales.orders.email') }}
+
+
+
+ {{ $order->customer_email }}
+
+
+
+ @if (! is_null($order->customer))
+
+
+ {{ __('admin::app.customers.customers.customer_group') }}
+
+
+
+ {{ $order->customer->group['name'] }}
+
+
+ @endif
+
+
+
+
+
+
+
+
+
+
+
+ {{ __('admin::app.sales.orders.billing-address') }}
+
+
+
+
+ @include ('admin::sales.address', ['address' => $order->billing_address])
+
+
+
+
+ @if ($order->shipping_address)
+
+
+ {{ __('admin::app.sales.orders.shipping-address') }}
+
+
+
+
+ @include ('admin::sales.address', ['address' => $order->shipping_address])
+
+
+
+ @endif
+
+
+
+
+
+
+
+
+
+ {{ __('admin::app.sales.orders.payment-info') }}
+
+
+
+
+
+ {{ __('admin::app.sales.orders.payment-method') }}
+
+
+
+ {{ core()->getConfigData('sales.paymentmethods.' . $order->payment->method . '.title') }}
+
+
+
+
+
+ {{ __('admin::app.sales.orders.currency') }}
+
+
+
+ {{ $order->order_currency_code }}
+
+
+
+
+
+
+
+ {{ __('admin::app.sales.orders.shipping-info') }}
+
+
+
+
+
+ {{ __('admin::app.sales.orders.shipping-method') }}
+
+
+
+ {{ $order->shipping_title }}
+
+
+
+
+
+ {{ __('admin::app.sales.orders.shipping-price') }}
+
+
+
+ {{ core()->formatBasePrice($order->base_shipping_amount) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ __('admin::app.sales.orders.SKU') }}
+ {{ __('admin::app.sales.orders.product-name') }}
+ {{ __('admin::app.sales.orders.price') }}
+ {{ __('admin::app.sales.orders.item-status') }}
+ {{ __('admin::app.sales.orders.subtotal') }}
+ {{ __('admin::app.sales.orders.tax-percent') }}
+ {{ __('admin::app.sales.orders.tax-amount') }}
+ @if ($order->base_discount_amount > 0)
+ {{ __('admin::app.sales.orders.discount-amount') }}
+ @endif
+ {{ __('admin::app.sales.orders.grand-total') }}
+
+
+
+
+
+ @foreach ($order->items as $item)
+
+
+ {{ $item->type == 'configurable' ? $item->child->sku : $item->sku }}
+
+
+
+ {{ $item->name }}
+
+ @if ($html = $item->getOptionDetailHtml())
+ {{ $html }}
+ @endif
+
+ @if ($preOrderItem = $preOrderItemRepository->findOneByField('order_item_id', $item->id))
+
+
type == 'configurable')style="margin-top: 0"@endif>
+ {{ __('preorder::app.admin.sales.orders.preorder-information') }}
+
+
+
+ {{ __('preorder::app.admin.sales.orders.type') }}
+
+ {{ $preOrderItem->type_label }}
+
+
+
+ {{ __('preorder::app.admin.sales.orders.status') }}
+
+ {{ $preOrderItem->status_label }}
+
+
+ @if ($preOrderItem->payment_order_item)
+
+ {{ __('preorder::app.admin.sales.orders.payment-order') }}
+
+
+ #{{ $preOrderItem->payment_order_item->order_id }}
+
+
+ @endif
+
+ @elseif ($preOrderItem = app('Webkul\SAASPreOrder\Repositories\PreOrderItemRepository')->findOneByField('payment_order_item_id', $item->id))
+
+
type == 'configurable')style="margin-top: 0"@endif>
+ {{ __('preorder::app.admin.sales.orders.preorder-payment-information') }}
+
+
+
+ {{ __('preorder::app.admin.sales.orders.reference-order') }}
+
+
+ #{{ $preOrderItem->order_id }}
+
+
+
+ @endif
+
+
+ {{ core()->formatBasePrice($item->base_price) }}
+
+
+
+ {{ $item->qty_ordered ? __('admin::app.sales.orders.item-ordered', ['qty_ordered' => $item->qty_ordered]) : '' }}
+
+
+
+ {{ $item->qty_invoiced ? __('admin::app.sales.orders.item-invoice', ['qty_invoiced' => $item->qty_invoiced]) : '' }}
+
+
+
+ {{ $item->qty_shipped ? __('admin::app.sales.orders.item-shipped', ['qty_shipped' => $item->qty_shipped]) : '' }}
+
+
+
+ {{ $item->qty_canceled ? __('admin::app.sales.orders.item-canceled', ['qty_canceled' => $item->qty_canceled]) : '' }}
+
+
+
+ {{ core()->formatBasePrice($item->base_total) }}
+
+ {{ $item->tax_percent }}%
+
+ {{ core()->formatBasePrice($item->base_tax_amount) }}
+
+ @if ($order->base_discount_amount > 0)
+ {{ core()->formatBasePrice($item->base_discount_amount) }}
+ @endif
+
+
+ {{ core()->formatBasePrice($item->base_total + $item->base_tax_amount) }}
+
+
+ @endforeach
+
+
+
+
+
+ {{ __('admin::app.sales.orders.subtotal') }}
+ -
+ {{ core()->formatBasePrice($order->base_sub_total) }}
+
+
+
+ {{ __('admin::app.sales.orders.shipping-handling') }}
+ -
+ {{ core()->formatBasePrice($order->base_shipping_amount) }}
+
+
+ @if ($order->base_discount_amount > 0)
+
+ {{ __('admin::app.sales.orders.discount') }}
+ -
+ -{{ core()->formatBasePrice($order->base_discount_amount) }}
+
+ @endif
+
+
+ {{ __('admin::app.sales.orders.tax') }}
+ -
+ {{ core()->formatBasePrice($order->base_tax_amount) }}
+
+
+
+ {{ __('admin::app.sales.orders.grand-total') }}
+ -
+ {{ core()->formatBasePrice($order->base_grand_total) }}
+
+
+
+ {{ __('admin::app.sales.orders.total-paid') }}
+ -
+ {{ core()->formatBasePrice($order->base_grand_total_invoiced) }}
+
+
+
+ {{ __('admin::app.sales.orders.total-refunded') }}
+ -
+ {{ core()->formatBasePrice($order->base_grand_total_refunded) }}
+
+
+
+ {{ __('admin::app.sales.orders.total-due') }}
+ -
+ {{ core()->formatBasePrice($order->base_total_due) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ __('admin::app.sales.invoices.id') }}
+ {{ __('admin::app.sales.invoices.date') }}
+ {{ __('admin::app.sales.invoices.order-id') }}
+ {{ __('admin::app.sales.invoices.customer-name') }}
+ {{ __('admin::app.sales.invoices.status') }}
+ {{ __('admin::app.sales.invoices.amount') }}
+ {{ __('admin::app.sales.invoices.action') }}
+
+
+
+
+
+ @foreach ($order->invoices as $invoice)
+
+ #{{ $invoice->id }}
+ {{ $invoice->created_at }}
+ #{{ $invoice->order->id }}
+ {{ $invoice->address->name }}
+ {{ $invoice->status_label }}
+ {{ core()->formatBasePrice($invoice->base_grand_total) }}
+
+
+
+
+
+
+ @endforeach
+
+ @if (! $order->invoices->count())
+
+ {{ __('admin::app.common.no-result-found') }}
+
+ @endif
+
+
+
+
+
+
+
+
+
+
+
+ {{ __('admin::app.sales.shipments.id') }}
+ {{ __('admin::app.sales.shipments.date') }}
+ {{ __('admin::app.sales.shipments.order-id') }}
+ {{ __('admin::app.sales.shipments.order-date') }}
+ {{ __('admin::app.sales.shipments.customer-name') }}
+ {{ __('admin::app.sales.shipments.total-qty') }}
+ {{ __('admin::app.sales.shipments.action') }}
+
+
+
+
+
+ @foreach ($order->shipments as $shipment)
+
+ #{{ $shipment->id }}
+ {{ $shipment->created_at }}
+ #{{ $shipment->order->id }}
+ {{ $shipment->order->created_at }}
+ {{ $shipment->address->name }}
+ {{ $shipment->total_qty }}
+
+
+
+
+
+
+ @endforeach
+
+ @if (! $order->shipments->count())
+
+ {{ __('admin::app.common.no-result-found') }}
+
+ @endif
+
+
+
+
+
+
+
+
+@stop
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/src/Resources/views/emails/in-stock.blade.php b/packages/Webkul/SAASPreOrder/src/Resources/views/emails/in-stock.blade.php
new file mode 100644
index 000000000..68c66fc92
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Resources/views/emails/in-stock.blade.php
@@ -0,0 +1,44 @@
+@component('shop::emails.layouts.master')
+
+
+
+
+
+
+
+ {{ __('preorder::app.mail.in-stock.dear', ['name' => $item->order->customer_full_name]) }},
+
+
+
+
+ {!!
+ __('preorder::app.mail.in-stock.info', [
+ 'name' => '' . $item->order_item->product->name . ' ',
+ 'link' => $item->order->is_guest ? route('preorder.shop.preorder.complete', ['token' => $item->token]) : route('customer.orders.view', ['id' => $item->order_id])
+ ])
+ !!}
+
+
+
+
+
+
+
+
+@endcomponent
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/src/Resources/views/shop/customers/account/orders/view.blade.php b/packages/Webkul/SAASPreOrder/src/Resources/views/shop/customers/account/orders/view.blade.php
new file mode 100644
index 000000000..020760917
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Resources/views/shop/customers/account/orders/view.blade.php
@@ -0,0 +1,414 @@
+@extends('shop::layouts.master')
+
+@section('page_title')
+ {{ __('shop::app.customer.account.order.view.page-tile', ['order_id' => $order->id]) }}
+@endsection
+
+@push('css')
+
+@endpush
+
+@section('content-wrapper')
+
+
+ @include('shop::customers.account.partials.sidemenu')
+
+
+
+
+
+
+ {{ __('shop::app.customer.account.order.view.page-tile', ['order_id' => $order->id]) }}
+
+
+
+
+ {!! view_render_event('bagisto.shop.customers.account.orders.view.before', ['order' => $order]) !!}
+
+
+
+
+
+
+ havePreOrderItems($order->id);
+ ?>
+
+ @if ($havePreOrderItems)
+ {{ __('preorder::app.shop.sales.orders.preorder-summary') }}
+ @endif
+
+
+
+
+
+ {{ __('shop::app.customer.account.order.view.placed-on') }}
+
+
+
+ {{ core()->formatDate($order->created_at, 'd M Y') }}
+
+
+
+
+
+
+
+ {{ __('shop::app.customer.account.order.view.products-ordered') }}
+
+
+
+
+
+
+
+ {{ __('shop::app.customer.account.order.view.SKU') }}
+ {{ __('shop::app.customer.account.order.view.product-name') }}
+ {{ __('shop::app.customer.account.order.view.price') }}
+ {{ __('shop::app.customer.account.order.view.item-status') }}
+ {{ __('shop::app.customer.account.order.view.subtotal') }}
+ {{ __('shop::app.customer.account.order.view.tax-percent') }}
+ {{ __('shop::app.customer.account.order.view.tax-amount') }}
+ {{ __('shop::app.customer.account.order.view.grand-total') }}
+
+
+
+
+
+ @foreach ($order->items as $item)
+
+
+ {{ $item->type == 'configurable' ? $item->child->sku : $item->sku }}
+
+
+
+ {{ $item->name }}
+
+ @if ($preOrderItem = $preOrderItemRepository->findOneByField('order_item_id', $item->id))
+
+
type == 'configurable')style="margin-top: 0"@endif>
+ {{ __('preorder::app.shop.sales.orders.preorder-information') }}
+
+
+
+ {{ __('preorder::app.shop.sales.orders.type') }}
+
+ {{ $preOrderItem->type_label }}
+
+
+
+ {{ __('preorder::app.shop.sales.orders.status') }}
+
+ {{ $preOrderItem->status_label }}
+
+
+ @if ($preOrderItem->payment_order_item)
+
+ {{ __('preorder::app.shop.sales.orders.payment-order') }}
+
+
+ #{{ $preOrderItem->payment_order_item->order_id }}
+
+
+ @endif
+
+ @elseif ($preOrderItem = app('Webkul\SAASPreOrder\Repositories\PreOrderItemRepository')->findOneByField('payment_order_item_id', $item->id))
+
+
type == 'configurable')style="margin-top: 0"@endif>
+ {{ __('preorder::app.shop.sales.orders.preorder-payment-information') }}
+
+
+
+ {{ __('preorder::app.shop.sales.orders.reference-order') }}
+
+
+ #{{ $preOrderItem->order_id }}
+
+
+
+ @endif
+
+
+ {{ core()->formatPrice($item->price, $order->order_currency_code) }}
+
+
+
+ {{ __('shop::app.customer.account.order.view.item-ordered', ['qty_ordered' => $item->qty_ordered]) }}
+
+
+
+ {{ $item->qty_invoiced ? __('shop::app.customer.account.order.view.item-invoice', ['qty_invoiced' => $item->qty_invoiced]) : '' }}
+
+
+
+ {{ $item->qty_shipped ? __('shop::app.customer.account.order.view.item-shipped', ['qty_shipped' => $item->qty_shipped]) : '' }}
+
+
+
+ {{ $item->qty_canceled ? __('shop::app.customer.account.order.view.item-canceled', ['qty_canceled' => $item->qty_canceled]) : '' }}
+
+
+
+ {{ core()->formatPrice($item->total, $order->order_currency_code) }}
+
+ {{ number_format($item->tax_percent, 2) }}%
+
+ {{ core()->formatPrice($item->tax_amount, $order->order_currency_code) }}
+
+
+ {{ core()->formatPrice($item->total + $item->tax_amount, $order->order_currency_code) }}
+
+ canBeComplete($item); ?>
+
+ @if ($canBeComplete)
+ Complete Preorder
+ @endif
+
+
+ @endforeach
+
+
+
+
+
+
+
+
+
+ {{ __('shop::app.customer.account.order.view.subtotal') }}
+ -
+ {{ core()->formatPrice($order->sub_total, $order->order_currency_code) }}
+
+
+
+ {{ __('shop::app.customer.account.order.view.shipping-handling') }}
+ -
+ {{ core()->formatPrice($order->shipping_amount, $order->order_currency_code) }}
+
+
+
+ {{ __('shop::app.customer.account.order.view.tax') }}
+ -
+ {{ core()->formatPrice($order->tax_amount, $order->order_currency_code) }}
+
+
+
+ {{ __('shop::app.customer.account.order.view.grand-total') }}
+ -
+ {{ core()->formatPrice($order->grand_total, $order->order_currency_code) }}
+
+
+
+ {{ __('shop::app.customer.account.order.view.total-paid') }}
+ -
+ {{ core()->formatPrice($order->grand_total_invoiced, $order->order_currency_code) }}
+
+
+
+ {{ __('shop::app.customer.account.order.view.total-refunded') }}
+ -
+ {{ core()->formatPrice($order->grand_total_refunded, $order->order_currency_code) }}
+
+
+
+ {{ __('shop::app.customer.account.order.view.total-due') }}
+ -
+ {{ core()->formatPrice($order->total_due, $order->order_currency_code) }}
+
+
+
+
+
+
+
+
+ @if ($order->invoices->count())
+
+
+ @foreach ($order->invoices as $invoice)
+
+
+
+
+
+
+
+
+
+ {{ __('shop::app.customer.account.order.view.SKU') }}
+ {{ __('shop::app.customer.account.order.view.product-name') }}
+ {{ __('shop::app.customer.account.order.view.price') }}
+ {{ __('shop::app.customer.account.order.view.qty') }}
+ {{ __('shop::app.customer.account.order.view.subtotal') }}
+ {{ __('shop::app.customer.account.order.view.tax-amount') }}
+ {{ __('shop::app.customer.account.order.view.grand-total') }}
+
+
+
+
+
+ @foreach ($invoice->items as $item)
+
+ {{ $item->child ? $item->child->sku : $item->sku }}
+ {{ $item->name }}
+ {{ core()->formatPrice($item->price, $order->order_currency_code) }}
+ {{ $item->qty }}
+ {{ core()->formatPrice($item->total, $order->order_currency_code) }}
+ {{ core()->formatPrice($item->tax_amount, $order->order_currency_code) }}
+ {{ core()->formatPrice($item->total + $item->tax_amount, $order->order_currency_code) }}
+
+ @endforeach
+
+
+
+
+
+
+
+ {{ __('shop::app.customer.account.order.view.subtotal') }}
+ -
+ {{ core()->formatPrice($invoice->sub_total, $order->order_currency_code) }}
+
+
+
+ {{ __('shop::app.customer.account.order.view.shipping-handling') }}
+ -
+ {{ core()->formatPrice($invoice->shipping_amount, $order->order_currency_code) }}
+
+
+
+ {{ __('shop::app.customer.account.order.view.tax') }}
+ -
+ {{ core()->formatPrice($invoice->tax_amount, $order->order_currency_code) }}
+
+
+
+ {{ __('shop::app.customer.account.order.view.grand-total') }}
+ -
+ {{ core()->formatPrice($invoice->grand_total, $order->order_currency_code) }}
+
+
+
+
+
+
+ @endforeach
+
+
+ @endif
+
+ @if ($order->shipments->count())
+
+
+ @foreach ($order->shipments as $shipment)
+
+
+
+ {{ __('shop::app.customer.account.order.view.individual-shipment', ['shipment_id' => $shipment->id]) }}
+
+
+
+
+
+
+
+
+ {{ __('shop::app.customer.account.order.view.SKU') }}
+ {{ __('shop::app.customer.account.order.view.product-name') }}
+ {{ __('shop::app.customer.account.order.view.qty') }}
+
+
+
+
+
+ @foreach ($shipment->items as $item)
+
+
+ {{ $item->sku }}
+ {{ $item->name }}
+ {{ $item->qty }}
+
+
+ @endforeach
+
+
+
+
+
+
+
+ @endforeach
+
+
+ @endif
+
+
+
+
+
+
+
+ {{ __('shop::app.customer.account.order.view.shipping-address') }}
+
+
+
+
+ @include ('admin::sales.address', ['address' => $order->billing_address])
+
+
+
+
+
+
+ {{ __('shop::app.customer.account.order.view.billing-address') }}
+
+
+
+
+ @include ('admin::sales.address', ['address' => $order->shipping_address])
+
+
+
+
+
+
+ {{ __('shop::app.customer.account.order.view.shipping-method') }}
+
+
+
+
+ {{ $order->shipping_title }}
+
+
+
+
+
+
+ {{ __('shop::app.customer.account.order.view.payment-method') }}
+
+
+
+ {{ core()->getConfigData('sales.paymentmethods.' . $order->payment->method . '.title') }}
+
+
+
+
+
+
+
+
+ {!! view_render_event('bagisto.shop.customers.account.orders.view.after', ['order' => $order]) !!}
+
+
+
+
+
+@endsection
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/src/Resources/views/shop/products/add-buttons.blade.php b/packages/Webkul/SAASPreOrder/src/Resources/views/shop/products/add-buttons.blade.php
new file mode 100644
index 000000000..76d0a7409
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Resources/views/shop/products/add-buttons.blade.php
@@ -0,0 +1,36 @@
+@if ($product->type != "configurable" && $product->totalQuantity() < 1 && $product->allow_preorder)
+ @if (core()->getConfigData('preorder.settings.general.percent'))
+ @if (core()->getConfigData('preorder.settings.general.preorder_type') == 'partial')
+ {{ __('preorder::app.shop.products.percent-to-pay', ['percent' => core()->getConfigData('preorder.settings.general.percent')]) }}
+ @endif
+ @else
+ {{ __('preorder::app.shop.products.nothing-to-pay') }}
+ @endif
+@endif
+
+@if ($product->type == "configurable")
+
+@else
+
+
+ @csrf
+
+
+
+
+ @if ($product->totalQuantity() < 1 && $product->allow_preorder)
+ {{ __('preorder::app.shop.products.preorder') }}
+ @else
+ haveSufficientQuantity(1) ? '' : 'disabled' }}>{{ __('shop::app.products.add-to-cart') }}
+ @endif
+
+
+ @include('shop::products.wishlist')
+
+@endif
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/src/Resources/views/shop/products/preorder-info.blade.php b/packages/Webkul/SAASPreOrder/src/Resources/views/shop/products/preorder-info.blade.php
new file mode 100644
index 000000000..27e625d6b
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Resources/views/shop/products/preorder-info.blade.php
@@ -0,0 +1,93 @@
+@if ($product->type != 'configurable' && $product->totalQuantity() < 1 && $product->allow_preorder)
+
+
+ @if (core()->getConfigData('preorder.settings.general.preorder_type') == 'partial')
+ @if (core()->getConfigData('preorder.settings.general.percent'))
+
{{ __('preorder::app.shop.products.percent-to-pay', ['percent' => core()->getConfigData('preorder.settings.general.percent')]) }}
+ @else
+
{{ __('preorder::app.shop.products.nothing-to-pay') }}
+ @endif
+ @endif
+
+ @if (core()->getConfigData('preorder.settings.general.message') != '')
+
{{ core()->getConfigData('preorder.settings.general.message') }}
+ @endif
+
+ @if ($product->preorder_availability && \Carbon\Carbon::parse($product->preorder_availability) > \Carbon\Carbon::now())
+
+ {!!
+ __('preorder::app.shop.products.available-on', [
+ 'date' => core()->formatDate(\Carbon\Carbon::parse($product->preorder_availability), 'F d, Y')
+ ])
+ !!}
+
+ @endif
+
+@elseif ($product->type == 'configurable')
+
+
+ @if (core()->getConfigData('preorder.settings.general.preorder_type') == 'partial')
+ @if (core()->getConfigData('preorder.settings.general.percent'))
+
{{ __('preorder::app.shop.products.percent-to-pay', ['percent' => core()->getConfigData('preorder.settings.general.percent')]) }}
+ @else
+
{{ __('preorder::app.shop.products.nothing-to-pay') }}
+ @endif
+ @endif
+
+ @if (core()->getConfigData('preorder.settings.general.message') != '')
+
{{ core()->getConfigData('preorder.settings.general.message') }}
+ @endif
+
+
+
+
+
+ @push('scripts')
+
+
+
+ @endpush
+@endif
+
+@push('css')
+
+@endpush
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/src/Resources/views/shop/products/view/product-add.blade.php b/packages/Webkul/SAASPreOrder/src/Resources/views/shop/products/view/product-add.blade.php
new file mode 100644
index 000000000..63f46f323
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Resources/views/shop/products/view/product-add.blade.php
@@ -0,0 +1,21 @@
+{!! view_render_event('bagisto.shop.products.view.product-add.after', ['product' => $product]) !!}
+
+
+ @if ($product->type != 'configurable')
+ @if ($product->totalQuantity() < 1 && $product->allow_preorder)
+
+ {{ __('preorder::app.shop.products.preorder') }}
+
+ @else
+ @include ('shop::products.add-to-cart', ['product' => $product])
+
+ @include ('shop::products.buy-now')
+ @endif
+ @else
+ @include ('shop::products.add-to-cart', ['product' => $product])
+
+ @include ('shop::products.buy-now')
+ @endif
+
+
+{!! view_render_event('bagisto.shop.products.view.product-add.after', ['product' => $product]) !!}
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/src/Shipping.php b/packages/Webkul/SAASPreOrder/src/Shipping.php
new file mode 100644
index 000000000..96fffe6b6
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/src/Shipping.php
@@ -0,0 +1,62 @@
+items()->get() as $item) {
+ if (isset($item->additional['pre_order_payment']))
+ $havePreOrderPaymentItem = true;
+ }
+
+ if (! $havePreOrderPaymentItem)
+ return parent::collectRates();
+
+ $object = new CartShippingRate;
+
+ $object->carrier = 'free';
+ $object->carrier_title = core()->getConfigData('sales.carriers.free.title');
+ $object->method = 'free_free';
+ $object->method_title = core()->getConfigData('sales.carriers.free.title');
+ $object->method_description = core()->getConfigData('sales.carriers.free.description');
+ $object->price = 0;
+ $object->base_price = 0;
+
+ $this->rates[] = $object;
+
+ $this->saveAllShippingRates();
+
+ return [
+ 'jump_to_section' => 'shipping',
+ 'html' => view('shop::checkout.onepage.shipping', ['shippingRateGroups' => $this->getGroupedAllShippingRates()])->render()
+ ];
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/SAASPreOrder/webpack.mix.js b/packages/Webkul/SAASPreOrder/webpack.mix.js
new file mode 100644
index 000000000..bc2d92bb3
--- /dev/null
+++ b/packages/Webkul/SAASPreOrder/webpack.mix.js
@@ -0,0 +1,22 @@
+const { mix } = require("laravel-mix");
+require("laravel-mix-merge-manifest");
+
+if (mix.inProduction()) {
+ var publicPath = 'publishable/assets';
+} else {
+ var publicPath = "../../../public/vendor/webkul/preorder/assets";
+}
+
+mix.setPublicPath(publicPath).mergeManifest();
+mix.disableNotifications();
+
+mix.copyDirectory(__dirname + "/src/Resources/assets/images", publicPath + "/images")
+ .sass(__dirname + "/src/Resources/assets/sass/app.scss", "css/preorder.css")
+ .sass(__dirname + "/src/Resources/assets/sass/admin.scss", "css/preorder-admin.css")
+ .options({
+ processCssUrls: false
+ });
+
+if (mix.inProduction()) {
+ mix.version();
+}
\ No newline at end of file
diff --git a/packages/Webkul/ShowPriceAfterLogin/Config/system.php b/packages/Webkul/ShowPriceAfterLogin/Config/system.php
new file mode 100644
index 000000000..a517727cd
--- /dev/null
+++ b/packages/Webkul/ShowPriceAfterLogin/Config/system.php
@@ -0,0 +1,51 @@
+ 'ShowPriceAfterLogin',
+ 'name' => 'ShowPriceAfterLogin::app.showpriceafterlogin.name',
+ 'sort' => 5
+ ], [
+ 'key' => 'ShowPriceAfterLogin.settings',
+ 'name' => 'ShowPriceAfterLogin::app.showpriceafterlogin.settings',
+ 'sort' => 1,
+ ], [
+ 'key' => 'ShowPriceAfterLogin.settings.settings',
+ 'name' => 'ShowPriceAfterLogin::app.showpriceafterlogin.settings',
+ 'sort' => 1,
+ 'fields' => [
+ [
+ 'name' => 'enableordisable',
+ 'title' => 'ShowPriceAfterLogin::app.showpriceafterlogin.toggle',
+ 'type' => 'boolean',
+ 'channel_based' => true,
+ 'locale_based' => false
+ ], [
+ 'name' => 'hide-shop-before-login',
+ 'title' => 'ShowPriceAfterLogin::app.showpriceafterlogin.hide-shop-before-login',
+ 'type' => 'boolean',
+ 'channel_based' => false,
+ 'locale_based' => false
+ ], [
+ 'name' => 'selectfunction',
+ 'title' => 'ShowPriceAfterLogin::app.showpriceafterlogin.select-function',
+ 'type' => 'select',
+ 'options' => [
+ [
+ 'name' => 'default',
+ 'title' => 'ShowPriceAfterLogin::app.showpriceafterlogin.select-function',
+ 'value' => ""
+ ], [
+ 'name' => 'hide-buy-cart-guest',
+ 'title' => 'ShowPriceAfterLogin::app.showpriceafterlogin.hide-buy-cart-guest',
+ 'value' => "hide-buy-cart-guest"
+ ], [
+ 'name' => 'hide-price-buy-cart',
+ 'title' => 'ShowPriceAfterLogin::app.showpriceafterlogin.hide-price-buy-cart-guest',
+ 'value' => "hide-price-buy-cart-guest"
+ ]
+ ],
+ ]
+ ]
+ ]
+];
\ No newline at end of file
diff --git a/packages/Webkul/ShowPriceAfterLogin/composer.json b/packages/Webkul/ShowPriceAfterLogin/composer.json
new file mode 100644
index 000000000..baf5adf0b
--- /dev/null
+++ b/packages/Webkul/ShowPriceAfterLogin/composer.json
@@ -0,0 +1,26 @@
+{
+ "name": "bagisto/showPriceAfterLogin",
+ "description": "show price and add to cart button after login ",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Prateek Srivastava",
+ "email": "prateek.srivastava781@webkul.com"
+ }
+ ],
+ "require": {},
+ "autoload": {
+ "psr-4": {
+ "Webkul\\ShowPriceAfterLogin\\": "src/"
+ }
+ },
+ "extra": {
+ "laravel": {
+ "providers": [
+ "Webkul\\ShowPriceAfterLogin\\Providers\\ShowPriceAfterLoginServiceProvider"
+ ],
+ "aliases": {}
+ }
+ },
+ "minimum-stability": "dev"
+}
diff --git a/packages/Webkul/ShowPriceAfterLogin/package.json b/packages/Webkul/ShowPriceAfterLogin/package.json
new file mode 100644
index 000000000..8c4598302
--- /dev/null
+++ b/packages/Webkul/ShowPriceAfterLogin/package.json
@@ -0,0 +1,16 @@
+{
+ "scripts": {
+ "dev": "npm run development",
+ "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
+ "watch": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
+ "watch-poll": "npm run watch -- --watch-poll",
+ "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
+ "prod": "npm run production",
+ "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
+ },
+ "devDependencies": {
+ "cross-env": "^5.1.4",
+ "laravel-mix": "^2.1",
+ "laravel-mix-merge-manifest": "^0.1.1"
+ }
+}
diff --git a/packages/Webkul/ShowPriceAfterLogin/src/Http/Middleware/ShowShopAfterLogin.php b/packages/Webkul/ShowPriceAfterLogin/src/Http/Middleware/ShowShopAfterLogin.php
new file mode 100644
index 000000000..443e9cb9c
--- /dev/null
+++ b/packages/Webkul/ShowPriceAfterLogin/src/Http/Middleware/ShowShopAfterLogin.php
@@ -0,0 +1,26 @@
+getConfigData('ShowPriceAfterLogin.settings.settings.hide-shop-before-login');
+ $moduleEnabled =(boolean) core()->getConfigData('ShowPriceAfterLogin.settings.settings.enableordisable');
+
+ if (!auth()->guard('customer')->check() && $moduleEnabled && ! request()->is('customer/*') && $status && ! request()->is('admin/*')) {
+ return redirect()->route('customer.session.index');
+ }
+ return $next($request);
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/ShowPriceAfterLogin/src/Http/routes.php b/packages/Webkul/ShowPriceAfterLogin/src/Http/routes.php
new file mode 100644
index 000000000..ab2a2c5a9
--- /dev/null
+++ b/packages/Webkul/ShowPriceAfterLogin/src/Http/routes.php
@@ -0,0 +1,284 @@
+ ['web', 'locale', 'theme', 'currency']], function () {
+ //Store front home
+ Route::get('/', 'Webkul\Shop\Http\Controllers\HomeController@index')->defaults('_config', [
+ 'view' => 'shop::home.index'
+ ])->name('shop.home.index');
+
+ //subscription
+ //subscribe
+ Route::get('/subscribe', 'Webkul\Shop\Http\Controllers\SubscriptionController@subscribe')->name('shop.subscribe');
+
+ //unsubscribe
+ Route::get('/unsubscribe/{token}', 'Webkul\Shop\Http\Controllers\SubscriptionController@unsubscribe')->name('shop.unsubscribe');
+
+ //Store front header nav-menu fetch
+ Route::get('/categories/{slug}', 'Webkul\Shop\Http\Controllers\CategoryController@index')->defaults('_config', [
+ 'view' => 'shop::products.index'
+ ])->name('shop.categories.index');
+
+ //Store front search
+ Route::get('/search', 'Webkul\Shop\Http\Controllers\SearchController@index')->defaults('_config', [
+ 'view' => 'shop::search.search'
+ ])->name('shop.search.index');
+
+ //Country State Selector
+ Route::get('get/countries', 'Webkul\Core\Http\Controllers\CountryStateController@getCountries')->defaults('_config', [
+ 'view' => 'shop::test'
+ ])->name('get.countries');
+
+ //Get States When Country is Passed
+ Route::get('get/states/{country}', 'Webkul\Core\Http\Controllers\CountryStateController@getStates')->defaults('_config', [
+ 'view' => 'shop::test'
+ ])->name('get.states');
+
+ //checkout and cart
+ //Cart Items(listing)
+ Route::get('checkout/cart', 'Webkul\Shop\Http\Controllers\CartController@index')->defaults('_config', [
+ 'view' => 'shop::checkout.cart.index'
+ ])->name('shop.checkout.cart.index');
+
+ //Cart Items Add
+ Route::post('checkout/cart/add/{id}', 'Webkul\Shop\Http\Controllers\CartController@add')->defaults('_config', [
+ 'redirect' => 'shop.checkout.cart.index'
+ ])->name('cart.add');
+
+ //Cart Items Add Configurable for more
+ Route::get('checkout/cart/addconfigurable/{slug}', 'Webkul\Shop\Http\Controllers\CartController@addConfigurable')->name('cart.add.configurable');
+
+ //Cart Items Remove
+ Route::get('checkout/cart/remove/{id}', 'Webkul\Shop\Http\Controllers\CartController@remove')->name('cart.remove');
+
+ //Cart Update Before Checkout
+ Route::post('/checkout/cart', 'Webkul\Shop\Http\Controllers\CartController@updateBeforeCheckout')->defaults('_config', [
+ 'redirect' => 'shop.checkout.cart.index'
+ ])->name('shop.checkout.cart.update');
+
+ //Cart Items Remove
+ Route::get('/checkout/cart/remove/{id}', 'Webkul\Shop\Http\Controllers\CartController@remove')->defaults('_config', [
+ 'redirect' => 'shop.checkout.cart.index'
+ ])->name('shop.checkout.cart.remove');
+
+ //Checkout Index page
+ Route::get('/checkout/onepage', 'Webkul\Shop\Http\Controllers\OnepageController@index')->defaults('_config', [
+ 'view' => 'shop::checkout.onepage'
+ ])->name('shop.checkout.onepage.index');
+
+ //Checkout Save Address Form Store
+ Route::post('/checkout/save-address', 'Webkul\Shop\Http\Controllers\OnepageController@saveAddress')->name('shop.checkout.save-address');
+
+ //Checkout Save Shipping Address Form Store
+ Route::post('/checkout/save-shipping', 'Webkul\Shop\Http\Controllers\OnepageController@saveShipping')->name('shop.checkout.save-shipping');
+
+ //Checkout Save Payment Method Form
+ Route::post('/checkout/save-payment', 'Webkul\Shop\Http\Controllers\OnepageController@savePayment')->name('shop.checkout.save-payment');
+
+ //Checkout Save Order
+ Route::post('/checkout/save-order', 'Webkul\Shop\Http\Controllers\OnepageController@saveOrder')->name('shop.checkout.save-order');
+
+ //Checkout Order Successfull
+ Route::get('/checkout/success', 'Webkul\Shop\Http\Controllers\OnepageController@success')->defaults('_config', [
+ 'view' => 'shop::checkout.success'
+ ])->name('shop.checkout.success');
+
+ //Shop buynow button action
+ Route::get('buynow/{id}', 'Webkul\Shop\Http\Controllers\CartController@buyNow')->name('shop.product.buynow');
+
+ //Shop buynow button action
+ Route::get('move/wishlist/{id}', 'Webkul\Shop\Http\Controllers\CartController@moveToWishlist')->name('shop.movetowishlist');
+
+ //Show Product Details Page(For individually Viewable Product)
+ Route::get('/products/{slug}', 'Webkul\Shop\Http\Controllers\ProductController@index')->defaults('_config', [
+ 'view' => 'shop::products.view'
+ ])->name('shop.products.index');
+
+ // Show Product Review Form
+ Route::get('/reviews/{slug}', 'Webkul\Shop\Http\Controllers\ReviewController@show')->defaults('_config', [
+ 'view' => 'shop::products.reviews.index'
+ ])->name('shop.reviews.index');
+
+ // Show Product Review(listing)
+ Route::get('/product/{slug}/review', 'Webkul\Shop\Http\Controllers\ReviewController@create')->defaults('_config', [
+ 'view' => 'shop::products.reviews.create'
+ ])->name('shop.reviews.create');
+
+ // Show Product Review Form Store
+ Route::post('/product/{slug}/review', 'Webkul\Shop\Http\Controllers\ReviewController@store')->defaults('_config', [
+ 'redirect' => 'shop.home.index'
+ ])->name('shop.reviews.store');
+
+ //customer routes starts here
+ Route::prefix('customer')->group(function () {
+ // forgot Password Routes
+ // Forgot Password Form Show
+ Route::get('/forgot-password', 'Webkul\Customer\Http\Controllers\ForgotPasswordController@create')->defaults('_config', [
+ 'view' => 'shop::customers.signup.forgot-password'
+ ])->name('customer.forgot-password.create');
+
+ // Forgot Password Form Store
+ Route::post('/forgot-password', 'Webkul\Customer\Http\Controllers\ForgotPasswordController@store')->name('customer.forgot-password.store');
+
+ // Reset Password Form Show
+ Route::get('/reset-password/{token}', 'Webkul\Customer\Http\Controllers\ResetPasswordController@create')->defaults('_config', [
+ 'view' => 'shop::customers.signup.reset-password'
+ ])->name('customer.reset-password.create');
+
+ // Reset Password Form Store
+ Route::post('/reset-password', 'Webkul\Customer\Http\Controllers\ResetPasswordController@store')->defaults('_config', [
+ 'redirect' => 'customer.profile.index'
+ ])->name('customer.reset-password.store');
+
+ // Login Routes
+ // showshopafterlogin
+ // Route::get('login', 'Webkul\Customer\Http\Controllers\SessionController@show')->defaults('_config', [
+ // 'view' => 'shop::customers.session.index',
+ // ])->name('customer.login.index');
+
+ // Login form show
+ Route::get('login', 'Webkul\Customer\Http\Controllers\SessionController@show')->defaults('_config', [
+ 'view' => 'shop::customers.session.index',
+ ])->name('customer.session.index');
+
+ // Login form store
+ Route::post('login', 'Webkul\Customer\Http\Controllers\SessionController@create')->defaults('_config', [
+ 'redirect' => 'customer.profile.index'
+ ])->name('customer.session.create');
+
+ // Registration Routes
+ //registration form show
+ Route::get('register', 'Webkul\Customer\Http\Controllers\RegistrationController@show')->defaults('_config', [
+ 'view' => 'shop::customers.signup.index'
+ ])->name('customer.register.index');
+
+ //registration form store
+ Route::post('register', 'Webkul\Customer\Http\Controllers\RegistrationController@create')->defaults('_config', [
+ 'redirect' => 'customer.session.index',
+ ])->name('customer.register.create');
+
+ //verify account
+ Route::get('/verify-account/{token}', 'Webkul\Customer\Http\Controllers\RegistrationController@verifyAccount')->name('customer.verify');
+
+ //resend verification email
+ Route::get('/resend/verification/{email}', 'Webkul\Customer\Http\Controllers\RegistrationController@resendVerificationEmail')->name('customer.resend.verification-email');
+
+ // Auth Routes
+ Route::group(['middleware' => ['customer']], function () {
+
+ //Customer logout
+ Route::get('logout', 'Webkul\Customer\Http\Controllers\SessionController@destroy')->defaults('_config', [
+ 'redirect' => 'customer.session.index'
+ ])->name('customer.session.destroy');
+
+ //Customer Wishlist add
+ Route::get('wishlist/add/{id}', 'Webkul\Customer\Http\Controllers\WishlistController@add')->name('customer.wishlist.add');
+
+ //Customer Wishlist remove
+ Route::get('wishlist/remove/{id}', 'Webkul\Customer\Http\Controllers\WishlistController@remove')->name('customer.wishlist.remove');
+
+ //Customer Wishlist remove
+ Route::get('wishlist/removeall', 'Webkul\Customer\Http\Controllers\WishlistController@removeAll')->name('customer.wishlist.removeall');
+
+ //Customer Wishlist move to cart
+ Route::get('wishlist/move/{id}', 'Webkul\Customer\Http\Controllers\WishlistController@move')->name('customer.wishlist.move');
+
+ //customer account
+ Route::prefix('account')->group(function () {
+ //Customer Dashboard Route
+ Route::get('index', 'Webkul\Customer\Http\Controllers\AccountController@index')->defaults('_config', [
+ 'view' => 'shop::customers.account.index'
+ ])->name('customer.account.index');
+
+ //Customer Profile Show
+ Route::get('profile', 'Webkul\Customer\Http\Controllers\CustomerController@index')->defaults('_config', [
+ 'view' => 'shop::customers.account.profile.index'
+ ])->name('customer.profile.index');
+
+ //Customer Profile Edit Form Show
+ Route::get('profile/edit', 'Webkul\Customer\Http\Controllers\CustomerController@edit')->defaults('_config', [
+ 'view' => 'shop::customers.account.profile.edit'
+ ])->name('customer.profile.edit');
+
+ //Customer Profile Edit Form Store
+ Route::post('profile/edit', 'Webkul\Customer\Http\Controllers\CustomerController@update')->defaults('_config', [
+ 'redirect' => 'customer.profile.index'
+ ])->name('customer.profile.edit');
+ /* Profile Routes Ends Here */
+
+ /* Routes for Addresses */
+ //Customer Address Show
+ Route::get('addresses', 'Webkul\Customer\Http\Controllers\AddressController@index')->defaults('_config', [
+ 'view' => 'shop::customers.account.address.index'
+ ])->name('customer.address.index');
+
+ //Customer Address Create Form Show
+ Route::get('addresses/create', 'Webkul\Customer\Http\Controllers\AddressController@create')->defaults('_config', [
+ 'view' => 'shop::customers.account.address.create'
+ ])->name('customer.address.create');
+
+ //Customer Address Create Form Store
+ Route::post('addresses/create', 'Webkul\Customer\Http\Controllers\AddressController@store')->defaults('_config', [
+ 'view' => 'shop::customers.account.address.address',
+ 'redirect' => 'customer.address.index'
+ ])->name('customer.address.create');
+
+ //Customer Address Edit Form Show
+ Route::get('addresses/edit/{id}', 'Webkul\Customer\Http\Controllers\AddressController@edit')->defaults('_config', [
+ 'view' => 'shop::customers.account.address.edit'
+ ])->name('customer.address.edit');
+
+ //Customer Address Edit Form Store
+ Route::put('addresses/edit/{id}', 'Webkul\Customer\Http\Controllers\AddressController@update')->defaults('_config', [
+ 'redirect' => 'customer.address.index'
+ ])->name('customer.address.edit');
+
+ //Customer Address Make Default
+ Route::get('addresses/default/{id}', 'Webkul\Customer\Http\Controllers\AddressController@makeDefault')->name('make.default.address');
+
+ //Customer Address Delete
+ Route::get('addresses/delete/{id}', 'Webkul\Customer\Http\Controllers\AddressController@destroy')->name('address.delete');
+
+ /* Wishlist route */
+ //Customer wishlist(listing)
+ Route::get('wishlist', 'Webkul\Customer\Http\Controllers\WishlistController@index')->defaults('_config', [
+ 'view' => 'shop::customers.account.wishlist.wishlist'
+ ])->name('customer.wishlist.index');
+
+ /* Orders route */
+ //Customer orders(listing)
+ Route::get('orders', 'Webkul\Shop\Http\Controllers\OrderController@index')->defaults('_config', [
+ 'view' => 'shop::customers.account.orders.index'
+ ])->name('customer.orders.index');
+
+ //Customer orders view summary and status
+ Route::get('orders/view/{id}', 'Webkul\Shop\Http\Controllers\OrderController@view')->defaults('_config', [
+ 'view' => 'shop::customers.account.orders.view'
+ ])->name('customer.orders.view');
+
+ //Prints invoice
+ Route::get('orders/print/{id}', 'Webkul\Shop\Http\Controllers\OrderController@print')->defaults('_config', [
+ 'view' => 'shop::customers.account.orders.print'
+ ])->name('customer.orders.print');
+
+ /* Reviews route */
+ //Customer reviews
+ Route::get('reviews', 'Webkul\Customer\Http\Controllers\CustomerController@reviews')->defaults('_config', [
+ 'view' => 'shop::customers.account.reviews.index'
+ ])->name('customer.reviews.index');
+
+ //Customer review delete
+ Route::get('reviews/delete/{id}', 'Webkul\Shop\Http\Controllers\ReviewController@destroy')->defaults('_config', [
+ 'redirect' => 'customer.reviews.index'
+ ])->name('customer.review.delete');
+
+ //Customer all review delete
+ Route::get('reviews/all-delete', 'Webkul\Shop\Http\Controllers\ReviewController@deleteAll')->defaults('_config', [
+ 'redirect' => 'customer.reviews.index'
+ ])->name('customer.review.deleteall');
+ });
+ });
+ });
+ //customer routes end here
+
+ Route::fallback('Webkul\Shop\Http\Controllers\HomeController@notFound');
+});
diff --git a/packages/Webkul/ShowPriceAfterLogin/src/Providers/ShowPriceAfterLoginServiceProvider.php b/packages/Webkul/ShowPriceAfterLogin/src/Providers/ShowPriceAfterLoginServiceProvider.php
new file mode 100644
index 000000000..9da52468e
--- /dev/null
+++ b/packages/Webkul/ShowPriceAfterLogin/src/Providers/ShowPriceAfterLoginServiceProvider.php
@@ -0,0 +1,52 @@
+loadRoutesFrom(__DIR__ . '/../Http/routes.php');
+
+ $this->loadTranslationsFrom(__DIR__ . '/../Resources/lang', 'ShowPriceAfterLogin');
+
+ $this->publishes([
+ dirname(__DIR__) . '/Resources/views/Shop/price.blade.php' => base_path('packages/Webkul/Shop/src/Resources/views/products/price.blade.php')
+ ]);
+ $this->publishes([
+ dirname(__DIR__) . '/Resources/views/Shop/add-to-cart.blade.php' => base_path('packages/Webkul/Shop/src/Resources/views/products/add-to-cart.blade.php')
+ ]);
+ $this->publishes([
+ dirname(__DIR__) . '/Resources/views/Shop/add-buttons.blade.php' => base_path('packages/Webkul/Shop/src/Resources/views/products/add-buttons.blade.php')
+ ]);
+ $this->publishes([
+ dirname(__DIR__) . '/Resources/views/Shop/buy-now.blade.php' => base_path('packages/Webkul/Shop/src/Resources/views/products/buy-now.blade.php')
+ ]);
+ $this->publishes([
+ dirname(__DIR__) . '/Resources/views/Shop/view/product-add.blade.php' => base_path('packages/Webkul/Shop/src/Resources/views/products/view/product-add.blade.php')
+ ]);
+ $this->publishes([
+ dirname(__DIR__) . '/Resources/views/Shop/review-price.blade.php' => base_path('packages/Webkul/Shop/src/Resources/views/products/review-price.blade.php')
+ ]);
+
+ }
+
+ /**
+ * Register services.
+ *
+ * @return void
+ */
+ public function register()
+ {
+ $this->mergeConfigFrom(
+ dirname(__DIR__) . '/../Config/system.php', 'core'
+ );
+ }
+}
diff --git a/packages/Webkul/ShowPriceAfterLogin/src/Resources/lang/en/app.php b/packages/Webkul/ShowPriceAfterLogin/src/Resources/lang/en/app.php
new file mode 100644
index 000000000..14ae839ce
--- /dev/null
+++ b/packages/Webkul/ShowPriceAfterLogin/src/Resources/lang/en/app.php
@@ -0,0 +1,19 @@
+ [
+ 'name' => 'Show Price After Login',
+ 'settings' => 'Settings',
+ 'toggle' => 'Enable Module',
+ 'hide-shop-before-login' => 'Hide Shop Before Login',
+ 'hide-price-buy-cart-guest' => 'Hide Price & Buy/Add-to-Cart For Guest',
+ 'hide-buy-cart-guest' => 'Hide Buy/Add-to-Cart For Guest',
+ 'select-function' => 'Select Functional',
+ 'configure' => 'Configure',
+ 'configurations' => 'Configuration',
+ ],
+ 'products' => [
+ 'login-to-view-price' => 'Login To View Price',
+ 'login-to-buy' => 'Login To Buy'
+ ]
+];
\ No newline at end of file
diff --git a/packages/Webkul/ShowPriceAfterLogin/src/Resources/views/Shop/add-buttons.blade.php b/packages/Webkul/ShowPriceAfterLogin/src/Resources/views/Shop/add-buttons.blade.php
new file mode 100644
index 000000000..26e3a42db
--- /dev/null
+++ b/packages/Webkul/ShowPriceAfterLogin/src/Resources/views/Shop/add-buttons.blade.php
@@ -0,0 +1,71 @@
+@if (Route::currentRouteName() == "shop.products.index")
+ @include ('shop::products.add-to', ['product' => $product])
+@else
+ @if(auth()->guard('customer')->check() && core()->getConfigData('ShowPriceAfterLogin.settings.settings.enableordisable'))
+ @if ($product->type == "configurable")
+
+ @else
+
+
+ @csrf
+
+
+
+ haveSufficientQuantity(1) ? '' : 'disabled' }}>{{ __('shop::app.products.add-to-cart') }}
+
+
+ @include('shop::products.wishlist')
+
+ @endif
+
+
+
+ @elseif(
+ !auth()->guard('customer')->check()
+ && core()->getConfigData('ShowPriceAfterLogin.settings.settings.enableordisable')
+ && (
+ core()->getConfigData('ShowPriceAfterLogin.settings.settings.selectfunction') == "hide-buy-cart-guest")
+ )
+
+ @elseif(! auth()->guard('customer')->check() && core()->getConfigData('ShowPriceAfterLogin.settings.settings.enableordisable') && core()->getConfigData('ShowPriceAfterLogin.settings.settings.selectfunction') == "hide-price-buy-cart-guest")
+
+
+ @else
+ @if ($product->type == "configurable")
+
+ @else
+
+
+ @csrf
+
+
+
+ haveSufficientQuantity(1) ? '' : 'disabled' }}>{{ __('shop::app.products.add-to-cart') }}
+
+
+ @include('shop::products.wishlist')
+
+ @endif
+
+ @endif
+@endif
\ No newline at end of file
diff --git a/packages/Webkul/ShowPriceAfterLogin/src/Resources/views/Shop/add-to-cart.blade.php b/packages/Webkul/ShowPriceAfterLogin/src/Resources/views/Shop/add-to-cart.blade.php
new file mode 100755
index 000000000..f4fe91285
--- /dev/null
+++ b/packages/Webkul/ShowPriceAfterLogin/src/Resources/views/Shop/add-to-cart.blade.php
@@ -0,0 +1,24 @@
+{!! view_render_event('bagisto.shop.products.add_to_cart.before', ['product' => $product]) !!}
+
+@if(auth()->guard('customer')->check() && core()->getConfigData('ShowPriceAfterLogin.settings.settings.enableordisable'))
+ type != 'configurable' && !$product->haveSufficientQuantity(1) ? 'disabled' : '' }}>
+ {{ __('shop::app.products.add-to-cart') }}
+
+
+ @elseif(
+ !auth()->guard('customer')->check()
+ && core()->getConfigData('ShowPriceAfterLogin.settings.settings.enableordisable')
+ && (
+ core()->getConfigData('ShowPriceAfterLogin.settings.settings.selectfunction') == "hide-price-buy-cart-guest"
+ || core()->getConfigData('ShowPriceAfterLogin.settings.settings.selectfunction') == "hide-buy-cart-guest")
+ )
+
+
+
+@else
+ type != 'configurable' && !$product->haveSufficientQuantity(1) ? 'disabled' : '' }}>
+ {{ __('shop::app.products.add-to-cart') }}
+
+
+@endif
+{!! view_render_event('bagisto.shop.products.add_to_cart.after', ['product' => $product]) !!}
\ No newline at end of file
diff --git a/packages/Webkul/ShowPriceAfterLogin/src/Resources/views/Shop/buy-now.blade.php b/packages/Webkul/ShowPriceAfterLogin/src/Resources/views/Shop/buy-now.blade.php
new file mode 100755
index 000000000..edcfaa261
--- /dev/null
+++ b/packages/Webkul/ShowPriceAfterLogin/src/Resources/views/Shop/buy-now.blade.php
@@ -0,0 +1,21 @@
+{!! view_render_event('bagisto.shop.products.buy_now.before', ['product' => $product]) !!}
+
+@if(auth()->guard('customer')->check() && core()->getConfigData('ShowPriceAfterLogin.settings.settings.enableordisable'))
+ type != 'configurable' && !$product->haveSufficientQuantity(1) ? 'disabled' : '' }}>
+ {{ __('shop::app.products.buy-now') }}
+
+
+@elseif(
+ !auth()->guard('customer')->check()
+ && core()->getConfigData('ShowPriceAfterLogin.settings.settings.enableordisable')
+ && ( core()->getConfigData('ShowPriceAfterLogin.settings.settings.selectfunction') == "hide-price-buy-cart-guest"
+ ||core()->getConfigData('ShowPriceAfterLogin.settings.settings.selectfunction') == "hide-buy-cart-guest"))
+
+
+@else
+ type != 'configurable' && !$product->haveSufficientQuantity(1) ? 'disabled' : '' }}>
+ {{ __('shop::app.products.buy-now') }}
+
+@endif
+
+{!! view_render_event('bagisto.shop.products.buy_now.after', ['product' => $product]) !!}
\ No newline at end of file
diff --git a/packages/Webkul/ShowPriceAfterLogin/src/Resources/views/Shop/price.blade.php b/packages/Webkul/ShowPriceAfterLogin/src/Resources/views/Shop/price.blade.php
new file mode 100755
index 000000000..29d6087c6
--- /dev/null
+++ b/packages/Webkul/ShowPriceAfterLogin/src/Resources/views/Shop/price.blade.php
@@ -0,0 +1,66 @@
+{!! view_render_event('bagisto.shop.products.price.before', ['product' => $product]) !!}
+
+ @if(auth()->guard('customer')->check() && core()->getConfigData('ShowPriceAfterLogin.settings.settings.enableordisable'))
+ @inject ('priceHelper', 'Webkul\Product\Helpers\Price')
+
+ @if ($product->type == 'configurable')
+
+
{{ __('shop::app.products.price-label') }}
+
+
{{ core()->currency($priceHelper->getMinimalPrice($product)) }}
+
+ @else
+
+ @if ($priceHelper->haveSpecialPrice($product))
+
+
+ {{ __('shop::app.products.sale') }}
+
+
+
{{ core()->currency($product->price) }}
+
+
{{ core()->currency($priceHelper->getSpecialPrice($product)) }}
+
+ @else
+
+
{{ core()->currency($product->price) }}
+
+ @endif
+
+ @endif
+
+ @elseif(!auth()->guard('customer')->check() && core()->getConfigData('ShowPriceAfterLogin.settings.settings.enableordisable') && (core()->getConfigData('ShowPriceAfterLogin.settings.settings.selectfunction') == "hide-price-buy-cart-guest"))
+
+
+
+ @else
+ @inject ('priceHelper', 'Webkul\Product\Helpers\Price')
+
+ @if ($product->type == 'configurable')
+
+
{{ __('shop::app.products.price-label') }}
+
+
{{ core()->currency($priceHelper->getMinimalPrice($product)) }}
+
+ @else
+
+ @if ($priceHelper->haveSpecialPrice($product))
+
+
+ {{ __('shop::app.products.sale') }}
+
+
+
{{ core()->currency($product->price) }}
+
+
{{ core()->currency($priceHelper->getSpecialPrice($product)) }}
+
+ @else
+
+
{{ core()->currency($product->price) }}
+
+ @endif
+
+ @endif
+ @endif
+
+{!! view_render_event('bagisto.shop.products.price.after', ['product' => $product]) !!}
\ No newline at end of file
diff --git a/packages/Webkul/ShowPriceAfterLogin/src/Resources/views/Shop/review-price.blade.php b/packages/Webkul/ShowPriceAfterLogin/src/Resources/views/Shop/review-price.blade.php
new file mode 100644
index 000000000..99e01100c
--- /dev/null
+++ b/packages/Webkul/ShowPriceAfterLogin/src/Resources/views/Shop/review-price.blade.php
@@ -0,0 +1,15 @@
+@if( !(core()->getConfigData('ShowPriceAfterLogin.settings.settings.enableordisable')) )
+
+ @inject ('priceHelper', 'Webkul\Product\Helpers\Price')
+
+ @if ($product->type == 'configurable')
+ {{ core()->currency($priceHelper->getMinimalPrice($product)) }}
+ @else
+ @if ($priceHelper->haveSpecialPrice($product))
+ {{ core()->currency($priceHelper->getSpecialPrice($product)) }}
+ @else
+ {{ core()->currency($product->price) }}
+ @endif
+ @endif
+
+@endif
\ No newline at end of file
diff --git a/packages/Webkul/ShowPriceAfterLogin/src/Resources/views/Shop/view/product-add.blade.php b/packages/Webkul/ShowPriceAfterLogin/src/Resources/views/Shop/view/product-add.blade.php
new file mode 100644
index 000000000..311a1a73e
--- /dev/null
+++ b/packages/Webkul/ShowPriceAfterLogin/src/Resources/views/Shop/view/product-add.blade.php
@@ -0,0 +1,28 @@
+{!! view_render_event('bagisto.shop.products.view.product-add.after', ['product' => $product]) !!}
+
+
+
+{!! view_render_event('bagisto.shop.products.view.product-add.after', ['product' => $product]) !!}
\ No newline at end of file
diff --git a/packages/Webkul/ShowPriceAfterLogin/vendor/autoload.php b/packages/Webkul/ShowPriceAfterLogin/vendor/autoload.php
new file mode 100644
index 000000000..1426faa9b
--- /dev/null
+++ b/packages/Webkul/ShowPriceAfterLogin/vendor/autoload.php
@@ -0,0 +1,7 @@
+
+ * Jordi Boggiano
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Autoload;
+
+/**
+ * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
+ *
+ * $loader = new \Composer\Autoload\ClassLoader();
+ *
+ * // register classes with namespaces
+ * $loader->add('Symfony\Component', __DIR__.'/component');
+ * $loader->add('Symfony', __DIR__.'/framework');
+ *
+ * // activate the autoloader
+ * $loader->register();
+ *
+ * // to enable searching the include path (eg. for PEAR packages)
+ * $loader->setUseIncludePath(true);
+ *
+ * In this example, if you try to use a class in the Symfony\Component
+ * namespace or one of its children (Symfony\Component\Console for instance),
+ * the autoloader will first look for the class under the component/
+ * directory, and it will then fallback to the framework/ directory if not
+ * found before giving up.
+ *
+ * This class is loosely based on the Symfony UniversalClassLoader.
+ *
+ * @author Fabien Potencier
+ * @author Jordi Boggiano
+ * @see http://www.php-fig.org/psr/psr-0/
+ * @see http://www.php-fig.org/psr/psr-4/
+ */
+class ClassLoader
+{
+ // PSR-4
+ private $prefixLengthsPsr4 = array();
+ private $prefixDirsPsr4 = array();
+ private $fallbackDirsPsr4 = array();
+
+ // PSR-0
+ private $prefixesPsr0 = array();
+ private $fallbackDirsPsr0 = array();
+
+ private $useIncludePath = false;
+ private $classMap = array();
+ private $classMapAuthoritative = false;
+ private $missingClasses = array();
+ private $apcuPrefix;
+
+ public function getPrefixes()
+ {
+ if (!empty($this->prefixesPsr0)) {
+ return call_user_func_array('array_merge', $this->prefixesPsr0);
+ }
+
+ return array();
+ }
+
+ public function getPrefixesPsr4()
+ {
+ return $this->prefixDirsPsr4;
+ }
+
+ public function getFallbackDirs()
+ {
+ return $this->fallbackDirsPsr0;
+ }
+
+ public function getFallbackDirsPsr4()
+ {
+ return $this->fallbackDirsPsr4;
+ }
+
+ public function getClassMap()
+ {
+ return $this->classMap;
+ }
+
+ /**
+ * @param array $classMap Class to filename map
+ */
+ public function addClassMap(array $classMap)
+ {
+ if ($this->classMap) {
+ $this->classMap = array_merge($this->classMap, $classMap);
+ } else {
+ $this->classMap = $classMap;
+ }
+ }
+
+ /**
+ * Registers a set of PSR-0 directories for a given prefix, either
+ * appending or prepending to the ones previously set for this prefix.
+ *
+ * @param string $prefix The prefix
+ * @param array|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
+ */
+ public function add($prefix, $paths, $prepend = false)
+ {
+ if (!$prefix) {
+ if ($prepend) {
+ $this->fallbackDirsPsr0 = array_merge(
+ (array) $paths,
+ $this->fallbackDirsPsr0
+ );
+ } else {
+ $this->fallbackDirsPsr0 = array_merge(
+ $this->fallbackDirsPsr0,
+ (array) $paths
+ );
+ }
+
+ return;
+ }
+
+ $first = $prefix[0];
+ if (!isset($this->prefixesPsr0[$first][$prefix])) {
+ $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+
+ return;
+ }
+ if ($prepend) {
+ $this->prefixesPsr0[$first][$prefix] = array_merge(
+ (array) $paths,
+ $this->prefixesPsr0[$first][$prefix]
+ );
+ } else {
+ $this->prefixesPsr0[$first][$prefix] = array_merge(
+ $this->prefixesPsr0[$first][$prefix],
+ (array) $paths
+ );
+ }
+ }
+
+ /**
+ * Registers a set of PSR-4 directories for a given namespace, either
+ * appending or prepending to the ones previously set for this namespace.
+ *
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param array|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
+ *
+ * @throws \InvalidArgumentException
+ */
+ public function addPsr4($prefix, $paths, $prepend = false)
+ {
+ if (!$prefix) {
+ // Register directories for the root namespace.
+ if ($prepend) {
+ $this->fallbackDirsPsr4 = array_merge(
+ (array) $paths,
+ $this->fallbackDirsPsr4
+ );
+ } else {
+ $this->fallbackDirsPsr4 = array_merge(
+ $this->fallbackDirsPsr4,
+ (array) $paths
+ );
+ }
+ } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
+ // Register directories for a new namespace.
+ $length = strlen($prefix);
+ if ('\\' !== $prefix[$length - 1]) {
+ throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+ }
+ $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+ $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ } elseif ($prepend) {
+ // Prepend directories for an already registered namespace.
+ $this->prefixDirsPsr4[$prefix] = array_merge(
+ (array) $paths,
+ $this->prefixDirsPsr4[$prefix]
+ );
+ } else {
+ // Append directories for an already registered namespace.
+ $this->prefixDirsPsr4[$prefix] = array_merge(
+ $this->prefixDirsPsr4[$prefix],
+ (array) $paths
+ );
+ }
+ }
+
+ /**
+ * Registers a set of PSR-0 directories for a given prefix,
+ * replacing any others previously set for this prefix.
+ *
+ * @param string $prefix The prefix
+ * @param array|string $paths The PSR-0 base directories
+ */
+ public function set($prefix, $paths)
+ {
+ if (!$prefix) {
+ $this->fallbackDirsPsr0 = (array) $paths;
+ } else {
+ $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
+ }
+ }
+
+ /**
+ * Registers a set of PSR-4 directories for a given namespace,
+ * replacing any others previously set for this namespace.
+ *
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param array|string $paths The PSR-4 base directories
+ *
+ * @throws \InvalidArgumentException
+ */
+ public function setPsr4($prefix, $paths)
+ {
+ if (!$prefix) {
+ $this->fallbackDirsPsr4 = (array) $paths;
+ } else {
+ $length = strlen($prefix);
+ if ('\\' !== $prefix[$length - 1]) {
+ throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+ }
+ $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+ $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ }
+ }
+
+ /**
+ * Turns on searching the include path for class files.
+ *
+ * @param bool $useIncludePath
+ */
+ public function setUseIncludePath($useIncludePath)
+ {
+ $this->useIncludePath = $useIncludePath;
+ }
+
+ /**
+ * Can be used to check if the autoloader uses the include path to check
+ * for classes.
+ *
+ * @return bool
+ */
+ public function getUseIncludePath()
+ {
+ return $this->useIncludePath;
+ }
+
+ /**
+ * Turns off searching the prefix and fallback directories for classes
+ * that have not been registered with the class map.
+ *
+ * @param bool $classMapAuthoritative
+ */
+ public function setClassMapAuthoritative($classMapAuthoritative)
+ {
+ $this->classMapAuthoritative = $classMapAuthoritative;
+ }
+
+ /**
+ * Should class lookup fail if not found in the current class map?
+ *
+ * @return bool
+ */
+ public function isClassMapAuthoritative()
+ {
+ return $this->classMapAuthoritative;
+ }
+
+ /**
+ * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
+ *
+ * @param string|null $apcuPrefix
+ */
+ public function setApcuPrefix($apcuPrefix)
+ {
+ $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
+ }
+
+ /**
+ * The APCu prefix in use, or null if APCu caching is not enabled.
+ *
+ * @return string|null
+ */
+ public function getApcuPrefix()
+ {
+ return $this->apcuPrefix;
+ }
+
+ /**
+ * Registers this instance as an autoloader.
+ *
+ * @param bool $prepend Whether to prepend the autoloader or not
+ */
+ public function register($prepend = false)
+ {
+ spl_autoload_register(array($this, 'loadClass'), true, $prepend);
+ }
+
+ /**
+ * Unregisters this instance as an autoloader.
+ */
+ public function unregister()
+ {
+ spl_autoload_unregister(array($this, 'loadClass'));
+ }
+
+ /**
+ * Loads the given class or interface.
+ *
+ * @param string $class The name of the class
+ * @return bool|null True if loaded, null otherwise
+ */
+ public function loadClass($class)
+ {
+ if ($file = $this->findFile($class)) {
+ includeFile($file);
+
+ return true;
+ }
+ }
+
+ /**
+ * Finds the path to the file where the class is defined.
+ *
+ * @param string $class The name of the class
+ *
+ * @return string|false The path if found, false otherwise
+ */
+ public function findFile($class)
+ {
+ // class map lookup
+ if (isset($this->classMap[$class])) {
+ return $this->classMap[$class];
+ }
+ if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
+ return false;
+ }
+ if (null !== $this->apcuPrefix) {
+ $file = apcu_fetch($this->apcuPrefix.$class, $hit);
+ if ($hit) {
+ return $file;
+ }
+ }
+
+ $file = $this->findFileWithExtension($class, '.php');
+
+ // Search for Hack files if we are running on HHVM
+ if (false === $file && defined('HHVM_VERSION')) {
+ $file = $this->findFileWithExtension($class, '.hh');
+ }
+
+ if (null !== $this->apcuPrefix) {
+ apcu_add($this->apcuPrefix.$class, $file);
+ }
+
+ if (false === $file) {
+ // Remember that this class does not exist.
+ $this->missingClasses[$class] = true;
+ }
+
+ return $file;
+ }
+
+ private function findFileWithExtension($class, $ext)
+ {
+ // PSR-4 lookup
+ $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
+
+ $first = $class[0];
+ if (isset($this->prefixLengthsPsr4[$first])) {
+ $subPath = $class;
+ while (false !== $lastPos = strrpos($subPath, '\\')) {
+ $subPath = substr($subPath, 0, $lastPos);
+ $search = $subPath . '\\';
+ if (isset($this->prefixDirsPsr4[$search])) {
+ $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
+ foreach ($this->prefixDirsPsr4[$search] as $dir) {
+ if (file_exists($file = $dir . $pathEnd)) {
+ return $file;
+ }
+ }
+ }
+ }
+ }
+
+ // PSR-4 fallback dirs
+ foreach ($this->fallbackDirsPsr4 as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
+ return $file;
+ }
+ }
+
+ // PSR-0 lookup
+ if (false !== $pos = strrpos($class, '\\')) {
+ // namespaced class name
+ $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
+ . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
+ } else {
+ // PEAR-like class name
+ $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
+ }
+
+ if (isset($this->prefixesPsr0[$first])) {
+ foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
+ if (0 === strpos($class, $prefix)) {
+ foreach ($dirs as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+ return $file;
+ }
+ }
+ }
+ }
+ }
+
+ // PSR-0 fallback dirs
+ foreach ($this->fallbackDirsPsr0 as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+ return $file;
+ }
+ }
+
+ // PSR-0 include paths.
+ if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
+ return $file;
+ }
+
+ return false;
+ }
+}
+
+/**
+ * Scope isolated include.
+ *
+ * Prevents access to $this/self from included files.
+ */
+function includeFile($file)
+{
+ include $file;
+}
diff --git a/packages/Webkul/ShowPriceAfterLogin/vendor/composer/LICENSE b/packages/Webkul/ShowPriceAfterLogin/vendor/composer/LICENSE
new file mode 100644
index 000000000..f27399a04
--- /dev/null
+++ b/packages/Webkul/ShowPriceAfterLogin/vendor/composer/LICENSE
@@ -0,0 +1,21 @@
+
+Copyright (c) Nils Adermann, Jordi Boggiano
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
diff --git a/packages/Webkul/ShowPriceAfterLogin/vendor/composer/autoload_classmap.php b/packages/Webkul/ShowPriceAfterLogin/vendor/composer/autoload_classmap.php
new file mode 100644
index 000000000..7a91153b0
--- /dev/null
+++ b/packages/Webkul/ShowPriceAfterLogin/vendor/composer/autoload_classmap.php
@@ -0,0 +1,9 @@
+ array($baseDir . '/src'),
+);
diff --git a/packages/Webkul/ShowPriceAfterLogin/vendor/composer/autoload_real.php b/packages/Webkul/ShowPriceAfterLogin/vendor/composer/autoload_real.php
new file mode 100644
index 000000000..cab3e4106
--- /dev/null
+++ b/packages/Webkul/ShowPriceAfterLogin/vendor/composer/autoload_real.php
@@ -0,0 +1,52 @@
+= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
+ if ($useStaticLoader) {
+ require_once __DIR__ . '/autoload_static.php';
+
+ call_user_func(\Composer\Autoload\ComposerStaticInitc08d2d3d643454e83806de724f18c074::getInitializer($loader));
+ } else {
+ $map = require __DIR__ . '/autoload_namespaces.php';
+ foreach ($map as $namespace => $path) {
+ $loader->set($namespace, $path);
+ }
+
+ $map = require __DIR__ . '/autoload_psr4.php';
+ foreach ($map as $namespace => $path) {
+ $loader->setPsr4($namespace, $path);
+ }
+
+ $classMap = require __DIR__ . '/autoload_classmap.php';
+ if ($classMap) {
+ $loader->addClassMap($classMap);
+ }
+ }
+
+ $loader->register(true);
+
+ return $loader;
+ }
+}
diff --git a/packages/Webkul/ShowPriceAfterLogin/vendor/composer/autoload_static.php b/packages/Webkul/ShowPriceAfterLogin/vendor/composer/autoload_static.php
new file mode 100644
index 000000000..b451fb80e
--- /dev/null
+++ b/packages/Webkul/ShowPriceAfterLogin/vendor/composer/autoload_static.php
@@ -0,0 +1,31 @@
+
+ array (
+ 'Webkul\\ShowPriceAfterLogin\\' => 27,
+ ),
+ );
+
+ public static $prefixDirsPsr4 = array (
+ 'Webkul\\ShowPriceAfterLogin\\' =>
+ array (
+ 0 => __DIR__ . '/../..' . '/src',
+ ),
+ );
+
+ public static function getInitializer(ClassLoader $loader)
+ {
+ return \Closure::bind(function () use ($loader) {
+ $loader->prefixLengthsPsr4 = ComposerStaticInitc08d2d3d643454e83806de724f18c074::$prefixLengthsPsr4;
+ $loader->prefixDirsPsr4 = ComposerStaticInitc08d2d3d643454e83806de724f18c074::$prefixDirsPsr4;
+
+ }, null, ClassLoader::class);
+ }
+}
diff --git a/packages/Webkul/ShowPriceAfterLogin/webpack.mix.js b/packages/Webkul/ShowPriceAfterLogin/webpack.mix.js
new file mode 100644
index 000000000..b57811642
--- /dev/null
+++ b/packages/Webkul/ShowPriceAfterLogin/webpack.mix.js
@@ -0,0 +1,22 @@
+const { mix } = require("laravel-mix");
+require("laravel-mix-merge-manifest");
+
+if (mix.inProduction()) {
+ var publicPath = 'publishable/assets';
+} else {
+ var publicPath = "../../../public/vendor/module/assets";
+}
+
+mix.setPublicPath(publicPath).mergeManifest();
+mix.disableNotifications();
+
+mix.js(__dirname + "/src/Resources/assets/js/app.js", 'js/custom_app.js')
+ .copyDirectory( __dirname + '/src/Resources/assets/images', publicPath + '/images')
+ .sass(__dirname + "/src/Resources/assets/sass/app.scss", 'css/custom_app.css')
+ .options({
+ processCssUrls: false
+ });
+
+if (mix.inProduction()) {
+ mix.version();
+}
diff --git a/packages/Webkul/StripeConnect/.gitignore b/packages/Webkul/StripeConnect/.gitignore
new file mode 100644
index 000000000..6376db975
--- /dev/null
+++ b/packages/Webkul/StripeConnect/.gitignore
@@ -0,0 +1,3 @@
+/node_modules
+/package-lock.json
+npm-debug.log
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/composer.json b/packages/Webkul/StripeConnect/composer.json
new file mode 100644
index 000000000..ccce67bde
--- /dev/null
+++ b/packages/Webkul/StripeConnect/composer.json
@@ -0,0 +1,25 @@
+{
+ "name": "bagisto/laravel-stripe-connect",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Prashant Singh",
+ "email": "prashant.singh852@webkul.com"
+ }
+ ],
+ "require": {},
+ "autoload": {
+ "psr-4": {
+ "Webkul\\StripeConnect\\": "src/"
+ }
+ },
+ "extra": {
+ "laravel": {
+ "providers": [
+ "Webkul\\StripeConnect\\Providers\\StripeConnectServiceProdiver"
+ ],
+ "aliases": {}
+ }
+ },
+ "minimum-stability": "dev"
+}
diff --git a/packages/Webkul/StripeConnect/package.json b/packages/Webkul/StripeConnect/package.json
new file mode 100644
index 000000000..2d948db6a
--- /dev/null
+++ b/packages/Webkul/StripeConnect/package.json
@@ -0,0 +1,25 @@
+{
+ "private": true,
+ "scripts": {
+ "dev": "npm run development",
+ "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
+ "watch": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
+ "watch-poll": "cross-env npm run watch -- --watch-poll --progress",
+ "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
+ "prod": "npm run production",
+ "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
+ },
+ "devDependencies": {
+ "axios": "^0.18",
+ "cross-env": "^5.1.4",
+ "laravel-mix": "^2.1",
+ "laravel-mix-merge-manifest": "^0.1.1",
+ "jquery": "^3.2",
+ "vue": "^2.1.10"
+ },
+ "dependencies": {
+ "vee-validate": "2.0.0-rc.26",
+ "vue-flatpickr": "^2.3.0",
+ "vue-slider-component": "^2.7.5"
+ }
+}
diff --git a/packages/Webkul/StripeConnect/src/Config/admin-menu.php b/packages/Webkul/StripeConnect/src/Config/admin-menu.php
new file mode 100644
index 000000000..7d2364232
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Config/admin-menu.php
@@ -0,0 +1,19 @@
+ 'stripe',
+ 'name' => 'STRIPE',
+ 'route' => 'admin.stripe.seller',
+ 'sort' => 7,
+ 'icon-class' => 'stripe-menu-icon',
+ ],
+
+ [
+ 'key' => 'stripe.connect',
+ 'name' => 'Connect Account',
+ 'route' => 'admin.stripe.seller',
+ 'sort' => 1,
+ 'icon-class' => '',
+ ]
+];
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/src/Config/paymentmethods.php b/packages/Webkul/StripeConnect/src/Config/paymentmethods.php
new file mode 100644
index 000000000..05268dabc
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Config/paymentmethods.php
@@ -0,0 +1,11 @@
+ [
+ 'code' => 'stripe',
+ 'title' => 'Stripe',
+ 'description' => 'Stripe Payments',
+ 'class' => 'Webkul\StripeConnect\Payment\StripePayment',
+ 'sandbox' => true,
+ 'active' => true
+ ]
+];
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/src/Config/system.php b/packages/Webkul/StripeConnect/src/Config/system.php
new file mode 100644
index 000000000..95f84c6a4
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Config/system.php
@@ -0,0 +1,127 @@
+ 'stripe',
+ 'name' => 'Stripe Connect',
+ 'sort' => 5
+ ], [
+ 'key' => 'stripe.connect',
+ 'name' => 'Connect Account',
+ 'sort' => 1,
+ ], [
+ 'key' => 'stripe.connect.details',
+ 'name' => 'Account Details',
+ 'sort' => 1,
+ 'fields' => [
+ [
+ 'name' => 'clientid',
+ 'title' => 'Client ID',
+ 'type' => 'text',
+ 'validation' => 'required',
+ 'channel_based' => false,
+ 'locale_based' => false
+ ]
+ ]
+ ], [
+ 'key' => 'sales.paymentmethods.stripe',
+ 'name' => 'Stripe Payments',
+ 'sort' => 4,
+ 'fields' => [
+ [
+ 'name' => 'active',
+ 'title' => 'Enable For Checkout',
+ 'type' => 'select',
+ 'options' => [
+ [
+ 'title' => 'True',
+ 'value' => true
+ ], [
+ 'title' => 'False',
+ 'value' => false
+ ]
+ ],
+ 'validation' => 'required'
+ ], [
+ 'name' => 'title',
+ 'title' => 'Title',
+ 'type' => 'text',
+ 'validation' => 'required',
+ 'channel_based' => false,
+ 'locale_based' => true
+ ],
+ // [
+ // 'name' => 'acceptedchannels',
+ // 'title' => 'Accpeted Channels',
+ // 'type' => 'multiselect',
+ // 'validation' => 'required',
+ // 'channel_based' => false,
+ // 'locale_based' => false,
+ // 'repository' => 'Webkul\Aramex\Repositories\ChannelRepository@getAllChannels'
+ // ],
+ [
+ 'name' => 'description',
+ 'title' => 'Description',
+ 'type' => 'textarea',
+ 'channel_based' => false,
+ 'locale_based' => true
+ ], [
+ 'name' => 'enabletesting',
+ 'title' => 'Enable Testing',
+ 'type' => 'select',
+ 'channel_based' => false,
+ 'locale_based' => true,
+ 'options' => [
+ [
+ 'title' => 'Active',
+ 'value' => true
+ ], [
+ 'title' => 'Inactive',
+ 'value' => false
+ ]
+ ],
+ 'validation' => 'required'
+ ],
+ // [
+ // 'name' => 'test_publishable_key',
+ // 'title' => 'Test Publishable Key',
+ // 'type' => 'text',
+ // 'type' => 'text',
+ // // 'validation' => 'required',
+ // 'channel_based' => false,
+ // 'locale_based' => false
+ // ], [
+ // 'name' => 'test_secret_key',
+ // 'title' => 'Test Secret Key',
+ // 'type' => 'text',
+ // 'type' => 'text',
+ // // 'validation' => 'required',
+ // 'channel_based' => false,
+ // 'locale_based' => false
+ // ], [
+ // 'name' => 'live_publishable_key',
+ // 'title' => 'Live Publishable Key',
+ // 'type' => 'text',
+ // 'type' => 'text',
+ // // 'validation' => 'required',
+ // 'channel_based' => false,
+ // 'locale_based' => false
+ // ], [
+ // 'name' => 'live_secret_key',
+ // 'title' => 'Live Secret Key',
+ // 'type' => 'text',
+ // 'type' => 'text',
+ // // 'validation' => 'required',
+ // 'channel_based' => false,
+ // 'locale_based' => false
+ // ],
+ [
+ 'name' => 'statement_descriptor',
+ 'title' => 'Statement Descriptor',
+ 'type' => 'text',
+ 'type' => 'text',
+ // 'validation' => 'required'
+ ]
+ ]
+ ]
+];
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/src/Contracts/StripeCart.php b/packages/Webkul/StripeConnect/src/Contracts/StripeCart.php
new file mode 100644
index 000000000..4175718e4
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Contracts/StripeCart.php
@@ -0,0 +1,7 @@
+increments('id');
+ $table->integer('customer_id')->nullable()->unsigned();
+ $table->foreign('customer_id')->references('id')->on('customers')->onDelete('cascade');
+ $table->string('token');
+ $table->boolean('need_new_token')->default(0);
+ $table->string('last_four')->length(4)->nullable();
+ $table->json('misc')->nullable();
+
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('stripe_cards');
+ }
+}
diff --git a/packages/Webkul/StripeConnect/src/Database/Migrations/2019_06_09_152250_create_stripe_companies_table.php b/packages/Webkul/StripeConnect/src/Database/Migrations/2019_06_09_152250_create_stripe_companies_table.php
new file mode 100644
index 000000000..ea6343626
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Database/Migrations/2019_06_09_152250_create_stripe_companies_table.php
@@ -0,0 +1,37 @@
+increments('id');
+ $table->string('access_token');
+ $table->string('refresh_token');
+ $table->string('stripe_publishable_key');
+ $table->string('stripe_user_id');
+ $table->integer('company_id')->unsigned();
+ $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('stripe_companies');
+ }
+}
diff --git a/packages/Webkul/StripeConnect/src/Database/Migrations/2019_06_11_174319_create_stripe_cart_table.php b/packages/Webkul/StripeConnect/src/Database/Migrations/2019_06_11_174319_create_stripe_cart_table.php
new file mode 100644
index 000000000..f5850aca0
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Database/Migrations/2019_06_11_174319_create_stripe_cart_table.php
@@ -0,0 +1,34 @@
+increments('id');
+ $table->integer('cart_id')->unsigned();
+ $table->foreign('cart_id')->references('id')->on('cart')->onDelete('cascade');
+ $table->json('stripe_token');
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('stripe_cart');
+ }
+}
diff --git a/packages/Webkul/StripeConnect/src/Http/Controllers/Controller.php b/packages/Webkul/StripeConnect/src/Http/Controllers/Controller.php
new file mode 100755
index 000000000..d75c0d17a
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Http/Controllers/Controller.php
@@ -0,0 +1,12 @@
+ @prashant-webkul
+ * @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
+ */
+class SellerRegistrationController extends Controller
+{
+ /**
+ * To hold the StripeConnect Repository Instance
+ */
+ protected $stripeConnect;
+
+ public function __construct(StripeConnect $stripeConnect)
+ {
+ $this->stripeConnect = $stripeConnect;
+
+ Stripe::setApiKey(env('STRIPE_TEST_SECRET_KEY'));
+ }
+
+ public function index()
+ {
+ return view('stripe::connect');
+ }
+
+ /**
+ * To process the retrieved token after the seller's onboarding
+ * on platform account
+ */
+ public function retrieveToken()
+ {
+ if (! request()->has('error')) {
+ $scope = request()->input('scope');
+ $code = request()->input('code');
+
+ $client = new Client(); //GuzzleHttp\Client
+ $result = $client->post('https://connect.stripe.com/oauth/token', [
+ 'auth' => [env('STRIPE_TEST_SECRET_KEY'), ''],
+ 'form_params' => [
+ 'code' => $code,
+ 'grant_type' => 'authorization_code'
+ ]
+ ]);
+
+ $decoded = json_decode($result->getBody()->getContents());
+ $access_token = $decoded->access_token;
+ $refresh_token = $decoded->refresh_token;
+ $publishable_key = $decoded->stripe_publishable_key;
+ $stripe_user_id = $decoded->stripe_user_id;
+
+ $result = $this->stripeConnect->create([
+ 'access_token' => $access_token,
+ 'refresh_token' => $refresh_token,
+ 'stripe_publishable_key' => $publishable_key,
+ 'stripe_user_id' => $stripe_user_id
+ ]);
+
+ if ($result) {
+ session()->flash('success', 'Your Stripe account is successfully integrated with the platform');
+ } else {
+ session()->flash('error', 'There was some problem in onboarding your account');
+ }
+ } else {
+ session()->flash('error', request()->input('error_description'));
+ }
+
+ return redirect()->route('admin.stripe.seller');
+ }
+
+ public function revokeAccess()
+ {
+ $stripeConnectDetails = $this->stripeConnect->findWhere([
+ 'company_id' => \Company::getCurrent()->id
+ ])->first();
+
+ $client = new Client(); //GuzzleHttp\Client
+ $result = $client->post('https://connect.stripe.com/oauth/deauthorize', [
+ 'auth' => [env('STRIPE_TEST_SECRET_KEY'), ''],
+ 'form_params' => [
+ 'client_id' => core()->getConfigData('stripe.connect.details.clientid'),
+ 'stripe_user_id' => $stripeConnectDetails->stripe_user_id
+ ]
+ ]);
+
+ if ($result->getStatusCode() == 200) {
+ $stripeConnectDetails->delete();
+
+ session()->flash('info', 'Your stripe account has been successfully revoked from the platform');
+ } else {
+ session()->flash('error', $result->getBody());
+ }
+
+ return redirect()->route('admin.stripe.seller');
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/src/Http/Controllers/StripeConnectController.php b/packages/Webkul/StripeConnect/src/Http/Controllers/StripeConnectController.php
new file mode 100644
index 000000000..b0d0e7c90
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Http/Controllers/StripeConnectController.php
@@ -0,0 +1,333 @@
+ @prashant-webkul
+ * @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
+ */
+class StripeConnectController extends Controller
+{
+ /**
+ * OrderRepository object
+ *
+ * @var array
+ */
+ protected $orderRepository;
+
+ /**
+ * StripeRepository object
+ *
+ * @var array
+ */
+ protected $stripeRepository;
+
+ /**
+ * To hold the live stripe publishable key
+ */
+ protected $stripeLivePublishableKey = null;
+
+ /**
+ * To hold the live stripe secret key
+ */
+ protected $stripeLiveSecretKey = null;
+
+ /**
+ * To hold the Test stripe publishable key
+ */
+ protected $stripeTestPublishableKey = null;
+
+ /**
+ * To hold the Test stripe secret key
+ */
+ protected $stripeTestSecretKey = null;
+
+ /**
+ * Determine test mode
+ */
+ protected $testMode;
+
+ /**
+ * Determine if Stripe is active or Not
+ */
+ protected $active;
+
+ /**
+ * Statement descriptor string
+ */
+ protected $statementDescriptor;
+
+ /**
+ * Stripe Cart Repository Instance holder
+ */
+ protected $stripeCart;
+
+ /**
+ * Stripe Connect Repository Instance holder
+ */
+ protected $stripeConnect;
+
+ /**
+ * Create a new controller instance.
+ *
+ * @param Webkul\Attribute\Repositories\OrderRepository $orderRepository
+ * @return void
+ */
+ public function __construct(OrderRepository $orderRepository, StripeCart $stripeCart, StripeConnect $stripeConnect)
+ {
+ // $this->middleware('auth:super-admin', ['only' => ['storeDetails', 'createDetails', 'editDetails', 'updateDetails']]);
+
+ $this->orderRepository = $orderRepository;
+
+ $this->stripeCart = $stripeCart;
+
+ $this->stripeConnect = $stripeConnect;
+
+ $this->testMode = env('STRIPE_ENABLE_TESTING');
+
+ $this->stripeTestPublishableKey = env('STRIPE_TEST_PUBLISHABLE_KEY');
+
+ $this->stripeTestSecretKey = env('STRIPE_TEST_SECRET_KEY');
+
+ $this->stripeLivePublishableKey = env('STRIPE_LIVE_PUBLISHABLE_KEY');
+
+ $this->stripeLiveSecretKey = env('STRIPE_LIVE_SECRET_KEY');
+
+ $this->statementDescriptor = 'null';
+ }
+
+ public function collectToken()
+ {
+ $data = request()->all();
+
+ if (auth()->guard('customer')->check()) {
+ //customer authenticated but using saved card
+ if(isset($data['useSavedCard'])) {
+ // session()->put('stripe_card', $data);
+ $this->stripeCart->create([
+ 'cart_id' => \Cart::getCart()->id,
+ 'stripe_token' => json_encode($data)
+ ]);
+
+ return response()->json(['success' => 'true']);
+ //customer authenticated but not using saved card
+ } else {
+ $misc = request()->input('stripeReturn');
+
+ //customer authenticated but opt to remember card
+ $last4 = null;
+ if (isset($data['last4'])) {
+ $stripeToken = $data['stripeToken'];
+ $last4 = $data['last4'];
+
+ $result = $this->stripeRepository->create([
+ 'customer_id' => auth()->guard('customer')->user()->id,
+ 'token' => $stripeToken,
+ 'last_four' => $last4,
+ 'misc' => json_encode($misc)
+ ]);
+
+ // session()->put(['stripe_card' => $result]);
+ $this->stripeCart->create([
+ 'cart_id' => \Cart::getCart()->id,
+ 'stripe_token' => json_encode($data)
+ ]);
+
+ if ($result) {
+ return response()->json(['success' => 'true']);
+ } else {
+ return response()->json(['success' => 'false'], 400);
+ }
+
+ //customer authenticated but not opting for remembering card
+ } else {
+ $stripeCart = $this->stripeCart->findWhere([
+ 'cart_id' => Cart::getCart()->id
+ ]);
+
+ if ($stripeCart->count() == 0) {
+ $this->stripeCart->create([
+ 'cart_id' => \Cart::getCart()->id,
+ 'stripe_token' => json_encode($data)
+ ]);
+ } else {
+ $stripeCart->first()->update([
+ 'stripe_token' => json_encode($data)
+ ]);
+ }
+ }
+
+ return response()->json(['success' => 'true']);
+ }
+ } else {
+ //customer not authenticated
+ $stripeCart = $this->stripeCart->findWhere([
+ 'cart_id' => Cart::getCart()->id
+ ]);
+
+ if ($stripeCart->count() == 0) {
+ $this->stripeCart->create([
+ 'cart_id' => \Cart::getCart()->id,
+ 'stripe_token' => json_encode($data)
+ ]);
+ } else {
+ $stripeCart->first()->update([
+ 'stripe_token' => json_encode($data)
+ ]);
+ }
+
+
+ return response()->json(['success' => 'true']);
+ }
+ }
+
+ public function createCharge()
+ {
+ $stripeConnect = $this->stripeConnect->findWhere([
+ 'company_id' => \Company::getCurrent()->id
+ ]);
+
+ if ($stripeConnect->count()) {
+ $sellerUserId = $stripeConnect->first()->stripe_user_id;
+ } else {
+ session()->flash('error', 'Stripe unavailable for this seller');
+
+ return false;
+ }
+
+ if($this->testMode) {
+ Stripe::setApiKey($this->stripeTestSecretKey);
+ } else {
+ Stripe::setApiKey($this->stripeLiveSecretKey);
+ }
+
+ $stripeCard = $this->stripeCart->findWhere([
+ 'cart_id' => Cart::getCart()->id
+ ])->first()->stripe_token;
+
+ $stripeCard = json_decode($stripeCard);
+
+ if(isset($stripeCard->stripeToken)) {
+ $stripeToken = $stripeCard->stripeToken;
+ } else if(isset($stripeCard->useSavedCard)) {
+ $cardId = $stripeCard->savedCardId;
+
+ $card = $this->stripeRepository->findOneByField('id', $cardId);
+
+ if($card->need_new_token) {
+ $result = false;
+ } else {
+ $stripeToken = $card->token;
+
+ $this->stripeRepository->update(['need_new_token' => 1], $cardId);
+ }
+ } else {
+ $stripeToken = $stripeCard->stripeToken;
+ }
+
+ try {
+ $cart = Cart::getCart();
+ $applicationFee = $cart->base_grand_total;
+ $applicationFee = (0.029 * $applicationFee) + (0.02 * $applicationFee) + 0.3;
+
+ if(Cart::getCart()->base_currency_code == 'YEN' ||Cart::getCart()->base_currency_code == 'yen') {
+ $result = StripeCharge::create ([
+ "amount" => Cart::getCart()->base_grand_total,
+ "currency" => Cart::getCart()->base_currency_code,
+ "source" => $stripeToken,
+ "description" => "Purchased ".Cart::getCart()->items_count." items on ".config('app.name'),
+ 'application_fee_amount' => $applicationFee * 100,
+ 'statement_descriptor' => $this->statementDescriptor,
+ ], [
+ 'stripe_account' => '{{'.$sellerUserId.'}}'
+ ]);
+ } else {
+ $result = StripeCharge::create ([
+ "amount" => round(Cart::getCart()->base_grand_total, 2) * 100,
+ "currency" => Cart::getCart()->base_currency_code,
+ "source" => $stripeToken,
+ "description" => "Purchased ".Cart::getCart()->items_count." items on ".config('app.name'),
+ 'application_fee_amount' => round($applicationFee, 2) * 100,
+ 'statement_descriptor' => $this->statementDescriptor,
+ ], [
+ 'stripe_account' => $sellerUserId
+ ]);
+ }
+
+ } catch(\Exception $e) {
+ $result = false;
+ }
+
+ // catch(\Stripe\Error\Card $e) {
+ // // Since it's a decline, \Stripe\Error\Card will be caught
+ // $body = $e->getJsonBody();
+ // $err = $body['error'];
+
+ // print('Status is:' . $e->getHttpStatus() . "\n");
+ // print('Type is:' . $err['type'] . "\n");
+ // print('Code is:' . $err['code'] . "\n");
+ // // param is '' in this case
+ // print('Param is:' . $err['param'] . "\n");
+ // print('Message is:' . $err['message'] . "\n");
+ // } catch (\Stripe\Error\RateLimit $e) {
+ // // Too many requests made to the API too quickly
+ // } catch (\Stripe\Error\InvalidRequest $e) {
+ // // Invalid parameters were supplied to Stripe's API
+ // } catch (\Stripe\Error\Authentication $e) {
+ // // Authentication with Stripe's API failed
+ // // (maybe you changed API keys recently)
+ // } catch (\Stripe\Error\ApiConnection $e) {
+ // // Network communication with Stripe failed
+ // } catch (\Stripe\Error\Base $e) {
+ // // Display a very generic error to the user, and maybe send
+ // // yourself an email
+ // } catch (Exception $e) {
+ // // Something else happened, completely unrelated to Stripe
+ // }
+
+ $this->stripeCart->deleteWhere([
+ 'cart_id' => \Cart::getCart()->id
+ ]);
+
+ if ($result) {
+ $order = $this->orderRepository->create(Cart::prepareDataForOrder());
+
+ Cart::deActivateCart();
+
+ session()->flash('order', $order);
+
+ return redirect()->route('shop.checkout.success');
+ } else {
+ session()->flash('error', trans('stripe::app.payment-failed'));
+
+ return redirect()->route('shop.home.index');
+ }
+
+ return redirect()->route('shop.home.index');
+ }
+
+ public function deleteCard()
+ {
+ $deleteIfFound = $this->stripeRepository->findWhere(['id' => request()->input('id'), 'customer_id' => auth()->guard('customer')->user()->id]);
+
+ $result = $deleteIfFound->first()->delete();
+
+ return (string)$result;
+ }
+}
diff --git a/packages/Webkul/StripeConnect/src/Http/routes.php b/packages/Webkul/StripeConnect/src/Http/routes.php
new file mode 100644
index 000000000..f994f47c1
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Http/routes.php
@@ -0,0 +1,38 @@
+group(function () {
+ Route::group(['middleware' => ['admin']], function () {
+ Route::get('stripe/connect', 'Webkul\StripeConnect\Http\Controllers\SellerRegistrationController@index')->name('admin.stripe.seller');
+
+ Route::get('stripe/connect/retrieve/token', 'Webkul\StripeConnect\Http\Controllers\SellerRegistrationController@retrieveToken')->name('admin.stripe.retrieve-grant');
+
+ Route::get('stripe/connect/revoke', 'Webkul\StripeConnect\Http\Controllers\SellerRegistrationController@revokeAccess')->name('admin.stripe.revoke-access');
+ });
+});
+
+Route::prefix('super')->group(function () {
+ Route::get('stripe/create', 'Webkul\StripeConnect\Http\Controllers\StripeConnectController@createDetails')->name('admin.stripe.create-details');
+
+ Route::post('stripe/store', 'Webkul\StripeConnect\Http\Controllers\StripeConnectController@storeDetails')->name('admin.stripe.store-details');
+
+ Route::get('stripe/edit', 'Webkul\StripeConnect\Http\Controllers\StripeConnectController@editDetails')->name('admin.stripe.edit-details');
+
+ Route::post('stripe/update', 'Webkul\StripeConnect\Http\Controllers\StripeConnectController@updateDetails')->name('admin.stripe.update-details');
+});
+
+Route::group(['middleware' => ['web']], function () {
+// Route::middleware('web')->group(function () {
+ Route::prefix('checkout')->group(function () {
+ Route::get('/stripe', 'Webkul\StripeConnect\Http\Controllers\StripeConnectController@collectCard')->defaults('_config', [
+ 'view' => 'stripe::checkout.card'
+ ])->name('stripe.cardcollect');
+
+ Route::get('/stripe/card/check', 'Webkul\StripeConnect\Http\Controllers\StripeConnectController@checkCard')->name('stripe.check.card.unique');
+
+ Route::get('/stripe/card/delete', 'Webkul\StripeConnect\Http\Controllers\StripeConnectController@deleteCard')->name('stripe.delete.saved.cart');
+
+ Route::post('/sendtoken', 'Webkul\StripeConnect\Http\Controllers\StripeConnectController@collectToken')->name('stripe.get.token');
+
+ Route::get('/create/charge', 'Webkul\StripeConnect\Http\Controllers\StripeConnectController@createCharge')->name('stripe.make.payment');
+ });
+});
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/src/Models/StripeCart.php b/packages/Webkul/StripeConnect/src/Models/StripeCart.php
new file mode 100644
index 000000000..688fe53ca
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Models/StripeCart.php
@@ -0,0 +1,15 @@
+
+ * @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
+ */
+abstract class Stripe extends Payment
+{
+ /**
+ * To hold the stripe live API key
+ */
+ protected $apiKey;
+
+ /**
+ * To hold the instance of the sku intance of the stripe API
+ */
+ protected $sku;
+
+ /**
+ * Bank statement descriptor, to hold the statement descriptor value
+ */
+ protected $statementDescriptor;
+
+ /**
+ * Checkout.js link for payment processing
+ */
+ protected $checkoutLink;
+
+ /**
+ * To redirect to the stripe payment page
+ */
+ public function getStripeUrl()
+ {
+ return route('stripe.make.payment');
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/src/Payment/StripePayment.php b/packages/Webkul/StripeConnect/src/Payment/StripePayment.php
new file mode 100644
index 000000000..7f614cfe2
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Payment/StripePayment.php
@@ -0,0 +1,33 @@
+ @prashant-webkul
+ * @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
+ */
+class StripePayment extends Stripe
+{
+ protected $code = 'stripe';
+
+ /**
+ * Get the redirect url for redirecting to
+ */
+ public function getRedirectUrl()
+ {
+ return route('stripe.make.payment');
+ }
+
+ /**
+ * Stripe web URL generic getter
+ *
+ * @param array $params
+ * @return string
+ */
+ public function getStripeUrl($params = [])
+ {
+ $this->getRedirectUrl();
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/src/Providers/EventServiceProvider.php b/packages/Webkul/StripeConnect/src/Providers/EventServiceProvider.php
new file mode 100644
index 000000000..e1a4a9e4f
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Providers/EventServiceProvider.php
@@ -0,0 +1,30 @@
+addTemplate('stripe::checkout.style');
+ });
+
+ Event::listen('bagisto.shop.checkout.payment-method.after', function($viewRenderEventManager){
+ $viewRenderEventManager->addTemplate('stripe::checkout.card');
+ });
+
+ Event::listen('bagisto.shop.layout.body.after', function($viewRenderEventManager) {
+ $viewRenderEventManager->addTemplate('stripe::checkout.card-script');
+ });
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/src/Providers/ModuleServiceProvider.php b/packages/Webkul/StripeConnect/src/Providers/ModuleServiceProvider.php
new file mode 100644
index 000000000..33d2ed065
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Providers/ModuleServiceProvider.php
@@ -0,0 +1,12 @@
+publishes([
+ dirname(__DIR__) . '/Resources/assets/sass/stripe.scss' => base_path('public/vendor/webkul/stripe/assets/css/stripe.css')
+ ]);
+
+ $this->publishes([
+ dirname(__DIR__) . '/Resources/assets/images/' => base_path('public/vendor/webkul/stripe/assets/images/')
+ ]);
+
+ $this->loadTranslationsFrom(__DIR__ . '/../Resources/lang', 'stripe');
+ $this->loadMigrationsFrom(__DIR__ . '/../Database/Migrations');
+ $this->loadViewsFrom(__DIR__ . '/../Resources/views', 'stripe');
+
+ $this->app->register(EventServiceProvider::class);
+ }
+
+ /**
+ * Register services.
+ *
+ * @return void
+ */
+ public function register()
+ {
+ $this->registerConfig();
+ }
+
+ /**
+ * Merge the stripe connect's configuration with the admin panel
+ */
+ public function registerConfig()
+ {
+ $this->mergeConfigFrom(
+ dirname(__DIR__) . '/Config/admin-menu.php', 'menu.admin'
+ );
+
+ $this->mergeConfigFrom(
+ dirname(__DIR__) . '/Config/system.php', 'core'
+ );
+
+ $this->mergeConfigFrom(
+ dirname(__DIR__) . '/Config/paymentmethods.php', 'paymentmethods'
+ );
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/src/Repositories/StripeCartRepository.php b/packages/Webkul/StripeConnect/src/Repositories/StripeCartRepository.php
new file mode 100644
index 000000000..602c9fa7e
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Repositories/StripeCartRepository.php
@@ -0,0 +1,24 @@
+ @prashant-webkul
+ * @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
+ */
+class StripeCartRepository extends Repository
+{
+ /**
+ * Specify Model class name
+ *
+ * @return mixed
+ */
+ function model()
+ {
+ return 'Webkul\StripeConnect\Contracts\StripeCart';
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/src/Repositories/StripeConnectRepository.php b/packages/Webkul/StripeConnect/src/Repositories/StripeConnectRepository.php
new file mode 100644
index 000000000..8b5aa05c6
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Repositories/StripeConnectRepository.php
@@ -0,0 +1,24 @@
+ @prashant-webkul
+ * @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
+ */
+class StripeConnectRepository extends Repository
+{
+ /**
+ * Specify Model class name
+ *
+ * @return mixed
+ */
+ function model()
+ {
+ return 'Webkul\StripeConnect\Contracts\StripeConnect';
+ }
+}
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/src/Resources/assets/fonts/montserrat-v12-latin-regular.eot b/packages/Webkul/StripeConnect/src/Resources/assets/fonts/montserrat-v12-latin-regular.eot
new file mode 100644
index 000000000..58433f250
Binary files /dev/null and b/packages/Webkul/StripeConnect/src/Resources/assets/fonts/montserrat-v12-latin-regular.eot differ
diff --git a/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/Icon-Stripe-Active.svg b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/Icon-Stripe-Active.svg
new file mode 100644
index 000000000..b85762bac
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/Icon-Stripe-Active.svg
@@ -0,0 +1,15 @@
+
+
+
+ Icon-Stripe-Active
+ Created with Sketch.
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/Icon-Stripe.svg b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/Icon-Stripe.svg
new file mode 100644
index 000000000..721b1549e
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/Icon-Stripe.svg
@@ -0,0 +1,15 @@
+
+
+
+ Icon-Stripe
+ Created with Sketch.
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/calender copy 2.png b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/calender copy 2.png
new file mode 100644
index 000000000..cfa741901
Binary files /dev/null and b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/calender copy 2.png differ
diff --git a/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/calender copy 2.svg b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/calender copy 2.svg
new file mode 100644
index 000000000..7f0b311cf
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/calender copy 2.svg
@@ -0,0 +1,13 @@
+
+
+
+ calender copy 2
+ Created with Sketch.
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/calender copy.png b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/calender copy.png
new file mode 100644
index 000000000..d7583aaf6
Binary files /dev/null and b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/calender copy.png differ
diff --git a/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/calender copy.svg b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/calender copy.svg
new file mode 100644
index 000000000..1cc4e9f56
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/calender copy.svg
@@ -0,0 +1,13 @@
+
+
+
+ calender copy
+ Created with Sketch.
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/calender.png b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/calender.png
new file mode 100644
index 000000000..0cd04df06
Binary files /dev/null and b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/calender.png differ
diff --git a/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/calender.svg b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/calender.svg
new file mode 100644
index 000000000..fefe7a424
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/calender.svg
@@ -0,0 +1,15 @@
+
+
+
+ calender
+ Created with Sketch.
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/card.png b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/card.png
new file mode 100644
index 000000000..db4e51a0f
Binary files /dev/null and b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/card.png differ
diff --git a/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/card.svg b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/card.svg
new file mode 100644
index 000000000..2a5f8eb6a
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/card.svg
@@ -0,0 +1,13 @@
+
+
+
+ card
+ Created with Sketch.
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/check-1.png b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/check-1.png
new file mode 100644
index 000000000..2629266e8
Binary files /dev/null and b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/check-1.png differ
diff --git a/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/check-1.svg b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/check-1.svg
new file mode 100644
index 000000000..922694293
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/check-1.svg
@@ -0,0 +1,16 @@
+
+
+
+ check-1
+ Created with Sketch.
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/close-icon.svg b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/close-icon.svg
new file mode 100644
index 000000000..e8b45b1e6
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/close-icon.svg
@@ -0,0 +1,13 @@
+
+
+
+ calender copy 2
+ Created with Sketch.
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/close.svg b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/close.svg
new file mode 100644
index 000000000..73345683f
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/close.svg
@@ -0,0 +1,11 @@
+
+
+
+ close
+ Created with Sketch.
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/cross-icon.svg b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/cross-icon.svg
new file mode 100755
index 000000000..cf00c5a56
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/cross-icon.svg
@@ -0,0 +1,16 @@
+
+
+
+ Icon-Cross
+ Created with Sketch.
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/logo.png b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/logo.png
new file mode 100644
index 000000000..1b9be03cb
Binary files /dev/null and b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/logo.png differ
diff --git a/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/logo.svg b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/logo.svg
new file mode 100644
index 000000000..d6fe4161b
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/logo.svg
@@ -0,0 +1,11 @@
+
+
+
+ logo
+ Created with Sketch.
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/master.svg b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/master.svg
new file mode 100644
index 000000000..5930b2dce
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/master.svg
@@ -0,0 +1,16 @@
+
+
+
+ master
+ Created with Sketch.
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/mastro.svg b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/mastro.svg
new file mode 100644
index 000000000..593985c89
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/mastro.svg
@@ -0,0 +1,14 @@
+
+
+
+ mastro
+ Created with Sketch.
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/pci.svg b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/pci.svg
new file mode 100644
index 000000000..bbe13319e
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/pci.svg
@@ -0,0 +1,14 @@
+
+
+
+ pci
+ Created with Sketch.
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/stripe-logo.png b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/stripe-logo.png
new file mode 100644
index 000000000..c86ee507b
Binary files /dev/null and b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/stripe-logo.png differ
diff --git a/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/successful.png b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/successful.png
new file mode 100644
index 000000000..538b66543
Binary files /dev/null and b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/successful.png differ
diff --git a/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/successful.svg b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/successful.svg
new file mode 100644
index 000000000..3c303cd22
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/successful.svg
@@ -0,0 +1,11 @@
+
+
+
+ successful
+ Created with Sketch.
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/visa.svg b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/visa.svg
new file mode 100644
index 000000000..9286d752e
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Resources/assets/images/icons/visa.svg
@@ -0,0 +1,17 @@
+
+
+
+ visa
+ Created with Sketch.
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/src/Resources/assets/sass/stripe.scss b/packages/Webkul/StripeConnect/src/Resources/assets/sass/stripe.scss
new file mode 100644
index 000000000..d7d6c68c3
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Resources/assets/sass/stripe.scss
@@ -0,0 +1,141 @@
+.stripe-close-icon {
+ width: 24px;
+ height: 24px;
+ background-image: url("../images/icons/close-icon.svg");
+ position: absolute;
+ top: 5px;
+ right: 5px;
+}
+
+.stripe-menu-icon {
+ background-image: url("../images/icons/Icon-Stripe.svg");
+}
+
+.stripe-menu-icon.active {
+ background-image: url("../images/icons/Icon-Stripe-Active.svg");
+}
+
+#stripe-pay-button label {
+ display: inline;
+ color: #ffffff;
+}
+
+
+.more-payment-icons {
+ text-align: center;
+ margin-top: 15px;
+
+ .visa-icon {
+ width: 45px;
+ height: 28px;
+ background-image: url("../images/icons/visa.svg");
+ padding-left: 32px;
+ }
+
+ .master-icon {
+ width: 45px;
+ height: 28px;
+ background-image: url("../images/icons/master.svg");
+ padding-left: 32px;
+ }
+
+ .mastro-icon {
+ width: 45px;
+ height: 28px;
+ background-image: url("../images/icons/mastro.svg");
+ padding-left: 32px;
+ }
+
+ .pci-icon {
+ width: 45px;
+ height: 28px;
+ background-image: url("../images/icons/pci.svg");
+ padding-left: 32px;
+ }
+}
+.add-card {
+ display: none;
+}
+
+.stripe-cards {
+ // position: relative;
+}
+
+.stripe-block-modal {
+ top: 120px;
+ left: calc(50% - 222px) !important;
+ display: block;
+ position: fixed;
+ z-index: 11;
+ width: 450px;
+ background: #FFFFFF;
+ border: 1px solid #979797;
+ box-shadow: 0 11px 23px 6px rgba(0,0,0,0.28);
+ border-radius: 5px;
+ margin-left: 0px !important;
+
+
+
+ .stripe-title {
+ padding-bottom: 20px;
+ padding-top: 20px;
+ text-align: center;
+ }
+}
+
+.stripe-form-content {
+ padding-top: 30px;
+ padding-bottom: 10px;
+
+ .stripe-fields {
+ .control-group {
+ margin-bottom: 10px;
+ }
+ }
+
+ .btn.btn-primary.btn-lg {
+ width: 100%;
+ }
+}
+
+.stripe-errors {
+ margin-bottom: 10px;
+ color: #FF5252
+}
+
+.stripe-block-modal.close {
+ display: none;
+}
+
+.card-info {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: flex-start;
+ font-size: 16px;
+
+ .radio-container {
+ padding-left: 28px;
+ }
+
+ span.icon {
+ width: 35px;
+ height:32px;
+ }
+
+ span.card-last-four, a#edit-card, a#delete-card {
+ font-style: normal;
+ }
+
+ span.card-last-four, a#edit-card {
+ margin-right: 14px;
+ }
+}
+
+.stripe-cards-block {
+ display: none;
+}
+
+.payment-icon {
+ width: 25px;
+}
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/src/Resources/lang/en/app.php b/packages/Webkul/StripeConnect/src/Resources/lang/en/app.php
new file mode 100644
index 000000000..e34a0a5bc
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Resources/lang/en/app.php
@@ -0,0 +1,19 @@
+ 'Name on Card',
+ 'expirymonth' => 'Expiration Month',
+ 'expiryyear' => 'Expiration Year',
+ 'cvc' => 'CVC',
+ 'cardno' => 'Card Number',
+ 'paynow' => 'Pay Now',
+ 'errors-in-fields' => 'Please correct the errors and try
+ again',
+ 'add-card' => 'Pay With New Card',
+ 'remember-card' => 'Remember Card',
+ 'pay' => 'Pay',
+ 'payment-failed' => 'Error! Payment Cannot Be Done',
+ 'payment-success' => 'Success! Payment Done',
+ 'click-continue' => 'Click continue to proceed further',
+ 'some-error' => 'Some error occurred'
+];
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/src/Resources/views/checkout/card-script.blade.php b/packages/Webkul/StripeConnect/src/Resources/views/checkout/card-script.blade.php
new file mode 100644
index 000000000..dbaa30682
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Resources/views/checkout/card-script.blade.php
@@ -0,0 +1,290 @@
+@if(request()->is('checkout/onepage'))
+
+
+
+
+
+
+@endif
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/src/Resources/views/checkout/card.blade.php b/packages/Webkul/StripeConnect/src/Resources/views/checkout/card.blade.php
new file mode 100644
index 000000000..9a8595108
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Resources/views/checkout/card.blade.php
@@ -0,0 +1,19 @@
+@if($payment['method'] == "stripe")
+ @include('stripe::components.add-card')
+
+
+
+
+
+
+
+
+
+
+
+ @include('stripe::components.stripe-form')
+
+
+
+
+@endif
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/src/Resources/views/checkout/style.blade.php b/packages/Webkul/StripeConnect/src/Resources/views/checkout/style.blade.php
new file mode 100644
index 000000000..758c26a06
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Resources/views/checkout/style.blade.php
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/src/Resources/views/components/add-card.blade.php b/packages/Webkul/StripeConnect/src/Resources/views/components/add-card.blade.php
new file mode 100644
index 000000000..460d66e85
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Resources/views/components/add-card.blade.php
@@ -0,0 +1,7 @@
+
diff --git a/packages/Webkul/StripeConnect/src/Resources/views/components/saved-cards.blade.php b/packages/Webkul/StripeConnect/src/Resources/views/components/saved-cards.blade.php
new file mode 100644
index 000000000..94afacd3b
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Resources/views/components/saved-cards.blade.php
@@ -0,0 +1,31 @@
+@php
+ $cards = collect();
+
+ if(auth()->guard('customer')->check()) {
+ $customer_id = auth()->guard('customer')->user()->id;
+
+ $cards = app('Webkul\Stripe\Repositories\StripeRepository')->findWhere(['customer_id' => $customer_id]);
+ }
+@endphp
+
+@if(auth()->guard('customer')->check())
+
+
+ @foreach($cards as $card)
+ @if(!$card->need_new_token)
+
+
+
+
+
+
+
+
*** *** {{ $card->last_four }}
+ {{--
Edit --}}
+
Delete
+
+ @endif
+ @endforeach
+
+
+@endif
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/src/Resources/views/components/stripe-form.blade.php b/packages/Webkul/StripeConnect/src/Resources/views/components/stripe-form.blade.php
new file mode 100644
index 000000000..ad0656dd8
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Resources/views/components/stripe-form.blade.php
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{-- @if(auth()->guard('customer')->check())
+
+
+
+
+ {{ __('stripe::app.remember-card') }}
+
+
+ @endif --}}
+
+
Pay Now
+
+ ( {{ core()->currency(\Cart::getCart()->base_grand_total) }} )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/src/Resources/views/connect.blade.php b/packages/Webkul/StripeConnect/src/Resources/views/connect.blade.php
new file mode 100644
index 000000000..31e6b5a19
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Resources/views/connect.blade.php
@@ -0,0 +1,35 @@
+@extends('admin::layouts.content')
+
+@section('page_title')
+ Connect Stripe Account
+@stop
+
+@section('content')
+
+
+
+
+ @if (core()->getConfigData('stripe.connect.details.clientid') != null)
+ @inject('stripeConnect', 'Webkul\StripeConnect\Repositories\StripeConnectRepository')
+
+ @if($stripeConnect->findWhere(['company_id' => \Company::getCurrent()->id])->count() == 0)
+
Connect Stripe
+ @else
+
Revoke Your Stripe Account's Access
+ @endif
+ @else
+
+ Please provide your stripe client ID to connect your account with the platform.
+
+ Click here
+
+ @endif
+
+
+@stop
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/src/Resources/views/super-admin/create.blade.php b/packages/Webkul/StripeConnect/src/Resources/views/super-admin/create.blade.php
new file mode 100644
index 000000000..6d749705d
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Resources/views/super-admin/create.blade.php
@@ -0,0 +1,91 @@
+@extends('saas::companies.layouts.master')
+
+@section('page_title')
+ Add Stripe Details
+@stop
+
+@section('content-wrapper')
+
+@stop
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/src/Resources/views/super-admin/edit.blade.php b/packages/Webkul/StripeConnect/src/Resources/views/super-admin/edit.blade.php
new file mode 100644
index 000000000..b81e34211
--- /dev/null
+++ b/packages/Webkul/StripeConnect/src/Resources/views/super-admin/edit.blade.php
@@ -0,0 +1,85 @@
+@extends('saas::companies.layouts.master')
+
+@section('page_title')
+ Update Stripe Details
+@stop
+
+@section('content-wrapper')
+
+@stop
\ No newline at end of file
diff --git a/packages/Webkul/StripeConnect/webpack.mix.js b/packages/Webkul/StripeConnect/webpack.mix.js
new file mode 100644
index 000000000..009882bc1
--- /dev/null
+++ b/packages/Webkul/StripeConnect/webpack.mix.js
@@ -0,0 +1,19 @@
+const { mix } = require("laravel-mix");
+require("laravel-mix-merge-manifest");
+
+// var publicPath = 'publishable/assets';
+var publicPath = "../../../public/vendor/webkul/stripe/assets";
+
+mix.setPublicPath(publicPath).mergeManifest();
+mix.disableNotifications();
+
+ mix.copy(__dirname + "/src/Resources/assets/images", publicPath + "/images/")
+ .copy(__dirname + "/src/Resources/assets/fonts", publicPath + "/fonts/")
+ .sass(__dirname + "/src/Resources/assets/sass/stripe.scss", "css/stripe.css")
+ .options({
+ processCssUrls: false
+ });
+
+if (mix.inProduction()) {
+ mix.version();
+}
\ No newline at end of file
diff --git a/resources/views/vendor/admin/customers/groups/create.blade.php b/resources/views/vendor/admin/customers/groups/create.blade.php
new file mode 100644
index 000000000..7b6624eb0
--- /dev/null
+++ b/resources/views/vendor/admin/customers/groups/create.blade.php
@@ -0,0 +1,211 @@
+@extends('admin::layouts.content')
+
+@section('page_title')
+ {{ __('admin::app.customers.groups.add-title') }}
+@stop
+
+@section('content')
+
+@stop
+
+@push('scripts')
+
+
+
+
+@endpush
\ No newline at end of file
diff --git a/resources/views/vendor/admin/customers/groups/edit.blade.php b/resources/views/vendor/admin/customers/groups/edit.blade.php
new file mode 100644
index 000000000..6671b9b39
--- /dev/null
+++ b/resources/views/vendor/admin/customers/groups/edit.blade.php
@@ -0,0 +1,227 @@
+@extends('admin::layouts.content')
+
+@section('page_title')
+ {{ __('admin::app.customers.groups.edit-title') }}
+@stop
+
+@section('content')
+
+@stop
+
+@push('scripts')
+
+
+
+
+@endpush
\ No newline at end of file
diff --git a/resources/views/vendor/admin/sales/orders/index.blade.php b/resources/views/vendor/admin/sales/orders/index.blade.php
new file mode 100644
index 000000000..630e22919
--- /dev/null
+++ b/resources/views/vendor/admin/sales/orders/index.blade.php
@@ -0,0 +1,42 @@
+@extends('admin::layouts.content')
+
+@section('page_title')
+ {{ __('admin::app.sales.orders.title') }}
+@stop
+
+@section('content')
+
+
+
+
+ @inject('orderGrid', 'Webkul\SAASPreOrder\DataGrids\Admin\Order')
+
+ {!! $orderGrid->render() !!}
+
+
+
+
+ {{ __('admin::app.export.download') }}
+
+
+
+
+
+@stop
+
+@push('scripts')
+ @include('admin::export.export', ['gridName' => $orderGrid])
+@endpush
\ No newline at end of file
diff --git a/resources/views/vendor/admin/sales/orders/view.blade.php b/resources/views/vendor/admin/sales/orders/view.blade.php
new file mode 100644
index 000000000..adc395d8f
--- /dev/null
+++ b/resources/views/vendor/admin/sales/orders/view.blade.php
@@ -0,0 +1,503 @@
+@extends('admin::layouts.master')
+
+@section('page_title')
+ {{ __('admin::app.sales.orders.view-title', ['order_id' => $order->id]) }}
+@stop
+
+@section('content-wrapper')
+
+
+
+
+
+
+
+
+
+
+
+ havePreOrderItems($order->id);
+ ?>
+
+ @if ($havePreOrderItems)
+
{{ __('preorder::app.admin.sales.orders.preorder-summary') }}
+ @endif
+
+
+
+
+
+
+ {{ __('admin::app.sales.orders.order-info') }}
+
+
+
+
+
+ {{ __('admin::app.sales.orders.order-date') }}
+
+
+
+ {{ $order->created_at }}
+
+
+
+
+
+ {{ __('admin::app.sales.orders.order-status') }}
+
+
+
+ {{ $order->status_label }}
+
+
+
+
+
+ {{ __('admin::app.sales.orders.channel') }}
+
+
+
+ {{ $order->channel_name }}
+
+
+
+
+
+
+
+ {{ __('admin::app.sales.orders.account-info') }}
+
+
+
+
+
+ {{ __('admin::app.sales.orders.customer-name') }}
+
+
+
+ {{ $order->customer_full_name }}
+
+
+
+
+
+ {{ __('admin::app.sales.orders.email') }}
+
+
+
+ {{ $order->customer_email }}
+
+
+
+ @if (! is_null($order->customer))
+
+
+ {{ __('admin::app.customers.customers.customer_group') }}
+
+
+
+ {{ $order->customer->group['name'] }}
+
+
+ @endif
+
+
+
+
+
+
+
+
+
+
+
+ {{ __('admin::app.sales.orders.billing-address') }}
+
+
+
+
+ @include ('admin::sales.address', ['address' => $order->billing_address])
+
+
+
+
+ @if ($order->shipping_address)
+
+
+ {{ __('admin::app.sales.orders.shipping-address') }}
+
+
+
+
+ @include ('admin::sales.address', ['address' => $order->shipping_address])
+
+
+
+ @endif
+
+
+
+
+
+
+
+
+
+ {{ __('admin::app.sales.orders.payment-info') }}
+
+
+
+
+
+ {{ __('admin::app.sales.orders.payment-method') }}
+
+
+
+ {{ core()->getConfigData('sales.paymentmethods.' . $order->payment->method . '.title') }}
+
+
+
+
+
+ {{ __('admin::app.sales.orders.currency') }}
+
+
+
+ {{ $order->order_currency_code }}
+
+
+
+
+
+
+
+ {{ __('admin::app.sales.orders.shipping-info') }}
+
+
+
+
+
+ {{ __('admin::app.sales.orders.shipping-method') }}
+
+
+
+ {{ $order->shipping_title }}
+
+
+
+
+
+ {{ __('admin::app.sales.orders.shipping-price') }}
+
+
+
+ {{ core()->formatBasePrice($order->base_shipping_amount) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ __('admin::app.sales.orders.SKU') }}
+ {{ __('admin::app.sales.orders.product-name') }}
+ {{ __('admin::app.sales.orders.price') }}
+ {{ __('admin::app.sales.orders.item-status') }}
+ {{ __('admin::app.sales.orders.subtotal') }}
+ {{ __('admin::app.sales.orders.tax-percent') }}
+ {{ __('admin::app.sales.orders.tax-amount') }}
+ @if ($order->base_discount_amount > 0)
+ {{ __('admin::app.sales.orders.discount-amount') }}
+ @endif
+ {{ __('admin::app.sales.orders.grand-total') }}
+
+
+
+
+
+ @foreach ($order->items as $item)
+
+
+ {{ $item->type == 'configurable' ? $item->child->sku : $item->sku }}
+
+
+
+ {{ $item->name }}
+
+ @if ($html = $item->getOptionDetailHtml())
+ {{ $html }}
+ @endif
+
+ @if ($preOrderItem = $preOrderItemRepository->findOneByField('order_item_id', $item->id))
+
+
type == 'configurable')style="margin-top: 0"@endif>
+ {{ __('preorder::app.admin.sales.orders.preorder-information') }}
+
+
+
+ {{ __('preorder::app.admin.sales.orders.type') }}
+
+ {{ $preOrderItem->type_label }}
+
+
+
+ {{ __('preorder::app.admin.sales.orders.status') }}
+
+ {{ $preOrderItem->status_label }}
+
+
+ @if ($preOrderItem->payment_order_item)
+
+ {{ __('preorder::app.admin.sales.orders.payment-order') }}
+
+
+ #{{ $preOrderItem->payment_order_item->order_id }}
+
+
+ @endif
+
+ @elseif ($preOrderItem = app('Webkul\SAASPreOrder\Repositories\PreOrderItemRepository')->findOneByField('payment_order_item_id', $item->id))
+
+
type == 'configurable')style="margin-top: 0"@endif>
+ {{ __('preorder::app.admin.sales.orders.preorder-payment-information') }}
+
+
+
+ {{ __('preorder::app.admin.sales.orders.reference-order') }}
+
+
+ #{{ $preOrderItem->order_id }}
+
+
+
+ @endif
+
+
+ {{ core()->formatBasePrice($item->base_price) }}
+
+
+
+ {{ $item->qty_ordered ? __('admin::app.sales.orders.item-ordered', ['qty_ordered' => $item->qty_ordered]) : '' }}
+
+
+
+ {{ $item->qty_invoiced ? __('admin::app.sales.orders.item-invoice', ['qty_invoiced' => $item->qty_invoiced]) : '' }}
+
+
+
+ {{ $item->qty_shipped ? __('admin::app.sales.orders.item-shipped', ['qty_shipped' => $item->qty_shipped]) : '' }}
+
+
+
+ {{ $item->qty_canceled ? __('admin::app.sales.orders.item-canceled', ['qty_canceled' => $item->qty_canceled]) : '' }}
+
+
+
+ {{ core()->formatBasePrice($item->base_total) }}
+
+ {{ $item->tax_percent }}%
+
+ {{ core()->formatBasePrice($item->base_tax_amount) }}
+
+ @if ($order->base_discount_amount > 0)
+ {{ core()->formatBasePrice($item->base_discount_amount) }}
+ @endif
+
+
+ {{ core()->formatBasePrice($item->base_total + $item->base_tax_amount) }}
+
+
+ @endforeach
+
+
+
+
+
+ {{ __('admin::app.sales.orders.subtotal') }}
+ -
+ {{ core()->formatBasePrice($order->base_sub_total) }}
+
+
+
+ {{ __('admin::app.sales.orders.shipping-handling') }}
+ -
+ {{ core()->formatBasePrice($order->base_shipping_amount) }}
+
+
+ @if ($order->base_discount_amount > 0)
+
+ {{ __('admin::app.sales.orders.discount') }}
+ -
+ -{{ core()->formatBasePrice($order->base_discount_amount) }}
+
+ @endif
+
+
+ {{ __('admin::app.sales.orders.tax') }}
+ -
+ {{ core()->formatBasePrice($order->base_tax_amount) }}
+
+
+
+ {{ __('admin::app.sales.orders.grand-total') }}
+ -
+ {{ core()->formatBasePrice($order->base_grand_total) }}
+
+
+
+ {{ __('admin::app.sales.orders.total-paid') }}
+ -
+ {{ core()->formatBasePrice($order->base_grand_total_invoiced) }}
+
+
+
+ {{ __('admin::app.sales.orders.total-refunded') }}
+ -
+ {{ core()->formatBasePrice($order->base_grand_total_refunded) }}
+
+
+
+ {{ __('admin::app.sales.orders.total-due') }}
+ -
+ {{ core()->formatBasePrice($order->base_total_due) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ __('admin::app.sales.invoices.id') }}
+ {{ __('admin::app.sales.invoices.date') }}
+ {{ __('admin::app.sales.invoices.order-id') }}
+ {{ __('admin::app.sales.invoices.customer-name') }}
+ {{ __('admin::app.sales.invoices.status') }}
+ {{ __('admin::app.sales.invoices.amount') }}
+ {{ __('admin::app.sales.invoices.action') }}
+
+
+
+
+
+ @foreach ($order->invoices as $invoice)
+
+ #{{ $invoice->id }}
+ {{ $invoice->created_at }}
+ #{{ $invoice->order->id }}
+ {{ $invoice->address->name }}
+ {{ $invoice->status_label }}
+ {{ core()->formatBasePrice($invoice->base_grand_total) }}
+
+
+
+
+
+
+ @endforeach
+
+ @if (! $order->invoices->count())
+
+ {{ __('admin::app.common.no-result-found') }}
+
+ @endif
+
+
+
+
+
+
+
+
+
+
+
+ {{ __('admin::app.sales.shipments.id') }}
+ {{ __('admin::app.sales.shipments.date') }}
+ {{ __('admin::app.sales.shipments.order-id') }}
+ {{ __('admin::app.sales.shipments.order-date') }}
+ {{ __('admin::app.sales.shipments.customer-name') }}
+ {{ __('admin::app.sales.shipments.total-qty') }}
+ {{ __('admin::app.sales.shipments.action') }}
+
+
+
+
+
+ @foreach ($order->shipments as $shipment)
+
+ #{{ $shipment->id }}
+ {{ $shipment->created_at }}
+ #{{ $shipment->order->id }}
+ {{ $shipment->order->created_at }}
+ {{ $shipment->address->name }}
+ {{ $shipment->total_qty }}
+
+
+
+
+
+
+ @endforeach
+
+ @if (! $order->shipments->count())
+
+ {{ __('admin::app.common.no-result-found') }}
+
+ @endif
+
+
+
+
+
+
+
+
+@stop
\ No newline at end of file
diff --git a/resources/views/vendor/shop/customers/account/orders/view.blade.php b/resources/views/vendor/shop/customers/account/orders/view.blade.php
new file mode 100644
index 000000000..020760917
--- /dev/null
+++ b/resources/views/vendor/shop/customers/account/orders/view.blade.php
@@ -0,0 +1,414 @@
+@extends('shop::layouts.master')
+
+@section('page_title')
+ {{ __('shop::app.customer.account.order.view.page-tile', ['order_id' => $order->id]) }}
+@endsection
+
+@push('css')
+
+@endpush
+
+@section('content-wrapper')
+
+
+ @include('shop::customers.account.partials.sidemenu')
+
+
+
+
+
+
+ {{ __('shop::app.customer.account.order.view.page-tile', ['order_id' => $order->id]) }}
+
+
+
+
+ {!! view_render_event('bagisto.shop.customers.account.orders.view.before', ['order' => $order]) !!}
+
+
+
+
+
+
+ havePreOrderItems($order->id);
+ ?>
+
+ @if ($havePreOrderItems)
+ {{ __('preorder::app.shop.sales.orders.preorder-summary') }}
+ @endif
+
+
+
+
+
+ {{ __('shop::app.customer.account.order.view.placed-on') }}
+
+
+
+ {{ core()->formatDate($order->created_at, 'd M Y') }}
+
+
+
+
+
+
+
+ {{ __('shop::app.customer.account.order.view.products-ordered') }}
+
+
+
+
+
+
+
+ {{ __('shop::app.customer.account.order.view.SKU') }}
+ {{ __('shop::app.customer.account.order.view.product-name') }}
+ {{ __('shop::app.customer.account.order.view.price') }}
+ {{ __('shop::app.customer.account.order.view.item-status') }}
+ {{ __('shop::app.customer.account.order.view.subtotal') }}
+ {{ __('shop::app.customer.account.order.view.tax-percent') }}
+ {{ __('shop::app.customer.account.order.view.tax-amount') }}
+ {{ __('shop::app.customer.account.order.view.grand-total') }}
+
+
+
+
+
+ @foreach ($order->items as $item)
+
+
+ {{ $item->type == 'configurable' ? $item->child->sku : $item->sku }}
+
+
+
+ {{ $item->name }}
+
+ @if ($preOrderItem = $preOrderItemRepository->findOneByField('order_item_id', $item->id))
+
+
type == 'configurable')style="margin-top: 0"@endif>
+ {{ __('preorder::app.shop.sales.orders.preorder-information') }}
+
+
+
+ {{ __('preorder::app.shop.sales.orders.type') }}
+
+ {{ $preOrderItem->type_label }}
+
+
+
+ {{ __('preorder::app.shop.sales.orders.status') }}
+
+ {{ $preOrderItem->status_label }}
+
+
+ @if ($preOrderItem->payment_order_item)
+
+ {{ __('preorder::app.shop.sales.orders.payment-order') }}
+
+
+ #{{ $preOrderItem->payment_order_item->order_id }}
+
+
+ @endif
+
+ @elseif ($preOrderItem = app('Webkul\SAASPreOrder\Repositories\PreOrderItemRepository')->findOneByField('payment_order_item_id', $item->id))
+
+
type == 'configurable')style="margin-top: 0"@endif>
+ {{ __('preorder::app.shop.sales.orders.preorder-payment-information') }}
+
+
+
+ {{ __('preorder::app.shop.sales.orders.reference-order') }}
+
+
+ #{{ $preOrderItem->order_id }}
+
+
+
+ @endif
+
+
+ {{ core()->formatPrice($item->price, $order->order_currency_code) }}
+
+
+
+ {{ __('shop::app.customer.account.order.view.item-ordered', ['qty_ordered' => $item->qty_ordered]) }}
+
+
+
+ {{ $item->qty_invoiced ? __('shop::app.customer.account.order.view.item-invoice', ['qty_invoiced' => $item->qty_invoiced]) : '' }}
+
+
+
+ {{ $item->qty_shipped ? __('shop::app.customer.account.order.view.item-shipped', ['qty_shipped' => $item->qty_shipped]) : '' }}
+
+
+
+ {{ $item->qty_canceled ? __('shop::app.customer.account.order.view.item-canceled', ['qty_canceled' => $item->qty_canceled]) : '' }}
+
+
+
+ {{ core()->formatPrice($item->total, $order->order_currency_code) }}
+
+ {{ number_format($item->tax_percent, 2) }}%
+
+ {{ core()->formatPrice($item->tax_amount, $order->order_currency_code) }}
+
+
+ {{ core()->formatPrice($item->total + $item->tax_amount, $order->order_currency_code) }}
+
+ canBeComplete($item); ?>
+
+ @if ($canBeComplete)
+ Complete Preorder
+ @endif
+
+
+ @endforeach
+
+
+
+
+
+
+
+
+
+ {{ __('shop::app.customer.account.order.view.subtotal') }}
+ -
+ {{ core()->formatPrice($order->sub_total, $order->order_currency_code) }}
+
+
+
+ {{ __('shop::app.customer.account.order.view.shipping-handling') }}
+ -
+ {{ core()->formatPrice($order->shipping_amount, $order->order_currency_code) }}
+
+
+
+ {{ __('shop::app.customer.account.order.view.tax') }}
+ -
+ {{ core()->formatPrice($order->tax_amount, $order->order_currency_code) }}
+
+
+
+ {{ __('shop::app.customer.account.order.view.grand-total') }}
+ -
+ {{ core()->formatPrice($order->grand_total, $order->order_currency_code) }}
+
+
+
+ {{ __('shop::app.customer.account.order.view.total-paid') }}
+ -
+ {{ core()->formatPrice($order->grand_total_invoiced, $order->order_currency_code) }}
+
+
+
+ {{ __('shop::app.customer.account.order.view.total-refunded') }}
+ -
+ {{ core()->formatPrice($order->grand_total_refunded, $order->order_currency_code) }}
+
+
+
+ {{ __('shop::app.customer.account.order.view.total-due') }}
+ -
+ {{ core()->formatPrice($order->total_due, $order->order_currency_code) }}
+
+
+
+
+
+
+
+
+ @if ($order->invoices->count())
+
+
+ @foreach ($order->invoices as $invoice)
+
+
+
+
+
+
+
+
+
+ {{ __('shop::app.customer.account.order.view.SKU') }}
+ {{ __('shop::app.customer.account.order.view.product-name') }}
+ {{ __('shop::app.customer.account.order.view.price') }}
+ {{ __('shop::app.customer.account.order.view.qty') }}
+ {{ __('shop::app.customer.account.order.view.subtotal') }}
+ {{ __('shop::app.customer.account.order.view.tax-amount') }}
+ {{ __('shop::app.customer.account.order.view.grand-total') }}
+
+
+
+
+
+ @foreach ($invoice->items as $item)
+
+ {{ $item->child ? $item->child->sku : $item->sku }}
+ {{ $item->name }}
+ {{ core()->formatPrice($item->price, $order->order_currency_code) }}
+ {{ $item->qty }}
+ {{ core()->formatPrice($item->total, $order->order_currency_code) }}
+ {{ core()->formatPrice($item->tax_amount, $order->order_currency_code) }}
+ {{ core()->formatPrice($item->total + $item->tax_amount, $order->order_currency_code) }}
+
+ @endforeach
+
+
+
+
+
+
+
+ {{ __('shop::app.customer.account.order.view.subtotal') }}
+ -
+ {{ core()->formatPrice($invoice->sub_total, $order->order_currency_code) }}
+
+
+
+ {{ __('shop::app.customer.account.order.view.shipping-handling') }}
+ -
+ {{ core()->formatPrice($invoice->shipping_amount, $order->order_currency_code) }}
+
+
+
+ {{ __('shop::app.customer.account.order.view.tax') }}
+ -
+ {{ core()->formatPrice($invoice->tax_amount, $order->order_currency_code) }}
+
+
+
+ {{ __('shop::app.customer.account.order.view.grand-total') }}
+ -
+ {{ core()->formatPrice($invoice->grand_total, $order->order_currency_code) }}
+
+
+
+
+
+
+ @endforeach
+
+
+ @endif
+
+ @if ($order->shipments->count())
+
+
+ @foreach ($order->shipments as $shipment)
+
+
+
+ {{ __('shop::app.customer.account.order.view.individual-shipment', ['shipment_id' => $shipment->id]) }}
+
+
+
+
+
+
+
+
+ {{ __('shop::app.customer.account.order.view.SKU') }}
+ {{ __('shop::app.customer.account.order.view.product-name') }}
+ {{ __('shop::app.customer.account.order.view.qty') }}
+
+
+
+
+
+ @foreach ($shipment->items as $item)
+
+
+ {{ $item->sku }}
+ {{ $item->name }}
+ {{ $item->qty }}
+
+
+ @endforeach
+
+
+
+
+
+
+
+ @endforeach
+
+
+ @endif
+
+
+
+
+
+
+
+ {{ __('shop::app.customer.account.order.view.shipping-address') }}
+
+
+
+
+ @include ('admin::sales.address', ['address' => $order->billing_address])
+
+
+
+
+
+
+ {{ __('shop::app.customer.account.order.view.billing-address') }}
+
+
+
+
+ @include ('admin::sales.address', ['address' => $order->shipping_address])
+
+
+
+
+
+
+ {{ __('shop::app.customer.account.order.view.shipping-method') }}
+
+
+
+
+ {{ $order->shipping_title }}
+
+
+
+
+
+
+ {{ __('shop::app.customer.account.order.view.payment-method') }}
+
+
+
+ {{ core()->getConfigData('sales.paymentmethods.' . $order->payment->method . '.title') }}
+
+
+
+
+
+
+
+
+ {!! view_render_event('bagisto.shop.customers.account.orders.view.after', ['order' => $order]) !!}
+
+
+
+
+
+@endsection
\ No newline at end of file
diff --git a/resources/views/vendor/shop/layouts/footer/footer.blade.php b/resources/views/vendor/shop/layouts/footer/footer.blade.php
new file mode 100644
index 000000000..2f8532d59
--- /dev/null
+++ b/resources/views/vendor/shop/layouts/footer/footer.blade.php
@@ -0,0 +1,94 @@
+
diff --git a/resources/views/vendor/shop/layouts/header/nav-menu/navmenu.blade.php b/resources/views/vendor/shop/layouts/header/nav-menu/navmenu.blade.php
new file mode 100644
index 000000000..e65090536
--- /dev/null
+++ b/resources/views/vendor/shop/layouts/header/nav-menu/navmenu.blade.php
@@ -0,0 +1,137 @@
+{!! view_render_event('bagisto.shop.layout.header.category.before') !!}
+
+getVisibleCategoryTree(core()->getCurrentChannel()->root_category_id) as $category) {
+ if ($category->slug)
+ array_push($categories, $category);
+}
+
+?>
+
+
+
+{!! view_render_event('bagisto.shop.layout.header.category.after') !!}
+
+
+@push('scripts')
+
+
+
+
+
+
+
+
+
+
+
+@endpush
\ No newline at end of file
diff --git a/resources/views/vendor/shop/products/add-buttons.blade.php b/resources/views/vendor/shop/products/add-buttons.blade.php
new file mode 100644
index 000000000..76d0a7409
--- /dev/null
+++ b/resources/views/vendor/shop/products/add-buttons.blade.php
@@ -0,0 +1,36 @@
+@if ($product->type != "configurable" && $product->totalQuantity() < 1 && $product->allow_preorder)
+ @if (core()->getConfigData('preorder.settings.general.percent'))
+ @if (core()->getConfigData('preorder.settings.general.preorder_type') == 'partial')
+ {{ __('preorder::app.shop.products.percent-to-pay', ['percent' => core()->getConfigData('preorder.settings.general.percent')]) }}
+ @endif
+ @else
+ {{ __('preorder::app.shop.products.nothing-to-pay') }}
+ @endif
+@endif
+
+@if ($product->type == "configurable")
+
+@else
+
+
+ @csrf
+
+
+
+
+ @if ($product->totalQuantity() < 1 && $product->allow_preorder)
+ {{ __('preorder::app.shop.products.preorder') }}
+ @else
+ haveSufficientQuantity(1) ? '' : 'disabled' }}>{{ __('shop::app.products.add-to-cart') }}
+ @endif
+
+
+ @include('shop::products.wishlist')
+
+@endif
\ No newline at end of file
diff --git a/resources/views/vendor/shop/products/index.blade.php b/resources/views/vendor/shop/products/index.blade.php
new file mode 100644
index 000000000..347e23722
--- /dev/null
+++ b/resources/views/vendor/shop/products/index.blade.php
@@ -0,0 +1,128 @@
+@extends('shop::layouts.master')
+
+@section('page_title')
+ {{ $category->meta_title ?? $category->name }}
+@stop
+
+@section('seo')
+
+
+@stop
+
+@section('content-wrapper')
+ @inject ('productRepository', 'Webkul\Product\Repositories\ProductRepository')
+
+
+ {!! view_render_event('bagisto.shop.products.index.before', ['category' => $category]) !!}
+
+
+
+ @if (in_array($category->display_mode, [null, 'products_only', 'products_and_description']))
+ @include ('shop::products.list.layered-navigation')
+ @endif
+
+
display_mode == 'description_only') style="width: 100%" @endif>
+
+ @if (!is_null($category->image))
+
+ @endif
+
+
+ @if (in_array($category->display_mode, [null, 'description_only', 'products_and_description']))
+ @if ($category->description)
+
+ {!! $category->description !!}
+
+ @endif
+ @endif
+
+ @if (in_array($category->display_mode, [null, 'products_only', 'products_and_description']))
+ getAll($category->id); ?>
+
+ @if ($products->count())
+
+ @include ('shop::products.list.toolbar')
+
+ @inject ('toolbarHelper', 'Webkul\Product\Helpers\Toolbar')
+
+ @if ($toolbarHelper->getCurrentMode() == 'grid')
+
+ @foreach ($products as $productFlat)
+
+ @include ('shop::products.list.card', ['product' => $productFlat])
+
+ @endforeach
+
+ @else
+
+ @foreach ($products as $productFlat)
+
+ @include ('shop::products.list.card', ['product' => $productFlat])
+
+ @endforeach
+
+ @endif
+
+ {!! view_render_event('bagisto.shop.products.index.pagination.before', ['category' => $category]) !!}
+
+
+ {{ $products->appends(request()->input())->links() }}
+
+
+ {!! view_render_event('bagisto.shop.products.index.pagination.after', ['category' => $category]) !!}
+
+ @else
+
+
+
{{ __('shop::app.products.whoops') }}
+
+
+ {{ __('shop::app.products.empty') }}
+
+
+
+ @endif
+ @endif
+
+
+
+ {!! view_render_event('bagisto.shop.products.index.after', ['category' => $category]) !!}
+
+@stop
+
+@push('scripts')
+
+@endpush
\ No newline at end of file
diff --git a/resources/views/vendor/shop/products/view/product-add.blade.php b/resources/views/vendor/shop/products/view/product-add.blade.php
new file mode 100644
index 000000000..63f46f323
--- /dev/null
+++ b/resources/views/vendor/shop/products/view/product-add.blade.php
@@ -0,0 +1,21 @@
+{!! view_render_event('bagisto.shop.products.view.product-add.after', ['product' => $product]) !!}
+
+
+ @if ($product->type != 'configurable')
+ @if ($product->totalQuantity() < 1 && $product->allow_preorder)
+
+ {{ __('preorder::app.shop.products.preorder') }}
+
+ @else
+ @include ('shop::products.add-to-cart', ['product' => $product])
+
+ @include ('shop::products.buy-now')
+ @endif
+ @else
+ @include ('shop::products.add-to-cart', ['product' => $product])
+
+ @include ('shop::products.buy-now')
+ @endif
+
+
+{!! view_render_event('bagisto.shop.products.view.product-add.after', ['product' => $product]) !!}
\ No newline at end of file