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

namespace PotageBundle\Controller;

5
use PotageBundle\Entity\Commande;
6
use PotageBundle\Entity\CommandeLegumes;
7 8 9 10
use PotageBundle\Entity\Groupe;
use PotageBundle\Entity\Lettre;
use PotageBundle\Entity\Offre;
use PotageBundle\Entity\OffreLegumes;
Mat's avatar
Mat committed
11
use PotageBundle\Entity\User;
12
use PotageBundle\Entity\Utilisateur;
13
use PotageBundle\Form\Membre\CommandeType;
Mat's avatar
Mat committed
14 15 16 17 18 19 20 21 22
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
hop  
Mat committed
23 24 25
     *
     * 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
26 27 28 29 30 31 32 33 34 35 36 37 38
     *
     * @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)
        {
39
            $groupes = $this->getGroupesDepotLettresAndOffreLegumes($user);
Mat's avatar
Mat committed
40 41 42 43
            
            if ($request->query->has('token'))
            {
                $token = $request->query->get('token');
Mat's avatar
Mat committed
44
                $tokenInside = $lettreToken->decodePotageUserToken($token);
45 46 47
                $currentOffre = $this->getCurrentOffre($tokenInside['offre_ref']);
            }
            else {
Mat's avatar
Mat committed
48 49
                $token = null;
                $tokenInside =null;
50
                $currentOffre = null;
Mat's avatar
Mat committed
51 52 53 54 55 56 57
            }
            
            return $this->render('@Potage/Membre/today.html.twig', array(
                'user' => $user,
                'groupes' => $groupes,
                'token' => $token,
                'tokenInside' => $tokenInside,
58 59 60
                'offreOne' => $currentOffre['offreOne'],
                'legumesSorted' => $currentOffre['legumesSorted'],
                'groupeOne' => $currentOffre['groupeOne'],
Mat's avatar
Mat committed
61 62 63 64 65 66 67
            ));
        }
        
    }
    
    
    /**
Mat's avatar
hop  
Mat committed
68 69
     * Lorsqu'on pointe explicitement la référence de l'offre
     *
70
     * @param Request $request
71
     * @param string $offre_ref
Mat's avatar
Mat committed
72 73 74
     * @return \Symfony\Component\HttpFoundation\Response
     * @throws \Doctrine\ORM\NonUniqueResultException
     */
75
    public function todayOneAction(Request $request, $offre_ref)
