This commit is contained in:
Ludovic CANDELLIER
2022-04-13 23:49:48 +02:00
parent 8afb3467f8
commit 2f77b5fc23
56 changed files with 948 additions and 336 deletions

View File

@@ -0,0 +1,69 @@
<?php
namespace App\Http\Controllers\Admin\Shop;
use Illuminate\Http\Request;
use App\Repositories\Shop\Merchandises;
use App\Repositories\Shop\TagGroups;
use App\Datatables\Shop\MerchandisesDataTable;
use App\Models\Shop\Merchandise;
class MerchandiseController extends Controller
{
public function index(MerchandisesDataTable $dataTable)
{
return $dataTable->render('Admin.Shop.Merchandises.list');
}
public function create()
{
$data['tags_list'] = TagGroups::getTreeTags();
return view('Admin.Shop.Merchandises.create', $data);
}
public function store(Request $request)
{
$data = $request->all();
Merchandises::storeFull($data);
return redirect()->route('Admin.Shop.Merchandises.index');
}
public function show($id)
{
return view('Admin.Shop.Merchandises.view', Merchandises::get($id));
}
public function edit($id)
{
$data['merchandise'] = Merchandises::getFull($id);
$data['tags_list'] = TagGroups::getTreeTags();
return view('Admin.Shop.Merchandises.edit', $data);
}
public function destroy($id)
{
return Merchandises::destroy($id);
}
public function getImages(Request $request, $id = false, $can_edit = true)
{
$id = $id ? $id : $request->input('id');
$data['images'] = Merchandises::getImages($id);
$data['can_edit'] = $can_edit;
return view('components.uploader.mini-gallery-items', $data);
}
public function deleteImage(Request $request)
{
$id = $request->input('id');
$index = $request->input('index');
return Merchandises::deleteImage($id, $index);
}
public function exportExcel()
{
return Merchandises::exportExcel();
}
}

View File

