Browse code

Do not show negative behaelter values

Benjamin Roth authored on11/09/2023 10:43:36
Showing1 changed files
... ...
@@ -167,7 +167,7 @@ class SlotAjaxController extends AbstractController
167 167
             $arrLage = array_combine($Lage->fetchEach('id'),$Lage->fetchEach('title'));
168 168
         }
169 169
 
170
-        $intAvailableBehaelter = $Slot->getAvailableBehaelter();
170
+        $intAvailableBehaelter = max(0,$Slot->getAvailableBehaelter());
171 171
 
172 172
         $arrData = [
173 173
             'modal' => $blnModal,
... ...
@@ -237,7 +237,7 @@ class SlotAjaxController extends AbstractController
237 237
             $arrLage = $Lage->fetchEach('title');
238 238
         }
239 239
 
240
-        $intAvailableBehaelter = $Slot->getAvailableBehaelter();
240
+        $intAvailableBehaelter = max(0,$Slot->getAvailableBehaelter());
241 241
 
242 242
         $arrData = [
243 243
             'modal' => $blnModal,
... ...
@@ -366,7 +366,7 @@ class SlotAjaxController extends AbstractController
366 366
             $arrLagenBooked = explode(',', $Booking->lage);
367 367
         }
368 368
 
369
-        $intAvailableBehaelter = $Slot->getAvailableBehaelter();
369
+        $intAvailableBehaelter = max(0,$Slot->getAvailableBehaelter());
370 370
 
371 371
         $arrData = array_merge($arrData,[
372 372
             'modal' => $blnModal,
Browse code

Update

Benjamin Roth authored on31/08/2023 16:56:18
Showing1 changed files
... ...
@@ -173,7 +173,7 @@ class SlotAjaxController extends AbstractController
173 173
             'modal' => $blnModal,
174 174
             'id'       => $Slot->id,
175 175
             'slot'     => array_merge($Slot->row(),[
176
-                'anmerkungen' => $insertTagService->replace($Slot->anmerkungen),
176
+                'anmerkungen' => $insertTagService->replace($Slot->anmerkungen ?? ''),
177 177
                 'sorte' => $arrSorten,
178 178
                 'behaelterAvailable' => $intAvailableBehaelter
179 179
             ]),
... ...
@@ -243,7 +243,7 @@ class SlotAjaxController extends AbstractController
243 243
             'modal' => $blnModal,
244 244
             'id'       => $Slot->id,
245 245
             'slot'     => array_merge($Slot->row(),[
246
-                'anmerkungen' => $insertTagService->replace($Slot->anmerkungen),
246
+                'anmerkungen' => $insertTagService->replace($Slot->anmerkungen ?? ''),
247 247
                 'sorte' => $arrSorten,
248 248
                 'behaelterAvailable' => $intAvailableBehaelter
249 249
             ]),
... ...
@@ -372,7 +372,7 @@ class SlotAjaxController extends AbstractController
372 372
             'modal' => $blnModal,
373 373
             'id'       => $Booking->id,
374 374
             'slot'     => array_merge($Slot->row(),[
375
-                'anmerkungen' => $insertTagService->replace($Slot->anmerkungen),
375
+                'anmerkungen' => $insertTagService->replace($Slot->anmerkungen ?? ''),
376 376
                 'sorte' => $arrSortenAvailable,
377 377
                 'behaelterAvailable' => $intAvailableBehaelter,
378 378
             ]),
Browse code

Update

Benjamin Roth authored on31/08/2023 14:17:19
Showing1 changed files
... ...
@@ -449,7 +449,7 @@ class SlotAjaxController extends AbstractController
449 449
 
450 450
         if (count($arrError))
451 451
         {
452
-            return $this->renderDetails(false,'<div class="toast toast--danger mx-0">Bitte geben Sie alle Pflichtangaben (mit * marierte Felder) an</div>');
452
+            return $this->renderDetails(false,'<div class="toast toast--danger mx-0">Bitte geben Sie alle Pflichtangaben (mit * markierte Felder) an</div>');
453 453
         }
454 454
 
455 455
         $arrSorten = [];
... ...
@@ -548,7 +548,7 @@ class SlotAjaxController extends AbstractController
548 548
 
549 549
         if (count($arrError))
550 550
         {
551
-            return $this->renderBooking(false,'<div class="toast toast--danger mx-0">Bitte geben Sie alle Pflichtangaben (mit * marierte Felder) an</div>');
551
+            return $this->renderBooking(false,'<div class="toast toast--danger mx-0">Bitte geben Sie alle Pflichtangaben (mit * markierte Felder) an</div>');
552 552
         }
553 553
 
554 554
         $arrSorten = [];
Browse code

Update

Benjamin Roth authored on31/08/2023 14:16:35
Showing1 changed files
... ...
@@ -439,7 +439,7 @@ class SlotAjaxController extends AbstractController
439 439
             }
440 440
         }
441 441
         $arrError = [];
442
-        foreach (['behaelter','sorten','ernteart'] as $field)
442
+        foreach (['behaelter','sorten','ernteart','lage'] as $field)
443 443
         {
444 444
             if (empty(Input::post($field)))
445 445
             {
... ...
@@ -538,7 +538,7 @@ class SlotAjaxController extends AbstractController
538 538
             }
539 539
         }
540 540
         $arrError = [];
