Browse code

Fix month filter to only show one entry per month

Benjamin Roth authored on21/09/2023 16:03:02
Showing1 changed files
... ...
@@ -91,7 +91,7 @@ class WeinanlieferungBookingsController extends AbstractController
91 91
 
92 92
         }
93 93
         $arrMonthOptions = [];
94
-        $MonthRequest = $this->db->executeQuery("SELECT s.date, DATE_FORMAT(FROM_UNIXTIME(s.date),'%m/%Y') as 'month_label' FROM tl_vr_wa_reservation r INNER JOIN tl_vr_wa_slot s ON s.id = r.pid GROUP BY month_label, s.date ORDER BY s.date ASC");
94
+        $MonthRequest = $this->db->executeQuery("SELECT s.date, DATE_FORMAT(FROM_UNIXTIME(s.date),'%m/%Y') as 'month_label' FROM tl_vr_wa_reservation r INNER JOIN tl_vr_wa_slot s ON s.id = r.pid GROUP BY month_label ORDER BY s.date ASC");
95 95
 
96 96
         foreach ($MonthRequest->iterateAssociative() as $month)
97 97
         {
Browse code

Add month filter to backend reservations list

Benjamin Roth authored on21/09/2023 15:44:16
Showing1 changed files
... ...
@@ -68,6 +68,28 @@ class WeinanlieferungBookingsController extends AbstractController
68 68
         System::loadLanguageFile('default');
69 69
 
70 70
         // Filter
71
+        if (Input::post('FORM_SUBMIT') === 'tl_filters' && Input::post('filter_reset') === null)
72
+        {
73
+            $queryBuilder = $this->db->createQueryBuilder()
74
+                ->select('id')
75
+                ->from(WeinanlieferungSlotsModel::getTable());
76
+
77
+            if (!empty(Input::post('tl_month')) && is_numeric(Input::post('tl_month')))
78
+            {
79
+                $Month = new Date(Input::post('tl_month'));
80
+                $arrData['filter']['month']['selected'] = Input::post('tl_month');
81
+                $queryBuilder->andWhere('date BETWEEN :month_start AND :month_end')
82
+                    ->setParameter('month_start', $Month->monthBegin)
83
+                    ->setParameter('month_end', $Month->monthEnd);
84
+            } else {
85
+                $Today = new Date();
86
+                $queryBuilder->andWhere("time >= :today")
87
+                    ->setParameter('today',$Today->dayBegin);
88
+            }
89
+
90
+            $arrSlots = $queryBuilder->fetchFirstColumn();
91
+
92
+        }
71 93
         $arrMonthOptions = [];
72 94
         $MonthRequest = $this->db->executeQuery("SELECT s.date, DATE_FORMAT(FROM_UNIXTIME(s.date),'%m/%Y') as 'month_label' FROM tl_vr_wa_reservation r INNER JOIN tl_vr_wa_slot s ON s.id = r.pid GROUP BY month_label, s.date ORDER BY s.date ASC");
73 95
 
... ...
@@ -76,9 +98,28 @@ class WeinanlieferungBookingsController extends AbstractController
76 98
             $arrMonthOptions[$month['date']] = $month['month_label'];
77 99
         }
78 100
 
101
+        $arrData['filter']['month']['options'] = $arrMonthOptions;
102
+
79 103
 
80 104
         // Get bookings