@@ -6,8 +6,6 @@ use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
use App\Repositories\Layout;
use Carbon\Carbon;
class LoginController extends Controller
{
@@ -22,25 +20,11 @@ class LoginController extends Controller
public function showLoginForm()
{
$data = \App\Repositories\Config::init();
return view('auth.login', $data);
return view('Shop.auth.login', $data);
}
public function authenticated(Request $request, $user)
{
$request->session()->forget('password_expired_id');
if ($user->passwordSecurity->password_expiry_days > 0) {
$password_updated_at = $user->passwordSecurity->password_updated_at;
$password_expiry_days = $user->passwordSecurity->password_expiry_days;
$password_expiry_at = Carbon::parse($password_updated_at)->addDays($password_expiry_days);
if ($password_expiry_at->lessThan(Carbon::now())) {
$request->session()->put('password_expired_id', $user->id);
auth()->logout();
return redirect('/reset-password')->with('message', "Your password is expired. You need to change your password.");
}
}
return redirect()->intended($this->redirectPath());
}

View File

@@ -0,0 +1,24 @@
<?php
namespace App\Http\Controllers\Shop\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\View\Factory;
use Illuminate\Contracts\View\View;
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
class ForgotPasswordController extends Controller
{
use SendsPasswordResetEmails;
/**
* Get password request form view.
*
* @return Application|Factory|View
*/
public function showLinkRequestForm()
{
return view('boilerplate::auth.passwords.email');
}
}

View File

@@ -40,49 +40,43 @@ class LoginController extends Controller
*/
public function __construct()
{
$this->middleware('customer')->except('logout');
// $this->middleware('guest')->except('logout');
}
public function showLoginForm()
{
$data['url'] = route('Shop.Auth.login.post');
return view('Shop.Auth.login', $data);
$data['url'] = route('Shop.login.post');
return view('Shop.auth.login', $data);
}
protected function guard()
{
return Auth::guard('customer');
return Auth::guard('guest');
}
public function login(Request $request)
{
$this->validate($request, [
'username' => 'required|email',
'password' => 'required|min:6'
'password' => 'required|min:8'
]);
if (Auth::guard('customer')->attempt(['username' => $request->username, 'password' => $request->password], $request->get('remember'))) {
return redirect()->intended(route('Conferencing.event'));
if (Auth::guard('guest')->attempt(['username' => $request->username, 'password' => $request->password], $request->get('remember'))) {
return redirect()->intended(route('home'));
}
return back()->withInput($request->only('username', 'remember'));
}
public function logout(Request $request)
{
// Get the session key for this user
$sessionKey = $this->guard()->getName();
$this->guard()->logout();
// Delete single session key (just for this user)
$request->session()->forget($sessionKey);
return redirect()->route('home');
}
public function username()
{
return 'username';
return 'email';
}
}

View File

@@ -0,0 +1,161 @@
<?php
namespace App\Http\Controllers\Shop\Auth;
use App\Http\Controllers\Controller;
use Carbon\Carbon;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\View\Factory;
use Illuminate\Contracts\View\View;
use Illuminate\Foundation\Auth\EmailVerificationRequest;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Validator;
use Sebastienheyd\Boilerplate\Rules\Password;
class RegisterController extends Controller
{
use RegistersUsers;
/**
* Where to redirect users after registration.
*
* @var string
*/
protected $redirectTo;
/**
* Is registering the first user ?
*
* @var bool
*/
protected $firstUser;
/**
* Create a new controller instance.
*/
public function __construct()
{
$userModel = config('auth.providers.users.model');
$this->firstUser = $userModel::whereRoleIs('admin')->count() === 0;
}
/**
* Return route where to redirect after login success.
*
* @return string
*/
protected function redirectTo()
{
return route(config('boilerplate.app.redirectTo', 'boilerplate.dashboard'));
}
/**
* Get a validator for an incoming registration request.
*
* @param array $data
* @return \Illuminate\Contracts\Validation\Validator
*/
protected function validator(array $data)
{
return Validator::make($data, [
'last_name' => 'required|max:255',
'first_name' => 'required|max:255',
'email' => 'required|email|max:255|unique:users,email,NULL,id,deleted_at,NULL',
'password' => ['required', 'confirmed', new Password()],
]);
}
/**
* Show the application registration form.
*
* @return Application|Factory|View
*/
public function showRegistrationForm()
{
if (! $this->firstUser && ! config('boilerplate.auth.register')) {
abort('404');
}
return view('boilerplate::auth.register', ['firstUser' => $this->firstUser]);
}
/**
* Create a new user instance after a valid registration.
*
* @param array $data
* @return mixed
*/
protected function create(array $data)
{
if (! $this->firstUser && ! config('boilerplate.auth.register')) {
abort('404');
}
$userModel = config('auth.providers.users.model');
$roleModel = config('laratrust.models.role');
$user = $userModel::withTrashed()->updateOrCreate(['email' => $data['email']], [
'active' => true,
'first_name' => $data['first_name'],
'last_name' => $data['last_name'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
'last_login' => Carbon::now()->toDateTimeString(),
]);
if ($this->firstUser) {
$admin = $roleModel::whereName('admin')->first();
$user->attachRole($admin);
} else {
$user->restore();
$role = $roleModel::whereName(config('boilerplate.auth.register_role'))->first();
$user->roles()->sync([$role->id]);
}
return $user;
}
/**
* Show message to verify e-mail.
*
* @return Application|Factory|View
*/
public function emailVerify()
{
if (Auth::user()->hasVerifiedEmail()) {
return redirect(route(config('boilerplate.app.redirectTo', 'boilerplate.dashboard')));
}
return view('boilerplate::auth.verify-email');
}
/**
* If e-mail has been verified, redirect to the given route.
*
* @param EmailVerificationRequest $request
* @return Application|RedirectResponse|Redirector
*/
public function emailVerifyRequest(EmailVerificationRequest $request)
{
$request->fulfill();
return redirect(route(config('boilerplate.app.redirectTo', 'boilerplate.dashboard')));
}
/**
* Send verification e-mail.
*
* @param Request $request
* @return RedirectResponse
*/
public function emailSendVerification(Request $request)
{
$request->user()->sendEmailVerificationNotification();
return back()->with('message', 'Verification link sent!');
}
}

View File

@@ -7,6 +7,8 @@ use App\Http\Controllers\Controller;
use App\Repositories\Core\User\ShopCart;
use App\Repositories\Shop\Offers;
use App\Repositories\Shop\Orders;
class BasketController extends Controller
{
@@ -52,6 +54,12 @@ class BasketController extends Controller
return ShopCart::count();
}
public function getSummary()
{
$data = ShopCart::getSummary();
return response()->json(['data' => $data, 'code' => '200']);
}
public function order(Request $request)
{
ShopCart::clear();
@@ -60,8 +68,6 @@ class BasketController extends Controller
$data['user_id'] = Users::getId();
Orders::newOrder($data);
return response()->json(['code' => '200']);
// return redirect()->route('ThirdParty.select');
}
public function clearBasket()

View File

@@ -0,0 +1,13 @@
<?php
namespace App\Http\Controllers\Commercial;
use App\Http\Controllers\Controller as ParentController;
class Controller extends ParentController
{
public function __construct()
{
// $this->middleware('auth:guest');
}
}

View File

@@ -6,19 +6,11 @@ use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Repositories\Shop\Articles;
use App\Repositories\Shop\Categories;
use App\Repositories\Shop\Offers;
use App\Repositories\Shop\Tags;
use App\Repositories\Shop\TagGroups;
use App\Repositories\Shop\Homepages;
class HomeController extends Controller
{
public function __construct()
{
// $this->middleware('auth');
}
public function index(Request $request)
{
$input = $request->input();

View File

@@ -9,18 +9,24 @@ class Botanic
{
public function make(Builder $menu)
{
$menu->add('Botanique', [ 'permission' => 'backend_access', 'icon' => 'leaf' ])
$menu->add('Botanique', ['icon' => 'leaf' ])
->id('botanic')
->activeIfRoute('botanic')
->order(5);
$menu->addTo('botanic', 'Familles', [ 'route' => 'Admin.Botanic.Families.index', 'permission' => 'backend_access' ])
->activeIfRoute(['Admin.Botanic.Families.*'])->order(1);
$menu->addTo('botanic', 'Genres', [ 'route' => 'Admin.Botanic.Genres.index', 'permission' => 'backend_access' ])
->activeIfRoute(['Admin.Botanic.Genres.*'])->order(2);
$menu->addTo('botanic', 'Espèces', [ 'route' => 'Admin.Botanic.Species.index', 'permission' => 'backend_access' ])
->activeIfRoute(['Admin.Botanic.Species.*'])->order(3);
$menu->addTo('botanic', 'Variétés', [ 'route' => 'Admin.Botanic.Varieties.index', 'permission' => 'backend_access' ])
->activeIfRoute(['Admin.Botanic.Varieties.*'])->order(4);
$menu->addTo('botanic', 'Familles', [
'route' => 'Admin.Botanic.Families.index',
])->activeIfRoute(['Admin.Botanic.Families.*'])->order(1);
$menu->addTo('botanic', 'Genres', [
'route' => 'Admin.Botanic.Genres.index',
])->activeIfRoute(['Admin.Botanic.Genres.*'])->order(2);
$menu->addTo('botanic', 'Espèces', [
'route' => 'Admin.Botanic.Species.index',
])->activeIfRoute(['Admin.Botanic.Species.*'])->order(3);
$menu->addTo('botanic', 'Variétés', [
'route' => 'Admin.Botanic.Varieties.index',
])->activeIfRoute(['Admin.Botanic.Varieties.*'])->order(4);
}
}

View File

@@ -8,15 +8,12 @@ class Customers
{
public function make(Builder $menu)
{
$menu->add('Clients finaux', [ 'permission' => 'backend_access', 'icon' => 'address-card' ])
$menu->add('Clients finaux', ['icon' => 'address-card' ])
->id('customers')
->activeIfRoute('customers')
->order(4);
$menu->addTo('customers', __('customer.customers.name'), [
'route' => 'Admin.Shop.Customers.index',
'permission' => 'backend_access',
])
->activeIfRoute(['Admin.Shop.Customers.*'])->order(1);
])->activeIfRoute(['Admin.Shop.Customers.*'])->order(1);
}
}

View File

@@ -8,24 +8,16 @@ class Deliveries
{
public function make(Builder $menu)
{
$menu->add('Modes de vente', [
'permission' => 'backend_access',
'icon' => 'address-card'
])
$menu->add('Modes de vente', ['icon' => 'store'])
->id('sales_mode')
->activeIfRoute('sales_mode')
->order(3);
$menu->addTo('sales_mode', __('shop.sale_channels.name'), [
'route' => 'Admin.Shop.SaleChannels.index',
'permission' => 'backend_access',
])
->activeIfRoute(['Admin.Shop.SaleChannels.*'])->order(1);
])->activeIfRoute(['Admin.Shop.SaleChannels.*'])->order(1);
$menu->addTo('sales_mode', __('shop.deliveries.title'), [
'route' => 'Admin.Shop.Deliveries.index',
'permission' => 'backend_access',
])
->activeIfRoute(['Admin.Shop.Deliveries.*'])->order(1);
])->activeIfRoute(['Admin.Shop.Deliveries.*'])->order(1);
}
}

