diff --git a/app/Http/Controllers/Bo/CreneauxController.php b/app/Http/Controllers/Bo/CreneauxController.php index e74a16c..139bd23 100644 --- a/app/Http/Controllers/Bo/CreneauxController.php +++ b/app/Http/Controllers/Bo/CreneauxController.php @@ -3,6 +3,8 @@ namespace App\Http\Controllers\Bo; use App\Http\Controllers\Controller; +use App\Models\TimeslotSetting; +use App\Models\Setting; use Illuminate\Http\Request; class CreneauxController extends Controller @@ -10,41 +12,33 @@ class CreneauxController extends Controller public function settings(Request $request) { - $plage = array( - 0 => array(), - 1 => array( - 'start' => '09:00', - 'end' => '16:50', - ), - 2 => array( - 'start' => '09:00', - 'end' => '17:00', - ), - 3 => array( - 'start' => '09:00', - 'end' => '17:00', - ), - 4 => array( - 'start' => '09:00', - 'end' => '17:00', - ), - 5 => array( - 'start' => '09:00', - 'end' => '17:00', - ), - 6 => array( - 'start' => '10:00', - 'end' => '12:00', - ), - ); - $plage_interval = "00:15"; - $plage_days = 14; + $timeslotSettings = TimeslotSetting::all(); + $plage_days = Setting::where('key','order_withdrawal_period')->firstOrFail()->value; - return view('bo.creneaux.settings', compact('plage', 'plage_interval', 'plage_days')); + return view('bo.creneaux.settings', compact('timeslotSettings', 'plage_days')); } public function updateSettings(Request $request) { - dd($request); + $plage = $request->plage; + $plage_days = $request->plage_days; + + foreach($plage as $index => $day) { + $setting = TimeslotSetting::where('day_index', ''.$index)->firstOrFail(); + $setting->morning_start = $day['morning_start']; + $setting->morning_end = $day['morning_end']; + $setting->afternoon_start = $day['afternoon_start']; + $setting->afternoon_end = $day['afternoon_end']; + $setting->interval = $day['interval']; + $setting->max_orders_per_interval = $day['max_orders_per_interval']; + $setting->min_order_preparation = $day['min_order_preparation']; + $setting->save(); + } + + $order_withdrawal_period = Setting::where('key','order_withdrawal_period')->firstOrFail(); + $order_withdrawal_period->value = $plage_days; + $order_withdrawal_period->save(); + + return redirect()->route('bo.creneaux.settings')->with('success', 'Modifications enregistrées !'); } } diff --git a/app/Http/Controllers/Bo/OrdersController.php b/app/Http/Controllers/Bo/OrdersController.php index 7536e9c..db207c2 100644 --- a/app/Http/Controllers/Bo/OrdersController.php +++ b/app/Http/Controllers/Bo/OrdersController.php @@ -13,6 +13,7 @@ use Illuminate\Support\Facades\Mail; use App\Mail\OrderStatusMail; use App\Mail\OrderConfirmMail; use App\Models\Customers; +use App\Models\TimeslotSetting; use Carbon\Carbon; use Carbon\CarbonImmutable; use Carbon\CarbonInterval; @@ -166,39 +167,25 @@ class OrdersController extends Controller { $activestep = 3; - //settings à stocker - //get available timeslots - //days 0 = sunday => 6 = saturday - $plage = array( - 0 => array(), - 1 => array( - 'start' => '09:00', - 'end' => '16:50', - ), - 2 => array( - 'start' => '09:00', - 'end' => '17:00', - ), - 3 => array( - 'start' => '09:00', - 'end' => '17:00', - ), - 4 => array( - 'start' => '09:00', - 'end' => '17:00', - ), - 5 => array( - 'start' => '09:00', - 'end' => '17:00', - ), - 6 => array( - 'start' => '10:00', - 'end' => '12:00', - ), - ); - $plage_interval = "0:15"; + //setting à stocker et réutiliser $plage_days = 14; + $timeslotSettings = TimeslotSetting::all(); + //fabriquons un tableau recap + $plage = array(); + foreach($timeslotSettings as $day) { + + $plage[$day->day_index] = array( + 'morning_start' => $day->morning_start, + 'morning_end' => $day->morning_end, + 'afternoon_start' => $day->afternoon_start, + 'afternoon_end' => $day->afternoon_end, + 'interval' => $day->interval, + 'min_order_preparation' => $day->min_order_preparation + ); + } + + //génération des plages //start today $today = CarbonImmutable::now()->startOfDay(); @@ -206,25 +193,40 @@ class OrdersController extends Controller $availCreneaux = array(); - $interval = CarbonInterval::createFromFormat('h:i', $plage_interval); - for ($i = 0; $i < $plage_days; $i++) { /** @var Carbon */ $current = $today->add($i, 'day'); $weekDay = $current->weekday(); - if (isset($plage[$weekDay]['start'])) { - $currentTime = Carbon::createFromTimeString($plage[$weekDay]['start']); - $endTime = Carbon::createFromTimeString($plage[$weekDay]['end']); + $interval = CarbonInterval::createFromFormat('h:i', $plage[$weekDay]['interval'] ?? '00:15'); + $delaiPrepa = CarbonInterval::createFromFormat('h:i', $plage[$weekDay]['min_order_preparation'] ?? '01:00'); + //matinée + if (!empty($plage[$weekDay]['morning_start'])) { + $currentTime = Carbon::createFromTimeString($plage[$weekDay]['morning_start']); + $endTime = Carbon::createFromTimeString($plage[$weekDay]['morning_end']); do { $creneau = $currentTime->format('H:i'); //attention si la date est passée (today mai avant maintenant) : pas de créneau - if ($current > $today || $currentTime >= $now) { + if ($current > $today || $currentTime >= $now->add($delaiPrepa)) { + $availCreneaux[$current->format('d/m/Y')][] = $creneau; + } + $currentTime->add($interval); + } while ($currentTime <= $endTime); + } + //aprem + if (!empty($plage[$weekDay]['afternoon_start'])) { + $currentTime = Carbon::createFromTimeString($plage[$weekDay]['afternoon_start']); + $endTime = Carbon::createFromTimeString($plage[$weekDay]['afternoon_end']); + do { + $creneau = $currentTime->format('H:i'); + //attention si la date est passée (today mais avant maintenant) : pas de créneau + if ($current > $today || $currentTime >= $now->add($delaiPrepa)) { $availCreneaux[$current->format('d/m/Y')][] = $creneau; } $currentTime->add($interval); } while ($currentTime <= $endTime); } } + $order = Order::where('reference', '=', $reference)->firstOrFail(); return view('sales.pick-slot', compact('activestep', 'availCreneaux', 'order')); } diff --git a/app/Http/Controllers/Bo/ProductsController.php b/app/Http/Controllers/Bo/ProductsController.php index 4dbaa0b..27e9a2f 100644 --- a/app/Http/Controllers/Bo/ProductsController.php +++ b/app/Http/Controllers/Bo/ProductsController.php @@ -67,6 +67,7 @@ class ProductsController extends Controller /** * store a new product * @todo : manage tags and associated products + * @todo : enregistrer unité de vente, poids et unité de poids */ public function store(Request $request) { @@ -198,6 +199,7 @@ class ProductsController extends Controller /** * update an existing product + * @todo : enregistrer unité de vente, poids et unité de poids */ public function update(Request $request, $id) { diff --git a/app/Models/Product.php b/app/Models/Product.php index 04896c7..a2678a2 100644 --- a/app/Models/Product.php +++ b/app/Models/Product.php @@ -8,7 +8,9 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Gloudemans\Shoppingcart\Contracts\Buyable; use Gloudemans\Shoppingcart\CanBeBought; - +/** + * @todo : unité de vente/unité de poids devrait être des énums (via table liée ou package enum) + */ class Product extends Model implements Buyable { use HasFactory; diff --git a/app/Models/TimeslotSetting.php b/app/Models/TimeslotSetting.php new file mode 100644 index 0000000..fd605f0 --- /dev/null +++ b/app/Models/TimeslotSetting.php @@ -0,0 +1,11 @@ +id(); + + $table->enum('day_index', [0,1,2,3,4,5,6])->nullable()->unique(); + $table->string('morning_start')->nullable(); + $table->string('morning_end')->nullable(); + $table->string('afternoon_start')->nullable(); + $table->string('afternoon_end')->nullable(); + $table->string('interval')->nullable(); + $table->unsignedInteger('max_orders_per_interval')->nullable(); + $table->string('min_order_preparation')->nullable(); + + $table->timestamps(); + }); + + $seeder = new TimeslotSettingsSeeder; + $seeder->run(); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('timeslot_settings'); + } +} diff --git a/database/seeders/ThemeSettings.php b/database/seeders/ThemeSettings.php index ad8128e..6fc9a86 100644 --- a/database/seeders/ThemeSettings.php +++ b/database/seeders/ThemeSettings.php @@ -3,7 +3,9 @@ namespace Database\Seeders; use Illuminate\Database\Seeder; - +/** + * @deprecated + */ class ThemeSettings extends Seeder { /** diff --git a/database/seeders/TimeslotSettingsSeeder.php b/database/seeders/TimeslotSettingsSeeder.php new file mode 100644 index 0000000..cab7a3b --- /dev/null +++ b/database/seeders/TimeslotSettingsSeeder.php @@ -0,0 +1,86 @@ +day_index = '0'; + $mondays->morning_start = "09:01"; + $mondays->morning_end = "12:00"; + $mondays->afternoon_start = "13:00"; + $mondays->afternoon_end = "17:00"; + $mondays->interval = "00:15"; + $mondays->max_orders_per_interval = 4; + $mondays->min_order_preparation = "01:00"; + $mondays->save(); + + $tuesdays = new TimeslotSetting(); + $tuesdays->day_index = '1'; + $tuesdays->morning_start = "09:02"; + $tuesdays->morning_end = "12:00"; + $tuesdays->afternoon_start = "13:00"; + $tuesdays->afternoon_end = "17:00"; + $tuesdays->interval = "00:15"; + $tuesdays->max_orders_per_interval = 4; + $tuesdays->min_order_preparation = "01:00"; + $tuesdays->save(); + + $wednesdays = new TimeslotSetting(); + $wednesdays->day_index = '2'; + $wednesdays->morning_start = "09:03"; + $wednesdays->morning_end = "12:00"; + $wednesdays->afternoon_start = "13:00"; + $wednesdays->afternoon_end = "17:00"; + $wednesdays->interval = "00:15"; + $wednesdays->max_orders_per_interval = 4; + $wednesdays->min_order_preparation = "01:00"; + $wednesdays->save(); + + $thursdays = new TimeslotSetting(); + $thursdays->day_index = '3'; + $thursdays->morning_start = "09:04"; + $thursdays->morning_end = "12:00"; + $thursdays->afternoon_start = "13:00"; + $thursdays->afternoon_end = "17:00"; + $thursdays->interval = "00:15"; + $thursdays->max_orders_per_interval = 4; + $thursdays->min_order_preparation = "01:00"; + $thursdays->save(); + + $fridays = new TimeslotSetting(); + $fridays->day_index = '4'; + $fridays->morning_start = "09:05"; + $fridays->morning_end = "12:00"; + $fridays->afternoon_start = "13:00"; + $fridays->afternoon_end = "17:00"; + $fridays->interval = "00:15"; + $fridays->max_orders_per_interval = 4; + $fridays->min_order_preparation = "01:00"; + $fridays->save(); + + $saturdays = new TimeslotSetting(); + $saturdays->day_index = '5'; + $saturdays->morning_start = "09:06"; + $saturdays->morning_end = "12:00"; + $saturdays->interval = "00:15"; + $saturdays->max_orders_per_interval = 4; + $saturdays->min_order_preparation = "01:00"; + $saturdays->save(); + + $sundays = new TimeslotSetting(); + $sundays->day_index = '6'; + $sundays->save(); + + } +} diff --git a/resources/views/bo/creneaux/settings.blade.php b/resources/views/bo/creneaux/settings.blade.php index faf7457..01f1ece 100644 --- a/resources/views/bo/creneaux/settings.blade.php +++ b/resources/views/bo/creneaux/settings.blade.php @@ -49,81 +49,73 @@
- Début -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- + Matinée Début
+ @foreach ($timeslotSettings as $zeDay) +
+ +
+ @endforeach
- Fin + Matinée Fin
+ @foreach ($timeslotSettings as $zeDay)
- +
+ @endforeach +
+
- + Après-midi Début
+ @foreach ($timeslotSettings as $zeDay) +
+ +
+ @endforeach +
+
- + Après-midi Fin
+ @foreach ($timeslotSettings as $zeDay)
- -
-
- -
-
- -
-
- +
+ @endforeach
Durée d'un crénaux
+ @foreach ($timeslotSettings as $zeDay) +
+ +
+ @endforeach +
+
- + Nb de réservations maximum par crénau
+ @foreach ($timeslotSettings as $zeDay) +
+ +
+ @endforeach +
+
- -
-
- -
-
- -
-
- -
-
- -
-
- + Delai de préparation de commande
+ @foreach ($timeslotSettings as $zeDay) +
+ +
+ @endforeach
diff --git a/resources/views/bo/settings.blade.php b/resources/views/bo/settings.blade.php index dae18c3..5e3c2a8 100644 --- a/resources/views/bo/settings.blade.php +++ b/resources/views/bo/settings.blade.php @@ -46,12 +46,12 @@ Gestion des QR codes
-
+ {{--
-
+
--}}