541
-        foreach (['behaelter','sorten','ernteart'] as $field)
541
+        foreach (['behaelter','sorten','ernteart','lage'] as $field)
542 542
         {
543 543
             if (empty(Input::post($field)))
544 544
             {
Browse code

Update

Benjamin Roth authored on31/08/2023 14:09:27
Showing1 changed files
... ...
@@ -100,6 +100,8 @@ class SlotAjaxController extends AbstractController
100 100
 
101 101
     protected function renderDetails(bool $blnModal=true,string $error=null)
102 102
     {
103
+        $insertTagService = Controller::getContainer()->get('contao.insert_tag.parser');
104
+
103 105
         if (empty($_REQUEST['id']))
104 106
         {
105 107
             return new Response('Required parameter missing',412);
... ...
@@ -171,6 +173,7 @@ class SlotAjaxController extends AbstractController
171 173
             'modal' => $blnModal,
172 174
             'id'       => $Slot->id,
173 175
             'slot'     => array_merge($Slot->row(),[
176
+                'anmerkungen' => $insertTagService->replace($Slot->anmerkungen),
174 177
                 'sorte' => $arrSorten,
175 178
                 'behaelterAvailable' => $intAvailableBehaelter
176 179
             ]),
... ...
@@ -197,6 +200,8 @@ class SlotAjaxController extends AbstractController
197 200
 
198 201
     protected function renderAnnotation(bool $blnModal=true,string $error=null)
199 202
     {
203
+        $insertTagService = Controller::getContainer()->get('contao.insert_tag.parser');
204
+
200 205
         if (empty($_REQUEST['id']))
201 206
         {
202 207
             return new Response('Required parameter missing',412);
... ...
@@ -238,6 +243,7 @@ class SlotAjaxController extends AbstractController
238 243
             'modal' => $blnModal,
239 244
             'id'       => $Slot->id,
240 245
             'slot'     => array_merge($Slot->row(),[
246
+                'anmerkungen' => $insertTagService->replace($Slot->anmerkungen),
241 247
                 'sorte' => $arrSorten,
242 248
                 'behaelterAvailable' => $intAvailableBehaelter
243 249
             ]),
... ...
@@ -256,6 +262,8 @@ class SlotAjaxController extends AbstractController
256 262
 
257 263
     protected function renderBooking(bool $blnModal=true,string $error=null)
258 264
     {
265
+        $insertTagService = Controller::getContainer()->get('contao.insert_tag.parser');
266
+
259 267
         $arrData = [];
260 268
 
261 269
         if (empty($_REQUEST['id']))
... ...
@@ -364,6 +372,7 @@ class SlotAjaxController extends AbstractController
364 372
             'modal' => $blnModal,
365 373
             'id'       => $Booking->id,
366 374
             'slot'     => array_merge($Slot->row(),[
375
+                'anmerkungen' => $insertTagService->replace($Slot->anmerkungen),
367 376
                 'sorte' => $arrSortenAvailable,
368 377
                 'behaelterAvailable' => $intAvailableBehaelter,
369 378
             ]),
Browse code

Update

Benjamin Roth authored on30/08/2023 22:08:09
Showing1 changed files
... ...
@@ -31,6 +31,7 @@ use Symfony\Component\HttpFoundation\Request;
31 31
 use Symfony\Component\HttpFoundation\Response;
32 32
 use Symfony\Component\Routing\Annotation\Route;
33 33
 use Symfony\Contracts\Translation\TranslatorInterface;
34
+use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungLageModel;
34 35
 use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungLeseartModel;
35 36
 use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungRebsorteModel;
36 37
 use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungReservationModel;
... ...
@@ -154,10 +155,16 @@ class SlotAjaxController extends AbstractController
154 155
         {
155 156
             foreach (explode(',', $Slot->ernteart) as $ernteart)
156 157
             {
157
-                $arrErnteart[] = $GLOBALS['TL_LANG']['REF']['wa_ernteart'][$ernteart] ?? $ernteart;
158
+                $arrErnteart[$ernteart] = $GLOBALS['TL_LANG']['REF']['wa_ernteart'][$ernteart] ?? $ernteart;
158 159
             }
159 160
         }
160 161
 
162
+        $arrLage = [];
163
+        if (($Lage = $Slot->getRelated('lage')) !== null)
164
+        {
165
+            $arrLage = array_combine($Lage->fetchEach('id'),$Lage->fetchEach('title'));
166
+        }
167
+
161 168
         $intAvailableBehaelter = $Slot->getAvailableBehaelter();
162 169
 
163 170
         $arrData = [
... ...
@@ -168,12 +175,14 @@ class SlotAjaxController extends AbstractController
168 175
                 'behaelterAvailable' => $intAvailableBehaelter
169 176
             ]),
170 177
             'standort' => $Slot->getRelated('pid'),
171
-            'lage' => $Slot->getRelated('lage'),
178
+            'lage' => $arrLage,
172 179
             'ernteart' => $arrErnteart,
173 180
             'buchen' => [
174 181
                 'buchbar' => (boolean) $intAvailableBehaelter,
175 182
                 'behaelter' => range(min($intAvailableBehaelter,1),$intAvailableBehaelter),
176
-                'sorten' => $arrSorten
183
+                'sorten' => $arrSorten,
184
+                'lage' => $arrLage,
185
+                'ernteart' => $arrErnteart,
177 186
             ],
178 187
             'reservations' => $arrReservations
179 188
         ];
... ...
@@ -217,6 +226,12 @@ class SlotAjaxController extends AbstractController
217 226
             }
218 227
         }
219 228
 
229
+        $arrLage = [];
230
+        if (($Lage = $Slot->getRelated('lage')) !== null)
231
+        {
232
+            $arrLage = $Lage->fetchEach('title');
233
+        }
234
+
220 235
         $intAvailableBehaelter = $Slot->getAvailableBehaelter();
221 236
 
222 237
         $arrData = [
... ...
@@ -227,7 +242,7 @@ class SlotAjaxController extends AbstractController
227 242
                 'behaelterAvailable' => $intAvailableBehaelter
228 243
             ]),
229 244
             'standort' => $Slot->getRelated('pid'),
230
-            'lage' => $Slot->getRelated('lage'),
245
+            'lage' => $arrLage,
231 246
             'ernteart' => $arrErnteart,
232 247
             'buchen' => [
233 248
                 'buchbar' => (boolean) $intAvailableBehaelter,
... ...
@@ -239,7 +254,7 @@ class SlotAjaxController extends AbstractController
239 254
         return $this->render('@Contao/modal_slot_annotation.html.twig',$arrData);
240 255
     }
241 256
 
242
-    protected function renderBooking(bool $blnModal=true)
257
+    protected function renderBooking(bool $blnModal=true,string $error=null)
243 258
     {
244 259
         $arrData = [];
245 260
 
... ...
@@ -315,6 +330,34 @@ class SlotAjaxController extends AbstractController
315 330
             $arrSortenBooked[$objSorte->id.','.$objLeseart->id] = ($objSorte !== null  ? $objSorte->title : '') . ' ' . ($objLeseart !== null  ? $objLeseart->title : '');
316 331
         }
317 332
 
333
+        $arrErnteartAvailable = [];
334
+        if ($Slot->ernteart !== null)
335
+        {
336
+            foreach (explode(',', $Slot->ernteart) as $ernteart)
337
+            {
338
+                $arrErnteartAvailable[$ernteart] = $GLOBALS['TL_LANG']['REF']['wa_ernteart'][$ernteart] ?? $ernteart;
339
+            }
340
+        }
341
+        $arrErnteartBooked = [];
342
+        if ($Booking->ernteart !== null)
343
+        {
344
+            $arrErnteartBooked = explode(',', $Booking->ernteart);
345
+        }
346
+
347
+        $arrLagenAvailable = [];
348
+        if (($Lagen = $Slot->getRelated('lage')) !== null)
349
+        {
350
+            foreach ($Lagen as $lage)
351
+            {
352
+                $arrLagenAvailable[$lage->id] = $lage->title;
353
+            }
354
+        }
355
+        $arrLagenBooked = [];
356
+        if ($Booking->lage !== null)
357
+        {
358
+            $arrLagenBooked = explode(',', $Booking->lage);
359
+        }
360
+
318 361
         $intAvailableBehaelter = $Slot->getAvailableBehaelter();
319 362
 
320 363
         $arrData = array_merge($arrData,[
... ...
@@ -322,19 +365,28 @@ class SlotAjaxController extends AbstractController
322 365
             'id'       => $Booking->id,
323 366
             'slot'     => array_merge($Slot->row(),[
324 367
                 'sorte' => $arrSortenAvailable,
325
-                'behaelterAvailable' => $intAvailableBehaelter
368
+                'behaelterAvailable' => $intAvailableBehaelter,
326 369
             ]),
327 370
             'buchung' => array_merge($Booking->row(),[
328
-                'sorten' => $arrSortenBooked
371
+                'sorten' => $arrSortenBooked,
372
+                'ernteart' => $arrErnteartBooked,
373
+                'lage' => $arrLagenBooked,
329 374
             ]),
330 375
             'standort' => $Slot->getRelated('pid'),
331 376
             'buchen' => [
332 377
                 'buchbar' => (boolean) $intAvailableBehaelter,
333 378
                 'behaelter' => range(min($intAvailableBehaelter,1),$intAvailableBehaelter+$Booking->behaelter),
334
-                'sorten' => $arrSortenAvailable
379
+                'sorten' => $arrSortenAvailable,
380
+                'ernteart' => $arrErnteartAvailable,
381
+                'lage' => $arrLagenAvailable,
335 382
             ]
336 383
         ]);
337 384
 
385
+        if (!empty($error))
386
+        {
387
+            $arrData['toast'] = $error;
388
+        }
389
+
338 390
         return $this->render('@Contao/modal_booking_details.html.twig',$arrData);
339 391
     }
340 392
 
... ...
@@ -364,11 +416,33 @@ class SlotAjaxController extends AbstractController
364 416
             }
365 417
         }
366 418
 
367
-        if (empty($_REQUEST['id']) || empty(Input::post('behaelter')) || empty(Input::post('sorten')))
419
+        if (empty($_REQUEST['id']))
368 420
         {
369 421
             return new Response('Missing parameter',412);
370 422
         }
371 423
 
424
+        // Form validation
425
+        if (($Slot = WeinanlieferungSlotsModel::findByPk($_REQUEST['id'])) !== null)
426
+        {
427
+            if (Input::post('behaelter') > $Slot->getAvailableBehaelter())
428
+            {
429
+                return $this->renderDetails(false,sprintf('<div class="toast toast--danger mx-0">Fehler: Es sind mittlerweile nur noch %s Behälter verfügbar.</div>',$Slot->getAvailableBehaelter()));
430
+            }
431
+        }
432
+        $arrError = [];
433
+        foreach (['behaelter','sorten','ernteart'] as $field)
434
+        {
435
+            if (empty(Input::post($field)))
436
+            {
437
+                $arrError = [$field];
438
+            }
439
+        }
440
+
441
+        if (count($arrError))
442
+        {
443
+            return $this->renderDetails(false,'<div class="toast toast--danger mx-0">Bitte geben Sie alle Pflichtangaben (mit * marierte Felder) an</div>');
444
+        }
445
+
372 446
         $arrSorten = [];