View File

@@ -8,18 +8,24 @@ class Orders
{
public function make(Builder $menu)
{
$menu->add('Commandes', [ 'permission' => 'backend_access', 'icon' => 'shopping-basket' ])
$menu->add('Commandes', ['icon' => 'shopping-basket'])
->id('orders')
->activeIfRoute('orders')
->order(1);
$menu->addTo('orders', 'Commandes', [ 'route' => 'Admin.Shop.Orders.index', 'permission' => 'backend_access' ])
->activeIfRoute(['Admin.Shop.Orders.*'])->order(1);
$menu->addTo('orders', 'Factures', [ 'route' => 'Admin.Shop.Invoices.index', 'permission' => 'backend_access' ])
->activeIfRoute(['Admin.Shop.Invoices.*'])->order(2);
$menu->addTo('orders', 'Avoirs', [ 'route' => 'Admin.Shop.Invoices.index', 'permission' => 'backend_access' ])
->activeIfRoute(['Admin.Shop.Invoices.*'])->order(3);
$menu->addTo('orders', 'Bons de livraison', [ 'route' => 'Admin.Shop.Invoices.index', 'permission' => 'backend_access' ])
->activeIfRoute(['Admin.Shop.Invoices.*'])->order(4);
$menu->addTo('orders', 'Commandes', [
'route' => 'Admin.Shop.Orders.index',
])->activeIfRoute(['Admin.Shop.Orders.*'])->order(1);
$menu->addTo('orders', 'Factures', [
'route' => 'Admin.Shop.Invoices.index',
])->activeIfRoute(['Admin.Shop.Invoices.*'])->order(2);
$menu->addTo('orders', 'Avoirs', [
'route' => 'Admin.Shop.Invoices.index',
])->activeIfRoute(['Admin.Shop.Invoices.*'])->order(3);
$menu->addTo('orders', 'Bons de livraison', [
'route' => 'Admin.Shop.Invoices.index',
])->activeIfRoute(['Admin.Shop.Invoices.*'])->order(4);
}
}

