src/Controller/Api/Production/ProductionsRaccoValidController.php line 84

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Api\Production;
  3. use DateTime;
  4. use App\Entity\User;
  5. use App\Service\HierarchyService;
  6. use App\Repository\UserRepository;
  7. use App\Repository\ClusterRepository;
  8. use App\Repository\ProductionRepository;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use App\Repository\PointOfSaleRepository;
  11. use App\Repository\EtatProductionRepository;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\Routing\Annotation\Route;
  14. use Symfony\Component\HttpFoundation\JsonResponse;
  15. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  16. use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
  17. class ProductionsRaccoValidController extends AbstractController
  18. {
  19.     private $clusterRepository;
  20.     private $productionRepository;
  21.     private $pointOfSaleRepository;
  22.     private $userRepository;
  23.     private $etatRepository;
  24.     public function __construct(
  25.         ClusterRepository $clusterRepository,
  26.         ProductionRepository $productionRepository,
  27.         PointOfSaleRepository $pointOfSaleRepository,
  28.         UserRepository $userRepository,
  29.         EtatProductionRepository $etatRepository
  30.     ) {
  31.         $this->clusterRepository $clusterRepository;
  32.         $this->productionRepository $productionRepository;
  33.         $this->pointOfSaleRepository $pointOfSaleRepository;
  34.         $this->userRepository $userRepository;
  35.         $this->etatRepository $etatRepository;
  36.     }
  37.     public function __invoke($annee$optionRequest $request,EntityManagerInterface $entityManager,
  38.     HierarchyService $hierarchyService)
  39.     {
  40.         $pointOfSaleId $request->query->get('pointOfSaleId'null);
  41.         $pointOfSale null;
  42.         if ($pointOfSaleId) {
  43.             $pointOfSale $this->pointOfSaleRepository->find($pointOfSaleId);
  44.             if (!$pointOfSale) {
  45.                 return  new JsonResponse('Le point de vente avec cet ID n\'existe pas.');
  46.             }
  47.         }
  48.         if ((strtolower($option) != 'r') && (strtolower($option) != 'v')) {
  49.             return new JsonResponse(['error' => 'Vérifier l option de selection'], 404);
  50.         }
  51.         $codeCluster $request->query->get('codeCluster'null);
  52.         $mois $request->query->get('mois'null);
  53.         $cluster null;
  54.         if ($codeCluster) {
  55.             $cluster $this->clusterRepository->findOneBy(['codeCluster' => $codeCluster]);
  56.             if ($cluster == null) {
  57.                 return new JsonResponse(['error' => 'Aucun cluster avec ce code'], 404);
  58.             }
  59.         }
  60.         $codeInsee $request->query->get('codeInsee'null);
  61.         $organisationId $request->query->get('organisationId'null);
  62.         $etatId=$request->query->get('etatId'1);
  63.         $etat $this->etatRepository->findOneBy(['id'=>$etatId]);
  64.         if ($etat == null) {
  65.             return new JsonResponse(['error' => 'Aucune état avec cet ID'], 404);
  66.         }
  67.         $childs = [];
  68.         $user null;
  69.         if ($request->query->get('idUser') != null) {
  70.             $user $entityManager->getRepository(User::class)->find((int)$request->query->get('idUser'));
  71.             if (!$user) {
  72.                 throw new BadRequestHttpException('L\'utilisateur avec cet ID n\'existe pas.');
  73.             }
  74.             // Récupérer l'hierarchie descendante
  75.             if (in_array('ROLE_MANAGER'$user->getRoles()) || in_array('ROLE_DIRECTOR'$user->getRoles())) {
  76.                 $childs array_map(fn($p) => (int) $p['id'], $hierarchyService->getHierarchyDescendante($user->getId()));
  77.             }
  78.         }
  79.         $productionsCohorte $this->productionRepository->getProductionsRaccoValidRate($pointOfSale$cluster$mois$annee$codeInsee$etat$option,$childs,$organisationId);
  80.         return new JsonResponse($this->transformResult($productionsCohorte$option));
  81.     }
  82.     private function transformResult(array $queryResultsstring $option): array
  83.     {
  84.         $formattedResults = [];
  85.         foreach ($queryResults as $row) {
  86.             $mois_raccordement sprintf('%04d-%02d'$row['annee_racc'], $row['mois_racc']);
  87.             $mois_validation sprintf('%04d-%02d'$row['annee_validation'], $row['mois_validation']);
  88.             if ($option === "R") {
  89.                 // Organisation des résultats selon le mois de raccordement
  90.                 if (!isset($formattedResults[$mois_raccordement])) {
  91.                     $formattedResults[$mois_raccordement] = [
  92.                         'mois_raccordement' => $mois_raccordement,
  93.                         'total_ventes_raccordees' => 0,
  94.                         'ventes_par_mois_validation' => []
  95.                     ];
  96.                 }
  97.                 // Ajout du total des ventes raccordées
  98.                 $formattedResults[$mois_raccordement]['total_ventes_raccordees'] += $row['total_ventes'];
  99.                 // Ajout des ventes par mois de validation
  100.                 if (!isset($formattedResults[$mois_raccordement]['ventes_par_mois_validation'][$mois_validation])) {
  101.                     $formattedResults[$mois_raccordement]['ventes_par_mois_validation'][$mois_validation] = [
  102.                         'ventes' => 0,
  103.                         'pourcentage' => "0%"
  104.                     ];
  105.                 }
  106.                 $formattedResults[$mois_raccordement]['ventes_par_mois_validation'][$mois_validation]['ventes'] += $row['total_ventes'];
  107.             } elseif ($option === "V") {
  108.                 // Organisation des résultats selon le mois de validation
  109.                 if (!isset($formattedResults[$mois_validation])) {
  110.                     $formattedResults[$mois_validation] = [
  111.                         'mois_validation' => $mois_validation,
  112.                         'total_ventes_validees' => 0,
  113.                         'ventes_par_mois_raccordement' => []
  114.                     ];
  115.                 }
  116.                 // Ajout du total des ventes validées
  117.                 $formattedResults[$mois_validation]['total_ventes_validees'] += $row['total_ventes'];
  118.                 // Ajout des ventes par mois de raccordement
  119.                 if (!isset($formattedResults[$mois_validation]['ventes_par_mois_raccordement'][$mois_raccordement])) {
  120.                     $formattedResults[$mois_validation]['ventes_par_mois_raccordement'][$mois_raccordement] = [
  121.                         'ventes' => 0,
  122.                         'pourcentage' => "0%"
  123.                     ];
  124.                 }
  125.                 $formattedResults[$mois_validation]['ventes_par_mois_raccordement'][$mois_raccordement]['ventes'] += $row['total_ventes'];
  126.             }
  127.         }
  128.         // Calcul des pourcentages après agrégation
  129.         foreach ($formattedResults as &$result) {
  130.             if ($option === "R") {
  131.                 $totalVentes $result['total_ventes_raccordees'];
  132.                 foreach ($result['ventes_par_mois_validation'] as &$validation) {
  133.                     $validation['pourcentage'] = $this->calculerPourcentage($totalVentes$validation['ventes']) . "%";
  134.                 }
  135.             } elseif ($option === "V") {
  136.                 $totalVentes $result['total_ventes_validees'];
  137.                 foreach ($result['ventes_par_mois_raccordement'] as &$raccordement) {
  138.                     $raccordement['pourcentage'] = $this->calculerPourcentage($totalVentes$raccordement['ventes']) . "%";
  139.                 }
  140.             }
  141.         }
  142.         // Réindexer sous forme de liste
  143.         return array_values($formattedResults);
  144.     }
  145.     // Fonction de calcul de pourcentage
  146.     private function calculerPourcentage($total$ventes)
  147.     {
  148.         if ($total == 0) {
  149.             return 0// Évite la division par zéro
  150.         }
  151.         return round(($ventes $total) * 100);
  152.     }
  153. }