373 447
         if (!is_array(Input::post('sorten')))
374 448
         {
... ...
@@ -377,13 +451,31 @@ class SlotAjaxController extends AbstractController
377 451
             $arrSorten = implode(';', Input::post('sorten'));
378 452
         }
379 453
 
454
+        $arrErnteart = [];
455
+        if (!is_array(Input::post('ernteart')))
456
+        {
457
+            $arrErnteart[] = Input::post('ernteart');
458
+        } else {
459
+            $arrErnteart = implode(',', Input::post('ernteart'));
460
+        }
461
+
462
+        $arrLage = [];
463
+        if (!is_array(Input::post('lage')))
464
+        {
465
+            $arrLage[] = Input::post('lage');
466
+        } else {
467
+            $arrLage = implode(',', Input::post('lage'));
468
+        }
469
+
380 470
         $Reservation = new WeinanlieferungReservationModel();
381 471
         $arrData = array_merge($arrData,[
382 472
             'pid' => $_REQUEST['id'],
383 473
             'tstamp' => time(),
384 474
             'uid' => FrontendUser::getInstance()->id,
385 475
             'behaelter' => Input::post('behaelter'),
386
-            'sorten' => $arrSorten
476
+            'sorten' => $arrSorten,
477
+            'ernteart' => $arrErnteart,
478
+            'lage' => $arrLage
387 479
         ]);
388 480
         $Reservation->setRow($arrData);
389 481
 
... ...
@@ -397,7 +489,7 @@ class SlotAjaxController extends AbstractController
397 489
     {
398 490
         Controller::loadDataContainer('tl_vr_wa_reservation');
399 491
 
400
-        if (empty($_REQUEST['id']) || empty(Input::post('behaelter')) || empty(Input::post('sorten')))
492
+        if (empty($_REQUEST['id']))
401 493
         {
402 494
             return new Response('Missing parameter',412);
403 495
         }
... ...
@@ -418,7 +510,7 @@ class SlotAjaxController extends AbstractController
418 510
 
419 511
             if ($File->hasErrors())
420 512
             {
421
-                return $this->renderDetails(false,'<div class="toast toast--danger mx-0">' . $File->getErrorAsHTML() . '</div>');
513
+                return $this->renderBooking(false,'<div class="toast toast--danger mx-0">' . $File->getErrorAsHTML() . '</div>');
422 514
             }
423 515
 
424 516
             if (!empty($_SESSION['FILES'][$File->name]))
... ...
@@ -428,6 +520,28 @@ class SlotAjaxController extends AbstractController
428 520
             }
429 521
         }
430 522
 
523
+        // Form validation
524
+        if (($Slot = $Reservation->getRelated('pid')) !== null)
525
+        {
526
+            if (Input::post('behaelter') > $Slot->getAvailableBehaelter()+$Reservation->behaelter)
527
+            {
528
+                return $this->renderBooking(false,sprintf('<div class="toast toast--danger mx-0">Fehler: Es sind mittlerweile nur noch %s Behälter verfügbar.</div>',$Slot->getAvailableBehaelter()+$Reservation->behaelter));
529
+            }
530
+        }
531
+        $arrError = [];
532
+        foreach (['behaelter','sorten','ernteart'] as $field)
533
+        {
534
+            if (empty(Input::post($field)))
535
+            {
536
+                $arrError = [$field];
537
+            }
538
+        }
539
+
540
+        if (count($arrError))
541
+        {
542
+            return $this->renderBooking(false,'<div class="toast toast--danger mx-0">Bitte geben Sie alle Pflichtangaben (mit * marierte Felder) an</div>');
543
+        }
544
+
431 545
         $arrSorten = [];
432 546
         if (!is_array(Input::post('sorten')))
433 547
         {
... ...
@@ -436,9 +550,27 @@ class SlotAjaxController extends AbstractController
436 550
             $arrSorten = implode(';', Input::post('sorten'));
437 551
         }
438 552
 
553
+        $arrErnteart = [];
554
+        if (!is_array(Input::post('ernteart')))
555
+        {
556
+            $arrErnteart[] = Input::post('ernteart');
557
+        } else {
558
+            $arrErnteart = implode(',', Input::post('ernteart'));
559
+        }
560
+
561
+        $arrLage = [];
562
+        if (!is_array(Input::post('lage')))
563
+        {
564
+            $arrLage[] = Input::post('lage');
565
+        } else {
566
+            $arrLage = implode(',', Input::post('lage'));
567
+        }
568
+
439 569
         $Reservation->tstamp = time();
440 570
         $Reservation->behaelter = Input::post('behaelter');
441 571
         $Reservation->sorten = $arrSorten;
572
+        $Reservation->ernteart = $arrErnteart;
573
+        $Reservation->lage = $arrLage;
442 574
 
443 575
         $Reservation->save();
444 576
 
Browse code

Lot's of changes and improvements

Benjamin Roth authored on30/08/2023 17:18:43
Showing1 changed files
... ...
@@ -149,6 +149,15 @@ class SlotAjaxController extends AbstractController
149 149
             $arrSorten = array_combine($Sorten->fetchEach('id'),$Sorten->fetchEach('title'));
150 150
         }*/
151 151
 
152
+        $arrErnteart = [];
153
+        if ($Slot->ernteart !== null)
154
+        {
155
+            foreach (explode(',', $Slot->ernteart) as $ernteart)
156
+            {
157
+                $arrErnteart[] = $GLOBALS['TL_LANG']['REF']['wa_ernteart'][$ernteart] ?? $ernteart;
158
+            }
159
+        }
160
+
152 161
         $intAvailableBehaelter = $Slot->getAvailableBehaelter();
153 162
 
154 163
         $arrData = [
... ...
@@ -159,6 +168,8 @@ class SlotAjaxController extends AbstractController
159 168
                 'behaelterAvailable' => $intAvailableBehaelter
160 169
             ]),
161 170
             'standort' => $Slot->getRelated('pid'),
171
+            'lage' => $Slot->getRelated('lage'),
172
+            'ernteart' => $arrErnteart,
162 173
             'buchen' => [
163 174
                 'buchbar' => (boolean) $intAvailableBehaelter,
164 175
                 'behaelter' => range(min($intAvailableBehaelter,1),$intAvailableBehaelter),
... ...
@@ -197,6 +208,15 @@ class SlotAjaxController extends AbstractController
197 208
             $arrSorten[$objSorte->id.','.$objLeseart->id] = ($objSorte !== null  ? $objSorte->title : '') . ' ' . ($objLeseart !== null  ? $objLeseart->title : '');
198 209
         }
199 210
 
211
+        $arrErnteart = [];
212
+        if ($Slot->ernteart !== null)
213
+        {
214
+            foreach (explode(',', $Slot->ernteart) as $ernteart)
215
+            {
216
+                $arrErnteart[] = $GLOBALS['TL_LANG']['REF']['wa_ernteart'][$ernteart] ?? $ernteart;
217
+            }
218
+        }
219
+
200 220
         $intAvailableBehaelter = $Slot->getAvailableBehaelter();
201 221
 
202 222
         $arrData = [
... ...
@@ -207,6 +227,8 @@ class SlotAjaxController extends AbstractController
207 227
                 'behaelterAvailable' => $intAvailableBehaelter
208 228
             ]),
209 229
             'standort' => $Slot->getRelated('pid'),
230
+            'lage' => $Slot->getRelated('lage'),
231
+            'ernteart' => $arrErnteart,
210 232
             'buchen' => [
211 233
                 'buchbar' => (boolean) $intAvailableBehaelter,
212 234
                 'behaelter' => range(min($intAvailableBehaelter,1),$intAvailableBehaelter),
Browse code

Lot's of changes and improvements

Benjamin Roth authored on29/08/2023 15:05:02
Showing1 changed files
... ...
@@ -78,6 +78,9 @@ class SlotAjaxController extends AbstractController
78 78
             case 'details':
79 79
                 return $this->renderDetails($blnModal);
80 80
 
81
+            case 'annotation':
82
+                return $this->renderAnnotation($blnModal);
83
+
81 84
             case 'booking':
82 85
                 return $this->renderBooking($blnModal);
83 86
 
... ...
@@ -172,6 +175,48 @@ class SlotAjaxController extends AbstractController
172 175
         return $this->render('@Contao/modal_slot_details.html.twig',$arrData);
173 176
     }