View File

@@ -8,43 +8,57 @@ class Shop
{
public function make(Builder $menu)
{
$menu->add('En vente', [ 'permission' => 'backend_access', 'icon' => 'store' ])
$menu->add('En vente', ['icon' => 'shopping-cart' ])
->id('shop')
->activeIfRoute('shop')
->order(2);
$menu->addTo('shop', 'Articles', [ 'route' => 'Admin.Shop.Articles.index', 'permission' => 'backend_access' ])
->activeIfRoute(['Admin.Shop.Articles.*'])->order(1);
$menu->addTo('shop', 'Déclinaisons', [ 'route' => 'Admin.Shop.Variations.index', 'permission' => 'backend_access' ])
->activeIfRoute(['Admin.Shop.Variations.*'])->order(2);
$menu->addTo('shop', 'Tarifs', [ 'route' => 'Admin.Shop.Tariffs.index', 'permission' => 'backend_access' ])
->activeIfRoute(['Admin.Shop.Tariffs.*'])->order(3);
$menu->addTo('shop', 'Offres', [ 'route' => 'Admin.Shop.Offers.index', 'permission' => 'backend_access' ])
->activeIfRoute(['Admin.Shop.Offers.*'])->order(4);
$menu->addTo('shop', 'Articles', [
'route' => 'Admin.Shop.Articles.index',
])->activeIfRoute(['Admin.Shop.Articles.*'])->order(1);
$menu->addTo('shop', 'Déclinaisons', [
'route' => 'Admin.Shop.Variations.index',
])->activeIfRoute(['Admin.Shop.Variations.*'])->order(2);
$menu->addTo('shop', 'Tarifs', [
'route' => 'Admin.Shop.Tariffs.index',
])->activeIfRoute(['Admin.Shop.Tariffs.*'])->order(3);
$menu->addTo('shop', 'Offres', [
'route' => 'Admin.Shop.Offers.index',
])->activeIfRoute(['Admin.Shop.Offers.*'])->order(4);
$menu->addTo('shop', 'Rayons', [ 'route' => 'Admin.Shop.Categories.index', 'permission' => 'backend_access' ])
->activeIfRoute(['Admin.Shop.Categories.*'])->order(6);
$menu->addTo('shop', 'Rayons', [
'route' => 'Admin.Shop.Categories.index',
])->activeIfRoute(['Admin.Shop.Categories.*'])->order(6);
$menu->addTo('shop', 'Tags', [ 'route' => 'Admin.Shop.Tags.index', 'permission' => 'backend_access' ])
->activeIfRoute(['Admin.Shop.Tags.*'])->order(8);
$menu->addTo('shop', 'Tags', [
'route' => 'Admin.Shop.Tags.index',
])->activeIfRoute(['Admin.Shop.Tags.*'])->order(8);
$menu->addTo('shop', 'Groupes de tags', [ 'route' => 'Admin.Shop.TagGroups.index', 'permission' => 'backend_access' ])
->activeIfRoute(['Admin.Shop.TagGroups.*'])->order(8);
$menu->addTo('shop', 'Groupes de tags', [
'route' => 'Admin.Shop.TagGroups.index',
])->activeIfRoute(['Admin.Shop.TagGroups.*'])->order(8);
$menu->addTo('shop', 'Natures d\'articles', [ 'route' => 'Admin.Shop.ArticleNatures.index', 'permission' => 'backend_access' ])
->activeIfRoute(['Admin.Shop.ArticleNatures.*'])->order(9);
$menu->addTo('shop', 'Natures d\'articles', [
'route' => 'Admin.Shop.ArticleNatures.index',
])->activeIfRoute(['Admin.Shop.ArticleNatures.*'])->order(9);
$menu->addTo('shop', 'Packages', [ 'route' => 'Admin.Shop.Packages.index', 'permission' => 'backend_access' ])
->activeIfRoute(['Admin.Shop.Packages.*'])->order(12);
$menu->addTo('shop', 'Packages', [
'route' => 'Admin.Shop.Packages.index',
])->activeIfRoute(['Admin.Shop.Packages.*'])->order(12);
$menu->addTo('shop', 'Unités de tarifs', [ 'route' => 'Admin.Shop.TariffUnities.index', 'permission' => 'backend_access' ])
->activeIfRoute(['Admin.Shop.TariffUnities.*'])->order(13);
$menu->addTo('shop', 'Unités de tarifs', [
'route' => 'Admin.Shop.TariffUnities.index',
])->activeIfRoute(['Admin.Shop.TariffUnities.*'])->order(13);
$menu->addTo('shop', 'Unités', [ 'route' => 'Admin.Shop.Unities.index', 'permission' => 'backend_access' ])
->activeIfRoute(['Admin.Shop.Unities.*'])->order(14);
$menu->addTo('shop', 'Accueil', [ 'route' => 'Admin.Shop.Homepages.index', 'permission' => 'backend_access' ])
->activeIfRoute(['Admin.Shop.Homepages.*'])->order(14);
$menu->addTo('shop', 'Unités', [
'route' => 'Admin.Shop.Unities.index',
])->activeIfRoute(['Admin.Shop.Unities.*'])->order(14);
$menu->addTo('shop', 'Accueil', [
'route' => 'Admin.Shop.Homepages.index',
])->activeIfRoute(['Admin.Shop.Homepages.*'])->order(14);
}
}

