MembreController.php 7.1 KB
Newer Older
Mat's avatar
Mat committed
1 2 3 4
<?php

namespace PotageBundle\Controller;

5
use PotageBundle\Entity\Commande;
6 7 8 9
use PotageBundle\Entity\Groupe;
use PotageBundle\Entity\Lettre;
use PotageBundle\Entity\Offre;
use PotageBundle\Entity\OffreLegumes;
Mat's avatar
Mat committed
10
use PotageBundle\Entity\User;
11
use PotageBundle\Entity\Utilisateur;
12
use PotageBundle\Form\Membre\CommandeType;
Mat's avatar
Mat committed
13 14 15 16 17 18 19 20 21
use PotageBundle\Services\LettreToken;
use Symfony\Component\HttpFoundation\Request;

class MembreController extends MasterController
{
    
    /**
     * La page today affiche le(s) offres disponibles pour un user
     * identifié sur base du token passé dans le lien
Mat's avatar
Mat committed
22 23 24
     *
     * Affiche l'offre qui est indiquée dans le token
     * ou sans token, la liste des offres du moment pour cet utilisateur
Mat's avatar
Mat committed
25 26 27 28 29 30 31 32 33 34 35 36 37
     *
     * @param Request $request
     * @param LettreToken $lettreToken
     * @return \Symfony\Component\HttpFoundation\Response
     * @throws \Doctrine\ORM\NonUniqueResultException
     */
    public function todayAction(Request $request, LettreToken $lettreToken)
    {
        
        $user = $this->getUser();
        
        if ($user !== null)
        {
38
            $groupes = $this->getGroupesDepotLettresAndOffreLegumes($user);
Mat's avatar
Mat committed
39 40 41 42
            
            if ($request->query->has('token'))
            {
                $token = $request->query->get('token');
Mat's avatar
Mat committed
43
                $tokenInside = $lettreToken->decodePotageUserToken($token);
44 45 46
                $currentOffre = $this->getCurrentOffre($tokenInside['offre_ref']);
            }
            else {
Mat's avatar
Mat committed
47 48
                $token = null;
                $tokenInside =null;
49
                $currentOffre = null;
Mat's avatar
Mat committed
50 51 52 53 54 55 56
            }
            
            return $this->render('@Potage/Membre/today.html.twig', array(
                'user' => $user,
                'groupes' => $groupes,
                'token' => $token,
                'tokenInside' => $tokenInside,
57 58 59
                'offreOne' => $currentOffre['offreOne'],
                'legumesSorted' => $currentOffre['legumesSorted'],
                'groupeOne' => $currentOffre['groupeOne'],
Mat's avatar
Mat committed
60 61 62 63 64 65 66
            ));
        }
        
    }
    
    
    /**
Mat's avatar
Mat committed
67 68
     * Lorsqu'on pointe explicitement la référence de l'offre
     *
69
     * @param Request $request
70
     * @param string $offre_ref
Mat's avatar
Mat committed
71 72 73
     * @return \Symfony\Component\HttpFoundation\Response
     * @throws \Doctrine\ORM\NonUniqueResultException
     */
74
    public function todayOneAction(Request $request, $offre_ref)
Mat's avatar
Mat committed
75 76
    {
        $user = $this->getUser();
77
        
Mat's avatar
Mat committed
78 79
        if ($user !== null)
        {
80
            $groupes = $this->getGroupesDepotLettresAndOffreLegumes($user);
81
    
82
            $currentOffre = $this->getCurrentOffre($offre_ref);
83
            $offre = $currentOffre['offreOne'];
84 85 86 87 88 89
    
            /**
             *  il faut que l'offre soit en cours, et qu'on aie le droit d'y accéder
             */
            if ($currentOffre['offreOne'] === null || ! $groupes->contains($currentOffre['groupeOne']))
            {
90 91
                return $this->redirectToRoute('potage_today');
            }
92 93 94 95 96 97 98 99 100 101 102 103
    
            $commande = new Commande($offre, $user);
            $form = $this->createForm(CommandeType::class, $commande);
            $form->handleRequest($request);
            
            if ($form->isSubmitted() && $form->isValid())
            {
                $em = $this->getDoctrine()->getManager();
                $em->persist($commande);
                $em->flush();
                
            }
Mat's avatar
Mat committed
104 105 106 107 108 109
            
            return $this->render('@Potage/Membre/today.html.twig', array(
                'user' => $user,
                'groupes' => $groupes,
                'token' => null,
                'tokenInside' => null,
110 111 112
                'offreOne' => $currentOffre['offreOne'],
                'legumesSorted' => $currentOffre['legumesSorted'],
                'groupeOne' => $currentOffre['groupeOne'],
113
                'formCommande' => $form->createView(),
Mat's avatar
Mat committed
114 115 116 117 118
            ));
        }
        
    }
    
119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
    /**
     * Récupère la chaîne d'objets
     * User -> Utilisateur -> Groupes -> Lettres -> Offre -> Legumes
     *
     * @param User $user
     * @return \Doctrine\Common\Collections\Collection
     */
    private function getGroupesDepotLettresAndOffreLegumes(User $user)
    {
        /**
         * @var Utilisateur $utilisateur
         * @var Groupe $groupe
         */
        $utilisateur = $user->getUtilisateur();
        $groupes = $utilisateur->getGroupes();
        foreach ($groupes as $groupe)
        {
            /**
             * @var Lettre $lettre
             */
            $lettres = $groupe->getLettres();
            foreach ($lettres as $lettre)
            {
                /**
                 * @var Offre $offre
144
                 * @var OffreLegumes $legume
145 146 147 148 149 150 151 152 153 154 155 156
                 */
                $offre = $lettre->getOffre();
            
                $legumes = $offre->getOffreLegumes();
                foreach ($legumes as $legume)
                {
                    // semble nécessaire pour récupérer les légumes
                }
            }
        }
        return $groupes;
    }
Mat's avatar
Mat committed
157
    
158 159 160 161 162 163 164 165 166

