diff --git a/app/Http/Controllers/Bo/CreneauxController.php b/app/Http/Controllers/Bo/CreneauxController.php
index 139bd23..a713959 100644
--- a/app/Http/Controllers/Bo/CreneauxController.php
+++ b/app/Http/Controllers/Bo/CreneauxController.php
@@ -3,6 +3,7 @@
namespace App\Http\Controllers\Bo;
use App\Http\Controllers\Controller;
+use App\Models\CollecteException;
use App\Models\TimeslotSetting;
use App\Models\Setting;
use Illuminate\Http\Request;
@@ -12,10 +13,11 @@ class CreneauxController extends Controller
public function settings(Request $request)
{
- $timeslotSettings = TimeslotSetting::all();
- $plage_days = Setting::where('key','order_withdrawal_period')->firstOrFail()->value;
+ $timeslotSettings = TimeslotSetting::all();
+ $plage_days = Setting::where('key', 'order_withdrawal_period')->firstOrFail()->value;
+ $exceptionsCollecte = CollecteException::orderBy('date')->get();
- return view('bo.creneaux.settings', compact('timeslotSettings', 'plage_days'));
+ return view('bo.creneaux.settings', compact('timeslotSettings', 'plage_days', 'exceptionsCollecte'));
}
public function updateSettings(Request $request)
@@ -41,4 +43,40 @@ class CreneauxController extends Controller
return redirect()->route('bo.creneaux.settings')->with('success', 'Modifications enregistrées !');
}
+
+ public function saveExceptions(Request $request)
+ {
+ $collecteException = $request->collecte_exception;
+
+ for ($i = 0; $i < count($collecteException); $i++) {
+ $collecteExceptionToInsert = !empty($collecteException[$i]["date"]);
+ if (isset($collecteException[$i]["id"]) && $collecteException[$i]["id"] !== null && $collecteExceptionToInsert) {
+ $ce = CollecteException::findOrFail($collecteException[$i]["id"]);
+ $ce->date = $collecteException[$i]["date"];
+ $ce->comment = $collecteException[$i]["comment"];
+ $ce->save();
+ } else {
+ if ($collecteExceptionToInsert) {
+ $ce = CollecteException::updateOrCreate(['date' => $collecteException[$i]["date"], 'comment' => $collecteException[$i]["comment"]]);
+ $collecteException[$i]["id"] = $ce->id;
+ } else {
+ unset($collecteException[$i]);
+ $i--;
+ }
+ }
+ }
+
+ //remet dans l'ordre avant de renvoyer
+ $collecteException = CollecteException::orderBy('date')->get();
+ return $collecteException;
+
+ }
+
+ public function destroyExceptions(Request $request)
+ {
+ $collecteException = CollecteException::findOrFail($request->id);
+ $collecteException->delete();
+
+ return "Suppression terminée !";
+ }
}
diff --git a/app/Http/Controllers/Bo/OrdersController.php b/app/Http/Controllers/Bo/OrdersController.php
index db207c2..80a2ebf 100644
--- a/app/Http/Controllers/Bo/OrdersController.php
+++ b/app/Http/Controllers/Bo/OrdersController.php
@@ -12,6 +12,7 @@ use App\Models\Timeslot;
use Illuminate\Support\Facades\Mail;
use App\Mail\OrderStatusMail;
use App\Mail\OrderConfirmMail;
+use App\Models\CollecteException;
use App\Models\Customers;
use App\Models\TimeslotSetting;
use Carbon\Carbon;
@@ -185,11 +186,14 @@ class OrdersController extends Controller
);
}
-
//génération des plages
//start today
$today = CarbonImmutable::now()->startOfDay();
+ //final boundary (permet de limiter la liste des jours d'exception)
+ $finalday = $today->add($plage_days, 'day');
$now = CarbonImmutable::now();
+ //jours exceptions
+ $noCollectDays = CollecteException::whereDate('date','>',$now)->whereDate('date','<=',$finalday)->orderBy('date')->get();
$availCreneaux = array();
@@ -199,6 +203,16 @@ class OrdersController extends Controller
$weekDay = $current->weekday();
$interval = CarbonInterval::createFromFormat('h:i', $plage[$weekDay]['interval'] ?? '00:15');
$delaiPrepa = CarbonInterval::createFromFormat('h:i', $plage[$weekDay]['min_order_preparation'] ?? '01:00');
+ //si c'est un jour exception skip
+ $skip = false;
+ foreach ($noCollectDays as $not_today) {
+ if($current->isSameDay($not_today->date)) {
+ $skip = true;
+ }
+ }
+ if($skip) {
+ continue;
+ }
//matinée
if (!empty($plage[$weekDay]['morning_start'])) {
$currentTime = Carbon::createFromTimeString($plage[$weekDay]['morning_start']);
diff --git a/app/Models/CollecteException.php b/app/Models/CollecteException.php
new file mode 100644
index 0000000..b97a806
--- /dev/null
+++ b/app/Models/CollecteException.php
@@ -0,0 +1,28 @@
+ 'date',
+ ];
+
+ protected function serializeDate(DateTimeInterface $date)
+ {
+ return $date->format('Y-m-d');
+ }
+}
diff --git a/database/migrations/2021_04_21_154354_create_collecte_exceptions_table.php b/database/migrations/2021_04_21_154354_create_collecte_exceptions_table.php
new file mode 100644
index 0000000..b59ddeb
--- /dev/null
+++ b/database/migrations/2021_04_21_154354_create_collecte_exceptions_table.php
@@ -0,0 +1,33 @@
+id();
+ $table->date('date');
+ $table->string('comment')->nullable();
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('collecte_exceptions');
+ }
+}
diff --git a/public/b-o/js/app.js b/public/b-o/js/app.js
index fcfc411..4087838 100644
--- a/public/b-o/js/app.js
+++ b/public/b-o/js/app.js
@@ -12220,6 +12220,114 @@ __webpack_require__.r(__webpack_exports__);
/***/ }),
+/***/ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/CreneauxExceptions.vue?vue&type=script&lang=js&":
+/*!*****************************************************************************************************************************************************************************!*\
+ !*** ./node_modules/babel-loader/lib??ref--4-0!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/CreneauxExceptions.vue?vue&type=script&lang=js& ***!
+ \*****************************************************************************************************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+/* harmony default export */ __webpack_exports__["default"] = ({
+ mounted: function mounted() {
+ console.log('CreneauxExceptions Component mounted.');
+ this.datas = JSON.parse(this.dbdatas);
+ },
+ props: ['name', 'dbdatas'],
+ data: function data() {
+ return {
+ datas: [],
+ response: null,
+ processing: false
+ };
+ },
+ watch: {},
+ methods: {
+ newItem: function newItem() {
+ this.datas.push({
+ date: '',
+ comment: ''
+ });
+ },
+ removeItem: function removeItem(index) {
+ var _this = this;
+
+ if (this.datas[index]['id'] !== undefined) {
+ this.processing = true;
+ axios.post('/bo/ajax/delete-creneaux-exception', {
+ id: this.datas[index]['id']
+ }).then(function (response) {
+ _this.response = response.data;
+ _this.processing = false;
+ })["catch"](function (error) {
+ console.log(error);
+ alert('Erreur lors de la suppression.');
+ this.processing = false;
+ });
+ this.datas.splice(index, 1);
+ } else {
+ this.datas.splice(index, 1);
+ }
+ },
+ saveData: function saveData() {
+ var _this2 = this;
+
+ this.processing = true;
+ this.response = "En cours de sauvegarde...";
+ axios.post('/bo/ajax/save-creneaux-exception', {
+ collecte_exception: this.datas
+ }).then(function (response) {
+ _this2.datas = response.data;
+ _this2.response = "Sauvegarde terminée !";
+ _this2.processing = false;
+ })["catch"](function (error) {
+ console.log(error);
+ this.response = "Erreur lors de la sauvegarde.";
+ this.processing = false;
+ });
+ }
+ }
+});
+
+/***/ }),
+
/***/ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Faq.vue?vue&type=script&lang=js&":
/*!**************************************************************************************************************************************************************!*\
!*** ./node_modules/babel-loader/lib??ref--4-0!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/Faq.vue?vue&type=script&lang=js& ***!
@@ -16953,6 +17061,25 @@ exports.push([module.i, "\n", ""]);
// exports
+/***/ }),
+
+/***/ "./node_modules/css-loader/index.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/CreneauxExceptions.vue?vue&type=style&index=0&id=0a13eb26&scoped=true&lang=css&":
+/*!************************************************************************************************************************************************************************************************************************************************************************************************************!*\
+ !*** ./node_modules/css-loader??ref--7-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--7-2!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/CreneauxExceptions.vue?vue&type=style&index=0&id=0a13eb26&scoped=true&lang=css& ***!
+ \************************************************************************************************************************************************************************************************************************************************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
+// imports
+
+
+// module
+exports.push([module.i, "\n.fade-enter-active[data-v-0a13eb26], .fade-leave-active[data-v-0a13eb26] {\n transition: opacity .5s;\n}\n.fade-enter[data-v-0a13eb26], .fade-leave-to[data-v-0a13eb26] {\n opacity: 0;\n}\n", ""]);
+
+// exports
+
+
/***/ }),
/***/ "./node_modules/css-loader/index.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Faq.vue?vue&type=style&index=0&id=5546b00a&scoped=true&lang=css&":
@@ -48238,6 +48365,36 @@ var insertInto;
+var options = {"hmr":true}
+
+options.transform = transform
+options.insertInto = undefined;
+
+var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);
+
+if(content.locals) module.exports = content.locals;
+
+if(false) {}
+
+/***/ }),
+
+/***/ "./node_modules/style-loader/index.js!./node_modules/css-loader/index.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/CreneauxExceptions.vue?vue&type=style&index=0&id=0a13eb26&scoped=true&lang=css&":
+/*!****************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
+ !*** ./node_modules/style-loader!./node_modules/css-loader??ref--7-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--7-2!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/CreneauxExceptions.vue?vue&type=style&index=0&id=0a13eb26&scoped=true&lang=css& ***!
+ \****************************************************************************************************************************************************************************************************************************************************************************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+var content = __webpack_require__(/*! !../../../node_modules/css-loader??ref--7-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src??ref--7-2!../../../node_modules/vue-loader/lib??vue-loader-options!./CreneauxExceptions.vue?vue&type=style&index=0&id=0a13eb26&scoped=true&lang=css& */ "./node_modules/css-loader/index.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/CreneauxExceptions.vue?vue&type=style&index=0&id=0a13eb26&scoped=true&lang=css&");
+
+if(typeof content === 'string') content = [[module.i, content, '']];
+
+var transform;
+var insertInto;
+
+
+
var options = {"hmr":true}
options.transform = transform
@@ -50146,6 +50303,204 @@ render._withStripped = true
+/***/ }),
+
+/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/CreneauxExceptions.vue?vue&type=template&id=0a13eb26&scoped=true&":
+/*!*********************************************************************************************************************************************************************************************************************************!*\
+ !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/CreneauxExceptions.vue?vue&type=template&id=0a13eb26&scoped=true& ***!
+ \*********************************************************************************************************************************************************************************************************************************/
+/*! exports provided: render, staticRenderFns */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "render", function() { return render; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return staticRenderFns; });
+var render = function() {
+ var _vm = this
+ var _h = _vm.$createElement
+ var _c = _vm._self._c || _h
+ return _c("div", [
+ _c(
+ "div",
+ {
+ staticClass:
+ "d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom"
+ },
+ [
+ _vm._m(0),
+ _vm._v(" "),
+ _c("transition", { attrs: { name: "fade" } }, [
+ _c(
+ "span",
+ {
+ directives: [
+ {
+ name: "show",
+ rawName: "v-show",
+ value: _vm.processing,
+ expression: "processing"
+ }
+ ],
+ staticClass: "float-right text-success"
+ },
+ [_vm._v(_vm._s(_vm.response))]
+ )
+ ]),
+ _vm._v(" "),
+ _c(
+ "button",
+ {
+ staticClass: "btn btn-primary btn-sm text-white float-right",
+ attrs: { disabled: _vm.processing },
+ on: {
+ click: function($event) {
+ return _vm.saveData()
+ }
+ }
+ },
+ [
+ _vm._v("\n Sauvegarder les exceptions\n "),
+ _c(
+ "div",
+ {
+ directives: [
+ {
+ name: "show",
+ rawName: "v-show",
+ value: _vm.processing,
+ expression: "processing"
+ }
+ ],
+ staticClass: "spinner-border spinner-border-sm text-light",
+ attrs: { role: "status" }
+ },
+ [_c("span", { staticClass: "sr-only" }, [_vm._v("Loading...")])]
+ )
+ ]
+ )
+ ],
+ 1
+ ),
+ _vm._v(" "),
+ _c("table", { staticClass: "table table-bordered text-center" }, [
+ _vm._m(1),
+ _vm._v(" "),
+ _c(
+ "tbody",
+ _vm._l(_vm.datas, function(item, index) {
+ return _c("tr", { key: item.id }, [
+ _c("td", [
+ _c("input", {
+ directives: [
+ {
+ name: "model",
+ rawName: "v-model",
+ value: item.date,
+ expression: "item.date"
+ }
+ ],
+ staticClass: "form-control form-control-sm",
+ attrs: { type: "date", required: "" },
+ domProps: { value: item.date },
+ on: {
+ input: function($event) {
+ if ($event.target.composing) {
+ return
+ }
+ _vm.$set(item, "date", $event.target.value)
+ }
+ }
+ })
+ ]),
+ _vm._v(" "),
+ _c("td", [
+ _c("input", {
+ directives: [
+ {
+ name: "model",
+ rawName: "v-model",
+ value: item.comment,
+ expression: "item.comment"
+ }
+ ],
+ staticClass: "form-control form-control-sm",
+ attrs: { type: "text" },
+ domProps: { value: item.comment },
+ on: {
+ input: function($event) {
+ if ($event.target.composing) {
+ return
+ }
+ _vm.$set(item, "comment", $event.target.value)
+ }
+ }
+ })
+ ]),
+ _vm._v(" "),
+ _c("td", [
+ _c(
+ "button",
+ {
+ staticClass: "btn btn-danger btn-sm",
+ on: {
+ click: function($event) {
+ return _vm.removeItem(index)
+ }
+ }
+ },
+ [_vm._v("Supprimer")]
+ )
+ ])
+ ])
+ }),
+ 0
+ )
+ ]),
+ _vm._v(" "),
+ _c("div", { staticClass: "form-group text-right" }, [
+ _c(
+ "button",
+ {
+ staticClass: "btn btn-primary btn-sm text-white",
+ on: { click: _vm.newItem }
+ },
+ [_vm._v("Ajouter une date")]
+ )
+ ])
+ ])
+}
+var staticRenderFns = [
+ function() {
+ var _vm = this
+ var _h = _vm.$createElement
+ var _c = _vm._self._c || _h
+ return _c("h1", { staticClass: "h2" }, [
+ _vm._v("Jours Exception - "),
+ _c("small", { staticClass: "text-muted" }, [
+ _vm._v("Fermetures exceptionnelles")
+ ])
+ ])
+ },
+ function() {
+ var _vm = this
+ var _h = _vm.$createElement
+ var _c = _vm._self._c || _h
+ return _c("thead", [
+ _c("tr", [
+ _c("th", { attrs: { scope: "col" } }, [_vm._v("Jour")]),
+ _vm._v(" "),
+ _c("th", { attrs: { scope: "col" } }, [_vm._v("Commentaire")]),
+ _vm._v(" "),
+ _c("th", { attrs: { scope: "col" } })
+ ])
+ ])
+ }
+]
+render._withStripped = true
+
+
+
/***/ }),
/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Faq.vue?vue&type=template&id=5546b00a&scoped=true&":
@@ -62890,6 +63245,7 @@ Vue.component('product-card', __webpack_require__(/*! ./components/ProductCard.v
Vue.component('products-cards-dnd', __webpack_require__(/*! ./components/ProductsCardsDnd.vue */ "./resources/js/components/ProductsCardsDnd.vue")["default"]);
Vue.component('tags-input', _voerro_vue_tagsinput__WEBPACK_IMPORTED_MODULE_0__["default"]);
Vue.component('auto-complete-tags', __webpack_require__(/*! ./components/AutoCompleteTags.vue */ "./resources/js/components/AutoCompleteTags.vue")["default"]);
+Vue.component('creneaux-exceptions', __webpack_require__(/*! ./components/CreneauxExceptions.vue */ "./resources/js/components/CreneauxExceptions.vue")["default"]);
var app = new Vue({
el: '#app'
});
@@ -63025,6 +63381,93 @@ __webpack_require__.r(__webpack_exports__);
+/***/ }),
+
+/***/ "./resources/js/components/CreneauxExceptions.vue":
+/*!********************************************************!*\
+ !*** ./resources/js/components/CreneauxExceptions.vue ***!
+ \********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _CreneauxExceptions_vue_vue_type_template_id_0a13eb26_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CreneauxExceptions.vue?vue&type=template&id=0a13eb26&scoped=true& */ "./resources/js/components/CreneauxExceptions.vue?vue&type=template&id=0a13eb26&scoped=true&");
+/* harmony import */ var _CreneauxExceptions_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./CreneauxExceptions.vue?vue&type=script&lang=js& */ "./resources/js/components/CreneauxExceptions.vue?vue&type=script&lang=js&");
+/* empty/unused harmony star reexport *//* harmony import */ var _CreneauxExceptions_vue_vue_type_style_index_0_id_0a13eb26_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./CreneauxExceptions.vue?vue&type=style&index=0&id=0a13eb26&scoped=true&lang=css& */ "./resources/js/components/CreneauxExceptions.vue?vue&type=style&index=0&id=0a13eb26&scoped=true&lang=css&");
+/* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ "./node_modules/vue-loader/lib/runtime/componentNormalizer.js");
+
+
+
+
+
+
+/* normalize component */
+
+var component = Object(_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__["default"])(
+ _CreneauxExceptions_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__["default"],
+ _CreneauxExceptions_vue_vue_type_template_id_0a13eb26_scoped_true___WEBPACK_IMPORTED_MODULE_0__["render"],
+ _CreneauxExceptions_vue_vue_type_template_id_0a13eb26_scoped_true___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"],
+ false,
+ null,
+ "0a13eb26",
+ null
+
+)
+
+/* hot reload */
+if (false) { var api; }
+component.options.__file = "resources/js/components/CreneauxExceptions.vue"
+/* harmony default export */ __webpack_exports__["default"] = (component.exports);
+
+/***/ }),
+
+/***/ "./resources/js/components/CreneauxExceptions.vue?vue&type=script&lang=js&":
+/*!*********************************************************************************!*\
+ !*** ./resources/js/components/CreneauxExceptions.vue?vue&type=script&lang=js& ***!
+ \*********************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _node_modules_babel_loader_lib_index_js_ref_4_0_node_modules_vue_loader_lib_index_js_vue_loader_options_CreneauxExceptions_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/babel-loader/lib??ref--4-0!../../../node_modules/vue-loader/lib??vue-loader-options!./CreneauxExceptions.vue?vue&type=script&lang=js& */ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/CreneauxExceptions.vue?vue&type=script&lang=js&");
+/* empty/unused harmony star reexport */ /* harmony default export */ __webpack_exports__["default"] = (_node_modules_babel_loader_lib_index_js_ref_4_0_node_modules_vue_loader_lib_index_js_vue_loader_options_CreneauxExceptions_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__["default"]);
+
+/***/ }),
+
+/***/ "./resources/js/components/CreneauxExceptions.vue?vue&type=style&index=0&id=0a13eb26&scoped=true&lang=css&":
+/*!*****************************************************************************************************************!*\
+ !*** ./resources/js/components/CreneauxExceptions.vue?vue&type=style&index=0&id=0a13eb26&scoped=true&lang=css& ***!
+ \*****************************************************************************************************************/
+/*! no static exports found */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _node_modules_style_loader_index_js_node_modules_css_loader_index_js_ref_7_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_7_2_node_modules_vue_loader_lib_index_js_vue_loader_options_CreneauxExceptions_vue_vue_type_style_index_0_id_0a13eb26_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/style-loader!../../../node_modules/css-loader??ref--7-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src??ref--7-2!../../../node_modules/vue-loader/lib??vue-loader-options!./CreneauxExceptions.vue?vue&type=style&index=0&id=0a13eb26&scoped=true&lang=css& */ "./node_modules/style-loader/index.js!./node_modules/css-loader/index.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/CreneauxExceptions.vue?vue&type=style&index=0&id=0a13eb26&scoped=true&lang=css&");
+/* harmony import */ var _node_modules_style_loader_index_js_node_modules_css_loader_index_js_ref_7_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_7_2_node_modules_vue_loader_lib_index_js_vue_loader_options_CreneauxExceptions_vue_vue_type_style_index_0_id_0a13eb26_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_index_js_node_modules_css_loader_index_js_ref_7_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_7_2_node_modules_vue_loader_lib_index_js_vue_loader_options_CreneauxExceptions_vue_vue_type_style_index_0_id_0a13eb26_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__);
+/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _node_modules_style_loader_index_js_node_modules_css_loader_index_js_ref_7_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_7_2_node_modules_vue_loader_lib_index_js_vue_loader_options_CreneauxExceptions_vue_vue_type_style_index_0_id_0a13eb26_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__) if(["default"].indexOf(__WEBPACK_IMPORT_KEY__) < 0) (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _node_modules_style_loader_index_js_node_modules_css_loader_index_js_ref_7_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_7_2_node_modules_vue_loader_lib_index_js_vue_loader_options_CreneauxExceptions_vue_vue_type_style_index_0_id_0a13eb26_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__[key]; }) }(__WEBPACK_IMPORT_KEY__));
+
+
+/***/ }),
+
+/***/ "./resources/js/components/CreneauxExceptions.vue?vue&type=template&id=0a13eb26&scoped=true&":
+/*!***************************************************************************************************!*\
+ !*** ./resources/js/components/CreneauxExceptions.vue?vue&type=template&id=0a13eb26&scoped=true& ***!
+ \***************************************************************************************************/
+/*! exports provided: render, staticRenderFns */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_CreneauxExceptions_vue_vue_type_template_id_0a13eb26_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../node_modules/vue-loader/lib??vue-loader-options!./CreneauxExceptions.vue?vue&type=template&id=0a13eb26&scoped=true& */ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/CreneauxExceptions.vue?vue&type=template&id=0a13eb26&scoped=true&");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "render", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_CreneauxExceptions_vue_vue_type_template_id_0a13eb26_scoped_true___WEBPACK_IMPORTED_MODULE_0__["render"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_CreneauxExceptions_vue_vue_type_template_id_0a13eb26_scoped_true___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"]; });
+
+
+
/***/ }),
/***/ "./resources/js/components/Faq.vue":
diff --git a/resources/js/app.js b/resources/js/app.js
index de75fee..b056efb 100644
--- a/resources/js/app.js
+++ b/resources/js/app.js
@@ -13,6 +13,7 @@ Vue.component('product-card', require('./components/ProductCard.vue').default);
Vue.component('products-cards-dnd', require('./components/ProductsCardsDnd.vue').default);
Vue.component('tags-input', VoerroTagsInput);
Vue.component('auto-complete-tags', require('./components/AutoCompleteTags.vue').default);
+Vue.component('creneaux-exceptions', require('./components/CreneauxExceptions.vue').default);
const app = new Vue({
el: '#app',
diff --git a/resources/js/components/CreneauxExceptions.vue b/resources/js/components/CreneauxExceptions.vue
new file mode 100644
index 0000000..7e2b854
--- /dev/null
+++ b/resources/js/components/CreneauxExceptions.vue
@@ -0,0 +1,112 @@
+
+ Jours Exception - Fermetures exceptionnelles
+
+
+
+
+
+
+
+ Jour
+ Commentaire
+
+
+
+
+
+
+
+