src/Controller/ContratController.php line 43

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use DateTime;
  4. use App\Library\Excel;
  5. use App\Entity\Tickets;
  6. use App\Entity\Contrats;
  7. use App\Service\Securizer;
  8. use App\Entity\Intervention;
  9. use App\Entity\LigneDeContrat;
  10. use App\Repository\ClientsRepository;
  11. use App\Repository\TicketsRepository;
  12. use App\Repository\ContratsRepository;
  13. use Doctrine\ORM\EntityManagerInterface;
  14. use PhpOffice\PhpSpreadsheet\Style\Border;
  15. use App\Repository\LigneDeContratRepository;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use Symfony\Component\HttpFoundation\Response;
  18. use Symfony\Component\Serializer\SerializerInterface;
  19. use Symfony\Component\Validator\Validator\ValidatorInterface;
  20. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  21. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  22. use Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface;
  23. class ContratController extends AbstractController
  24. {
  25.     /**
  26.      * @IsGranted("ROLE_CLIENT")
  27.      */
  28.     public function index(ContratsRepository $repoContratAccessDecisionManagerInterface $accessDecisionManager): Response
  29.     {
  30.         //voir la liste des contrats
  31.         $securizer = new Securizer($accessDecisionManager);
  32.         $contrats $repoContrat->findContratId($this->getUser(), $securizer);
  33.         return $this->json($contrats200, [], ['groups' => 'affichageContrat']);
  34.     }
  35.     /**
  36.      * @IsGranted("ROLE_CLIENT")
  37.      */
  38.     public function contratsClient(int $idClient,  ContratsRepository $repoContratAccessDecisionManagerInterface $accessDecisionManager): Response
  39.     {
  40.         //voir la liste des contrats par client
  41.         $securizer = new Securizer($accessDecisionManager);
  42.         $contrats $repoContrat->findContratIdClient($idClient$this->getUser(), $securizer);
  43.         return $this->json($contrats200, [], ['groups' => 'affichageContrat']);
  44.     }
  45.     /**
  46.      * @IsGranted("ROLE_CLIENT")
  47.      */
  48.     public function voir($idContratsRepository $repoContratAccessDecisionManagerInterface $accessDecisionManager): Response
  49.     {
  50.         //recuperer un contrat par id
  51.         $securizer = new Securizer($accessDecisionManager);
  52.         $contrats $repoContrat->findContratId($this->getUser(), $securizer);
  53.         //verifi que le contrat que l'on cherche fait bien partie de la liste de ceux qu'il est possible d'afficher
  54.         if (in_array($repoContrat->find($id), $contrats)) {
  55.             $contrat $repoContrat->find($id);
  56.         } else {
  57.             return $this->json([
  58.                 'status' => 400,
  59.                 'message' => "Vous ne pouvez pas consulter ce contrat"
  60.             ], 400);
  61.         }
  62.         return $this->json($contrat200, [], ['groups' => 'affichageContrat']);
  63.     }
  64.     /**
  65.      * @IsGranted("ROLE_COMMERCIAL")
  66.      */
  67.     public function creer(Request $requestValidatorInterface $validatorSerializerInterface $serializerEntityManagerInterface $manager): Response
  68.     {
  69.         //creer un nouveau contrat, seul les roles commercial et admin peuvent accer a cette url
  70.         $jsonRecu $request->getContent();
  71.         try {
  72.             //transforme le json reçu en entity
  73.             $contrat $serializer->deserialize($jsonRecuContrats::class, 'json');
  74.             $errors $validator->validate($contrat);
  75.             if (count($errors) > 0) {
  76.                 return $this->json($errors400);
  77.             }
  78.             $manager->persist($contrat);
  79.             $manager->flush();
  80.         } catch (\throwable $e) {
  81.             return $this->json([
  82.                 'status' => 400,
  83.                 'message' => $e->getMessage()
  84.             ], 400);
  85.         }
  86.         return $this->json($contrat201, [], ['groups' => 'affichageContrat']);
  87.     }
  88.     /**
  89.      * @IsGranted("ROLE_COMMERCIAL")
  90.      */
  91.     public function modif($idRequest $requestContratsRepository $repoContratValidatorInterface $validatorSerializerInterface $serializerEntityManagerInterface $manager): Response
  92.     {
  93.         //modifi un contrat existant, seul les roles commercial et admin peuvent accer a cette url
  94.         $contrat $repoContrat->find($id);
  95.         if ($contrat == null) {
  96.             return $this->json([
  97.                 'status' => 400,
  98.                 'message' => "le client à modifier n'existe pas"
  99.             ], 400);
  100.         }
  101.         $jsonRecu $request->getContent();
  102.         try {
  103.             //transforme le json reçu en entity
  104.             $serializer->deserialize($jsonRecuContrats::class, 'json', ['object_to_populate' => $contrat]);
  105.             //validation des données reçus
  106.             $errors $validator->validate($contrat);
  107.             if (count($errors) > 0) {
  108.                 return $this->json($errors400);
  109.             }
  110.             $manager->persist($contrat);
  111.             $manager->flush();
  112.         } catch (\throwable $e) {
  113.             return $this->json([
  114.                 'status' => 400,
  115.                 'message' => $e->getMessage()
  116.             ], 400);
  117.         }
  118.         return $this->json($contrat201, [], ['groups' => 'affichageContrat']);
  119.     }
  120.     /**
  121.      * @IsGranted("ROLE_TECH")
  122.      */
  123.     public function voirStatistiques(ContratsRepository $repoContrat): Response
  124.     {
  125.         //recuperer les contrats actif
  126.         $contrats $repoContrat->findContratsActif();
  127.         $data = [];
  128.         foreach ($contrats as $contrat) {
  129.             if (!isset($data[$contrat->getIdClient()->getNom()])) $data[$contrat->getIdClient()->getNom()] = [
  130.                 'client' => $contrat->getIdClient(),
  131.                 'services' => [],
  132.             ];
  133.             foreach ($contrat->getLigneDeContrats() as $ligne) {
  134.                 $data[$contrat->getIdClient()->getNom()]['services'][] = [
  135.                     'title' => $ligne->getIdTypeIntervention()->gettype(),
  136.                     'done' => $ligne->getQuantiteConsome(),
  137.                     'total' => $ligne->getQuantitePrevus(),
  138.                     'dateDebut' => $contrat->getDateDebut(),
  139.                     'dateFin' => $contrat->getDateFin(),
  140.                 ];
  141.             }
  142.         }
  143.         return $this->json($data200, [], ['groups' => 'affichageClient']);
  144.     }
  145.     /**
  146.      * @IsGranted("ROLE_CLIENT")
  147.      */
  148.     public function getLigneDeContrat(int $idClientint $idTypeLigneDeContratRepository $ligneRepo)
  149.     {
  150.         // recupere ligneDeContrat par id client et id type
  151.         try {
  152.             $ligne $ligneRepo->findLigneDeContrat($idClient$idType);
  153.         } catch (\throwable $e) {
  154.             return $this->json([
  155.                 'status' => 400,
  156.                 'message' => $e->getMessage()
  157.             ], 400);
  158.         }
  159.         if (!isset($ligne[0]))
  160.             return $this->json([
  161.                 'status' => 410,
  162.                 'message' => "Il n'y a pas de contrat actif pour le client sélectionné."
  163.             ], 410);
  164.         $ligne $ligne[0];
  165.         if ($ligne->getQuantiteConsome() >= $ligne->getQuantitePrevus())
  166.             return $this->json([
  167.                 'status' => 410,
  168.                 'message' => "Le nombre maximum de ce type d'interventions dans le contrat a été atteint."
  169.             ], 410);
  170.         return $this->json($ligne201, [], ['groups' => 'affichageContrat']);
  171.     }
  172.     /**
  173.      * @IsGranted("ROLE_COMMERCIAL")
  174.      */
  175.     public function export(Request $requestClientsRepository $repoClientsContratsRepository $repoContratTicketsRepository $repoTickets)
  176.     {
  177.         try {
  178.             $data json_decode($request->getContent(), true);
  179.             if (!isset($data["client"]) || !isset($data["dateDebut"]) || !isset($data["dateFin"])) return $this->json([
  180.                 'status' => 400,
  181.                 'message' => "les données reçues sont incorrectes"
  182.             ], 400);
  183.             $client $repoClients->find($data["client"]);
  184.             $dateDebut = new DateTime($data["dateDebut"]);
  185.             $dateFin = new DateTime($data["dateFin"]);
  186.             if ($client == null || $dateDebut == null || $dateFin == null) {
  187.                 return $this->json([
  188.                     'status' => 400,
  189.                     'message' => "les données reçues sont incorrectes"
  190.                 ], 400);
  191.             }
  192.             /** @var Contrat[] $contrats */
  193.             $contrats $repoContrat->getContratsByDate($client->getId(), $dateDebut$dateFin);
  194.             /** @var LigneDeContrat[] $lignesPreventives */
  195.             $lignesPreventives = [];
  196.             /** @var LigneDeContrat[] $lignesCuratives */
  197.             $lignesCuratives = [];
  198.             /** @var LigneDeContrat[] $lignesRegie */
  199.             $lignesRegie = [];
  200.             /** @var LigneDeContrat[] $lignesTelemaintenace */
  201.             $lignesTelemaintenace = [];
  202.             $actionsCommerciales = [];
  203.             foreach ($contrats as $contrat) {
  204.                 foreach ($contrat->getLigneDeContrats()->toArray() as $ligne) {
  205.                     if ($ligne->getIdTypeIntervention()->getType() == "Preventive")
  206.                         $lignesPreventives[] = $ligne;
  207.                     if ($ligne->getIdTypeIntervention()->getType() == "Curative")
  208.                         $lignesCuratives[] = $ligne;
  209.                     if ($ligne->getIdTypeIntervention()->getType() == "Télémaintenance")
  210.                         $lignesTelemaintenace[] = $ligne;
  211.                     if ($ligne->getIdTypeIntervention()->getType() == "Régie")
  212.                         $lignesRegie[] = $ligne;
  213.                     $actionsCommerciales array_merge($actionsCommerciales$ligne->getActionCommercials()->toArray());
  214.                 }
  215.             }
  216.             $hasActionsCommerciales count($actionsCommerciales) > 0;
  217.             $hasInterventionsRegie count($lignesRegie) > 0;
  218.             $path $_SERVER["DOCUMENT_ROOT"] . ($_ENV['APP_ENV'] == "dev" '../documents/' '/ExtranetV2/documents/');
  219.             $excel = new Excel($path'Export_Contrats.xlsx');
  220.             if ($hasActionsCommerciales && $hasInterventionsRegie) {
  221.                 $excel->loadFile($path 'templates/export_contrats_+_actions_commerciales_+_regie.xlsx');
  222.             } else if ($hasActionsCommerciales && !$hasInterventionsRegie) {
  223.                 $excel->loadFile($path 'templates/export_contrats_+_actions_commerciales.xlsx');
  224.             } else if (!$hasActionsCommerciales && $hasInterventionsRegie) {
  225.                 $excel->loadFile($path 'templates/export_contrats_+_regie.xlsx');
  226.             } else {
  227.                 $excel->loadFile($path 'templates/export_contrats.xlsx');
  228.             }
  229.             $excel->selectSheetbyIndex(0);
  230.             $excel->writeCell('A1'"Récapitulatif contrat " $dateDebut->format('Y') . " / " $dateFin->format('Y'), Excel::_FORMAT_TEXTE_);
  231.             $excel->writeCell('A2'"Export du " $dateDebut->format('d/m/Y') . " au " $dateFin->format('d/m/Y'), Excel::_FORMAT_TEXTE_);
  232.             //  Télémaintenance -----
  233.             // Actions Commerciales
  234.             $actionsCommerciales_telemaintenance array_filter($actionsCommerciales, function ($action) {
  235.                 return $action->getLigneDeContrat()->getIdTypeIntervention()->getType() === "Télémaintenance";
  236.             });
  237.             $minutesCommerciales array_reduce(
  238.                 $actionsCommerciales_telemaintenance,
  239.                 function ($carry$item) {
  240.                     return $carry $item->getQuantite();
  241.                 },
  242.                 0
  243.             );
  244.             // Quantité de minutes de type télémaintenance prévus
  245.             $minutesPrevus array_sum(array_map(function ($ligne) {
  246.                 return $ligne->getQuantitePrevus();
  247.             }, $lignesTelemaintenace)) - $minutesCommerciales;
  248.             $excel->writeCell('B4'sprintf("%02dh%02d"floor($minutesPrevus 60), ($minutesPrevus 60)), Excel::_FORMAT_TEXTE_);
  249.             // Utilisation des minutes de type télémaintenance
  250.             $minutesConsomme array_sum(array_map(function ($ligne) {
  251.                 return $ligne->getQuantiteConsome();
  252.             }, $lignesTelemaintenace));
  253.             $excel->writeCell('D4'sprintf("%02dh%02d"floor($minutesConsomme 60), ($minutesConsomme 60)), Excel::_FORMAT_TEXTE_);
  254.             if ($hasActionsCommerciales)
  255.                 $excel->writeCell('E4'sprintf("%02dh%02d"floor($minutesCommerciales 60), abs($minutesCommerciales 60)), Excel::_FORMAT_TEXTE_);
  256.             // Restantes
  257.             $minutesConsomme $minutesConsomme $client->getHotlineCompteur();
  258.             $minutesPrevus $minutesPrevus $minutesCommerciales;
  259.             $excel->writeCell(($hasActionsCommerciales 'G4' 'E4'), sprintf("%02dh%02d", (($minutesPrevus) < $minutesConsomme "-" "") . floor(abs($minutesPrevus $minutesConsomme) / 60), (abs($minutesPrevus $minutesConsomme) % 60)), Excel::_FORMAT_TEXTE_);
  260.             // Préventive -----
  261.             // Actions Commerciales
  262.             $actionsCommerciales_preventive array_filter($actionsCommerciales, function ($action) {
  263.                 return $action->getLigneDeContrat()->getIdTypeIntervention()->getType() === "Preventive";
  264.             });
  265.             $journeesComerciales array_reduce(
  266.                 $actionsCommerciales_preventive,
  267.                 function ($carry$item) {
  268.                     return $carry $item->getQuantite();
  269.                 },
  270.                 0
  271.             );
  272.             // Quantité de journées de type préventive prévus
  273.             $journeesPrevus array_sum(array_map(function ($ligne) {
  274.                 return $ligne->getQuantitePrevus();
  275.             }, $lignesPreventives)) - $journeesComerciales;
  276.             $excel->writeCell('B5'$journeesPrevusExcel::_FORMAT_TEXTE_);
  277.             // Utilisation des journées de type préventive
  278.             $journeesConsomme array_sum(array_map(function ($ligne) {
  279.                 return $ligne->getQuantiteConsome();
  280.             }, $lignesPreventives));
  281.             $excel->writeCell('D5'$journeesConsommeExcel::_FORMAT_TEXTE_);
  282.             if ($hasActionsCommerciales)
  283.                 $excel->writeCell('E5'$journeesComercialesExcel::_FORMAT_TEXTE_);
  284.             // Restantes
  285.             $journeesPrevus $journeesPrevus $journeesComerciales;
  286.             $excel->writeCell(($hasActionsCommerciales 'G5' 'E5'), $journeesPrevus $journeesConsommeExcel::_FORMAT_TEXTE_);
  287.             // Curative -----
  288.             // Actions Commerciales
  289.             $actionsCommerciales_curative array_filter($actionsCommerciales, function ($action) {
  290.                 return $action->getLigneDeContrat()->getIdTypeIntervention()->getType() === "Curative";
  291.             });
  292.             $journeesComerciales array_reduce(
  293.                 $actionsCommerciales_curative,
  294.                 function ($carry$item) {
  295.                     return $carry $item->getQuantite();
  296.                 },
  297.                 0
  298.             );
  299.             // Quantité d'interventions de type curative prévus
  300.             $journeesPrevus array_sum(array_map(function ($ligne) {
  301.                 return $ligne->getQuantitePrevus();
  302.             }, $lignesCuratives)) - $journeesComerciales;
  303.             $excel->writeCell('B6'$journeesPrevusExcel::_FORMAT_TEXTE_);
  304.             // Utilisation des interventions de type curative
  305.             $interventionsConsomme array_sum(array_map(function ($ligne) {
  306.                 return $ligne->getQuantiteConsome();
  307.             }, $lignesCuratives));
  308.             $excel->writeCell('D6'$interventionsConsommeExcel::_FORMAT_TEXTE_);
  309.             if ($hasActionsCommerciales)
  310.                 $excel->writeCell('E6'$journeesComercialesExcel::_FORMAT_TEXTE_);
  311.             // Restantes
  312.             $journeesPrevus $journeesPrevus $journeesComerciales;
  313.             $excel->writeCell(($hasActionsCommerciales 'G6' 'E6'), $journeesPrevus $interventionsConsommeExcel::_FORMAT_TEXTE_);
  314.             if ($hasInterventionsRegie) {
  315.                 // Régie -----
  316.                 // Actions Commerciales
  317.                 $actionsCommerciales_regie array_filter($actionsCommerciales, function ($action) {
  318.                     return $action->getLigneDeContrat()->getIdTypeIntervention()->getType() === "Régie";
  319.                 });
  320.                 $journeesComerciales array_reduce(
  321.                     $actionsCommerciales_regie,
  322.                     function ($carry$item) {
  323.                         return $carry $item->getQuantite();
  324.                     },
  325.                     0
  326.                 );
  327.                 // Quantité d'interventions de type regie prévus
  328.                 $journeesPrevus array_sum(array_map(function ($ligne) {
  329.                     return $ligne->getQuantitePrevus();
  330.                 }, $lignesRegie)) - $journeesComerciales;
  331.                 $excel->writeCell('B7'$journeesPrevusExcel::_FORMAT_TEXTE_);
  332.                 // Utilisation des interventions de type regie
  333.                 $interventionsConsomme array_sum(array_map(function ($ligne) {
  334.                     return $ligne->getQuantiteConsome();
  335.                 }, $lignesRegie));
  336.                 $excel->writeCell('D7'$interventionsConsommeExcel::_FORMAT_TEXTE_);
  337.                 if ($hasActionsCommerciales)
  338.                     $excel->writeCell('E7'$journeesComercialesExcel::_FORMAT_TEXTE_);
  339.                 // Restantes
  340.                 $journeesPrevus $journeesPrevus $journeesComerciales;
  341.                 $excel->writeCell(($hasActionsCommerciales 'G7' 'E7'), $journeesPrevus $interventionsConsommeExcel::_FORMAT_TEXTE_);
  342.             }
  343.             // On initialise à 10 pour commencer à écrire à cette ligne
  344.             $row 10;
  345.             for ($i 0$i count($lignesPreventives); $i++) {
  346.                 /** @var Intervention $intervention */
  347.                 foreach ($lignesPreventives[$i]->getInterventions() as $intervention) {
  348.                     $excel->writeCell('A' $row$intervention->getTitre(), Excel::_FORMAT_TEXTE_);
  349.                     $excel->writeCell('B' $row"par " $intervention->getTechPrevus()->getNom() . " " $intervention->getTechPrevus()->getPrenom(), Excel::_FORMAT_TEXTE_);
  350.                     $excel->writeCell('C' $row$intervention->getDateIntervention()->format('d/m/Y') . " ( " $intervention->getIdStatus()->getStatus() . " )"Excel::_FORMAT_TEXTE_);
  351.                     $excel->applyBackgroundColorAndColor('A' $row ':C' $row, ($row == 'f5f5f5' 'ffffff'), '424242');
  352.                     $row++;
  353.                 }
  354.             }
  355.             $row 10;
  356.             for ($i 0$i count($lignesCuratives); $i++) {
  357.                 /** @var Intervention $intervention */
  358.                 foreach ($lignesCuratives[$i]->getInterventions() as $intervention) {
  359.                     $excel->writeCell('D' $row$intervention->getTitre(), Excel::_FORMAT_TEXTE_);
  360.                     $excel->writeCell('E' $row"par " $intervention->getTechPrevus()->getNom() . " " $intervention->getTechPrevus()->getPrenom(), Excel::_FORMAT_TEXTE_);
  361.                     $excel->writeCell('F' $row$intervention->getDateIntervention()->format('d/m/Y') . " ( " $intervention->getIdStatus()->getStatus() . " )"Excel::_FORMAT_TEXTE_);
  362.                     $excel->applyBackgroundColorAndColor('D' $row ':F' $row, ($row == 'f5f5f5' 'ffffff'), '424242');
  363.                     $row++;
  364.                 }
  365.             }
  366.             if ($hasInterventionsRegie) {
  367.                 $row 10;
  368.                 for ($i 0$i count($lignesRegie); $i++) {
  369.                     /** @var Intervention $intervention */
  370.                     foreach ($lignesRegie[$i]->getInterventions() as $intervention) {
  371.                         $excel->writeCell('G' $row$intervention->getTitre(), Excel::_FORMAT_TEXTE_);
  372.                         $excel->writeCell('H' $row"par " $intervention->getTechPrevus()->getNom() . " " $intervention->getTechPrevus()->getPrenom(), Excel::_FORMAT_TEXTE_);
  373.                         $excel->writeCell('I' $row$intervention->getDateIntervention()->format('d/m/Y') . " ( " $intervention->getIdStatus()->getStatus() . " )"Excel::_FORMAT_TEXTE_);
  374.                         $excel->applyBackgroundColorAndColor('G' $row ':I' $row, ($row == 'f5f5f5' 'ffffff'), '424242');
  375.                         $row++;
  376.                     }
  377.                 }
  378.             }
  379.             $excel->selectSheetbyIndex(1);
  380.             $topTickets $repoTickets->getClientTopTickets($client->getId(), $dateDebut$dateFin10);
  381.             $row 3;
  382.             /** @var Tickets $ticket */
  383.             foreach ($topTickets as $ticket) {
  384.                 $excel->writeCell('A' $row$ticket['id'], Excel::_FORMAT_NUMBER_);
  385.                 $excel->writeCell('B' $row$ticket['titre'], Excel::_FORMAT_TEXTE_);
  386.                 $excel->writeCell('C' $row$ticket['status'], Excel::_FORMAT_TEXTE_);
  387.                 $excel->writeCell('D' $row, ($ticket['dateCreation'])->format('d/m/Y'), Excel::_FORMAT_DDMMYYYY_);
  388.                 $excel->writeCell('E' $row$ticket['nom'] . " " $ticket['prenom'], Excel::_FORMAT_TEXTE_);
  389.                 $excel->writeCell('F' $row$ticket['duree'], Excel::_FORMAT_NUMBER_);
  390.                 $row++;
  391.             }
  392.             $topDemandes $repoTickets->getClientTopDemandes($client->getId(), $dateDebut$dateFin10);
  393.             $row 16;
  394.             /** @var Tickets $ticket */
  395.             foreach ($topDemandes as $ticket) {
  396.                 $excel->writeCell('A' $row$ticket['nom'] . " " $ticket['prenom'], Excel::_FORMAT_TEXTE_);
  397.                 $excel->writeCell('B' $row$ticket['duree'], Excel::_FORMAT_TEXTE_);
  398.                 $excel->writeCell('C' $row$ticket['nbTickets'], Excel::_FORMAT_TEXTE_);
  399.                 $row++;
  400.             }
  401.             $topConsommateurs $repoTickets->getClientTopConsommateurs($client->getId(), $dateDebut$dateFin10);
  402.             $row 29;
  403.             /** @var Tickets $ticket */
  404.             foreach ($topConsommateurs as $ticket) {
  405.                 $excel->writeCell('A' $row$ticket['nom'] . " " $ticket['prenom'], Excel::_FORMAT_TEXTE_);
  406.                 $excel->writeCell('B' $row$ticket['duree'], Excel::_FORMAT_TEXTE_);
  407.                 $excel->writeCell('C' $row$ticket['nbTickets'], Excel::_FORMAT_TEXTE_);
  408.                 $row++;
  409.             }
  410.             $tickets $repoTickets->getTicketsByClientAndDate($client->getId(), $dateDebut$dateFin);
  411.             $dureeTotale array_sum(array_map(function ($ticket) {
  412.                 return $ticket['duree'];
  413.             }, $tickets));
  414.             $excel->writeCell('F15'count($tickets), Excel::_FORMAT_NUMBER_);
  415.             $excel->writeCell('F16'$dureeTotaleExcel::_FORMAT_NUMBER_);
  416.             $excel->writeCell('F17'round($dureeTotale count($tickets), 2), Excel::_FORMAT_NUMBER_);
  417.             $excel->writeCell('F18'count(array_filter($tickets, function ($ticket) {
  418.                 return $ticket['duree'] < 5;
  419.             })), Excel::_FORMAT_NUMBER_);
  420.             $excel->writeCell('F19'count(array_filter($tickets, function ($ticket) {
  421.                 return $ticket['duree'] > 60;
  422.             })), Excel::_FORMAT_NUMBER_);
  423.             // ONGLET TICKETS
  424.             $excel->selectSheetbyIndex(2);
  425.             $excel->writeCell('A2'"Export du " $dateDebut->format('d/m/Y') . " au " $dateFin->format('d/m/Y'), Excel::_FORMAT_TEXTE_);
  426.             $row 4;
  427.             /** @var Tickets $ticket */
  428.             for ($i 0$i count($tickets); $i++) {
  429.                 $ticket $repoTickets->find($tickets[$i]['id']);
  430.                 $excel->writeCell("A" $row$ticket->getId(), Excel::_FORMAT_NUMBER_);
  431.                 $excel->writeCell("B" $row$ticket->getTitre(), Excel::_FORMAT_TEXTE_);
  432.                 $excel->writeCell("C" $row$ticket->getIdStatus()->getStatus(), Excel::_FORMAT_TEXTE_);
  433.                 $excel->writeCell("D" $rowdate('d/m/Y'$ticket->getDateCreation()), Excel::_FORMAT_DDMMYYYY_);
  434.                 $excel->writeCell("E" $row$ticket->getBeneficiaire()->getNom() . " " $ticket->getBeneficiaire()->getPrenom(), Excel::_FORMAT_TEXTE_);
  435.                 $excel->writeCell("F" $row$ticket->getDureeTotale(), Excel::_FORMAT_NUMBER_);
  436.                 $excel->applyBackgroundColorAndColor('A' $row ':F' $row, ($row == 'f5f5f5' 'ffffff'), '424242');
  437.                 $excel->fontBold('F' $row ':F' $row);
  438.                 $row++;
  439.             }
  440.             $excel->selectSheetbyIndex(3);
  441.             $excel->writeCell('A2'"Export du " $dateDebut->format('d/m/Y') . " au " $dateFin->format('d/m/Y'), Excel::_FORMAT_TEXTE_);
  442.             $row 4;
  443.             foreach ($contrats as $contrat) {
  444.                 foreach ($contrat->getLigneDeContrats()->toArray() as $ligne) {
  445.                     $excel->writeCell('A' $rowdate('d/m/Y'$contrat->getDateDebut()), Excel::_FORMAT_DDMMYYYY_);
  446.                     $excel->writeCell('B' $rowdate('d/m/Y'$contrat->getDateFin()), Excel::_FORMAT_DDMMYYYY_);
  447.                     $excel->writeCell('C' $row$ligne->getIdTypeIntervention()->gettype(), Excel::_FORMAT_TEXTE_);
  448.                     if ($ligne->getIdTypeIntervention()->getIdUnite()->getUnite() === "minute") {
  449.                         $excel->writeCell('D' $rowsprintf('%02dh%02d'floor($ligne->getQuantiteConsome() / 60), $ligne->getQuantiteConsome() % 60), Excel::_FORMAT_TEXTE_);
  450.                         $excel->writeCell('E' $rowsprintf('%02dh%02d'floor($ligne->getQuantitePrevus() / 60), $ligne->getQuantitePrevus() % 60), Excel::_FORMAT_TEXTE_);
  451.                     } else {
  452.                         $excel->writeCell('D' $row$ligne->getQuantiteConsome(), Excel::_FORMAT_NUMBER_);
  453.                         $excel->writeCell('E' $row$ligne->getQuantitePrevus(), Excel::_FORMAT_NUMBER_);
  454.                     }
  455.                     $excel->applyBackgroundColorAndColor('A' $row ':E' $row, ($row == 'f5f5f5' 'ffffff'), '424242');
  456.                     $row++;
  457.                 }
  458.             }
  459.             if ($hasActionsCommerciales) {
  460.                 $excel->selectSheetbyIndex(4);
  461.                 $excel->writeCell('A2'"Export du " $dateDebut->format('d/m/Y') . " au " $dateFin->format('d/m/Y'), Excel::_FORMAT_TEXTE_);
  462.                 $row 4;
  463.                 foreach ($actionsCommerciales as $action) {
  464.                     $excel->writeCell('A' $row, ($row 3), Excel::_FORMAT_TEXTE_);
  465.                     $excel->writeCell('B' $rowstrip_tags($action->getMessage()), Excel::_FORMAT_TEXTE_);
  466.                     $excel->writeCell('C' $rowdate('d/m/Y'$action->getDateTimestamp()), Excel::_FORMAT_DDMMYYYY_);
  467.                     if ($action->getLigneDeContrat()->getIdTypeIntervention()->getIdUnite()->getUnite() === "minute") {
  468.                         $excel->writeCell('D' $rowsprintf('%02dh%02d'floor($action->getQuantite() / 60), abs($action->getQuantite() % 60)) . " heure"Excel::_FORMAT_TEXTE_);
  469.                     } else {
  470.                         $excel->writeCell('D' $row$action->getQuantite() . " " $action->getLigneDeContrat()->getIdTypeIntervention()->getIdUnite()->getUnite(), Excel::_FORMAT_NUMBER_);
  471.                     }
  472.                     $row++;
  473.                 }
  474.             }
  475.             $excel->selectSheetbyIndex(0);
  476.         } catch (\Throwable $th) {
  477.             return $this->json([
  478.                 'status' => 400,
  479.                 'message' => $th->getMessage(),
  480.                 'trace' => $th->getTraceAsString(),
  481.                 'line' => $th->getLine(),
  482.             ], 400);
  483.         }
  484.         $excel->saveXlsx();
  485.         return $this->json(true200, []);
  486.     }
  487.     public function downloadExport()
  488.     {
  489.         $path $_SERVER["DOCUMENT_ROOT"] . ($_ENV['APP_ENV'] == "dev" '../documents/' '/ExtranetV2/documents/');
  490.         $path .= 'Export_Contrats.xlsx';
  491.         // header('Access-Control-Allow-Origin: ' . "http://localhost:8001");
  492.         header('Access-Control-Allow-Origin: ' . ($_ENV['APP_ENV'] == "dev" "http://localhost:8001" "https://ekxtranet.cco-info.fr/"));
  493.         header('Access-Control-Allow-Credentials: true');
  494.         header('Access-Control-Allow-Methods: GET');
  495.         header('Access-Control-Allow-Headers: Content-Type');
  496.         header('Content-Description: File Transfer');
  497.         header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); // Type MIME pour les fichiers Excel
  498.         header('Content-Disposition: attachment; filename="Export_Contrats.xlsx"');
  499.         header('Expires: 0');
  500.         header('Cache-Control: must-revalidate');
  501.         header('Pragma: public');
  502.         header('Content-Length: ' filesize($path));
  503.         return readfile($path);
  504.     }
  505. }