View File

@@ -2,22 +2,15 @@
namespace App\Models\Shop;
use Illuminate\Database\Eloquent\Model;
use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia;
use Spatie\MediaLibrary\MediaCollections\Models\Media;
// use Rinvex\Categories\Traits\Categorizable;
use Cesargb\Database\Support\CascadeDelete;
use Rinvex\Tags\Traits\Taggable;
use Wildside\Userstamps\Userstamps;
// use Kalnoy\Nestedset\NodeTrait;
use Rinvex\Categories\Models\Category as parentCategory;
use Kalnoy\Nestedset\NestedSet;
use App\Repositories\Shop\SaleChannels;
class Category extends parentCategory
{
use CascadeDelete, Taggable, Userstamps;
@@ -72,4 +65,12 @@ class Category extends parentCategory
{
return $query->where('id', '<>', 1);
}
public function scopeHasAvailableOffers($query, $sale_channel_id = false)
{
$sale_channel_id = $sale_channel_id ? $sale_channel_id : SaleChannels::getDefaultID();
return $query->whereHas('articles', function ($query) use ($sale_channel_id) {
$query->WithAvailableOffers($sale_channel_id);
});
}
}

View File

@@ -7,4 +7,6 @@ use Illuminate\Database\Eloquent\Model;
class Homepage extends Model
{
protected $guarded = ['id'];
protected $table = 'shop_homepages';
}

