src/Controller/Api/History/HistoryAnalyticsController.php line 22

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Api\History;
  3. use App\Entity\User;
  4. use App\Repository\EtatProductionRepository;
  5. use App\Repository\HistoryRepository;
  6. use App\Service\HierarchyService;
  7. use App\Repository\UserRepository;
  8. use App\Repository\PointOfSaleRepository;
  9. use App\Repository\SatisfactionClientRepository;
  10. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  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. use Doctrine\ORM\EntityManagerInterface;
  16. class HistoryAnalyticsController extends AbstractController
  17. {
  18.     public function __invoke(
  19.         Request $request,
  20.         EtatProductionRepository $etatProductionRepository,
  21.         HistoryRepository $historyRepository,
  22.         PointOfSaleRepository $pointOfSaleRepository,
  23.         SatisfactionClientRepository $satisfactionClientRepository,
  24.         UserRepository $userRepository,
  25.         EntityManagerInterface $entityManager,
  26.         HierarchyService $hierarchyService
  27.     ) {
  28.         $pointOfSaleId $request->query->get('pointOfSaleId'null);
  29.         $pointsOfSale = [];
  30.         if ($pointOfSaleId !== null) {
  31.             $organisationId null;
  32.             $pointOfSale $pointOfSaleRepository->findOneBy(["id" => $pointOfSaleId]);
  33.             if ($pointOfSale === null) {
  34.                 throw new BadRequestHttpException('Le point de vente avec cet ID n\'existe pas.');
  35.             }
  36.             $pointsOfSale = [$pointOfSale];
  37.         } else {
  38.             $organisationId $request->query->get('organisationId'null);
  39.             $pointsOfSale $pointOfSaleRepository->findAll();
  40.         }
  41.         $codeCluster $request->query->get('codeCluster'null);
  42.         $codeInsee $request->query->get('codeInsee'null);
  43.         $optionSelect $request->query->get('optionSelect''V');
  44.         $category $request->query->get('categoryId');
  45.         $nbrMonth = (int) $request->query->get('nbrMonth'1);
  46.         $currentYear = (int) date('Y');
  47.         $currentMonth = (int) date('m');
  48.         $queryMonth $request->query->get('month');
  49.         $queryYear $request->query->get('year');
  50.         $perid $request->query->get('perid');
  51.         $sellerId $request->query->get('sellerId');
  52.         $departement $request->query->get('departement');
  53.         $childs = [];
  54.         $user null;
  55.         if ($request->query->get('idUser') != null) {
  56.             $user $entityManager->getRepository(User::class)->find((int)$request->query->get('idUser'));
  57.             if (!$user) {
  58.                 throw new BadRequestHttpException('L\'utilisateur avec cet ID n\'existe pas.');
  59.             }
  60.             // Récupérer l'hierarchie descendante
  61.             if (in_array('ROLE_MANAGER'$user->getRoles()) || in_array('ROLE_DIRECTOR'$user->getRoles())) {
  62.                 $childs array_map(fn($p) => (int) $p['id'], $hierarchyService->getHierarchyDescendante($user->getId()));
  63.             }
  64.         }
  65.         $baseMonth $queryMonth !== null ? (int) $queryMonth $currentMonth;
  66.         $baseYear $queryYear !== null ? (int) $queryYear $currentYear;
  67.         $etatKO $etatProductionRepository->findOneBy(["nom" => 'Racco KO']);
  68.         $etatRaccorde $etatProductionRepository->findOneBy(["nom" => 'Raccorde']);
  69.         $response = [];
  70.         for ($i 0$i $nbrMonth$i++) {
  71.             $date = (new \DateTimeImmutable("$baseYear-$baseMonth-01"))->modify("-$i months");
  72.             $mois = (int) $date->format('m');
  73.             $annee = (int) $date->format('Y');
  74.             // Initialisation des agrégats
  75.             $totalVentes 0;
  76.             $totalSatisfaction 0.0;
  77.             $nombreVendeurs 0;
  78.             $etp 0;
  79.             $totalVentesKO 0;
  80.             $totalObjectif 0;
  81.             $projection 0;
  82.             $jours_restants 0;
  83.             $moyenneJournaliere 0;
  84.             $clients4P 0;
  85.             $clients4PC 0;
  86.             $j30 0;
  87.             $j30_mobile 0;
  88.             $titulaire_mobile 0;
  89.             $titulaire_mobile_chainage 0;
  90.             $clients_hors_mig 0;
  91.             $total_clients_unique 0;
  92.             $total_ventes_raccordes_fixe_conquete 0;
  93.             $total_ventes_raccordes_fixe 0;
  94.             $total_ventes_raccordes_mobile 0;
  95.             $j30_raccorde_fixe_conquete 0;
  96.             $j30_raccorde_fixe 0;
  97.             $j30_raccorde_mobile 0;
  98.             $rio 0;
  99.             $pto_non_saisie 0;
  100.             $pto_saisie 0;
  101.             $pto_non_existante 0;
  102.             $pto_existante 0;
  103.             $total_vente_vla_conquette 0;
  104.             $total_ventes_box_5G 0;
  105.             $mrz = [];
  106.             $clients_4PC_par_semaine = [];
  107.             $clients_4P_par_semaine = [];
  108.             foreach ($pointsOfSale as $pointOfSale) {
  109.                 $satisfactionData $satisfactionClientRepository->getSatisfactionClientAverageForSpecificMonthAndYearForHistory(
  110.                     $pointOfSale,
  111.                     $codeCluster,
  112.                     $codeInsee,
  113.                     $mois,
  114.                     $annee,
  115.                     $category,
  116.                     $childs,
  117.                     $organisationId,
  118.                     $perid,
  119.                     $sellerId,
  120.                     $departement
  121.                 );
  122.                 $note = !empty($satisfactionData) && isset($satisfactionData[0]['moyenneSatisfaction'])
  123.                     ? (float) $satisfactionData[0]['moyenneSatisfaction'] : 0.0;
  124.                 $totalSatisfaction += $note;
  125.                 $totalVentes += $historyRepository->getProductionsAnalyticsVentes(
  126.                     $pointOfSale,
  127.                     $codeCluster,
  128.                     $codeInsee,
  129.                     $mois,
  130.                     $annee,
  131.                     $optionSelect,
  132.                     $etatKO,
  133.                     $category,
  134.                     $childs,
  135.                     $organisationId,
  136.                     $perid,
  137.                     $sellerId,
  138.                     $departement
  139.                 )[0]['total_ventes'] ?? 0;
  140.                 $total_ventes_box_5G += $historyRepository->getProductionsAnalyticsVentesBox5G(
  141.                     $pointOfSale,
  142.                     $codeCluster,
  143.                     $codeInsee,
  144.                     $mois,
  145.                     $annee,
  146.                     "V",
  147.                     $etatKO,
  148.                     $category,
  149.                     $childs,
  150.                     $organisationId,
  151.                     $perid,
  152.                     $sellerId,
  153.                     $departement
  154.                 )[0]['total_ventes'] ?? 0;
  155.                 $total_ventes_raccordes_fixe_conquete += $historyRepository->getProductionsAnalyticsVentesForChurn(
  156.                     $pointOfSale,
  157.                     $codeCluster,
  158.                     $codeInsee,
  159.                     $mois,
  160.                     $annee,
  161.                     'B',
  162.                     "Raccorde",
  163.                     null,
  164.                     $childs,
  165.                     $organisationId,
  166.                     $perid,
  167.                     $sellerId,
  168.                     $departement
  169.                 )[0]['total_ventes'] ?? 0;
  170.                  $total_ventes_raccordes_fixe += $historyRepository->getProductionsAnalyticsVentes(
  171.                     $pointOfSale,
  172.                     $codeCluster,
  173.                     $codeInsee,
  174.                     $mois,
  175.                     $annee,
  176.                     'B',
  177.                     "Raccorde",
  178.                     null,
  179.                     $childs,
  180.                     $organisationId,
  181.                     $perid,
  182.                     $sellerId,
  183.                     $departement
  184.                 )[0]['total_ventes'] ?? 0;
  185.                 $total_ventes_raccordes_mobile += $historyRepository->getProductionsAnalyticsVentes(
  186.                     $pointOfSale,
  187.                     $codeCluster,
  188.                     $codeInsee,
  189.                     $mois,
  190.                     $annee,
  191.                     'B',
  192.                     "Raccorde_mobile",
  193.                     "31,32,33",
  194.                     $childs,
  195.                     $organisationId,
  196.                     $perid,
  197.                     $sellerId,
  198.                     $departement
  199.                 )[0]['total_ventes'] ?? 0;
  200.                 $nombreVendeurs += $historyRepository->getProductionsAnalyticsVendeurs(
  201.                     $pointOfSale,
  202.                     $codeCluster,
  203.                     $codeInsee,
  204.                     $mois,
  205.                     $annee,
  206.                     $optionSelect,
  207.                     $etatKO,
  208.                     $category,
  209.                     $childs,
  210.                     $organisationId,
  211.                     $perid,
  212.                     $sellerId,
  213.                     $departement
  214.                 )[0]['nombre_vendeurs'] ?? 0;
  215.                 $etp += (int)($historyRepository->getProductionsAnalyticsETP(
  216.                     $pointOfSale,
  217.                     $codeCluster,
  218.                     $codeInsee,
  219.                     $mois,
  220.                     $annee,
  221.                     $optionSelect,
  222.                     $etatKO,
  223.                     $category,
  224.                     $childs,
  225.                     $organisationId,
  226.                     $perid,
  227.                     $sellerId,
  228.                     $departement
  229.                 )[0]['etp'] ?? 0);
  230.                 $totalVentesKO += $historyRepository->getProductionsAnalyticsKO(
  231.                     $pointOfSale,
  232.                     $codeCluster,
  233.                     $codeInsee,
  234.                     $mois,
  235.                     $annee,
  236.                     $optionSelect,
  237.                     $etatKO,
  238.                     $category,
  239.                     $childs,
  240.                     $organisationId,
  241.                     $perid,
  242.                     $sellerId,
  243.                     $departement
  244.                 )[0]['total_ventes_ko'] ?? 0;
  245.                 $totalObjectif += (int)($historyRepository->getProductionsAnalyticsObjectifs(
  246.                     $pointOfSale,
  247.                     $codeCluster,
  248.                     $mois,
  249.                     $annee,
  250.                     $optionSelect,
  251.                     $etatKO,
  252.                     $category,
  253.                     $childs,
  254.                     $organisationId,
  255.                     $departement
  256.                 )[0]['total_objectif'] ?? 0);
  257.                 $projection += (int)$historyRepository->getProductionsAnalyticsProjection(
  258.                     $pointOfSale,
  259.                     $codeCluster,
  260.                     $codeInsee,
  261.                     $mois,
  262.                     $annee,
  263.                     $optionSelect,
  264.                     $etatKO,
  265.                     $category,
  266.                     $childs,
  267.                     $organisationId,
  268.                     $perid,
  269.                     $sellerId,
  270.                     $departement
  271.                 )['projection_ventes'] ?? 0;
  272.                 $moyenneJournaliere += (float)$historyRepository->getProductionsAnalyticsProjection(
  273.                     $pointOfSale,
  274.                     $codeCluster,
  275.                     $codeInsee,
  276.                     $mois,
  277.                     $annee,
  278.                     $optionSelect,
  279.                     $etatKO,
  280.                     $category,
  281.                     $childs,
  282.                     $organisationId,
  283.                     $perid,
  284.                     $sellerId,
  285.                     $departement
  286.                 )['ventes_par_jour'] ?? 0;
  287.                 $jours_restants += (float)$historyRepository->getProductionsAnalyticsProjection(
  288.                     $pointOfSale,
  289.                     $codeCluster,
  290.                     $codeInsee,
  291.                     $mois,
  292.                     $annee,
  293.                     $optionSelect,
  294.                     $etatKO,
  295.                     $category,
  296.                     $childs,
  297.                     $organisationId,
  298.                     $perid,
  299.                     $sellerId,
  300.                     $departement
  301.                 )['jours_restants'] ?? 0;
  302.                 $clients4P += (int)$historyRepository->getProductionsAnalyticsTotal4P(
  303.                     $pointOfSale,
  304.                     $codeCluster,
  305.                     $codeInsee,
  306.                     $mois,
  307.                     $annee,
  308.                     $optionSelect,
  309.                     $etatKO,
  310.                     "",
  311.                     $childs,
  312.                     $organisationId,
  313.                     $perid,
  314.                     $sellerId,
  315.                     $departement
  316.                 )['total_vente'] ?? 0;
  317.                 $clients4PC += (int)$historyRepository->getProductionsAnalyticsTitulaireVentes(
  318.                     $pointOfSale,
  319.                     $codeCluster,
  320.                     $codeInsee,
  321.                     $mois,
  322.                     $annee,
  323.                     $optionSelect,
  324.                     $etatKO,
  325.                     null,
  326.                     "chainage",
  327.                     false,
  328.                     $childs,
  329.                     $organisationId,
  330.                     $perid,
  331.                     $sellerId,
  332.                     $departement
  333.                 )[0]['nombre_titulaire_email'] ?? 0;
  334.                 $j30 += (int)$historyRepository->getProductionsAnalyticsTotalVentesByDateResiliationInf30(
  335.                     $pointOfSale,
  336.                     $codeCluster,
  337.                     $codeInsee,
  338.                     $mois,
  339.                     $annee,
  340.                     $optionSelect,
  341.                     $etatKO,
  342.                     $category,
  343.                     $childs,
  344.                     $organisationId,
  345.                     $perid,
  346.                     $sellerId,
  347.                     $departement
  348.                 )['total_vente'] ?? 0;
  349.                 $j30_raccorde_fixe += (int)$historyRepository->getProductionsAnalyticsTotalVentesByDateResiliationInf30(
  350.                     $pointOfSale,
  351.                     $codeCluster,
  352.                     $codeInsee,
  353.                     $mois,
  354.                     $annee,
  355.                     "B",
  356.                     $etatKO,
  357.                     "1,3",
  358.                     $childs,
  359.                     $organisationId,
  360.                     $perid,
  361.                     $sellerId,
  362.                     $departement
  363.                 )['total_vente'] ?? 0;
  364.                 $j30_raccorde_fixe_conquete += (int)$historyRepository->getProductionsAnalyticsTotalVentesByDateResiliationInf30ForChurn(
  365.                     $pointOfSale,
  366.                     $codeCluster,
  367.                     $codeInsee,
  368.                     $mois,
  369.                     $annee,
  370.                     "B",
  371.                     $etatKO,
  372.                     "1,3",
  373.                     $childs,
  374.                     $organisationId,
  375.                     $perid,
  376.                     $sellerId,
  377.                     $departement
  378.                 )['total_vente'] ?? 0;
  379.                 $j30_mobile += (int)$historyRepository->getProductionsAnalyticsTotalVentesByDateResiliationInf30Mobile(
  380.                     $pointOfSale,
  381.                     $codeCluster,
  382.                     $codeInsee,
  383.                     $mois,
  384.                     $annee,
  385.                     "B",
  386.                     $etatKO,
  387.                     "31,32,33",
  388.                     $childs,
  389.                     $organisationId,
  390.                     $perid,
  391.                     $sellerId,
  392.                     $departement
  393.                 )['total_vente'] ?? 0;
  394.                 $j30_raccorde_mobile += (int)$historyRepository->getProductionsAnalyticsTotalVentesByDateResiliationInf30Mobile(
  395.                     $pointOfSale,
  396.                     $codeCluster,
  397.                     $codeInsee,
  398.                     $mois,
  399.                     $annee,
  400.                     "B",
  401.                     "Raccorde_mobile",
  402.                     "31,32,33,48",
  403.                     $childs,
  404.                     $organisationId,
  405.                     $perid,
  406.                     $sellerId,
  407.                     $departement
  408.                 )['total_vente'] ?? 0;
  409.                 $titulaire_mobile += (int)$historyRepository->getProductionsAnalyticsTotalMobileV2(
  410.                     $pointOfSale,
  411.                     $codeCluster,
  412.                     $codeInsee,
  413.                     $mois,
  414.                     $annee,
  415.                     $optionSelect,
  416.                     $etatKO,
  417.                     "",
  418.                     $childs,
  419.                     $organisationId,
  420.                     $perid,
  421.                     $sellerId,
  422.                     $departement
  423.                 )['total_vente'] ?? 0;
  424.                 $titulaire_mobile_chainage += (int)$historyRepository->getProductionsAnalyticsTotalMobileChainage(
  425.                     $pointOfSale,
  426.                     $codeCluster,
  427.                     $codeInsee,
  428.                     $mois,
  429.                     $annee,
  430.                     $optionSelect,
  431.                     $etatKO,
  432.                     "chainage",
  433.                     $childs,
  434.                     $organisationId,
  435.                     $perid,
  436.                     $sellerId,
  437.                     $departement
  438.                 )['total_vente'] ?? 0;
  439.                 $clients_hors_mig += (int)$historyRepository->getProductionsAnalyticsTotalClientsHosting(
  440.                     $pointOfSale,
  441.                     $codeCluster,
  442.                     $codeInsee,
  443.                     $mois,
  444.                     $annee,
  445.                     $optionSelect,
  446.                     "",
  447.                     $childs,
  448.                     $organisationId,
  449.                     $perid,
  450.                     $sellerId,
  451.                     $departement
  452.                 )['total_vente'] ?? 0;
  453.                 $mrz[] = $historyRepository->getProductionsAnalyticsTotalByIdentityCtrl(
  454.                     $pointOfSale,
  455.                     $codeCluster,
  456.                     $codeInsee,
  457.                     $mois,
  458.                     $annee,
  459.                     $optionSelect,
  460.                     "",
  461.                     $childs,
  462.                     $organisationId,
  463.                     $perid,
  464.                     $sellerId,
  465.                     $departement
  466.                 );
  467.                 $total_clients_unique += (int)$historyRepository->getProductionsAnalyticsTotalClientsUnique(
  468.                     $pointOfSale,
  469.                     $codeCluster,
  470.                     $codeInsee,
  471.                     $mois,
  472.                     $annee,
  473.                     $optionSelect,
  474.                     $etatKO,
  475.                     $category,
  476.                     "",
  477.                     $childs,
  478.                     $organisationId,
  479.                     $perid,
  480.                     $sellerId,
  481.                     $departement
  482.                 )[0]['total_client_unique'] ?? 0;
  483.                 $clients_4PC_par_semaine[] = $historyRepository->get4PCByWeek(
  484.                     $pointOfSale,
  485.                     $codeCluster,
  486.                     $codeInsee,
  487.                     $mois,
  488.                     $annee,
  489.                     $optionSelect,
  490.                     $etatKO,
  491.                     "31,32,33",
  492.                     "chainage",
  493.                     true,
  494.                     $childs,
  495.                     $organisationId,
  496.                     $perid,
  497.                     $sellerId,
  498.                     $departement
  499.                 );
  500.                 $clients_4P_par_semaine[] = $historyRepository->get4PByWeek(
  501.                     $pointOfSale,
  502.                     $codeCluster,
  503.                     $codeInsee,
  504.                     $mois,
  505.                     $annee,
  506.                     $optionSelect,
  507.                     $etatKO,
  508.                     "",
  509.                     $childs,
  510.                     $organisationId,
  511.                     $perid,
  512.                     $sellerId,
  513.                     $departement
  514.                 );
  515.                 $rio += (int)$historyRepository->getProductionsAnalyticsTotalVenteByOption(
  516.                     $pointOfSale,
  517.                     $codeCluster,
  518.                     $codeInsee,
  519.                     $mois,
  520.                     $annee,
  521.                     $childs,
  522.                     $organisationId,
  523.                     "RIO",
  524.                     $perid,
  525.                     $sellerId,
  526.                     $departement
  527.                 )['total_vente'] ?? 0;
  528.                 $pto_non_saisie += (int)$historyRepository->getProductionsAnalyticsTotalVenteByOption(
  529.                     $pointOfSale,
  530.                     $codeCluster,
  531.                     $codeInsee,
  532.                     $mois,
  533.                     $annee,
  534.                     $childs,
  535.                     $organisationId,
  536.                     "PTO_NON_SAISIE",
  537.                     $perid,
  538.                     $sellerId,
  539.                     $departement
  540.                 )['total_vente'] ?? 0;
  541.                 $pto_saisie += (int)$historyRepository->getProductionsAnalyticsTotalVenteByOption(
  542.                     $pointOfSale,
  543.                     $codeCluster,
  544.                     $codeInsee,
  545.                     $mois,
  546.                     $annee,
  547.                     $childs,
  548.                     $organisationId,
  549.                     "PTO_SAISIE",
  550.                     $perid,
  551.                     $sellerId,
  552.                     $departement
  553.                 )['total_vente'] ?? 0;
  554.                 $pto_non_existante += (int)$historyRepository->getProductionsAnalyticsTotalVenteByOption(
  555.                     $pointOfSale,
  556.                     $codeCluster,
  557.                     $codeInsee,
  558.                     $mois,
  559.                     $annee,
  560.                     $childs,
  561.                     $organisationId,
  562.                     "PTO_NON_EXISTANTE",
  563.                     $perid,
  564.                     $sellerId,
  565.                     $departement
  566.                 )['total_vente'] ?? 0;
  567.                 $pto_existante += (int)$historyRepository->getProductionsAnalyticsTotalVenteByOption(
  568.                     $pointOfSale,
  569.                     $codeCluster,
  570.                     $codeInsee,
  571.                     $mois,
  572.                     $annee,
  573.                     $childs,
  574.                     $organisationId,
  575.                     "PTO_EXISTANTE",
  576.                     $perid,
  577.                     $sellerId,
  578.                     $departement
  579.                 )['total_vente'] ?? 0;
  580.                 $total_vente_vla_conquette += $historyRepository->getProductionsAnalyticsVentesVlaConquete(
  581.                     $pointOfSale,
  582.                     $codeCluster,
  583.                     $codeInsee,
  584.                     $mois,
  585.                     $annee,
  586.                     "B",
  587.                     "1,3",
  588.                     $childs,
  589.                     $organisationId,
  590.                     $perid,
  591.                     $sellerId,
  592.                     $departement
  593.                 )[0]['total_ventes'] ?? 0;
  594.                 $total_churn_fixe 0;
  595.                 $total_churn_mobile 0;
  596.                 $total_rio 0;
  597.                 $total_pto_saisie 0;
  598.                 $total_pto_non_saisie 0;
  599.                 $total_pto_non_existante 0;
  600.                 $total_potentiel 0;
  601.                 $total_pto_existante 0;
  602.                 if ($total_ventes_raccordes_fixe_conquete && $j30_raccorde_fixe_conquete 0) {
  603.                     $ratio_fixe = ($j30_raccorde_fixe_conquete $total_ventes_raccordes_fixe_conquete) * 100;
  604.                     $total_churn_fixe number_format($ratio_fixe1);
  605.                 }
  606.                 if ($total_ventes_raccordes_mobile && $j30_raccorde_mobile 0) {
  607.                     $ratio_mobile = ($j30_raccorde_mobile $total_ventes_raccordes_mobile) * 100;
  608.                     $total_churn_mobile number_format($ratio_mobile1);
  609.                 }
  610.                 if ($total_vente_vla_conquette && $rio 0) {
  611.                     $ratio_rio = ($rio $total_vente_vla_conquette) * 100;
  612.                     $total_rio round($ratio_rio2);
  613.                 }
  614.                 if ($total_vente_vla_conquette && $pto_saisie 0) {
  615.                     $ratio_pto_saisie = ($pto_saisie $total_vente_vla_conquette) * 100;
  616.                     $total_pto_saisie round($ratio_pto_saisie2);
  617.                 }
  618.                 if ($total_vente_vla_conquette && $pto_non_saisie 0) {
  619.                     $ratio_pto_non_saisie = ($pto_non_saisie $total_vente_vla_conquette) * 100;
  620.                     $total_pto_non_saisie round($ratio_pto_non_saisie2);
  621.                 }
  622.                 if ($total_vente_vla_conquette && $pto_non_existante 0) {
  623.                     $ratio_pto_non_existante = ($pto_non_existante $total_vente_vla_conquette) * 100;
  624.                     $total_pto_non_existante round($ratio_pto_non_existante2);
  625.                 }
  626.                 if ($pto_saisie && $pto_existante 0) {
  627.                     $ratio_potentiel = ($pto_saisie $pto_existante) * 100;
  628.                     $total_potentiel round($ratio_potentiel2);
  629.                 }
  630.                 if ($total_vente_vla_conquette && $pto_existante 0) {
  631.                     $ratio_pto_existante = ($pto_existante $total_vente_vla_conquette) * 100;
  632.                     $total_pto_existante round($ratio_pto_existante2);
  633.                 }
  634.             }
  635.             $nbPos count($pointsOfSale);
  636.             $response[$mois] = [
  637.                 'total_ventes' => $totalVentes,
  638.                 'note_satisfaction' => round($nbPos $totalSatisfaction $nbPos 0.02),
  639.                 'nombre_vendeurs' => $nombreVendeurs,
  640.                 'etp' => $etp,
  641.                 'total_ventes_ko' => $totalVentesKO,
  642.                 'total_objectif' => $totalObjectif,
  643.                 'projection' => $projection,
  644.                 'moyenne_journalliere' => round($moyenneJournaliere2),
  645.                 'jours_restants' => $jours_restants,
  646.                 'clients4P' => $clients4P,
  647.                 'clients4PC' => $clients4PC,
  648.                 'j+30' => $j30,
  649.                 'j+30_mobile' => $j30_mobile,
  650.                 'nombre_titulaire_email_mobile' => $titulaire_mobile,
  651.                 'nombre_titulaire_email_mobile_chainage' => $titulaire_mobile_chainage,
  652.                 'clients_hors_mig' => $clients_hors_mig,
  653.                 'mrz' => $this->fixMrzTotals($mrz),
  654.                 'total_client_unique' => $total_clients_unique,
  655.                 'j30_raccorde_fixe' => $j30_raccorde_fixe,
  656.                 'j30_raccorde_mobile' => $j30_raccorde_mobile,
  657.                 'total_ventes_raccordes_fixe' => $total_ventes_raccordes_fixe,
  658.                 'total_ventes_raccordes_mobile' => $total_ventes_raccordes_mobile,
  659.                 'clients_churn_fixe' => $total_churn_fixe,
  660.                 'clients_churn_mobile' => $total_churn_mobile,
  661.                 'clients_4PC_par_semaine' => $this->fixTaux4PCParSemaine($clients_4PC_par_semaine) ?? [],
  662.                 'clients_4P_par_semaine' => $this->fixTaux4PCParSemaine($clients_4P_par_semaine) ?? [],
  663.                 'RIO' => $total_rio "%",
  664.                 'Potentiel' => $total_potentiel "%",
  665.                 'PTO_saisie' => $total_pto_saisie "%",
  666.                 'PTO_non_saisie' => $total_pto_non_saisie "%",
  667.                 'PTO_sans' => $total_pto_non_existante "%",
  668.                 'PTO_existante' => $total_pto_existante "%",
  669.                 'total_ventes_box_5G' => $total_ventes_box_5G
  670.             ];
  671.         }
  672.         return new JsonResponse($nbrMonth $response $response[$baseMonth], 200);
  673.     }
  674.     public function fixTaux4PcParSemaine($clients_4PC_par_semaine)
  675.     {
  676.         $toclientsParSemaine = [];
  677.         foreach ($clients_4PC_par_semaine as $source) {
  678.             foreach ($source as $item) {
  679.                 if (!isset($item['semaine']) || !isset($item['total'])) {
  680.                     // On ignore les éléments incomplets
  681.                     continue;
  682.                 }
  683.                 $semaine $item['semaine'];
  684.                 $total = (int) $item['total'];
  685.                 if (!isset($toclientsParSemaine[$semaine])) {
  686.                     $toclientsParSemaine[$semaine] = 0;
  687.                 }
  688.                 $toclientsParSemaine[$semaine] += $total;
  689.             }
  690.         }
  691.         $resultat = [];
  692.         foreach ($toclientsParSemaine as $semaine => $total) {
  693.             $resultat[] = [
  694.                 'semaine' => $semaine,
  695.                 'total' => $total
  696.             ];
  697.         }
  698.         // Tri par ordre croissant de semaine (au cas où)
  699.         usort($resultat, fn($a$b) => $a['semaine'] <=> $b['semaine']);
  700.         return $resultat;
  701.     }
  702.     public function fixMrzTotals(array $mrz): array
  703.     {
  704.         $toclientsParType = [];
  705.         foreach ($mrz as $groupe) {
  706.             foreach ($groupe as $item) {
  707.                 if (!isset($item['identity_ctrl']) || !isset($item['total_vente'])) {
  708.                     continue;
  709.                 }
  710.                 $type $item['identity_ctrl'];
  711.                 $vente = (int) $item['total_vente'];
  712.                 if (!isset($toclientsParType[$type])) {
  713.                     $toclientsParType[$type] = 0;
  714.                 }
  715.                 $toclientsParType[$type] += $vente;
  716.             }
  717.         }
  718.         $resultat = [];
  719.         foreach ($toclientsParType as $type => $total) {
  720.             $resultat[] = [
  721.                 'identity_ctrl' => $type,
  722.                 'total_vente' => $total
  723.             ];
  724.         }
  725.         return $resultat;
  726.     }
  727.    
  728.   
  729. }