Browse code

Update slot overcapacity request functionality

Benjamin Roth authored on23/08/2024 13:33:02
Showing4 changed files
... ...
@@ -42,12 +42,12 @@
42 42
             <form hx-post="/_ajax/vr_wa/v1/slot?do=updateReservation" enctype="multipart/form-data">
43 43
                 <input type="hidden" name="id" value="{{ id }}">
44 44
                 <fieldset>
45
-                    <label for="res-behaelter"><strong>Liefernde Behältermenge</strong><sup class="text-danger">*</sup></label>
46
-                    <select id="res-behaelter" name="behaelter" required>
45
+                    <label for="bok-behaelter"><strong>Liefernde Behältermenge</strong><sup class="text-danger">*</sup></label>
46
+                    <select id="bok-behaelter" name="behaelter" required>
47 47
                         <option value="">-</option>
48 48
                         {% for option in buchen.behaelter %}
49
-                            {% if option > slot.behaelterAvailable %}
50
-                                <option value="{{ option }}"{{ buchung.behaelter == option ? ' selected' : '' }}>{{ option }} ({{ 'MSC.wa_approval_needed'|trans([], 'contao_default') }})</option>
49
+                            {% if option > slot.behaelterOcThreshold %}
50
+                                <option value="{{ option }}"{{ buchung.behaelter == option ? ' selected' : '' }} data-oc>{{ option }} ({{ 'MSC.wa_approval_needed'|trans([], 'contao_default') }})</option>
51 51
                             {% else %}
52 52
                                 <option value="{{ option }}"{{ buchung.behaelter == option ? ' selected' : '' }}>{{ option }}</option>
53 53
                             {% endif %}
... ...
@@ -81,15 +81,15 @@
81 81
                         <div class="u-flex u-items-center u-gap-1"><a href="{{ file.link }}">{{ file.name }}</a> <a href="javascript:;" hx-get="/_ajax/vr_wa/v1/slot?do=booking&id={{ id }}&modal=false&deleteFile=true" hx-target="closest .frame" hx-swap="outerHTML" class="tag tag__close-btn tag--danger tag--xs"></a></div>
82 82
                     </fieldset>
83 83
                     <fieldset>
84
-                        <label for="res-upload"><strong>Datei überschreiben</strong></label>
84
+                        <label for="bok-upload"><strong>Datei überschreiben</strong></label>
85 85
                 {% else %}
86 86
                     <fieldset>
87
-                        <label for="res-upload"><strong>Datei hochladen</strong></label>
87
+                        <label for="bok-upload"><strong>Datei hochladen</strong></label>
88 88
                 {% endif %}
89
-                    <input type="file" id="res-upload" name="upload">
89
+                    <input type="file" id="bok-upload" name="upload">
90 90
                 </fieldset>
91 91
                 <fieldset>
92
-                    <button type="submit">Speichern</button>
92
+                    <button id="bok-submit" type="submit" data-label-oc="Anfragen" data-label-default="Speichern">Speichern</button>
93 93
                 </fieldset>
94 94
             </form>
95 95
         </div>
... ...
@@ -115,7 +115,7 @@
115 115
                                 <option value="">-</option>
116 116
                                 {% for option in buchen.behaelter %}
117 117
                                     {% if option > slot.behaelterAvailable %}
118
-                                        <option value="{{ option }}">{{ option }} ({{ 'MSC.wa_approval_needed'|trans([], 'contao_default') }})</option>
118
+                                        <option value="{{ option }}" data-oc>{{ option }} ({{ 'MSC.wa_approval_needed'|trans([], 'contao_default') }})</option>
119 119
                                     {% else %}
120 120
                                         <option value="{{ option }}">{{ option }}</option>
121 121
                                     {% endif %}
... ...
@@ -148,7 +148,7 @@
148 148
                             <input type="file" id="res-upload" name="upload">
149 149
                         </fieldset>
150 150
                         <fieldset>
151
-                            <button type="submit">Reservieren</button>
151
+                            <button id="res-submit" type="submit" data-label-oc="Anfragen" data-label-default="Reservieren">Reservieren</button>
152 152
                         </fieldset>
153 153
                     </form>
154 154
                 {% else %}
... ...
@@ -132,6 +132,49 @@
132 132
     {% endblock %}