81
-        if (($bookings = WeinanlieferungReservationModel::findAllFuture(['order' => "(SELECT tl_vr_wa_slot.time FROM tl_vr_wa_slot WHERE tl_vr_wa_slot.id=tl_vr_wa_reservation.pid) ASC"])) !== null)
105
+        if (isset($queryBuilder))
106
+        {
107
+            $arrColumns = null;
108
+            if (count($arrSlots))
109
+            {
110
+                $arrColumns[] = "pid IN (".implode(',',$arrSlots).")";
111
+            }
112
+            if (!$arrColumns)
113
+            {
114
+                $bookings = WeinanlieferungReservationModel::findAllFuture(['order' => "(SELECT tl_vr_wa_slot.time FROM tl_vr_wa_slot WHERE tl_vr_wa_slot.id=tl_vr_wa_reservation.pid) ASC"]);
115
+            } else {
116
+                $bookings = WeinanlieferungReservationModel::findBy($arrColumns,null,['order' => "(SELECT tl_vr_wa_slot.time FROM tl_vr_wa_slot WHERE tl_vr_wa_slot.id=tl_vr_wa_reservation.pid) ASC"]);
117
+            }
118
+
119
+        } else {
120
+            $bookings = WeinanlieferungReservationModel::findAllFuture(['order' => "(SELECT tl_vr_wa_slot.time FROM tl_vr_wa_slot WHERE tl_vr_wa_slot.id=tl_vr_wa_reservation.pid) ASC"]);
121
+        }
122
+        if ($bookings !== null)
82 123
         {
83 124
             /** @var WeinanlieferungReservationModel $booking */
84 125
             foreach ($bookings as $booking)
Browse code

Update

Benjamin Roth authored on20/09/2023 13:46:43
Showing1 changed files
... ...
@@ -20,6 +20,7 @@ use Contao\FrontendUser;
20 20
 use Contao\Input;
21 21
 use Contao\StringUtil;
22 22
 use Contao\System;
23
+use Doctrine\DBAL\Connection;
23 24
 use Symfony\Component\HttpFoundation\RequestStack;
24 25
 use Symfony\Component\HttpFoundation\Response;
25 26
 use Symfony\Component\Routing\Annotation\Route;
... ...
@@ -37,12 +38,14 @@ class WeinanlieferungBookingsController extends AbstractController
37 38
     private $twig;
38 39
     private $tokenManager;
39 40
     private $request;
41
+    private $db;
40 42
 
41
-    public function __construct(TwigEnvironment $twig, ContaoCsrfTokenManager $tokenManager, RequestStack $requestStack)
43
+    public function __construct(TwigEnvironment $twig, ContaoCsrfTokenManager $tokenManager, RequestStack $requestStack, Connection $db)
42 44
     {
43 45
         $this->twig = $twig;
44 46
         $this->tokenManager = $tokenManager;
45 47
         $this->request = $requestStack->getCurrentRequest();
48
+        $this->db = $db;
46 49
 
47 50
         $container = System::getContainer();
48 51
         $objSession = $container->get('session');
... ...
@@ -64,6 +67,16 @@ class WeinanlieferungBookingsController extends AbstractController
64 67
         ];
65 68
         System::loadLanguageFile('default');
66 69
 
70
+        // Filter
71
+        $arrMonthOptions = [];
72
+        $MonthRequest = $this->db->executeQuery("SELECT s.date, DATE_FORMAT(FROM_UNIXTIME(s.date),'%m/%Y') as 'month_label' FROM tl_vr_wa_reservation r INNER JOIN tl_vr_wa_slot s ON s.id = r.pid GROUP BY month_label, s.date ORDER BY s.date ASC");
73
+
74
+        foreach ($MonthRequest->iterateAssociative() as $month)
75
+        {
76
+            $arrMonthOptions[$month['date']] = $month['month_label'];
77
+        }
78
+
79
+
67 80
         // Get bookings
68 81
         if (($bookings = WeinanlieferungReservationModel::findAllFuture(['order' => "(SELECT tl_vr_wa_slot.time FROM tl_vr_wa_slot WHERE tl_vr_wa_slot.id=tl_vr_wa_reservation.pid) ASC"])) !== null)
69 82
         {
Browse code

Do not cumulate same time slots for different locations

Benjamin Roth authored on11/09/2023 11:08:24
Showing1 changed files
... ...
@@ -78,7 +78,17 @@ class WeinanlieferungBookingsController extends AbstractController
78 78
                     $arrErnteart = [];
79 79
                     $arrLagen = [];
80 80
 
81
-                    if (!isset($arrData['days'][$day->dayBegin][$Slot->time]))
81
+                    if (!isset($arrData['days'][$day->dayBegin][$Slot->pid]))
82
+                    {
83
+                        $Standort = $Slot->getRelated('pid');
84
+
85
+                        $arrData['days'][$day->dayBegin][$Slot->pid] = [
86
+                            'standort' => $Standort !== null ? $Standort->title : ''
87
+                        ];
88
+
89
+                    }
90
+
91
+                    if (!isset($arrData['days'][$day->dayBegin][$Slot->pid]['times'][$Slot->time]))
82 92
                     {
83 93
                         $arrSortenAvailable = [];
84 94
                         $Sorten = StringUtil::deserialize($Slot->sorten,true);
... ...
@@ -88,7 +98,7 @@ class WeinanlieferungBookingsController extends AbstractController
88 98
                             $objLeseart = WeinanlieferungLeseartModel::findByPk($sorte['leseart']);
89 99
                             $arrSortenAvailable[] = ($objSorte !== null  ? $objSorte->title : '') . ' ' . ($objLeseart !== null  ? $objLeseart->title : '');
90 100
                         }
91
-                        $arrData['days'][$day->dayBegin][$Slot->time] = array_merge($Slot->row(),[
101
+                        $arrData['days'][$day->dayBegin][$Slot->pid]['times'][$Slot->time] = array_merge($Slot->row(),[
92 102
                             'sorten' => $arrSortenAvailable,
93 103
                             'behaelterAvailable' => $Slot->getAvailableBehaelter(),
94 104
                         ]);
... ...
@@ -128,7 +138,7 @@ class WeinanlieferungBookingsController extends AbstractController
128 138
                         $strStandort = $Standort->title;
129 139
                     }
130 140
 
131
-                    $arrData['days'][$day->dayBegin][$Slot->time]['items'][] = array_merge($booking->row(), [
141
+                    $arrData['days'][$day->dayBegin][$Slot->pid]['times'][$Slot->time]['items'][] = array_merge($booking->row(), [
132 142
                         'sorte'              => $arrSorten,
133 143
                         'ernteart' => $arrErnteart,
134 144
                         'lage' => $arrLagen,
Browse code

Add standort to backend views

Benjamin Roth authored on04/09/2023 16:17:33
Showing1 changed files
... ...
@@ -122,11 +122,18 @@ class WeinanlieferungBookingsController extends AbstractController
122 122
                         }
123 123
                     }
124 124
 
125
+                    $strStandort = '';
126
+                    if (($Standort = $Slot->getRelated('pid')) !== null)
127
+                    {
128
+                        $strStandort = $Standort->title;
129
+                    }
130
+
125 131
                     $arrData['days'][$day->dayBegin][$Slot->time]['items'][] = array_merge($booking->row(), [
126 132
                         'sorte'              => $arrSorten,
127 133
                         'ernteart' => $arrErnteart,
128 134
                         'lage' => $arrLagen,
129 135
                         'slot'  => $Slot->row(),
136
+                        'standort' => $strStandort,
130 137
                         'member' => $booking->getRelated('uid') !== null ? $booking->getRelated('uid')->row() : null
131 138
                     ]);
132 139
                 }
Browse code

Update

Benjamin Roth authored on30/08/2023 22:08:09
Showing1 changed files
... ...
@@ -62,6 +62,7 @@ class WeinanlieferungBookingsController extends AbstractController
62 62
             'request_token' => $this->tokenManager->getDefaultTokenValue(),
63 63
             'ref' => $this->request->attributes->get('_contao_referer_id')
64 64
         ];
65
+        System::loadLanguageFile('default');
65 66
 
66 67
         // Get bookings
67 68
         if (($bookings = WeinanlieferungReservationModel::findAllFuture(['order' => "(SELECT tl_vr_wa_slot.time FROM tl_vr_wa_slot WHERE tl_vr_wa_slot.id=tl_vr_wa_reservation.pid) ASC"])) !== null)
... ...
@@ -74,6 +75,8 @@ class WeinanlieferungBookingsController extends AbstractController
74 75
                 {
75 76
                     $day = new Date($Slot->date);
76 77
                     $arrSorten = [];
78
+                    $arrErnteart = [];
79
+                    $arrLagen = [];
77 80
 
78 81
                     if (!isset($arrData['days'][$day->dayBegin][$Slot->time]))
79 82
                     {
... ...
@@ -103,8 +106,26 @@ class WeinanlieferungBookingsController extends AbstractController
103 106
                         }
104 107
                     }
105 108
 
109
+                    if ($booking->ernteart !== null)
110
+                    {
111
+                        foreach (explode(',', $booking->ernteart) as $ernteart)
112
+                        {
113
+                            $arrErnteart[$ernteart] = $GLOBALS['TL_LANG']['REF']['wa_ernteart'][$ernteart] ?? $ernteart;
114
+                        }
115
+                    }
116
+
117
+                    if (($Lagen = $booking->getRelated('lage')) !== null)
118
+                    {
119
+                        foreach ($Lagen as $lage)
120
+                        {
121
+                            $arrLagen[$lage->id] = $lage->title;
122
+                        }
123
+                    }
124
+
106 125
                     $arrData['days'][$day->dayBegin][$Slot->time]['items'][] = array_merge($booking->row(), [
107 126
                         'sorte'              => $arrSorten,
127
+                        'ernteart' => $arrErnteart,
128
+                        'lage' => $arrLagen,
108 129
                         'slot'  => $Slot->row(),
109 130
                         'member' => $booking->getRelated('uid') !== null ? $booking->getRelated('uid')->row() : null
110 131
                     ]);
Browse code

Update

Benjamin Roth authored on17/08/2023 13:49:01
Showing1 changed files
... ...
@@ -106,7 +106,7 @@ class WeinanlieferungBookingsController extends AbstractController
106 106
                     $arrData['days'][$day->dayBegin][$Slot->time]['items'][] = array_merge($booking->row(), [
107 107
                         'sorte'              => $arrSorten,
108 108
                         'slot'  => $Slot->row(),
109
-                        'member' => $booking->getRelated('uid')->row()
109
+                        'member' => $booking->getRelated('uid') !== null ? $booking->getRelated('uid')->row() : null
110 110
                     ]);
111 111
                 }
112 112
             }
Browse code

Update

Benjamin Roth authored on17/08/2023 00:07:19
Showing1 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,122 @@
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\Backend;
14
+
15
+use Contao\CoreBundle\Controller\AbstractController;
16
+use Contao\CoreBundle\Csrf\ContaoCsrfTokenManager;
17
+use Contao\Date;
18
+use Contao\Environment;
19
+use Contao\FrontendUser;
20
+use Contao\Input;
21
+use Contao\StringUtil;
22
+use Contao\System;
23
+use Symfony\Component\HttpFoundation\RequestStack;
24
+use Symfony\Component\HttpFoundation\Response;
25
+use Symfony\Component\Routing\Annotation\Route;
26
+use Twig\Environment as TwigEnvironment;
27
+use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungLeseartModel;
28
+use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungRebsorteModel;
29
+use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungReservationModel;
30
+use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungSlotsModel;
31
+
32
+/**
33
+ * @Route("contao/weinanlieferung/buchungsliste", name=WeinanlieferungBookingsController::class, defaults={"_scope" = "backend"})
34
+ */
35
+class WeinanlieferungBookingsController extends AbstractController
36
+{
37
+    private $twig;
38
+    private $tokenManager;
39
+    private $request;
40
+
41
+    public function __construct(TwigEnvironment $twig, ContaoCsrfTokenManager $tokenManager, RequestStack $requestStack)
42
+    {
43
+        $this->twig = $twig;
44
+        $this->tokenManager = $tokenManager;
45
+        $this->request = $requestStack->getCurrentRequest();
46
+
47
+        $container = System::getContainer();
48
+        $objSession = $container->get('session');
49
+
50
+
51
+        $strKey = Input::get('popup') ? 'popupReferer' : 'referer';
52
+        $strRefererId = $this->request->attributes->get('_contao_referer_id');
53
+
54
+        $session = $objSession->get($strKey);
55
+        $session[$strRefererId]['current'] = substr(Environment::get('requestUri'), \strlen(Environment::get('path')) + 1);
56
+        $objSession->set($strKey, $session);
57
+    }
58
+    public function __invoke(): Response
59
+    {
60
+        $GLOBALS['TL_CSS']['cirrus'] = 'bundles/vonrotenbergweinanlieferung/css/backend.css|static';
61
+        $arrData = [
62
+            'request_token' => $this->tokenManager->getDefaultTokenValue(),
63
+            'ref' => $this->request->attributes->get('_contao_referer_id')
64
+        ];
65
+
66
+        // Get bookings
67
+        if (($bookings = WeinanlieferungReservationModel::findAllFuture(['order' => "(SELECT tl_vr_wa_slot.time FROM tl_vr_wa_slot WHERE tl_vr_wa_slot.id=tl_vr_wa_reservation.pid) ASC"])) !== null)
68
+        {
69
+            /** @var WeinanlieferungReservationModel $booking */
70
+            foreach ($bookings as $booking)
71
+            {
72
+                /** @var WeinanlieferungSlotsModel $Slot */
73
+                if (($Slot = $booking->getRelated('pid')) !== null)
74
+                {
75
+                    $day = new Date($Slot->date);
76
+                    $arrSorten = [];
77
+
78
+                    if (!isset($arrData['days'][$day->dayBegin][$Slot->time]))
79
+                    {
80
+                        $arrSortenAvailable = [];
81
+                        $Sorten = StringUtil::deserialize($Slot->sorten,true);
82
+                        foreach($Sorten as $sorte)
83
+                        {
84
+                            $objSorte = WeinanlieferungRebsorteModel::findByPk($sorte['sorte']);
85
+                            $objLeseart = WeinanlieferungLeseartModel::findByPk($sorte['leseart']);
86
+                            $arrSortenAvailable[] = ($objSorte !== null  ? $objSorte->title : '') . ' ' . ($objLeseart !== null  ? $objLeseart->title : '');
87
+                        }
88
+                        $arrData['days'][$day->dayBegin][$Slot->time] = array_merge($Slot->row(),[
89
+                            'sorten' => $arrSortenAvailable,
90
+                            'behaelterAvailable' => $Slot->getAvailableBehaelter(),
91
+                        ]);
92
+                    }
93
+
94
+                    if ($booking->sorten !== null)
95
+                    {
96
+                        $SortenLeseart = explode(';', $booking->sorten);
97
+                        foreach ($SortenLeseart as $sorteLeseart)
98
+                        {
99
+                            list($sorte, $leseart) = explode(',', $sorteLeseart);
100
+                            $objSorte = WeinanlieferungRebsorteModel::findByPk($sorte);
101
+                            $objLeseart = WeinanlieferungLeseartModel::findByPk($leseart);
102
+                            $arrSorten[$objSorte->id . ',' . $objLeseart->id] = ($objSorte !== null ? $objSorte->title : '') . ' ' . ($objLeseart !== null ? $objLeseart->title : '');
103
+                        }
104
+                    }
105
+
106
+                    $arrData['days'][$day->dayBegin][$Slot->time]['items'][] = array_merge($booking->row(), [
107
+                        'sorte'              => $arrSorten,
108
+                        'slot'  => $Slot->row(),
109
+                        'member' => $booking->getRelated('uid')->row()
110
+                    ]);
111
+                }
112
+            }
113
+        }
114
+
115
+        return new Response(
116
+            $this->twig->render(
117
+                '@Contao_VonrotenbergWeinanlieferungBundle/be_wa_buchungsliste.html.twig',
118
+                $arrData
119
+            )
120
+        );
121
+    }
122
+}