View File

@@ -33,9 +33,10 @@ class Categories
return self::getModel()->defaultOrder()->get()->toTree();
}
public static function getCategoryTreeVisibles()
public static function getCategoryTreeVisibles($sale_channel_id = false)
{
return self::getModel()->defaultOrder()->where('visible', 1)->get()->toTree();
// return self::getModel()->defaultOrder()->visible()->hasAvailableOffers($sale_channel_id)->get()->toTree();
return self::getModel()->defaultOrder()->visible()->get()->toTree();
}
public static function getChildren($data, $withFolder = false)

View File

@@ -19,6 +19,15 @@ class ShopCart
];
}
public static function getSummary()
{
return [
'count' => self::count(),
'quantity' => self::getTotalQuantity(),
'total' => self::getTotal(),
];
}
public static function remove($id)
{
return self::get()->remove($id);

View File

@@ -486,5 +486,4 @@ class Articles
{
return self::update(['homepage' => $homepage], $id);
}
}

View File

@@ -33,7 +33,7 @@ trait Imageable
public static function getPreviewSrc($image)
{
return $image ? Medias::getPreviewSrc($image) : null;
return $image ? Medias::getPreviewSrc($image) : '/img/visuel-non-disponible.jpg';
}
public static function getImage($image)
@@ -43,7 +43,7 @@ trait Imageable
public static function getImageSrc($image)
{
return $image ? Medias::getImageSrc($image) : null;
return $image ? Medias::getImageSrc($image) : '/img/visuel-non-disponible.jpg';
}
public static function deleteImage($id, $index)