src/Controller/Api/Panier/PanierDetailsController.php line 19

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Api\Panier;
  3. use App\Entity\User;
  4. use App\Repository\EtatProductionRepository;
  5. use App\Repository\NmdAppPanierRepository;
  6. use App\Repository\PointOfSaleRepository;
  7. use App\Repository\ProductionRepository;
  8. use DateTime;
  9. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  10. use Symfony\Component\HttpFoundation\Exception\BadRequestException;
  11. use Symfony\Component\HttpFoundation\JsonResponse;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\Routing\Annotation\Route;
  14. use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
  15. class PanierDetailsController extends AbstractController
  16. {
  17.     public function __invoke(
  18.         Request $request,
  19.         PointOfSaleRepository $pointOfSaleRepository,
  20.         NmdAppPanierRepository $panierRepository
  21.     ): JsonResponse {
  22.         $pointOfSaleId=$request->query->get('pointOfSaleId',null);
  23.         $page=$request->query->get('page',1);
  24.         $pointOfSale $pointOfSaleRepository->findOneBy(['id' => $pointOfSaleId]);
  25.         // Retrieve and cast filters
  26.         $mois = (int) $request->query->get('mois'date('n'));   // 'n' gives numeric month without leading zero
  27.         $annee = (int) $request->query->get('annee'date('Y')); // 'Y' gives full year (e.g. 2025)
  28.         // Get panier data with filters
  29.         $data $panierRepository->getPanierDetailsByHour($pointOfSale$mois$annee,$page);
  30.         if (empty($data)) {
  31.             return new JsonResponse(['erreur' => 'Aucun résultat trouvé'], 404);
  32.         }
  33.         // Organisation des résultats
  34.         $formattedResult = [];
  35.         foreach ($data as $row) {
  36.             $heure = (int) $row['heure'];
  37.             $userId $row['user_id'];
  38.             $nombreLignes = (int) $row['nombre_lignes'];
  39.             unset($row['heure'], $row['user_id'], $row['nombre_lignes']);
  40.             if (!isset($formattedResult[$heure])) {
  41.                 $formattedResult[$heure] = [
  42.                     'nombre_lignes' => 0,
  43.                     'details' => [],
  44.                 ];
  45.             }
  46.             $formattedResult[$heure]['nombre_lignes'] += $nombreLignes;
  47.             $formattedResult[$heure]['details'][] = [
  48.                 'user_id' => $userId,
  49.                 'paniers' => $this->cleanPanierData($row),
  50.             ];
  51.         }
  52.         // Keep totals independent unless you also want to filter them
  53.         $total_this_day $panierRepository->getTotalThisElement($pointOfSale'day');
  54.         $total_this_hour $panierRepository->getTotalThisElement($pointOfSale'hour');
  55.         $formattedResult['total_this_day'] = (int) $total_this_day;
  56.         $formattedResult['total_this_hour'] = (int) $total_this_hour;
  57.         return new JsonResponse($formattedResult200);
  58.     }
  59.     private function cleanPanierData(array $panier): array
  60.     {
  61.         unset($panier['nombre_lignes'], $panier['user_id'], $panier['heure']);
  62.         return $panier;
  63.     }
  64.     /**
  65.      * @Route("api/paniers-non-valides", name="api_get_paniers_not_validated", methods={"GET"})
  66.      */
  67.     public function getPaniersNonValides(
  68.         Request $request,
  69.         PointOfSaleRepository $pointOfSaleRepository,
  70.         NmdAppPanierRepository $panierRepository
  71.     ): JsonResponse {
  72.         $pointOfSaleId $request->query->get('pointOfSaleId'null);
  73.         $pointOfSale $pointOfSaleRepository->findOneBy(['id' => $pointOfSaleId]);
  74.         // Traitement de la date
  75.         $date $request->query->get('date'date('Y-m-d'));
  76.         $date str_replace('/''-'$date);
  77.         try {
  78.             $date = new \DateTime($date);
  79.         } catch (\Throwable $th) {
  80.             return new JsonResponse(['erreur' => 'La date ne respecte pas le format attendu (YYYY-MM-DD)'], 400);
  81.         }
  82.         // Traitement du paramètre yearMonth (format attendu : YYYY-MM)
  83.         $yearMonth $request->query->get('yearMonth'date('Y-m'));
  84.         $yearMonth str_replace('/''-'$yearMonth); // supporte aussi YYYY/MM
  85.         try {
  86.             $yearMonthDate = \DateTime::createFromFormat('Y-m'$yearMonth);
  87.             if (!$yearMonthDate) {
  88.                 throw new \Exception();
  89.             }
  90.             $year = (int) $yearMonthDate->format('Y');
  91.             $month = (int) $yearMonthDate->format('m');
  92.         } catch (\Exception $e) {
  93.             return new JsonResponse(['erreur' => 'Le paramètre yearMonth doit être au format YYYY-MM'], 400);
  94.         }
  95.         // Récupération des paniers non validés avec les filtres
  96.         $data $panierRepository->getPaniersNonValides($pointOfSale$date$year$month);
  97.         if (empty($data)) {
  98.             return new JsonResponse(['erreur' => 'Aucun résultat trouvé'], 200);
  99.         }
  100.         return new JsonResponse(["total"=>count($data)??0,"details"=>$data], 200);
  101.     }
  102. }