Browse code

Respect overcapacity feature and fix several bux related to it

Benjamin Roth authored on21/08/2024 11:35:44
Showing3 changed files
... ...
@@ -67,7 +67,7 @@
67 67
                             <select id="res-behaelter" name="behaelter" required>
68 68
                                 <option value="">-</option>
69 69
                                 {% for option in buchen.behaelter %}
70
-                                    {% if option > slot.behaelter %}
70
+                                    {% if option > slot.behaelterAvailable %}
71 71
                                         <option value="{{ option }}"{{ buchung.amount == option ? ' selected' : '' }}>{{ option }} ({{ 'MSC.wa_overbooking'|trans([], 'contao_default') }})</option>
72 72
                                     {% else %}
73 73
                                         <option value="{{ option }}"{{ buchung.amount == option ? ' selected' : '' }}>{{ option }}</option>
... ...
@@ -298,6 +298,7 @@ class SlotAjaxController extends AbstractController
298 298
 
299 299
         $intAvailableBehaelter = max(0,$Slot->getAvailableBehaelter());
300 300
         $intBookableBehaelter = $Slot->getAvailableBehaelter() + $Slot->getOvercapacityBehaelter();
301
+        $intUnitAmount = $intBookableBehaelter+$Booking->behaelter;
301 302
         $arrUnits = [];
302 303
 
303 304
         if (($Site = $Slot->getRelated('pid')) !== null)
... ...
@@ -310,6 +311,16 @@ class SlotAjaxController extends AbstractController
310 311
                 }
311 312
             }
312 313
 
314
+            if ($Booking->unit > 0 && \in_array($Booking->unit, array_keys($arrUnits)))
315
+            {
316
+                if (($Unit = WeinanlieferungUnitsModel::findByPk($Booking->unit)) === null)
317
+                {
318
+                    return new Response('Could not load unit data', 500);
319
+                }
320
+
321
+                $intUnitAmount = floor($intUnitAmount / max(1, $Unit->containers));
322
+            }
323
+
313 324
         }
314 325
 
315 326
         $arrData = array_merge($arrData,[
... ...
@@ -317,13 +328,13 @@ class SlotAjaxController extends AbstractController
317 328
             'id'       => $Booking->id,
318 329
             'slot'     => array_merge($Slot->row(),[
319 330
                 'anmerkungen' => $insertTagService->replace($Slot->anmerkungen ?? ''),
320
-                'behaelterAvailable' => $intAvailableBehaelter,
331
+                'behaelterAvailable' => $intAvailableBehaelter + $Booking->behaelter,
321 332
             ]),
322 333
             'buchung' => $Booking->row(),
323 334
             'standort' => $Slot->getRelated('pid'),
324 335
             'buchen' => [
325 336
                 'buchbar' => (boolean) $intBookableBehaelter,
326
-                'behaelter' => range(min($intBookableBehaelter,1),$intBookableBehaelter+$Booking->behaelter),
337
+                'behaelter' => $intUnitAmount ? range(1,$intUnitAmount) : [],
327 338
                 'units' => $arrUnits,
328 339
             ]
329 340
         ]);
... ...
@@ -556,7 +567,6 @@ class SlotAjaxController extends AbstractController
556 567
 
557 568
     protected function renderAvailableUnitAmount(): Response