174 177
 
178
+    protected function renderAnnotation(bool $blnModal=true,string $error=null)
179
+    {
180
+        if (empty($_REQUEST['id']))
181
+        {
182
+            return new Response('Required parameter missing',412);
183
+        }
184
+
185
+        if (($Slot = WeinanlieferungSlotsModel::findPublishedById($_REQUEST['id'])) === null)
186
+        {
187
+            return new Response('Could not load slot data',500);
188
+        }
189
+
190
+        // Build data
191
+        $arrSorten = [];
192
+        $Sorten = StringUtil::deserialize($Slot->sorten,true);
193
+        foreach($Sorten as $sorte)
194
+        {
195
+            $objSorte = WeinanlieferungRebsorteModel::findByPk($sorte['sorte']);
196
+            $objLeseart = WeinanlieferungLeseartModel::findByPk($sorte['leseart']);
197
+            $arrSorten[$objSorte->id.','.$objLeseart->id] = ($objSorte !== null  ? $objSorte->title : '') . ' ' . ($objLeseart !== null  ? $objLeseart->title : '');
198
+        }
199
+
200
+        $intAvailableBehaelter = $Slot->getAvailableBehaelter();
201
+
202
+        $arrData = [
203
+            'modal' => $blnModal,
204
+            'id'       => $Slot->id,
205
+            'slot'     => array_merge($Slot->row(),[
206
+                'sorte' => $arrSorten,
207
+                'behaelterAvailable' => $intAvailableBehaelter
208
+            ]),
209
+            'standort' => $Slot->getRelated('pid'),
210
+            'buchen' => [
211
+                'buchbar' => (boolean) $intAvailableBehaelter,
212
+                'behaelter' => range(min($intAvailableBehaelter,1),$intAvailableBehaelter),
213
+                'sorten' => $arrSorten
214
+            ],
215
+        ];
216
+
217
+        return $this->render('@Contao/modal_slot_annotation.html.twig',$arrData);
218
+    }
219
+
175 220
     protected function renderBooking(bool $blnModal=true)
176 221
     {
177 222
         $arrData = [];
Browse code

Update

Benjamin Roth authored on17/08/2023 00:07:19
Showing1 changed files
... ...
@@ -313,7 +313,6 @@ class SlotAjaxController extends AbstractController
313 313
         $Reservation = new WeinanlieferungReservationModel();
314 314
         $arrData = array_merge($arrData,[
315 315
             'pid' => $_REQUEST['id'],
316
-            'rootid' => $rootPage !== null ? $rootPage->id : '',
317 316
             'tstamp' => time(),
318 317
             'uid' => FrontendUser::getInstance()->id,
319 318
             'behaelter' => Input::post('behaelter'),
Browse code

Update

Benjamin Roth authored on15/08/2023 18:18:52
Showing1 changed files
... ...
@@ -290,8 +290,11 @@ class SlotAjaxController extends AbstractController
290 290
                 return $this->renderDetails(false,'<div class="toast toast--danger mx-0">' . $File->getErrorAsHTML() . '</div>');
291 291
             }
292 292
 
293
-            $arrData['filename'] = $_SESSION['FILES'][$File->name]['name'] ?? '';
294
-            $arrData['upload'] = $_SESSION['FILES'][$File->name]['uuid'] ? StringUtil::uuidToBin($_SESSION['FILES'][$File->name]['uuid']) : null;
293
+            if (!empty($_SESSION['FILES'][$File->name]))
294
+            {
295
+                $arrData['filename'] = $_SESSION['FILES'][$File->name]['name'] ?? '';
296
+                $arrData['upload'] = $_SESSION['FILES'][$File->name]['uuid'] ? StringUtil::uuidToBin($_SESSION['FILES'][$File->name]['uuid']) : null;
297
+            }
295 298
         }
296 299
 
297 300
         if (empty($_REQUEST['id']) || empty(Input::post('behaelter')) || empty(Input::post('sorten')))
... ...
@@ -352,8 +355,11 @@ class SlotAjaxController extends AbstractController
352 355
                 return $this->renderDetails(false,'<div class="toast toast--danger mx-0">' . $File->getErrorAsHTML() . '</div>');
353 356
             }
354 357
 
355
-            $Reservation->filename = $_SESSION['FILES'][$File->name]['name'] ?? '';
356
-            $Reservation->upload = $_SESSION['FILES'][$File->name]['uuid'] ? StringUtil::uuidToBin($_SESSION['FILES'][$File->name]['uuid']) : null;
358
+            if (!empty($_SESSION['FILES'][$File->name]))
359
+            {
360
+                $Reservation->filename = $_SESSION['FILES'][$File->name]['name'] ?? '';
361
+                $Reservation->upload = $_SESSION['FILES'][$File->name]['uuid'] ? StringUtil::uuidToBin($_SESSION['FILES'][$File->name]['uuid']) : null;
362
+            }
357 363
         }
358 364
 
359 365
         $arrSorten = [];
... ...
@@ -361,7 +367,7 @@ class SlotAjaxController extends AbstractController
361 367
         {
362 368
             $arrSorten[] = Input::post('sorten');
363 369
         } else {
364
-            $arrSorten = implode(',', Input::post('sorten'));
370
+            $arrSorten = implode(';', Input::post('sorten'));
365 371
         }
366 372
 
367 373
         $Reservation->tstamp = time();
Browse code

Update

Benjamin Roth authored on15/08/2023 17:55:14
Showing1 changed files
... ...
@@ -14,8 +14,12 @@ namespace vonRotenberg\WeinanlieferungBundle\Controller\Frontend\Ajax;
14 14
 
15 15
 use Contao\Controller;
16 16
 use Contao\CoreBundle\Controller\AbstractController;
17
+use Contao\CoreBundle\Exception\PageNotFoundException;
17 18
 use Contao\CoreBundle\Framework\ContaoFramework;
18 19
 use Contao\CoreBundle\Security\Authentication\Token\TokenChecker;
20
+use Contao\Environment;
21
+use Contao\File;
22
+use Contao\FilesModel;
19 23
 use Contao\FormFileUpload;
20 24
 use Contao\Frontend;
21 25
 use Contao\FrontendUser;
... ...
@@ -170,6 +174,8 @@ class SlotAjaxController extends AbstractController
170 174
 
171 175
     protected function renderBooking(bool $blnModal=true)