    /**
     * Retourne un tableau d'objets OffreLégumes triés
     *
     * @param Offre $offre
     * @return array
     */
    private function getOffreLegumesSorted(Offre $offre)
    {
167
        $legumesSorted = array();
168 169 170 171 172 173 174 175 176 177 178
        $sort = explode(",", $offre->getSorted());
        foreach ($sort as $k => $v)
        {
            foreach ($offre->getOffreLegumes() as $legume)
            {
                if ($legume->getId() === intval($v))
                {
                    $legumesSorted[$k] = $legume;
                }
            }
        }
179 180 181 182
        if (count($legumesSorted) !== count($offre->getOffreLegumes())) {
            $legumesSorted = $offre->getOffreLegumes();
        }
        
183 184
        return $legumesSorted;
    }
Mat's avatar
Mat committed
185
    
186 187
    
    /**
188
     * Récupère l'offre courante, le groupe indirectement associé, et l'ordre des items
189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211
     *
     * @param $reference
     * @return array
     * @throws \Doctrine\ORM\NonUniqueResultException
     */
    private function getCurrentOffre($reference)
    {
        /**
         * @var Offre $offreOne
         */
        $offreOne = $this->getDoctrine()->getManager()
            ->getRepository('PotageBundle:Offre')
            ->findOneByReference($reference);
    
        $groupeOne = array();
        $lettres = $offreOne->getLettres();
        foreach ($lettres as $lettre)
        {
            /**
             * TODO cas particulier: ça va coincer si une même offre est attachée à plusieurs lettres !
             * dans ce cas il y a plusieurs groupes, mais on ne veut afficher que celui
             * qui concerne l'utilisateur.
             * (-> passer $groupes dans la fonction, condition: être dans $groupes pour ajouter au tableau $groupeOne, et si $token, on n'affiche qu'un )
212
             *
213 214 215 216 217 218 219 220 221 222 223 224 225 226
             * Temporairement, on ne retourne que le premier groupe du tableau !!
             */
            $groupeOne[] = $lettre->getGroupe();
        }
    
        $legumesSorted = $this->getOffreLegumesSorted($offreOne);

        return [
            'offreOne' => $offreOne,
            'legumesSorted' =>$legumesSorted,
            'groupeOne' => $groupeOne[0],
        ];
    }
    
Mat's avatar
Mat committed
227
}