diff --git a/app/Http/Controllers/Bo/MagasinsController.php b/app/Http/Controllers/Bo/MagasinsController.php index d16f32c..f08d312 100644 --- a/app/Http/Controllers/Bo/MagasinsController.php +++ b/app/Http/Controllers/Bo/MagasinsController.php @@ -40,6 +40,8 @@ class MagasinsController extends Controller { $request->validate([ 'name' => 'required|string|max:255', + 'email_contact' => 'required|email:rfc,dns,spoof|max:255', + 'email_confirm' => 'nullable|email:rfc,dns,spoof|max:255', 'address' => 'required|string|max:255', 'postcode' => 'required', 'city' => 'required|string|max:255', @@ -73,6 +75,8 @@ class MagasinsController extends Controller { $request->validate([ 'name' => 'required|string|max:255', + 'email_contact' => 'required|email:rfc,dns,spoof|max:255', + 'email_confirm' => 'nullable|email:rfc,dns,spoof|max:255', 'address' => 'required|string|max:255', 'postcode' => 'required', 'city' => 'required|string|max:255', diff --git a/app/Http/Controllers/Bo/OrdersController.php b/app/Http/Controllers/Bo/OrdersController.php index 2d7ca6d..179ccfd 100644 --- a/app/Http/Controllers/Bo/OrdersController.php +++ b/app/Http/Controllers/Bo/OrdersController.php @@ -16,11 +16,13 @@ use App\Mail\OrderConfirmMail; use App\Mail\OrderConfirmAdminMail; use App\Jobs\CsvOrderWrite; use App\Models\Customers; +use App\Models\OrdersStatus; use App\Models\Setting; use Carbon\Carbon; use Carbon\CarbonImmutable; use Carbon\CarbonInterval; use Gloudemans\Shoppingcart\Facades\Cart; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Facades\Auth; use Illuminate\Http\Request; use Illuminate\Support\Facades\Session; @@ -37,9 +39,33 @@ class OrdersController extends Controller { $orders = $this->filterOrders($request); + $status_orders = OrdersStatus::all(); + $magasins = Magasin::all(); + + $filter_status_order = $request->query('filter_status_order'); + $filter_magasin = $request->query('filter_magasin'); + $filter_reference = $request->query('filter_reference'); + + if (!empty($filter_status_order)) { + $orders = $orders->where('status_id', $filter_status_order); + } + if (!empty($filter_magasin)) { + $orders = $orders->whereHas( + 'timeslot', + function (Builder $q) use ($filter_magasin) { + $q->where('timeslots.magasin_id', $filter_magasin); + } + ); + } + if (!empty($filter_reference)) { + $orders = $orders->where('reference', 'like', "%{$filter_reference}%"); + } $orders = $orders->paginate(10); - return view('bo.orders.index', compact('orders')); + return view( + 'bo.orders.index', + compact('orders', 'status_orders', 'magasins', 'filter_status_order', 'filter_magasin', 'filter_reference') + ); } /** @@ -73,7 +99,6 @@ class OrdersController extends Controller { $orders = Order::query(); - if ($request->rst) { Session::remove('orders.sort_col'); Session::remove('orders.sort_way'); @@ -110,7 +135,9 @@ class OrdersController extends Controller case 'customer_id': $orders = $orders->orderBy('customer_id', Session::get('orders.sort_way')); break; - }//end switch + } //end switch + } else { + $orders->orderByDesc('date'); }//end if return $orders; @@ -486,6 +513,7 @@ class OrdersController extends Controller * * @param Request $request * @return \Illuminate\Http\RedirectResponse + * @throws \RuntimeException If email missing. */ public function setTimeSlot(Request $request) { @@ -495,7 +523,6 @@ class OrdersController extends Controller 'ok_cgv' => 'accepted', ]); - $time_slot = Carbon::createFromFormat('d/m/Y-H:i', $request->selectedcreneau); $tsday = explode('-', $request->selectedcreneau)[0]; $tstime = explode('-', $request->selectedcreneau)[1]; $magasin_id = $request->selectedmagasin; @@ -520,12 +547,25 @@ class OrdersController extends Controller Mail::to($order->customer->email)->queue(new OrderConfirmMail($order)); // Envoi du mail de confirmation aux admins site. - $toMailSetting = Setting::where('key', 'send_order_confirm_mail_to')->first(); - if (empty($toMailSetting->value)) { - $toMail = config('mail.from.address'); + /** @var \App\Model\Magasin|null */ + $shop = Magasin::where('id', $magasin_id)->first(); + + if ($shop and $shop->email_confirm) { + /** @var string */ + $toMail = $shop->email_confirm; } else { - $toMail = $toMailSetting->value; + /** @var string|null */ + $toMail = \optional(Setting::where('key', 'send_order_confirm_mail_to')->first())->value; + if (!$toMail) { + /** @var string|null */ + $toMail = config('mail.from.address'); + } } + + if (!$toMail) { + throw new \RuntimeException('Impossible de trouver un mail'); + } + Mail::to($toMail)->queue(new OrderConfirmAdminMail($order)); // Export commande. diff --git a/app/Http/Controllers/ContactController.php b/app/Http/Controllers/ContactController.php index 83f63c4..5bdcb46 100644 --- a/app/Http/Controllers/ContactController.php +++ b/app/Http/Controllers/ContactController.php @@ -25,11 +25,12 @@ class ContactController extends Controller // @phpcs:enable $status = $request->session()->get('status'); - // 1er magasin en base pour le moment - $magasin = Magasin::first(); + $magasin = Magasin::first(); + $magasins = Magasin::all(); + $content = Content::where('key', 'contact')->first(); - return view('contact', compact('status', 'magasin', 'content')); + return view('contact', compact('status', 'magasins', 'magasin', 'content')); } /** @@ -37,17 +38,29 @@ class ContactController extends Controller * * @param ContactFormRequest $request * @return \Illuminate\Http\Response + * @throws \RuntimeException If email missing. */ public function contactSubmit(ContactFormRequest $request) { - $data = $request->all(); + /** @var \App\Model\Magasin|null */ + $shop = Magasin::where('name', $request->shop)->first(); - $toMailSetting = Setting::where('key', 'send_contact_mail_to')->first(); - if (empty($toMailSetting->value)) { - $toMail = config('mail.from.address'); + if ($shop and $shop->email_contact) { + /** @var string */ + $toMail = $shop->email_contact; } else { - $toMail = $toMailSetting->value; + /** @var string|null */ + $toMail = \optional(Setting::where('key', 'send_contact_mail_to')->first())->value; + if (!$toMail) { + /** @var string|null */ + $toMail = config('mail.from.address'); + } } + + if (!$toMail) { + throw new \RuntimeException('Impossible de trouver un mail'); + } + // Envoi du mail d'alerte. Mail::to($toMail)->send(new SendContactMail($request)); diff --git a/app/Http/Controllers/CustomerController.php b/app/Http/Controllers/CustomerController.php index 53f1f40..564ce9e 100644 --- a/app/Http/Controllers/CustomerController.php +++ b/app/Http/Controllers/CustomerController.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers; use App\Http\Requests\CustomerRegisterRequest; use App\Http\Requests\LoginRequest; use App\Http\Requests\UpdateInfosRequest; +use App\Mail\OrderCanceledConfirmMail; use App\Mail\PasswordResetMail; use App\Mail\RegisterConfirmMail; use App\Models\Customers; @@ -12,6 +13,7 @@ use App\Models\Magasin; use App\Models\Order; use App\Models\PasswordReset; use App\Models\Salarie; +use App\Models\Setting; use Illuminate\Database\Eloquent\ModelNotFoundException; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; @@ -455,6 +457,40 @@ class CustomerController extends Controller return view('customer.order-detail', compact('order', 'magasin')); } + /** + * mise au statut annulé d'une commande + * + * @param string $reference + * @return \Illuminate\Http\RedirectResponse + * @throws \RuntimeException If email missing. + */ + public function cancelOrder(string $reference) + { + /** @var \App\Models\Order|null */ + $order = Order::where('reference', $reference)->first(); + if (!$order) { + throw new \RuntimeException('Impossible de trouver un enregistrement Order'); + } + $order->status_id = 7; + $order->save(); + + // Envoi du mail d'annulation aux admins site. + /** @var string|null */ + $toMail = \optional(Setting::where('key', 'send_order_confirm_mail_to')->first())->value; + if (!$toMail) { + /** @var string|null */ + $toMail = config('mail.from.address'); + } + + if (!$toMail) { + throw new \RuntimeException('Impossible de trouver un mail'); + } + + Mail::to($toMail)->queue(new OrderCanceledConfirmMail($order)); + + return back()->with('success', "La commande " . $order->reference . " à été annulée."); + } + /** * delete customers * diff --git a/app/Http/Requests/ContactFormRequest.php b/app/Http/Requests/ContactFormRequest.php index 9e99e13..b2aab85 100644 --- a/app/Http/Requests/ContactFormRequest.php +++ b/app/Http/Requests/ContactFormRequest.php @@ -27,6 +27,7 @@ class ContactFormRequest extends FormRequest 'last_name' => 'required|min:2', 'first_name' => 'required|min:2', 'email' => 'required|email:rfc,dns,spoof', + 'shop' => 'present|nullable|string|exists:magasins,name', 'subject' => 'required|min:2', 'order_ref' => 'sometimes', 'message' => 'required|min:20|max:1900', @@ -46,6 +47,7 @@ class ContactFormRequest extends FormRequest 'ok_cgv.accepted' => __('You must accept the terms and conditions and the privacy policy'), 'file.max' => __('La taille du fichier ne peut pas dépasser :max kilo-octets.'), 'file.mimes' => __('Le fichier doit être de type : :values.'), + 'shop.exists' => __('Le magasin :exists est introuvable.') ]; } } diff --git a/app/Mail/OrderCanceledConfirmMail.php b/app/Mail/OrderCanceledConfirmMail.php new file mode 100644 index 0000000..4e7d316 --- /dev/null +++ b/app/Mail/OrderCanceledConfirmMail.php @@ -0,0 +1,47 @@ +order = $order; + } + + /** + * Build the message. + * + * @return $this + */ + public function build() + { + $order = $this->order; + + return $this->subject( + "Commande " . config('theme.site_name') . " n°" . $order->reference . " a été annulée." + )->view('mails.order-canceled-confirm', compact('order')); + } +} diff --git a/app/Models/Magasin.php b/app/Models/Magasin.php index ce7c754..a9236e5 100644 --- a/app/Models/Magasin.php +++ b/app/Models/Magasin.php @@ -15,7 +15,7 @@ class Magasin extends Model * @var array */ protected $fillable = [ - 'name', 'address', 'postcode', 'city', 'phone', + 'name', 'email_contact', 'email_confirm', 'address', 'postcode', 'city', 'phone', 'latitude', 'longitude', 'gmaps_placeid', 'gmaps_embed_href', 'gmaps_link_href', ]; diff --git a/database/migrations/2022_11_25_094244_add_field_to_magasins.php b/database/migrations/2022_11_25_094244_add_field_to_magasins.php new file mode 100644 index 0000000..aeedb87 --- /dev/null +++ b/database/migrations/2022_11_25_094244_add_field_to_magasins.php @@ -0,0 +1,34 @@ +string('email_contact')->after('name'); + $table->string('email_confirm')->nullable()->after('email_contact'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('magasins', function (Blueprint $table) { + $table->dropColumn('email_contact'); + $table->dropColumn('email_confirm'); + }); + } +} diff --git a/database/seeders/MagasinsSeeder.php b/database/seeders/MagasinsSeeder.php index 54ffe4f..0468cbb 100644 --- a/database/seeders/MagasinsSeeder.php +++ b/database/seeders/MagasinsSeeder.php @@ -14,13 +14,14 @@ class MagasinsSeeder extends Seeder */ public function run() { - $shop = new Magasin(); - $shop->name = 'Point de retrait'; - $shop->address = 'l\'adresse'; - $shop->postcode = '72000'; - $shop->city = 'Le Mans'; + $shop = new Magasin(); + $shop->name = 'Point de retrait'; + $shop->email_contact = 'adresse@domaine.fr'; + $shop->address = 'l\'adresse'; + $shop->postcode = '72000'; + $shop->city = 'Le Mans'; $shop->gmaps_embed_href = "https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d5338.425979915083!2d0.1977634707405403!3d48.00959481914027!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x47e288cfcdc1a263%3A0x7acf6d8dc923c25a!2zQ2l0w6kgUGxhbnRhZ2Vuw6p0!5e0!3m2!1sfr!2sfr!4v1619612657653!5m2!1sfr!2sfr"; - $shop->gmaps_link_href = 'https://goo.gl/maps/sxuj7FevRSHsDb8MA'; + $shop->gmaps_link_href = 'https://goo.gl/maps/sxuj7FevRSHsDb8MA'; $shop->save(); } } diff --git a/resources/views/bo/magasins/create.blade.php b/resources/views/bo/magasins/create.blade.php index e1cf8fc..1721d86 100644 --- a/resources/views/bo/magasins/create.blade.php +++ b/resources/views/bo/magasins/create.blade.php @@ -22,6 +22,20 @@ +
+
+
+ + +
+
+
+
+ + +
+
+
diff --git a/resources/views/bo/magasins/edit.blade.php b/resources/views/bo/magasins/edit.blade.php index 2c2349d..326d959 100644 --- a/resources/views/bo/magasins/edit.blade.php +++ b/resources/views/bo/magasins/edit.blade.php @@ -31,6 +31,20 @@ Editer Créneaux de collecte
+
+
+
+ + +
+
+
+
+ + +
+
+
diff --git a/resources/views/bo/magasins/index.blade.php b/resources/views/bo/magasins/index.blade.php index e753add..0f64303 100644 --- a/resources/views/bo/magasins/index.blade.php +++ b/resources/views/bo/magasins/index.blade.php @@ -14,9 +14,11 @@ - - - + + + + + @@ -24,6 +26,8 @@ + +
NomAdresseTéléphone{{ __('Nom') }}{{ __('Email de contact') }}{{ __('Email de confirmation') }}
{{ __('de commande') }}
{{ __('Adresse') }}{{ __('Téléphone') }}
{{$magasin->name}}{{$magasin->email_contact}}{{$magasin->email_confirm}} {{$magasin->address}}, {{$magasin->postcode}} {{$magasin->city}} {{$magasin->phone}} diff --git a/resources/views/bo/orders/index.blade.php b/resources/views/bo/orders/index.blade.php index 2d09e9b..e74b4ce 100644 --- a/resources/views/bo/orders/index.blade.php +++ b/resources/views/bo/orders/index.blade.php @@ -1,10 +1,55 @@ @extends('layouts.bo-layout') @section('content') -
-

Commandes @if (isset($today)) à retirer aujourd'hui @endif

+
+

{{ __('Commandes') }} @if (isset($today))
{{ __('à retirer aujourd\'hui') }} @endif

+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+ + Effacer le filtre +
+
+
+
+
+ @if (session('success')) - {{ session('success') }} + {{ session('success') }} @endif
diff --git a/routes/web.php b/routes/web.php index eefba9a..ab723e6 100644 --- a/routes/web.php +++ b/routes/web.php @@ -222,6 +222,7 @@ Route::name('account.') )->name('change-password'); Route::get('/commandes', [CustomerController::class, 'myOrders'])->name('my-orders'); Route::get('/commandes/{reference}', [CustomerController::class, 'orderDetail'])->name('order-detail'); + Route::get('/commandes/{reference}/annuler', [CustomerController::class, 'cancelOrder'])->name('cancel-order'); } );