172 176
     {
177
+        $arrData = [];
178
+
173 179
         if (empty($_REQUEST['id']))
174 180
         {
175 181
             return new Response('Required parameter missing',412);
... ...
@@ -181,6 +187,49 @@ class SlotAjaxController extends AbstractController
181 187
             return new Response('Could not load booking data',500);
182 188
         }
183 189
 
190
+        $objFile = FilesModel::findByUuid($Booking->upload);
191
+
192
+        if (!empty($_REQUEST['deleteFile']) && $_REQUEST['deleteFile'] && $objFile !== null)
193
+        {
194
+            $File = new File($objFile->path);
195
+            if ($File->delete())
196
+            {
197
+                $objFile->delete();
198
+                $objFile = null;
199
+            }
200
+        }
201
+
202
+        if (!empty($Booking->upload) && $objFile !== null)
203
+        {
204
+            $File = new File($objFile->path);
205
+            $strHref = Environment::get('request');
206
+
207
+            // Remove an existing file parameter (see #5683)
208
+            if (isset($_GET['file']))
209
+            {
210
+                $strHref = preg_replace('/(&(amp;)?|\?)file=[^&]+/', '', $strHref);
211
+            }
212
+
213
+            $strHref .= (strpos($strHref, '?') !== false ? '&amp;' : '?') . 'file=' . System::urlEncode($File->value);
214
+
215
+            $arrData['file'] = [
216
+                'link' => $strHref,
217
+                'filename' => $File->filename,
218
+                'extension' => $File->extension,
219
+                'name' => $File->name,
220
+                'path' => $File->dirname
221
+            ];
222
+        }
223
+
224
+        // Send the file to the browser (see #4632 and #8375)
225
+        if ($objFile !== null && ($file = Input::get('file', true)))
226
+        {
227
+            if ($file == $objFile->path)
228
+            {
229
+                Controller::sendFileToBrowser($file);
230
+            }
231
+        }
232
+
184 233
         $arrSortenAvailable = [];
185 234
         $Sorten = StringUtil::deserialize($Slot->sorten,true);
186 235
         foreach($Sorten as $sorte)
... ...
@@ -201,7 +250,7 @@ class SlotAjaxController extends AbstractController
201 250
 
202 251
         $intAvailableBehaelter = $Slot->getAvailableBehaelter();
203 252
 
204
-        $arrData = [
253
+        $arrData = array_merge($arrData,[
205 254
             'modal' => $blnModal,
206 255
             'id'       => $Booking->id,
207 256
             'slot'     => array_merge($Slot->row(),[
... ...
@@ -217,7 +266,7 @@ class SlotAjaxController extends AbstractController
217 266
                 'behaelter' => range(min($intAvailableBehaelter,1),$intAvailableBehaelter+$Booking->behaelter),
218 267
                 'sorten' => $arrSortenAvailable
219 268
             ]
220
-        ];
269
+        ]);
221 270
 
222 271
         return $this->render('@Contao/modal_booking_details.html.twig',$arrData);
223 272
     }
... ...
@@ -277,6 +326,8 @@ class SlotAjaxController extends AbstractController
277 326
 
278 327
     protected function updateReservation()
279 328
     {
329
+        Controller::loadDataContainer('tl_vr_wa_reservation');
330
+
280 331
         if (empty($_REQUEST['id']) || empty(Input::post('behaelter')) || empty(Input::post('sorten')))
281 332
         {
282 333
             return new Response('Missing parameter',412);
... ...
@@ -287,6 +338,24 @@ class SlotAjaxController extends AbstractController
287 338
             return new Response('Could not load booking data',500);
288 339
         }
289 340
 
341
+        if (($rootPage = Frontend::getRootPageFromUrl()) !== null && !empty($rootPage->vr_wa_uploadFolderSRC))
342
+        {
343
+            $File = new FormFileUpload(\Contao\Widget::getAttributesFromDca($GLOBALS['TL_DCA']['tl_vr_wa_reservation']['fields']['upload'], 'upload'));
344
+            $File->storeFile = true;
345
+            $File->doNotOverwrite = true;
346
+            $File->uploadFolder = $rootPage->vr_wa_uploadFolderSRC;
347
+
348
+            $File->validate();
349
+
350
+            if ($File->hasErrors())
351
+            {
352
+                return $this->renderDetails(false,'<div class="toast toast--danger mx-0">' . $File->getErrorAsHTML() . '</div>');
353
+            }
354
+
355
+            $Reservation->filename = $_SESSION['FILES'][$File->name]['name'] ?? '';
356
+            $Reservation->upload = $_SESSION['FILES'][$File->name]['uuid'] ? StringUtil::uuidToBin($_SESSION['FILES'][$File->name]['uuid']) : null;
357
+        }
358
+
290 359
         $arrSorten = [];
291 360
         if (!is_array(Input::post('sorten')))
292 361
         {
Browse code

Update

Benjamin Roth authored on15/08/2023 15:29:18
Showing1 changed files
... ...
@@ -16,6 +16,8 @@ use Contao\Controller;
16 16
 use Contao\CoreBundle\Controller\AbstractController;
17 17
 use Contao\CoreBundle\Framework\ContaoFramework;
18 18
 use Contao\CoreBundle\Security\Authentication\Token\TokenChecker;
19
+use Contao\FormFileUpload;
20
+use Contao\Frontend;
19 21
 use Contao\FrontendUser;
20 22
 use Contao\Input;
21 23
 use Contao\StringUtil;
... ...
@@ -88,7 +90,7 @@ class SlotAjaxController extends AbstractController
88 90
         return new Response('',500);
89 91
     }
90 92
 
91
-    protected function renderDetails(bool $blnModal=true)
93
+    protected function renderDetails(bool $blnModal=true,string $error=null)
92 94
     {
93 95
         if (empty($_REQUEST['id']))
94 96
         {
... ...
@@ -158,6 +160,11 @@ class SlotAjaxController extends AbstractController
158 160
             'reservations' => $arrReservations
159 161
         ];
160 162
 
163
+        if (!empty($error))
164
+        {
165
+            $arrData['toast'] = $error;
166
+        }
167
+
161 168
         return $this->render('@Contao/modal_slot_details.html.twig',$arrData);
162 169
     }
163 170
 
... ...
@@ -217,6 +224,27 @@ class SlotAjaxController extends AbstractController
217 224
 
218 225
     protected function reservate()
219 226
     {
227
+        Controller::loadDataContainer('tl_vr_wa_reservation');
228
+        $arrData = [];
229
+
230
+        if (($rootPage = Frontend::getRootPageFromUrl()) !== null && !empty($rootPage->vr_wa_uploadFolderSRC))
231
+        {
232
+            $File = new FormFileUpload(\Contao\Widget::getAttributesFromDca($GLOBALS['TL_DCA']['tl_vr_wa_reservation']['fields']['upload'], 'upload'));
233
+            $File->storeFile = true;
234
+            $File->doNotOverwrite = true;
235
+            $File->uploadFolder = $rootPage->vr_wa_uploadFolderSRC;
236
+
237
+            $File->validate();
238
+
239
+            if ($File->hasErrors())
240
+            {
241
+                return $this->renderDetails(false,'<div class="toast toast--danger mx-0">' . $File->getErrorAsHTML() . '</div>');
242
+            }
243
+
244
+            $arrData['filename'] = $_SESSION['FILES'][$File->name]['name'] ?? '';
245
+            $arrData['upload'] = $_SESSION['FILES'][$File->name]['uuid'] ? StringUtil::uuidToBin($_SESSION['FILES'][$File->name]['uuid']) : null;
246
+        }
247
+
220 248
         if (empty($_REQUEST['id']) || empty(Input::post('behaelter')) || empty(Input::post('sorten')))
221 249
         {
222 250
             return new Response('Missing parameter',412);
... ...
@@ -231,14 +259,15 @@ class SlotAjaxController extends AbstractController
231 259
         }
232 260
 
233 261
         $Reservation = new WeinanlieferungReservationModel();
234
-
235
-        $Reservation->setRow([
262
+        $arrData = array_merge($arrData,[
236 263
             'pid' => $_REQUEST['id'],
264
+            'rootid' => $rootPage !== null ? $rootPage->id : '',
237 265
             'tstamp' => time(),
238 266
             'uid' => FrontendUser::getInstance()->id,
239 267
             'behaelter' => Input::post('behaelter'),
240 268
             'sorten' => $arrSorten
241 269
         ]);
270
+        $Reservation->setRow($arrData);
242 271
 
243 272
 
244 273
         $Reservation->save();
Browse code

Update

Benjamin Roth authored on15/08/2023 00:19:43
Showing1 changed files
... ...
@@ -18,12 +18,15 @@ use Contao\CoreBundle\Framework\ContaoFramework;
18 18
 use Contao\CoreBundle\Security\Authentication\Token\TokenChecker;
19 19
 use Contao\FrontendUser;
20 20
 use Contao\Input;
21
+use Contao\StringUtil;
21 22
 use Contao\System;
22 23
 use Doctrine\DBAL\Connection;
23 24
 use Symfony\Component\HttpFoundation\Request;
24 25
 use Symfony\Component\HttpFoundation\Response;
25 26
 use Symfony\Component\Routing\Annotation\Route;
26 27
 use Symfony\Contracts\Translation\TranslatorInterface;
28
+use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungLeseartModel;
29
+use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungRebsorteModel;
27 30
 use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungReservationModel;
28 31
 use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungSlotsModel;
29 32
 
... ...
@@ -83,7 +86,6 @@ class SlotAjaxController extends AbstractController
83 86
         }
84 87
 
85 88
         return new Response('',500);
86
-        return new Response(null,203);
87 89
     }
88 90
 
89 91
     protected function renderDetails(bool $blnModal=true)
... ...
@@ -106,10 +108,18 @@ class SlotAjaxController extends AbstractController
106 108
             foreach ($Reservations as $reservation)
107 109
             {
108 110
                 $arrSortenBooked = [];
109
-                if (($Sorten = $reservation->getRelated('sorten')) !== null)
111
+                $SortenLeseart = explode(';',$reservation->sorten);
112
+                foreach($SortenLeseart as $sorteLeseart)
110 113
                 {
111
-                    $arrSortenBooked = $Sorten->fetchEach('title');
114
+                    list($sorte,$leseart) = explode(',',$sorteLeseart);
115
+                    $objSorte = WeinanlieferungRebsorteModel::findByPk($sorte);
116
+                    $objLeseart = WeinanlieferungLeseartModel::findByPk($leseart);
117
+                    $arrSortenBooked[$objSorte->id.','.$objLeseart->id] = ($objSorte !== null  ? $objSorte->title : '') . ' ' . ($objLeseart !== null  ? $objLeseart->title : '');
112 118
                 }
119
+                /*if (($Sorten = $reservation->getRelated('sorten')) !== null)
120
+                {
121
+                    $arrSortenBooked = $Sorten->fetchEach('title');
122
+                }*/
113 123
                 $arrReservations[] = array_merge($reservation->row(),[
114 124
                     'sorten' => $arrSortenBooked
115 125
                 ]);
... ...
@@ -118,10 +128,17 @@ class SlotAjaxController extends AbstractController
118 128
 
119 129
         // Build data
120 130
         $arrSorten = [];
121
-        if (($Sorten = $Slot->getRelated('sorte')) !== null)
131
+        $Sorten = StringUtil::deserialize($Slot->sorten,true);
132
+        foreach($Sorten as $sorte)
122 133
         {
123
-            $arrSorten = array_combine($Sorten->fetchEach('id'),$Sorten->fetchEach('title'));
134
+            $objSorte = WeinanlieferungRebsorteModel::findByPk($sorte['sorte']);
135
+            $objLeseart = WeinanlieferungLeseartModel::findByPk($sorte['leseart']);
136
+            $arrSorten[$objSorte->id.','.$objLeseart->id] = ($objSorte !== null  ? $objSorte->title : '') . ' ' . ($objLeseart !== null  ? $objLeseart->title : '');
124 137
         }
138
+        /*if (($Sorten = $Slot->getRelated('sorte')) !== null)
139
+        {
140
+            $arrSorten = array_combine($Sorten->fetchEach('id'),$Sorten->fetchEach('title'));
141
+        }*/
125 142
 
126 143
         $intAvailableBehaelter = $Slot->getAvailableBehaelter();
127 144
 
... ...
@@ -158,14 +175,21 @@ class SlotAjaxController extends AbstractController
158 175
         }
159 176
 
160 177
         $arrSortenAvailable = [];
161
-        if (($Sorten = $Slot->getRelated('sorte')) !== null)
178
+        $Sorten = StringUtil::deserialize($Slot->sorten,true);
179
+        foreach($Sorten as $sorte)
162 180
         {
163
-            $arrSortenAvailable = array_combine($Sorten->fetchEach('id'),$Sorten->fetchEach('title'));
181
+            $objSorte = WeinanlieferungRebsorteModel::findByPk($sorte['sorte']);
182
+            $objLeseart = WeinanlieferungLeseartModel::findByPk($sorte['leseart']);
183
+            $arrSortenAvailable[$objSorte->id.','.$objLeseart->id] = ($objSorte !== null  ? $objSorte->title : '') . ' ' . ($objLeseart !== null  ? $objLeseart->title : '');
164 184
         }
165 185
         $arrSortenBooked = [];
166
-        if (($Sorten = $Booking->getRelated('sorten')) !== null)
186
+        $SortenLeseart = explode(';',$Booking->sorten);
187
+        foreach($SortenLeseart as $sorteLeseart)
167 188
         {
168
-            $arrSortenBooked = array_combine($Sorten->fetchEach('id'),$Sorten->fetchEach('title'));
189
+            list($sorte,$leseart) = explode(',',$sorteLeseart);
190
+            $objSorte = WeinanlieferungRebsorteModel::findByPk($sorte);
191
+            $objLeseart = WeinanlieferungLeseartModel::findByPk($leseart);
192
+            $arrSortenBooked[$objSorte->id.','.$objLeseart->id] = ($objSorte !== null  ? $objSorte->title : '') . ' ' . ($objLeseart !== null  ? $objLeseart->title : '');
169 193
         }
170 194
 
171 195
         $intAvailableBehaelter = $Slot->getAvailableBehaelter();
... ...
@@ -203,7 +227,7 @@ class SlotAjaxController extends AbstractController
203 227
         {
204 228
             $arrSorten[] = Input::post('sorten');
205 229
         } else {
206
-            $arrSorten = implode(',', Input::post('sorten'));
230
+            $arrSorten = implode(';', Input::post('sorten'));
207 231
         }
208 232
 
209 233
         $Reservation = new WeinanlieferungReservationModel();
Browse code

Update

Benjamin Roth authored on10/08/2023 16:00:36
Showing1 changed files
... ...
@@ -219,7 +219,7 @@ class SlotAjaxController extends AbstractController
219 219
 
220 220
         $Reservation->save();
221 221
 
222
-        return new Response('<p>Reservierung erfolgreich</p>',200,['HX-Trigger'=> 'updateWaList']);
222
+        return new Response('<div class="toast toast--success mx-0"><p>Reservierung erfolgreich</p></div>',200,['HX-Trigger'=> 'updateWaList']);
223 223
     }
224 224
 
225 225
     protected function updateReservation()
... ...
@@ -248,7 +248,7 @@ class SlotAjaxController extends AbstractController
248 248
 
249 249
         $Reservation->save();
250 250
 
251
-        return new Response('<p>Reservierung erfolgreich geändert</p>',200,['HX-Trigger'=> 'updateWaBooking']);
251
+        return new Response('<div class="toast toast--success mx-0"><p>Reservierung erfolgreich geändert</p></div>',200,['HX-Trigger'=> 'updateWaBooking']);
252 252
     }
253 253
 
254 254
     protected function deleteReservation()
Browse code

Update

Benjamin Roth authored on09/08/2023 16:04:53
Showing1 changed files
... ...
@@ -57,24 +57,36 @@ class SlotAjaxController extends AbstractController
57 57
             return new Response('Required parameter missing',412);
58 58
         }
