src/Controller/RecetteController.php line 193

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use DateTime;
  4. use App\Entity\Depense;
  5. use App\Entity\Recette;
  6. use App\Entity\Boutique;
  7. use App\Form\DepenseType;
  8. use App\Entity\SortieStock;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use Symfony\Component\HttpFoundation\Request;
  11. use Symfony\Component\HttpFoundation\Response;
  12. use Symfony\Component\Routing\Annotation\Route;
  13. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  14. class RecetteController extends AbstractController
  15. {
  16.     #[Route('/recettes'name'app_recettes'methods: ['GET'])]
  17. public function index(EntityManagerInterface $entityManager): Response
  18. {
  19.     // Récupérer toutes les boutiques
  20.     $boutiques $entityManager->getRepository(Boutique::class)->findAll();
  21.     
  22.     // Récupérer toutes les recettes
  23.     $recettes $entityManager->getRepository(Recette::class)->findAll();
  24.     
  25.     // Initialiser le tableau avec toutes les boutiques
  26.     $recettesParBoutique = [];
  27.     
  28.     // D'abord, initialiser toutes les boutiques (même sans recettes)
  29.     foreach ($boutiques as $boutique) {
  30.         $recettesParBoutique[$boutique->getId()] = [
  31.             'boutique' => $boutique,
  32.             'boutiqueNom' => $boutique->getNom(),
  33.             'recettes' => []
  34.         ];
  35.     }
  36.     
  37.     // Ajouter une entrée pour les recettes sans boutique
  38.     $recettesParBoutique[0] = [
  39.         'boutique' => null,
  40.         'boutiqueNom' => 'Sans boutique',
  41.         'recettes' => []
  42.     ];
  43.     
  44.     // Ensuite, ajouter les recettes dans leurs boutiques respectives
  45.     foreach ($recettes as $recette) {
  46.         $boutique $recette->getBoutique();
  47.         $boutiqueId $boutique $boutique->getId() : 0;
  48.         
  49.         // Calculer le montant net pour cette recette
  50.         $totalDepenses 0;
  51.         foreach ($recette->getDepenses() as $depense) {
  52.             $totalDepenses += $depense->getMontant();
  53.         }
  54.         $montantNet $recette->getMontant() - $totalDepenses;
  55.         
  56.         // Ajouter la recette avec ses données calculées
  57.         $recettesParBoutique[$boutiqueId]['recettes'][] = [
  58.             'recette' => $recette,
  59.             'totalDepenses' => $totalDepenses,
  60.             'montantNet' => $montantNet
  61.         ];
  62.     }
  63.     
  64.     // Supprimer l'entrée "Sans boutique" si elle n'a pas de recettes
  65.     if (empty($recettesParBoutique[0]['recettes'])) {
  66.         unset($recettesParBoutique[0]);
  67.     }
  68.     
  69.     // Cumuler les recettes par jour pour chaque boutique
  70.     foreach ($recettesParBoutique as $boutiqueId => &$boutique) {
  71.         $recettesCumulees = [];
  72.         
  73.         // Grouper les recettes par jour
  74.         foreach ($boutique['recettes'] as $recetteData) {
  75.             $dateJour $recetteData['recette']->getDateRecette()->format('Y-m-d');
  76.             
  77.             if (!isset($recettesCumulees[$dateJour])) {
  78.                 $recettesCumulees[$dateJour] = [
  79.                     'date' => $recetteData['recette']->getDateRecette(),
  80.                     'montantBrut' => 0,
  81.                     'totalDepenses' => 0,
  82.                     'montantNet' => 0,
  83.                     'nombreRecettes' => 0,
  84.                     'sources' => [],
  85.                     'recettesDetails' => []
  86.                 ];
  87.             }
  88.             
  89.             // Cumuler les montants
  90.             $recettesCumulees[$dateJour]['montantBrut'] += $recetteData['recette']->getMontant();
  91.             $recettesCumulees[$dateJour]['totalDepenses'] += $recetteData['totalDepenses'];
  92.             $recettesCumulees[$dateJour]['montantNet'] += $recetteData['montantNet'];
  93.             $recettesCumulees[$dateJour]['nombreRecettes']++;
  94.             
  95.             // Ajouter la source si pas déjà présente
  96.             $source $recetteData['recette']->getSource();
  97.             if (!in_array($source$recettesCumulees[$dateJour]['sources'])) {
  98.                 $recettesCumulees[$dateJour]['sources'][] = $source;
  99.             }
  100.             
  101.             // Garder le détail des recettes pour les actions
  102.             $recettesCumulees[$dateJour]['recettesDetails'][] = $recetteData['recette'];
  103.         }
  104.         
  105.         // Trier par date (plus récentes en premier)
  106.         uksort($recettesCumulees, function($a$b) {
  107.             return $b <=> $a;
  108.         });
  109.         
  110.         // Remplacer les recettes individuelles par les recettes cumulées
  111.         $boutique['recettesCumulees'] = $recettesCumulees;
  112.         unset($boutique['recettes']); // Supprimer l'ancien tableau
  113.     }
  114.     
  115.     return $this->render('recette/index.html.twig', [
  116.         'recettesParBoutique' => $recettesParBoutique
  117.     ]);
  118. }
  119.     #[Route('/recette/generate'name'app_generate_recette'methods: ['POST'])]
  120.     public function generateRecette(EntityManagerInterface $entityManager): Response
  121.     {
  122.         $sortiesStock $entityManager->getRepository(SortieStock::class)->findAll();
  123.         $recettesParJour = [];
  124.         foreach ($sortiesStock as $sortie) {
  125.             $date $sortie->getDateSortie()->format('Y-m-d');
  126.             $prixVente $sortie->getPrixVente();
  127.             if (!isset($recettesParJour[$date])) {
  128.                 $recettesParJour[$date] = 0;
  129.             }
  130.             $recettesParJour[$date] += $prixVente;
  131.         }
  132.         foreach ($recettesParJour as $date => $montant) {
  133.             $recette $entityManager->getRepository(Recette::class)->findOneBy(['dateRecette' => new DateTime($date)]);
  134.             if (!$recette) {
  135.                 $recette = new Recette();
  136.                 $recette->setDateRecette(new DateTime($date));
  137.                 $recette->setMontant($montant);
  138.             } else {
  139.                 $recette->setMontant($recette->getMontant() + $montant);
  140.             }
  141.             $entityManager->persist($recette);
  142.         }
  143.         $entityManager->flush();
  144.         return $this->redirectToRoute('app_recettes');
  145.     }
  146.     #[Route('/depense/new'name'app_depense_new'methods: ['GET''POST'])]
  147.     public function newDepense(Request $requestEntityManagerInterface $entityManager): Response
  148.     {
  149.         $depense = new Depense();
  150.         $form $this->createForm(DepenseType::class, $depense);
  151.         $form->handleRequest($request);
  152.         if ($form->isSubmitted() && $form->isValid()) {
  153.             $depense->setDateDepense(new DateTime('now'));
  154.             $date $depense->getDateDepense()->format('Y-m-d');
  155.             $recette $entityManager->getRepository(Recette::class)->findOneBy(['dateRecette' => new \DateTime($date)]);
  156.             if (!$recette) {
  157.                 $recette = new Recette();
  158.                 $recette->setDateRecette(new DateTime($date));
  159.                 $recette->setMontant(0);
  160.             }
  161.             $recette->addDepense($depense);
  162.             $recette->setMontant($recette->getMontant() - $depense->getMontant());
  163.             $entityManager->persist($depense);
  164.             $entityManager->persist($recette);
  165.             $entityManager->flush();
  166.             return $this->redirectToRoute('app_recettes');
  167.         }
  168.         return $this->render('depense/new.html.twig', [
  169.             'form' => $form->createView(),
  170.         ]);
  171.     }
  172.     #[Route('/recette/{id}'name'app_recette_show'methods: ['GET'])]
  173.     public function show(EntityManagerInterface $entityManagerint $id): Response
  174.     {
  175.         $recette $entityManager->getRepository(Recette::class)->find($id);
  176.         if (!$recette) {
  177.             throw $this->createNotFoundException('La recette n\'existe pas.');
  178.         }
  179.         $depenses $recette->getDepenses();
  180.         $totalDepenses array_reduce($depenses->toArray(), function ($carry$depense) {
  181.             return $carry $depense->getMontant();
  182.         }, 0);
  183.         $montantNet $recette->getMontant() - $totalDepenses;
  184.         return $this->render('recette/show.html.twig', [
  185.             'recette' => $recette,
  186.             'totalDepenses' => $totalDepenses,
  187.             'montantNet' => $montantNet,
  188.         ]);
  189.     }
  190. }