Mat's avatar
Mat committed
76 77
    {
        $user = $this->getUser();
78
        
Mat's avatar
Mat committed
79 80
        if ($user !== null)
        {
81
            $groupes = $this->getGroupesDepotLettresAndOffreLegumes($user);
82
    
83
            $currentOffre = $this->getCurrentOffre($offre_ref);
84
            $offre = $currentOffre['offreOne'];
85 86
    
            /**
87
             *  Il faut que l'offre soit en cours, et qu'on aie le droit d'y accéder
88 89 90
             */
            if ($currentOffre['offreOne'] === null || ! $groupes->contains($currentOffre['groupeOne']))
            {
91 92
                return $this->redirectToRoute('potage_today');
            }
93
    
94
            /**
95 96 97 98
             *  Le formulaire de commande, formulaire imbriqué
             *  qui crée une commande et des commandeLégumes
             *
             *  @var OffreLegumes $legume
99
             */
100
            $commande = new Commande($offre, $user);
Mat's avatar
hop  
Mat committed
101
            
102 103 104 105
            foreach ($currentOffre['legumesSorted'] as $legume)
            {
                $item = new CommandeLegumes();
                $item
106
                    ->setOffreLegume($legume)
107 108 109 110 111 112 113
                    ->setPrixUnitaire($legume->getPrixUnitaire())
                    ->setUnite($legume->getUnite())
                    ->setQuantite(0.0)
                    ->setPrix(0.0)
                ;
                $commande->addCommandeLegumes($item);
            }
114
            
115 116
            $form = $this->createForm(CommandeType::class, $commande);
            $form->handleRequest($request);
Mat's avatar
Mat committed
117 118 119 120
    
            /**
             *  POST
             */
121 122
            if ($form->isSubmitted() && $form->isValid())
            {
123 124 125
                $total = 0.0;
                foreach ($commande->getCommandeLegumes() as $item)
                {
Mat's avatar
Mat committed
126 127 128 129 130 131 132
                    /**
                     * - on évacue les légumes qui ne sont pas sélectionnés
                     * - soit on calcule le prix sur base de la quantité
                     * - soit on calcule la quantité sur base du prix
                     */
                    if ( $item->getQuantite() === 0.0 && $item->getPrix() === 0.0 )
                    {
133
                        $commande->removeCommandeLegumes($item);
Mat's avatar
Mat committed
134 135 136 137 138 139 140 141 142 143 144
                    } else {
                        if ($item->getPrix() === 0.0)
                        {
                            $item->setPrix(
                                round($item->getPrixUnitaire() * $item->getQuantite(), 2)
                            );
                        } else {
                            $item->setQuantite(
                                round($item->getPrix() / $item->getPrixUnitaire(), 3)
                            );
                        }
145 146 147 148 149 150
                        $total += $item->getPrix();
                    }
                }
                $commande->setPrixTotal($total);
                dump($commande);
                
151 152 153
                $em = $this->getDoctrine()->getManager();
                $em->persist($commande);
                $em->flush();
Mat's avatar
Mat committed
154
                $this->addFlash('success', 'Votre commande a bien été enregistrée.');
155
                
156 157
                return $this->redirectToRoute('potage_resume');
                
158
            }
Mat's avatar
Mat committed
159 160 161 162 163 164
            
            return $this->render('@Potage/Membre/today.html.twig', array(
                'user' => $user,
                'groupes' => $groupes,
                'token' => null,
                'tokenInside' => null,
165 166 167
                'offreOne' => $currentOffre['offreOne'],
                'legumesSorted' => $currentOffre['legumesSorted'],
                'groupeOne' => $currentOffre['groupeOne'],
168
                'formCommande' => $form->createView(),
Mat's avatar
Mat committed
169 170 171 172 173
            ));
        }
        
    }
    
174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
    /**
     * 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
199
                 * @var OffreLegumes $legume
200 201 202 203 204 205 206 207 208 209 210 211
                 */
                $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
212
    
Mat's avatar
Mat committed
213 214 215 216 217 218 219 220 221

    /**
     * Retourne un tableau d'objets OffreLégumes triés
     *
     * @param Offre $offre
     * @return array
     */
    private function getOffreLegumesSorted(Offre $offre)
    {
222
        $legumesSorted = array();
Mat's avatar
Mat committed
223 224 225 226 227 228 229 230 231 232 233
        $sort = explode(",", $offre->getSorted());
        foreach ($sort as $k => $v)
        {
            foreach ($offre->getOffreLegumes() as $legume)
            {
                if ($legume->getId() === intval($v))
                {
                    $legumesSorted[$k] = $legume;
                }
            }
        }
234 235 236 237
        if (count($legumesSorted) !== count($offre->getOffreLegumes())) {
            $legumesSorted = $offre->getOffreLegumes();
        }
        
Mat's avatar
Mat committed
238 239
        return $legumesSorted;
    }
Mat's avatar
Mat committed
240
    
241 242
    
    /**
243
     * Récupère l'offre courante, le groupe indirectement associé, et l'ordre des items
244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266
     *
     * @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 )
267
             *
268 269 270 271 272 273 274 275 276 277 278 279 280 281
             * 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],
        ];
    }
    
282 283 284 285 286 287
    
    /**
     * @return \Symfony\Component\HttpFoundation\Response
     */
    public function resumeAction()
    {
288 289 290 291 292 293 294 295 296 297 298 299 300
        $user = $this->getUser();
    
        if ($user !== null)
        {
            $em = $this->getDoctrine()->getManager();
            $commandes = $em->getRepository('PotageBundle:Commande')
                ->findAllCurrentByUser($user->getId());
            
            
            return $this->render('PotageBundle:Membre:resume.html.twig', array(
                'commandes' => $commandes
            ));
        }
301 302
    }
    
303
    
Mat's avatar
Mat committed
304
}