59 59
 
60
+        $blnModal = true;
61
+
62
+        if (!empty($_REQUEST['modal']))
63
+        {
64
+            $blnModal = !(strtolower($_REQUEST['modal']) == 'false');
65
+        }
66
+
60 67
         switch ($_REQUEST['do'])
61 68
         {
62 69
             case 'details':
63
-                return $this->renderDetails();
64
-                break;
70
+                return $this->renderDetails($blnModal);
71
+
72
+            case 'booking':
73
+                return $this->renderBooking($blnModal);
65 74
 
66 75
             case 'reservate':
67 76
                 return $this->reservate();
68 77
 
78
+            case 'updateReservation':
79
+                return $this->updateReservation();
80
+
69 81
             case 'delete':
70
-                return $this->deleteBooking();
82
+                return $this->deleteReservation();
71 83
         }
72 84
 
73 85
         return new Response('',500);
74 86
         return new Response(null,203);
75 87
     }
76 88
 
77
-    protected function renderDetails()
89
+    protected function renderDetails(bool $blnModal=true)
78 90
     {
79 91
         if (empty($_REQUEST['id']))
80 92
         {
... ...
@@ -86,6 +98,25 @@ class SlotAjaxController extends AbstractController
86 98
             return new Response('Could not load slot data',500);
87 99
         }
88 100
 
101
+        // Get slot reservations from user
102
+        $arrReservations = [];
103
+
104
+        if (($Reservations = WeinanlieferungReservationModel::findBy(["uid = ?","pid = ?"],[FrontendUser::getInstance()->id,$Slot->id])) !== null)
105
+        {
106
+            foreach ($Reservations as $reservation)
107
+            {
108
+                $arrSortenBooked = [];
109
+                if (($Sorten = $reservation->getRelated('sorten')) !== null)
110
+                {
111
+                    $arrSortenBooked = $Sorten->fetchEach('title');
112
+                }
113
+                $arrReservations[] = array_merge($reservation->row(),[
114
+                    'sorten' => $arrSortenBooked
115
+                ]);
116
+            }
117
+        }
118
+
119
+        // Build data
89 120
         $arrSorten = [];
90 121
         if (($Sorten = $Slot->getRelated('sorte')) !== null)
91 122
         {
... ...
@@ -95,6 +126,7 @@ class SlotAjaxController extends AbstractController
95 126
         $intAvailableBehaelter = $Slot->getAvailableBehaelter();
96 127
 
97 128
         $arrData = [
129
+            'modal' => $blnModal,
98 130
             'id'       => $Slot->id,
99 131
             'slot'     => array_merge($Slot->row(),[
100 132
                 'sorte' => $arrSorten,
... ...
@@ -105,17 +137,65 @@ class SlotAjaxController extends AbstractController
105 137
                 'buchbar' => (boolean) $intAvailableBehaelter,
106 138
                 'behaelter' => range(min($intAvailableBehaelter,1),$intAvailableBehaelter),
107 139
                 'sorten' => $arrSorten
108
-            ]
140
+            ],
141
+            'reservations' => $arrReservations
109 142
         ];
110 143
 
111 144
         return $this->render('@Contao/modal_slot_details.html.twig',$arrData);
112 145
     }
113 146
 
147
+    protected function renderBooking(bool $blnModal=true)
148
+    {
149
+        if (empty($_REQUEST['id']))
150
+        {
151
+            return new Response('Required parameter missing',412);
152
+        }
153
+
154
+        /** @var WeinanlieferungSlotsModel $Slot */
155
+        if (($Booking = WeinanlieferungReservationModel::findById($_REQUEST['id'])) === null || ($Slot = $Booking->getRelated('pid')) === null)
156
+        {
157
+            return new Response('Could not load booking data',500);
158
+        }
159
+
160
+        $arrSortenAvailable = [];
161
+        if (($Sorten = $Slot->getRelated('sorte')) !== null)
162
+        {
163
+            $arrSortenAvailable = array_combine($Sorten->fetchEach('id'),$Sorten->fetchEach('title'));
164
+        }
165
+        $arrSortenBooked = [];
166
+        if (($Sorten = $Booking->getRelated('sorten')) !== null)
167
+        {
168
+            $arrSortenBooked = array_combine($Sorten->fetchEach('id'),$Sorten->fetchEach('title'));
169
+        }
170
+
171
+        $intAvailableBehaelter = $Slot->getAvailableBehaelter();
172
+
173
+        $arrData = [
174
+            'modal' => $blnModal,
175
+            'id'       => $Booking->id,
176
+            'slot'     => array_merge($Slot->row(),[
177
+                'sorte' => $arrSortenAvailable,
178
+                'behaelterAvailable' => $intAvailableBehaelter
179
+            ]),
180
+            'buchung' => array_merge($Booking->row(),[
181
+                'sorten' => $arrSortenBooked
182
+            ]),
183
+            'standort' => $Slot->getRelated('pid'),
184
+            'buchen' => [
185
+                'buchbar' => (boolean) $intAvailableBehaelter,
186
+                'behaelter' => range(min($intAvailableBehaelter,1),$intAvailableBehaelter+$Booking->behaelter),
187
+                'sorten' => $arrSortenAvailable
188
+            ]
189
+        ];
190
+
191
+        return $this->render('@Contao/modal_booking_details.html.twig',$arrData);
192
+    }
193
+
114 194
     protected function reservate()
115 195
     {
116 196
         if (empty($_REQUEST['id']) || empty(Input::post('behaelter')) || empty(Input::post('sorten')))
117 197
         {
118
-            return new Response('Missing parameter',500);
198
+            return new Response('Missing parameter',412);
119 199
         }
120 200
 
121 201
         $arrSorten = [];
... ...
@@ -139,14 +219,43 @@ class SlotAjaxController extends AbstractController
139 219
 
140 220
         $Reservation->save();
141 221
 
142
-        return new Response('<p>Reservierung erfolgreich</p>');
222
+        return new Response('<p>Reservierung erfolgreich</p>',200,['HX-Trigger'=> 'updateWaList']);
223
+    }
224
+
225
+    protected function updateReservation()
226
+    {
227
+        if (empty($_REQUEST['id']) || empty(Input::post('behaelter')) || empty(Input::post('sorten')))
228
+        {
229
+            return new Response('Missing parameter',412);
230
+        }
231
+
232
+        if (($Reservation = WeinanlieferungReservationModel::findById($_REQUEST['id'])) === null)
233
+        {
234
+            return new Response('Could not load booking data',500);
235
+        }
236
+
237
+        $arrSorten = [];
238
+        if (!is_array(Input::post('sorten')))
239
+        {
240
+            $arrSorten[] = Input::post('sorten');
241
+        } else {
242
+            $arrSorten = implode(',', Input::post('sorten'));
243
+        }
244
+
245
+        $Reservation->tstamp = time();
246
+        $Reservation->behaelter = Input::post('behaelter');
247
+        $Reservation->sorten = $arrSorten;
248
+
249
+        $Reservation->save();
250
+
251
+        return new Response('<p>Reservierung erfolgreich geändert</p>',200,['HX-Trigger'=> 'updateWaBooking']);
143 252
     }
144 253
 
145
-    protected function deleteBooking()
254
+    protected function deleteReservation()
146 255
     {
147 256
         if (empty($_REQUEST['id']))
148 257
         {
149
-            return new Response('Missing parameter',500);
258
+            return new Response('Missing parameter',412);
150 259
         }
151 260
 
152 261
         /** @var Connection $db */
... ...
@@ -159,7 +268,7 @@ class SlotAjaxController extends AbstractController
159 268
 
160 269
         if ($db->delete('tl_vr_wa_reservation',$arrCriteria))
161 270
         {
162
-            return new Response(null,203);
271
+            return new Response(null,203,['HX-Trigger'=> 'updateWaBooking']);
163 272
         }
164 273
 
165 274
         return new Response('Could not delete',500);
Browse code

Update

Benjamin Roth authored on09/08/2023 09:01:03
Showing1 changed files
... ...
@@ -12,12 +12,14 @@ declare(strict_types=1);
12 12
 
13 13
 namespace vonRotenberg\WeinanlieferungBundle\Controller\Frontend\Ajax;
14 14
 
15
+use Contao\Controller;
15 16
 use Contao\CoreBundle\Controller\AbstractController;
16 17
 use Contao\CoreBundle\Framework\ContaoFramework;
17 18
 use Contao\CoreBundle\Security\Authentication\Token\TokenChecker;
18 19
 use Contao\FrontendUser;
19 20
 use Contao\Input;
20 21
 use Contao\System;
22
+use Doctrine\DBAL\Connection;
21 23
 use Symfony\Component\HttpFoundation\Request;
22 24
 use Symfony\Component\HttpFoundation\Response;
23 25
 use Symfony\Component\Routing\Annotation\Route;
... ...
@@ -63,6 +65,9 @@ class SlotAjaxController extends AbstractController
63 65
 
64 66
             case 'reservate':
65 67
                 return $this->reservate();
68
+
69
+            case 'delete':
70
+                return $this->deleteBooking();
66 71
         }
67 72
 
68 73
         return new Response('',500);
... ...
@@ -137,6 +142,29 @@ class SlotAjaxController extends AbstractController
137 142
         return new Response('<p>Reservierung erfolgreich</p>');
138 143
     }