558 569
     {
559
-        // Todo: Respect the overcapacity feature
560 570
         if (empty($_REQUEST['id']))
561 571
         {
562 572
             return new Response('Required parameter missing',412);
... ...
@@ -569,6 +579,11 @@ class SlotAjaxController extends AbstractController
569 579
 
570 580
         $intAvailableBehaelter = max(0,$Slot->getAvailableBehaelter());
571 581
         $intAmount = $intAvailableBehaelter;
582
+        if ($intAvailableBehaelter > 0)
583
+        {
584
+            $intOvercapacityBehaelter = $Slot->getOvercapacityBehaelter();
585
+            $intAmount += $intOvercapacityBehaelter;
586
+        }
572 587
 
573 588
         if (!empty($_REQUEST['unit']) && intval($_REQUEST['unit']) > 0)
574 589
         {
... ...
@@ -584,7 +599,12 @@ class SlotAjaxController extends AbstractController
584 599
 <option value=\"\">-</option>\n";
585 600
         for ($i = 1; $i <= $intAmount; $i++)
586 601
         {
587
-            $strOutput .= "<option value=\"$i\">$i</option>\n";
602
+            if ($intAvailableBehaelter < $i)
603
+            {
604
+                $strOutput .= "<option value=\"$i\">$i (".$this->translator->trans('MSC.wa_overbooking',[], 'contao_default').")</option>\n";
605
+            } else {
606
+                $strOutput .= "<option value=\"$i\">$i</option>\n";
607
+            }
588 608
         }
589 609
         $strOutput .= "</select>\n";
590 610
 
... ...
@@ -593,7 +613,6 @@ class SlotAjaxController extends AbstractController
593 613
 
594 614
     protected function renderAvailableBookingUnitAmount(): Response
595 615
     {
596
-        // Todo: Respect the overcapacity feature
597 616
         if (empty($_REQUEST['id']))
598 617
         {
599 618
             return new Response('Required parameter missing',412);
... ...
@@ -606,6 +625,11 @@ class SlotAjaxController extends AbstractController
606 625
 
607 626
         $intAvailableBehaelter = max(0,$Slot->getAvailableBehaelter())+$Reservation->behaelter;
608 627
         $intAmount = $intAvailableBehaelter;
628
+        if ($intAvailableBehaelter > 0)
629
+        {
630
+            $intOvercapacityBehaelter = $Slot->getOvercapacityBehaelter();
631
+            $intAmount += $intOvercapacityBehaelter;
632
+        }
609 633
 
610 634
         if (!empty($_REQUEST['unit']) && intval($_REQUEST['unit']) > 0)
611 635
         {
... ...
@@ -621,7 +645,12 @@ class SlotAjaxController extends AbstractController
621 645
 <option value=\"\">-</option>\n";
622 646
         for ($i = 1; $i <= $intAmount; $i++)
623 647
         {
624
-            $strOutput .= "<option value=\"$i\">$i</option>\n";
648
+            if ($intAvailableBehaelter < $i)
649
+            {
650
+                $strOutput .= "<option value=\"$i\">$i (".$this->translator->trans('MSC.wa_overbooking',[], 'contao_default').")</option>\n";
651
+            } else {
652
+                $strOutput .= "<option value=\"$i\">$i</option>\n";
653
+            }
625 654
         }
626 655
         $strOutput .= "</select>\n";
627 656
 
... ...
@@ -146,11 +146,28 @@ class WeinanlieferungSlotsModel extends Model
146 146
             $intReserved += $intOffset;
147 147
         }
148 148
 
149
-        return (int) $this->behaelter + $intOvercapacity - $intReserved;
149
+        return (int) max(0,$this->behaelter + $intOvercapacity - $intReserved);
150 150
     }
151 151
 
152
-    public function getOvercapacityBehaelter()
152
+    public function getOvercapacityBehaelter(bool $blnGross=false)
153 153
     {
154
-        return round($this->behaelter/100*$this->overcapacity);
154
+        $intOvercapacity = round($this->behaelter/100*$this->overcapacity);
155
+
156
+        if ($blnGross)
157
+        {
158
+            return $intOvercapacity;
159
+        }
160
+
161
+        /** @var Connection $db */
162
+        $db = Controller::getContainer()->get('database_connection');
163
+
164
+        $ReservedBehaelter = $db->prepare("SELECT SUM(behaelter) FROM tl_vr_wa_reservation WHERE pid = ?")
165
+            ->executeQuery([$this->id]);
166
+
167
+        $intReserved = $ReservedBehaelter->fetchOne();
168
+
169
+        $intAmount = min($intOvercapacity,$this->behaelter+$intOvercapacity-$intReserved);
170
+
171
+        return $intAmount;
155 172
     }
156 173
 }