133 133
 
134 134
     {% block script %}
135
+        <script>
136
+            document.addEventListener("DOMContentLoaded", () => {
137
+                htmx.onLoad((elements) => {
138
+                    if (htmx.find(document, '#bok-behaelter') !== null)
139
+                    {
140
+                        htmx.find(document, '#bok-behaelter').addEventListener("change", (e) => {
141
+                            var selectedOption = e.target.options[e.target.selectedIndex];
142
+                            var dataInfo = selectedOption.hasAttribute("data-oc");
143
+                            var button = htmx.find(document, '#bok-submit');
144
+
145
+                            if (dataInfo)
146
+                            {
147
+                                button.innerHTML = button.getAttribute("data-label-oc");
148
+                                button.classList.add('btn-info');
149
+                            } else
150
+                            {
151
+                                button.innerHTML = button.getAttribute("data-label-default");
152
+                                button.classList.remove('btn-info');
153
+                            }
154
+                        });
155
+                    }
156
+
157
+                    if (htmx.find(elements, '#res-behaelter') !== null)
158
+                    {
159
+                        htmx.find(elements, '#res-behaelter').addEventListener("change", (e) => {
160
+                            var selectedOption = e.target.options[e.target.selectedIndex];
161
+                            var dataInfo = selectedOption.hasAttribute("data-oc");
162
+                            var button = htmx.find(document, '#res-submit');
163
+
164
+                            if (dataInfo)
165
+                            {
166
+                                button.innerHTML = button.getAttribute("data-label-oc");
167
+                                button.classList.add('btn-info');
168
+                            } else
169
+                            {
170
+                                button.innerHTML = button.getAttribute("data-label-default");
171
+                                button.classList.remove('btn-info');
172
+                            }
173
+                        });
174
+                    }
175
+                });
176
+            });
177
+        </script>
135 178
         {#<script>
136 179
             jQuery(function($) {
137 180
                 $(".mod_wa_slots_list").accordion({
... ...
@@ -184,7 +184,7 @@ class SlotAjaxController extends AbstractController
184 184
             'ernteart' => $arrErnteart,
185 185
             'buchen' => [
186 186
                 'buchbar' => (boolean) ($Slot->behaelter*3 > $intReservedBehaelter),
187
-                'behaelter' => range(max($intAvailableBehaelter,1),$Slot->behaelter*3-$intReservedBehaelter),
187
+                'behaelter' => range(min($intAvailableBehaelter,1),$Slot->behaelter*3-$intReservedBehaelter),
188 188
                 'sorten' => $arrSorten,
189 189
                 'lage' => $arrLage,
190 190
                 'ernteart' => $arrErnteart,
... ...
@@ -370,6 +370,7 @@ class SlotAjaxController extends AbstractController
370 370
 
371 371
         $intReservedBehaelter = $Slot->getReservedBehaelter();
372 372
         $intAvailableBehaelter = max($Booking->behaelter,$Slot->getAvailableBehaelter());
373
+        $intOcTreshold = $intAvailableBehaelter - $intReservedBehaelter + $Slot->behaelter;
373 374
 
374 375
         $arrData = array_merge($arrData,[
375 376
             'modal' => $blnModal,
... ...
@@ -378,6 +379,7 @@ class SlotAjaxController extends AbstractController
378 379
                 'anmerkungen' => $insertTagService->replace($Slot->anmerkungen ?? ''),
379 380
                 'sorte' => $arrSortenAvailable,
380 381
                 'behaelterAvailable' => $intAvailableBehaelter,
382
+                'behaelterOcThreshold' => $intOcTreshold,
381 383
                 'behaelterBooked' => $Slot->getReservedBehaelter(),
382 384
             ]),
383 385
             'buchung' => array_merge($Booking->row(),[
... ...
@@ -482,9 +484,21 @@ class SlotAjaxController extends AbstractController
482 484
         }
483 485
 
484 486
         $Reservation = new WeinanlieferungReservationModel();
487
+
488
+        $time = time();
489
+
490
+        if (Input::post('behaelter') > $Slot->behaelter - $Slot->getReservedBehaelter())
491
+        {
492
+            $arrData['approved'] = '';
493
+            $arrData['approved_on'] = 0;
494
+        } else {
495
+            $arrData['approved'] = '1';
496
+            $arrData['approved_on'] = $time;
497
+        }
498
+
485 499
         $arrData = array_merge($arrData,[
486 500
             'pid' => $_REQUEST['id'],
487
-            'tstamp' => time(),
501
+            'tstamp' => $time,
488 502
             'uid' => FrontendUser::getInstance()->id,
489 503
             'behaelter' => Input::post('behaelter'),
490 504
             'sorten' => $arrSorten,
... ...
@@ -493,9 +507,13 @@ class SlotAjaxController extends AbstractController
493 507
         ]);
494 508
         $Reservation->setRow($arrData);
495 509
 
496
-
497 510
         $Reservation->save();
498 511
 
512
+        if (empty($Reservation->approved))
513
+        {
514
+            return new Response('<div class="toast toast--warning mx-0"><p>Wir haben Ihre Anfrage erhalten. Bitte warten Sie auf eine Freigabe durch uns.</p></div>',200,['HX-Trigger'=> 'updateWaBooking']);
515
+        }
516
+
499 517
         return new Response('<div class="toast toast--success mx-0"><p>Reservierung erfolgreich</p></div>',200,['HX-Trigger'=> 'updateWaList']);
500 518
     }
501 519
 
... ...
@@ -513,6 +531,11 @@ class SlotAjaxController extends AbstractController
513 531
             return new Response('Could not load booking data',500);
514 532
         }
515 533
 
534
+        if (FrontendUser::getInstance()->id != $Reservation->uid)
535
+        {
536
+            return new Response('Member not authorized tu update this reservation',500);
537
+        }
538
+
516 539
         if (($rootPage = Frontend::getRootPageFromUrl()) !== null && !empty($rootPage->vr_wa_uploadFolderSRC))
517 540
         {
518 541
             $File = new FormFileUpload(\Contao\Widget::getAttributesFromDca($GLOBALS['TL_DCA']['tl_vr_wa_reservation']['fields']['upload'], 'upload'));
... ...
@@ -535,10 +558,11 @@ class SlotAjaxController extends AbstractController
535 558
         }
536 559
 
537 560
         // Form validation
561
+        /** @var WeinanlieferungSlotsModel $Slot */
538 562
         if (($Slot = $Reservation->getRelated('pid')) !== null)
539 563
         {
540 564
 //            if (Input::post('behaelter') > $Slot->getAvailableBehaelter()+$Reservation->behaelter)
541
-            if (Input::post('behaelter') > $Slot->behaelter*3)
565
+            if (Input::post('behaelter') > $Slot->behaelter*3-$Slot->getReservedBehaelter()+$Reservation->behaelter)
542 566
             {
543 567
                 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));
544 568
             }
... ...
@@ -581,7 +605,18 @@ class SlotAjaxController extends AbstractController
581 605
             $arrLage = implode(',', Input::post('lage'));
582 606
         }
583 607
 
584
-        $Reservation->tstamp = time();
608
+        $time = time();
609
+
610
+        if (Input::post('behaelter') > $Slot->behaelter - $Slot->getReservedBehaelter() + $Reservation->behaelter)
611
+        {
612
+            $Reservation->approved = '';
613
+            $Reservation->approved_on = 0;
614
+        } else {
615
+            $Reservation->approved = '1';
616
+            $Reservation->approved_on = $time;
617
+        }
618
+
619
+        $Reservation->tstamp = $time;
585 620
         $Reservation->behaelter = Input::post('behaelter');
586 621
         $Reservation->sorten = $arrSorten;
587 622
         $Reservation->ernteart = $arrErnteart;
... ...
@@ -589,6 +624,11 @@ class SlotAjaxController extends AbstractController
589 624
 
590 625
         $Reservation->save();
591 626
 
627
+        if (empty($Reservation->approved))
628
+        {
629
+            return new Response('<div class="toast toast--warning mx-0"><p>Wir haben Ihre Anfrage erhalten. Bitte warten Sie auf eine Freigabe durch uns.</p></div>',200,['HX-Trigger'=> 'updateWaBooking']);
630
+        }
631
+
592 632
         return new Response('<div class="toast toast--success mx-0"><p>Reservierung erfolgreich geändert</p></div>',200,['HX-Trigger'=> 'updateWaBooking']);
593 633
     }
594 634