139 144
 
145
+    protected function deleteBooking()
146
+    {
147
+        if (empty($_REQUEST['id']))
148
+        {
149
+            return new Response('Missing parameter',500);
150
+        }
151
+
152
+        /** @var Connection $db */
153
+        $db = Controller::getContainer()->get('database_connection');
154
+
155
+        $arrCriteria = [
156
+            'uid' => FrontendUser::getInstance()->id,
157
+            'id' => $_REQUEST['id']
158
+        ];
159
+
160
+        if ($db->delete('tl_vr_wa_reservation',$arrCriteria))
161
+        {
162
+            return new Response(null,203);
163
+        }
164
+
165
+        return new Response('Could not delete',500);
166
+    }
167
+
140 168
     protected function renderUnauthorized()
141 169
     {
142 170
         return $this->render('@Contao/modal_unauthorized.html.twig');
Browse code

Update

Benjamin Roth authored on09/08/2023 01:02:13
Showing1 changed files
... ...
@@ -15,11 +15,14 @@ namespace vonRotenberg\WeinanlieferungBundle\Controller\Frontend\Ajax;
15 15
 use Contao\CoreBundle\Controller\AbstractController;
16 16
 use Contao\CoreBundle\Framework\ContaoFramework;
17 17
 use Contao\CoreBundle\Security\Authentication\Token\TokenChecker;
18
+use Contao\FrontendUser;
19
+use Contao\Input;
18 20
 use Contao\System;
19 21
 use Symfony\Component\HttpFoundation\Request;
20 22
 use Symfony\Component\HttpFoundation\Response;
21 23
 use Symfony\Component\Routing\Annotation\Route;
22 24
 use Symfony\Contracts\Translation\TranslatorInterface;
25
+use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungReservationModel;
23 26
 use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungSlotsModel;
24 27
 
25 28
 /**
... ...
@@ -57,6 +60,9 @@ class SlotAjaxController extends AbstractController
57 60
             case 'details':
58 61
                 return $this->renderDetails();
59 62
                 break;
63
+
64
+            case 'reservate':
65
+                return $this->reservate();
60 66
         }
61 67
 
62 68
         return new Response('',500);
... ...
@@ -78,20 +84,59 @@ class SlotAjaxController extends AbstractController
78 84
         $arrSorten = [];
79 85
         if (($Sorten = $Slot->getRelated('sorte')) !== null)
80 86
         {
81
-            $arrSorten = $Sorten->fetchEach('title');
87
+            $arrSorten = array_combine($Sorten->fetchEach('id'),$Sorten->fetchEach('title'));
82 88
         }
83 89
 
90
+        $intAvailableBehaelter = $Slot->getAvailableBehaelter();
91
+
84 92
         $arrData = [
85 93
             'id'       => $Slot->id,
86 94
             'slot'     => array_merge($Slot->row(),[
87
-                'sorte' => $arrSorten
95
+                'sorte' => $arrSorten,
96
+                'behaelterAvailable' => $intAvailableBehaelter
88 97
             ]),
89
-            'standort' => $Slot->getRelated('pid')
98
+            'standort' => $Slot->getRelated('pid'),
99
+            'buchen' => [
100
+                'buchbar' => (boolean) $intAvailableBehaelter,
101
+                'behaelter' => range(min($intAvailableBehaelter,1),$intAvailableBehaelter),
102
+                'sorten' => $arrSorten
103
+            ]
90 104
         ];
91 105
 
92 106
         return $this->render('@Contao/modal_slot_details.html.twig',$arrData);
93 107
     }
94 108
 
109
+    protected function reservate()
110
+    {
111
+        if (empty($_REQUEST['id']) || empty(Input::post('behaelter')) || empty(Input::post('sorten')))
112
+        {
113
+            return new Response('Missing parameter',500);
114
+        }
115
+
116
+        $arrSorten = [];
117
+        if (!is_array(Input::post('sorten')))
118
+        {
119
+            $arrSorten[] = Input::post('sorten');
120
+        } else {
121
+            $arrSorten = implode(',', Input::post('sorten'));
122
+        }
123
+
124
+        $Reservation = new WeinanlieferungReservationModel();
125
+
126
+        $Reservation->setRow([
127
+            'pid' => $_REQUEST['id'],
128
+            'tstamp' => time(),
129
+            'uid' => FrontendUser::getInstance()->id,
130
+            'behaelter' => Input::post('behaelter'),
131
+            'sorten' => $arrSorten
132
+        ]);
133
+
134
+
135
+        $Reservation->save();
136
+
137
+        return new Response('<p>Reservierung erfolgreich</p>');
138
+    }
139
+
95 140
     protected function renderUnauthorized()
96 141
     {
97 142
         return $this->render('@Contao/modal_unauthorized.html.twig');
Browse code

Update

Benjamin Roth authored on08/08/2023 12:37:24
Showing1 changed files
... ...
@@ -42,6 +42,11 @@ class SlotAjaxController extends AbstractController
42 42
     {
43 43
         System::loadLanguageFile('default');
44 44
 
45
+        if (!$this->tokenChecker->hasFrontendUser())
46
+        {
47
+            return $this->renderUnauthorized();
48
+        }
49
+
45 50
         if (empty($_REQUEST['do']))
46 51
         {
47 52
             return new Response('Required parameter missing',412);
... ...
@@ -70,13 +75,26 @@ class SlotAjaxController extends AbstractController
70 75
             return new Response('Could not load slot data',500);
71 76
         }
72 77
 
78
+        $arrSorten = [];
79
+        if (($Sorten = $Slot->getRelated('sorte')) !== null)
80
+        {
81
+            $arrSorten = $Sorten->fetchEach('title');
82
+        }
83
+
73 84
         $arrData = [
74 85
             'id'       => $Slot->id,
75
-            'slot'     => $Slot->row(),
86
+            'slot'     => array_merge($Slot->row(),[
87
+                'sorte' => $arrSorten
88
+            ]),
76 89
             'standort' => $Slot->getRelated('pid')
77 90
         ];
78 91
 
79 92
         return $this->render('@Contao/modal_slot_details.html.twig',$arrData);
80 93
     }
81 94
 
95
+    protected function renderUnauthorized()
96
+    {
97
+        return $this->render('@Contao/modal_unauthorized.html.twig');
98
+    }
99
+
82 100
 }
Browse code

Update

Benjamin Roth authored on08/08/2023 12:03:12
Showing1 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,82 @@
1
+<?php
2
+
3
+declare(strict_types=1);
4
+
5
+/*
6
+ * This file is part of contao-weinanlieferung-bundle.
7
+ *
8
+ * (c) vonRotenberg
9
+ *
10
+ * @license commercial
11
+ */
12
+
13
+namespace vonRotenberg\WeinanlieferungBundle\Controller\Frontend\Ajax;
14
+
15
+use Contao\CoreBundle\Controller\AbstractController;
16
+use Contao\CoreBundle\Framework\ContaoFramework;
17
+use Contao\CoreBundle\Security\Authentication\Token\TokenChecker;
18
+use Contao\System;
19
+use Symfony\Component\HttpFoundation\Request;
20
+use Symfony\Component\HttpFoundation\Response;
21
+use Symfony\Component\Routing\Annotation\Route;
22
+use Symfony\Contracts\Translation\TranslatorInterface;
23
+use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungSlotsModel;
24
+
25
+/**
26
+ * @Route("/_ajax/vr_wa/v1/slot", name="vr_wa_slot_ajax", defaults={"_scope" = "frontend", "_token_check" = false})
27
+ */
28
+class SlotAjaxController extends AbstractController
29
+{
30
+    private $tokenChecker;
31
+    private $translator;
32
+    private $framework;
33
+
34
+    public function __construct(ContaoFramework $framework, TokenChecker $tokenChecker, TranslatorInterface $translator)
35
+    {
36
+        $this->framework = $framework;
37
+        $this->tokenChecker = $tokenChecker;
38
+        $this->translator = $translator;
39
+    }
40
+
41
+    public function __invoke(Request $request)
42
+    {
43
+        System::loadLanguageFile('default');
44
+
45
+        if (empty($_REQUEST['do']))
46
+        {
47
+            return new Response('Required parameter missing',412);
48
+        }
49
+
50
+        switch ($_REQUEST['do'])
51
+        {
52
+            case 'details':
53
+                return $this->renderDetails();
54
+                break;
55
+        }
56
+
57
+        return new Response('',500);
58
+        return new Response(null,203);
59
+    }
60
+
61
+    protected function renderDetails()
62
+    {
63
+        if (empty($_REQUEST['id']))
64
+        {
65
+            return new Response('Required parameter missing',412);
66
+        }
67
+
68
+        if (($Slot = WeinanlieferungSlotsModel::findPublishedById($_REQUEST['id'])) === null)
69
+        {
70
+            return new Response('Could not load slot data',500);
71
+        }
72
+
73
+        $arrData = [
74
+            'id'       => $Slot->id,
75
+            'slot'     => $Slot->row(),
76
+            'standort' => $Slot->getRelated('pid')
77
+        ];
78
+
79
+        return $this->render('@Contao/modal_slot_details.html.twig',$arrData);
80
+    }
81
+
82
+}