src/Controller/EntrepriseController.php line 523

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\CSPE;
  4. use App\Entity\Note;
  5. use App\Entity\User;
  6. use App\Entity\Rappel;
  7. use App\Entity\Contact;
  8. use App\Entity\Contrat;
  9. use App\Entity\GasMeter;
  10. use App\Entity\Entreprise;
  11. use App\Entity\EspaceClient;
  12. use App\Entity\ElectricMeter;
  13. use App\Form\EntrepriseType;
  14. use App\Form\ContratType;
  15. use App\Form\UserEntrepriseType;
  16. use App\Service\PricingService;
  17. use App\Repository\EntrepriseRepository;
  18. use Symfony\Contracts\HttpClient\HttpClientInterface;
  19. use Doctrine\Persistence\ManagerRegistry;
  20. use Doctrine\ORM\EntityManagerInterface;
  21. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  22. use Symfony\Component\HttpFoundation\Request;
  23. use Symfony\Component\HttpFoundation\Response;
  24. use Symfony\Component\HttpFoundation\JsonResponse;
  25. use Symfony\Component\Routing\Annotation\Route;
  26. use Symfony\Component\Security\Core\Exception\InvalidCsrfTokenException;
  27. use Psr\Log\LoggerInterface;
  28. class EntrepriseController extends AbstractController
  29. {
  30.     private $pricingService;
  31.     private $logger;
  32.     public function __construct(PricingService $pricingServiceLoggerInterface $logger)
  33.     {
  34.         $this->pricingService $pricingService;
  35.         $this->logger $logger;
  36.     }
  37.     /**
  38.      * @Route("/entreprise", name="app_entreprise")
  39.      */
  40.     public function index(ManagerRegistry $doctrine): Response
  41.     {
  42.         $entreprises $doctrine->getRepository(Entreprise::class)->findAll();
  43.         $array_entreprises = array();
  44.         
  45.         for ($i=0$i count($entreprises); $i++) { 
  46.             // Get all users for this company
  47.             $userIds $entreprises[$i]->getUtilisateur();
  48.             $user_names = [];
  49.             if (!empty($userIds)) {
  50.                 foreach ($userIds as $userId) {
  51.                     $user $doctrine->getRepository(User::class)->find((int)$userId);
  52.                     if ($user) {
  53.                         $user_names[] = $user->getUsername();
  54.                     }
  55.                 }
  56.             }
  57.             $user_name implode(', '$user_names);
  58.             $entreprise_contacts $doctrine->getRepository(Contact::class)->findBy(['entreprise_id' => $entreprises[$i]->getId()]);
  59.             $entreprise_contacts implode(" "array_map(function($contact) {
  60.                 return $contact->getNom()." ".$contact->getPrenom();
  61.             }, $entreprise_contacts));
  62.             
  63.             // Get electric meters PDLs
  64.             $electric_meters $doctrine->getRepository(ElectricMeter::class)->findBy(['entreprise_id' => $entreprises[$i]->getId()]);
  65.             $electric_pdls array_map(function($meter) {
  66.                 return $meter->getPDL();
  67.             }, $electric_meters);
  68.             // Get gas meters PDLs
  69.             $gas_meters $doctrine->getRepository(GasMeter::class)->findBy(['entreprise_id' => $entreprises[$i]->getId()]);
  70.             $gas_pdls array_map(function($meter) {
  71.                 return $meter->getPDL();
  72.             }, $gas_meters);
  73.             // Combine all PDLs into a searchable string
  74.             $all_pdls implode(' 'array_merge($electric_pdls$gas_pdls));
  75.             $array_entreprises[$i] = [
  76.                 $entreprises[$i]->getRaisonSociale(),
  77.                 $entreprises[$i]->getCommune(),
  78.                 $entreprises[$i]->getSiret(),
  79.                 $entreprise_contacts,
  80.                 $user_name,
  81.                 '<a href="'.$this->generateUrl('app_entreprise_details',['id' => $entreprises[$i]->getId()]).'" type="button" class="btn btn-sm btn-primary mb-1">Consulter</a>
  82.                 <a href="'.$this->generateUrl('app_entreprise_edit',['id' => $entreprises[$i]->getId()]).'" type="button" class="btn btn-sm btn-warning mb-1">Modifier</a>
  83.                 <a href="'.$this->generateUrl('app_entreprise_suppr',['id' => $entreprises[$i]->getId()]).'" type="button" class="btn btn-sm btn-danger ">Supprimer</a>',
  84.                 $all_pdls// Hidden column containing all PDLs
  85.                 $entreprises[$i]->getNaf(), // Hidden column containing NAF code
  86.             ];
  87.         };
  88.         return $this->render('entreprise/index.html.twig', [
  89.             'entreprises' => $array_entreprises,
  90.         ]);
  91.     }
  92.     /**
  93.      * @Route("/entreprise/calculate-value", name="app_entreprise_calculate_value", methods={"POST"})
  94.      */
  95.     public function calculateValue(Request $requestManagerRegistry $doctrine): JsonResponse
  96.     {
  97.         $this->logger->debug('Received calculate value request', [
  98.             'car' => $request->request->get('car'),
  99.             'dateDebut' => $request->request->get('dateDebut'),
  100.             'dateFin' => $request->request->get('dateFin'),
  101.             'pdl' => $request->request->get('pdl'),
  102.             'raw_request' => $request->request->all()
  103.         ]);
  104.         // Validate CSRF token
  105.         $submittedToken $request->headers->get('X-CSRF-Token');
  106.         if (!$this->isCsrfTokenValid('calculate-value'$submittedToken)) {
  107.             $this->logger->error('Invalid CSRF token');
  108.             return new JsonResponse(['error' => 'Invalid CSRF token'], 403);
  109.         }
  110.         try {
  111.             $car floatval($request->request->get('car'));
  112.             if ($car <= 0) {
  113.                 throw new \InvalidArgumentException('CAR must be greater than 0');
  114.             }
  115.             // Parse dates and set time to start of day
  116.             $dateDebut = new \DateTime($request->request->get('dateDebut'));
  117.             $dateDebut->setTime(000);
  118.             
  119.             $dateFin = new \DateTime($request->request->get('dateFin'));
  120.             $dateFin->setTime(000);
  121.             if ($dateDebut $dateFin) {
  122.                 throw new \InvalidArgumentException('Start date must be before end date');
  123.             }
  124.             // Check if this is a gas contract by looking up the PDL
  125.             $pdl $request->request->get('pdl');
  126.             $isGasContract false;
  127.             if ($pdl) {
  128.                 $gasMeter $doctrine->getRepository(GasMeter::class)->findOneBy(['PDL' => $pdl]);
  129.                 if ($gasMeter) {
  130.                     $isGasContract true;
  131.                     // For gas contracts, adjust the start date
  132.                     $dateDebut->modify('+1 day');
  133.                 }
  134.             }
  135.             // Create a temporary contract object to calculate the value
  136.             $contrat = new Contrat();
  137.             $contrat->setCar($car);
  138.             $contrat->setDateDebut($dateDebut);
  139.             $contrat->setDateFin($dateFin);
  140.             if ($pdl) {
  141.                 $contrat->setPdl($pdl);
  142.             }
  143.             // Calculate the annual value using the pricing service
  144.             $value $this->pricingService->calculateAnnualValue($contrat);
  145.             $this->logger->debug('Calculated contract value', [
  146.                 'car' => $car,
  147.                 'dateDebut' => $dateDebut->format('d/m/Y'),
  148.                 'dateFin' => $dateFin->format('d/m/Y'),
  149.                 'isGasContract' => $isGasContract,
  150.                 'value' => $value
  151.             ]);
  152.             return new JsonResponse([
  153.                 'value' => $value,
  154.                 'debug' => [
  155.                     'car' => $car,
  156.                     'dateDebut' => $dateDebut->format('d/m/Y'),
  157.                     'dateFin' => $dateFin->format('d/m/Y'),
  158.                     'isGasContract' => $isGasContract
  159.                 ]
  160.             ]);
  161.         } catch (\Exception $e) {
  162.             $this->logger->error('Error calculating contract value', [
  163.                 'error' => $e->getMessage(),
  164.                 'trace' => $e->getTraceAsString()
  165.             ]);
  166.             return new JsonResponse(['error' => 'Error calculating value: ' $e->getMessage()], 500);
  167.         }
  168.     }
  169.     /**
  170.      * @Route("/entreprise/add", name="app_entreprise_add")
  171.      */
  172.     public function add(Request $requestEntityManagerInterface $entityManager): Response
  173.     {
  174.         $entreprises = new Entreprise();
  175.         // using createQueryBuilder
  176.         $utilisateurs $entityManager->createQueryBuilder()
  177.             ->select('u')
  178.             ->from(User::class, 'u')
  179.             ->where('u.roles LIKE :roles')
  180.             ->setParameter('roles''%ROLE_TEAM%')
  181.             ->getQuery()
  182.             ->getResult();
  183.         $array_utilisateurs = array();
  184.         for ($i=0$i count($utilisateurs); $i++) { 
  185.             $array_utilisateurs[$utilisateurs[$i]->getUsername()] = $utilisateurs[$i]->getId();
  186.         }
  187.         $form $this->createForm(EntrepriseType::class, $entreprises, ['utilisateurs' => $array_utilisateurs]);
  188.         $form->handleRequest($request);
  189.         if ($form->isSubmitted() && $form->isValid()) {
  190.             $entityManager->persist($entreprises);
  191.             $entityManager->flush();
  192.             return $this->redirectToRoute('app_entreprise');
  193.         }
  194.         return $this->render('entreprise/add.html.twig', [
  195.             'entrepriseForm' => $form->createView(),
  196.             'array_utilisateurs' => $array_utilisateurs,
  197.         ]);
  198.     }
  199.     /**
  200.      * @Route("/entreprise/edit/{id}", name="app_entreprise_edit")
  201.      */
  202.     public function edit(int $idRequest $requestEntityManagerInterface $entityManagerManagerRegistry $doctrine): Response
  203.     {
  204.         $entreprise $doctrine->getRepository(Entreprise::class)->findOneBy(['id' => $id]);
  205.         $utilisateurs $entityManager->createQueryBuilder()
  206.             ->select('u')
  207.             ->from(User::class, 'u')
  208.             ->where('u.roles LIKE :roles')
  209.             ->setParameter('roles''%ROLE_TEAM%')
  210.             ->getQuery()
  211.             ->getResult();
  212.         $array_utilisateurs = array();
  213.         for ($i=0$i count($utilisateurs); $i++) { 
  214.             $array_utilisateurs[$utilisateurs[$i]->getUsername()] = $utilisateurs[$i]->getId();
  215.         }
  216.         $form $this->createForm(EntrepriseType::class, $entreprise, ['utilisateurs' => $array_utilisateurs]);
  217.         $form->handleRequest($request);
  218.         $entreprise_entity = [ 'raison_sociale' => $entreprise->getRaisonSociale(),
  219.             'siret' => $entreprise->getSiret(),
  220.             'naf' => $entreprise->getNaf(),
  221.             'rcs' => $entreprise->getRcs(),
  222.             'num_voie' => $entreprise->getNumVoie(),
  223.             'adresse' => $entreprise->getAdresse(),
  224.             'code_postal' => $entreprise->getCodePostal(),
  225.             'commune' => $entreprise->getCommune(),
  226.             'code_insee' => $entreprise->getCodeInsee(),
  227.             'statut' => $entreprise->getStatut(),
  228.             'utilisateur' => $entreprise->getUtilisateur(),
  229.         ];
  230.         if ($form->isSubmitted() && $form->isValid()) {
  231.             $entreprisesEdit $form->getData();
  232.             if($entreprisesEdit->getRaisonSociale() != null){
  233.                 $entreprise->setRaisonSociale($entreprisesEdit->getRaisonSociale());
  234.             }
  235.             if($entreprisesEdit->getSiret() != null){
  236.                 $entreprise->setSiret($entreprisesEdit->getSiret());
  237.             }
  238.             if($entreprisesEdit->getNaf() != null){
  239.                 $entreprise->setNaf($entreprisesEdit->getNaf());
  240.             }
  241.             if($entreprisesEdit->getRcs() != null){
  242.                 $entreprise->setRcs($entreprisesEdit->getRcs());
  243.             }
  244.             if($entreprisesEdit->getNumVoie() != null){
  245.                 $entreprise->setNumVoie($entreprisesEdit->getNumVoie());
  246.             }
  247.             if($entreprisesEdit->getAdresse() != null){
  248.                 $entreprise->setAdresse($entreprisesEdit->getAdresse());
  249.             }
  250.             if($entreprisesEdit->getCodePostal() != null){
  251.                 $entreprise->setCodePostal($entreprisesEdit->getCodePostal());
  252.             }
  253.             if($entreprisesEdit->getCommune() != null){
  254.                 $entreprise->setCommune($entreprisesEdit->getCommune());
  255.             }
  256.             if($entreprisesEdit->getCodeInsee() != null){
  257.                 $entreprise->setCodeInsee($entreprisesEdit->getCodeInsee());
  258.             }
  259.             if($entreprisesEdit->getStatut() != null){
  260.                 $entreprise->setStatut($entreprisesEdit->getStatut());
  261.             }
  262.             if($entreprisesEdit->getUtilisateur() != null){
  263.                 $entreprise->setUtilisateur(array_map('strval'$entreprisesEdit->getUtilisateur()));
  264.             }
  265.             $entityManager->persist($entreprise);
  266.             $entityManager->flush();
  267.             return $this->redirectToRoute('app_entreprise');
  268.         }
  269.         return $this->render('entreprise/edit.html.twig', [
  270.             'entrepriseForm' => $form->createView(),
  271.             'entreprise' => $entreprise_entity
  272.         ]);
  273.     }
  274.     /**
  275.      * @Route("/entreprise/suppr/{id}", name="app_entreprise_suppr")
  276.      */
  277.     public function suppr(int $idRequest $requestEntityManagerInterface $entityManagerManagerRegistry $doctrine): Response
  278.     {
  279.         $notes $doctrine->getRepository(Note::class)->findBy(['entreprise_id' => $id]);
  280.         for ($i=0$i count($notes); $i++) { 
  281.             $entityManager->remove($notes[$i]);
  282.             $entityManager->flush();
  283.         };
  284.         $rappels $doctrine->getRepository(Rappel::class)->findBy(['entreprise_id' => $id]);
  285.         for ($i=0$i count($rappels); $i++) { 
  286.             $entityManager->remove($rappels[$i]);
  287.             $entityManager->flush();
  288.         };
  289.         $electric_meters $doctrine->getRepository(ElectricMeter::class)->findBy(['entreprise_id' => $id]);
  290.         for ($i=0$i count($electric_meters); $i++) { 
  291.             $entityManager->remove($electric_meters[$i]);
  292.             $entityManager->flush();
  293.         };
  294.         $gas_meters $doctrine->getRepository(GasMeter::class)->findBy(['entreprise_id' => $id]);
  295.         for ($i=0$i count($gas_meters); $i++) { 
  296.             $entityManager->remove($gas_meters[$i]);
  297.             $entityManager->flush();
  298.         };
  299.         $cspes $doctrine->getRepository(CSPE::class)->findBy(['entreprise_id' => $id]);
  300.         for ($i=0$i count($cspes); $i++) { 
  301.             $entityManager->remove($cspes[$i]);
  302.             $entityManager->flush();
  303.         };
  304.         $espace_clients $doctrine->getRepository(EspaceClient::class)->findBy(['entreprise_id' => $id]);
  305.         for ($i=0$i count($espace_clients); $i++) { 
  306.             $entityManager->remove($espace_clients[$i]);
  307.             $entityManager->flush();
  308.         };
  309.         $contacts $doctrine->getRepository(Contact::class)->findBy(['entreprise_id' => $id]);
  310.         for ($i=0$i count($contacts); $i++) { 
  311.             $entityManager->remove($contacts[$i]);
  312.             $entityManager->flush();
  313.         };
  314.         $entreprise $doctrine->getRepository(Entreprise::class)->findOneBy(['id' => $id]);
  315.         $entityManager->remove($entreprise);
  316.         $entityManager->flush();
  317.         return $this->redirectToRoute('app_entreprise');
  318.     }
  319.     /**
  320.      * @Route("/entreprise/details/{id}", name="app_entreprise_details")
  321.      */
  322.     public function details(int $idManagerRegistry $doctrine): Response
  323.     {
  324.         $entreprise $doctrine->getRepository(Entreprise::class)->findOneBy(['id' => $id]);
  325.         if(!$entreprise){
  326.             return $this->redirectToRoute('app_requetes');
  327.         }
  328.         
  329.         // Get all users for this company
  330.         $userIds $entreprise->getUtilisateur();
  331.         $user_names = [];
  332.         if (!empty($userIds)) {
  333.             foreach ($userIds as $userId) {
  334.                 $user $doctrine->getRepository(User::class)->find((int)$userId);
  335.                 if ($user) {
  336.                     $user_names[] = $user->getUsername();
  337.                 }
  338.             }
  339.         }
  340.         $user_name implode(', '$user_names);
  341.         $entreprise_entity = [ 'id' => $entreprise->getId(),
  342.             'raison_sociale' => $entreprise->getRaisonSociale(),
  343.             'siret' => $entreprise->getSiret(),
  344.             'naf' => $entreprise->getNaf(),
  345.             'rcs' => $entreprise->getRcs(),
  346.             'num_voie' => $entreprise->getNumVoie(),
  347.             'adresse' => $entreprise->getAdresse(),
  348.             'code_postal' => $entreprise->getCodePostal(),
  349.             'commune' => $entreprise->getCommune(),
  350.             'code_insee' => $entreprise->getCodeInsee(),
  351.             'statut' => $entreprise->getStatut(),
  352.             'utilisateur' => $user_names,
  353.         ];
  354.         // Fetch and prepare notes data
  355.         $notes $doctrine->getRepository(Note::class)->findBy(['entreprise_id' => $id], ['date_creation' => 'DESC']);
  356.         $array_notes = array();
  357.         foreach ($notes as $note) {
  358.             $user $note->getUser();
  359.             $array_notes[] = [
  360.                 'date_creation' => $note->getDateCreation() ? $note->getDateCreation()->format('d/m/Y') : '',
  361.                 'texte' => $note->getTexte(),
  362.                 'user' => $user $user->getUsername() : 'Non défini',
  363.                 'edit_url' => $this->generateUrl('app_note_edit', ['id' => $note->getId()]),
  364.                 'delete_url' => $this->generateUrl('app_note_suppr', ['id' => $note->getId()]),
  365.             ];
  366.         }
  367.         // Fetch and prepare rappels data
  368.         $rappels $doctrine->getRepository(Rappel::class)->findBy(['entreprise_id' => $id]);
  369.         $array_rappels = array();
  370.         foreach ($rappels as $rappel) {
  371.             $array_rappels[] = [
  372.                 $rappel->getTitre(),
  373.                 $rappel->getDescription(),
  374.                 $rappel->getEcheance()->format('d/m/Y'),
  375.                 $rappel->isCompleter(),
  376.                 '<a href="'.$this->generateUrl('app_rappel_edit',['id' => $rappel->getId()]).'" type="button" class="btn btn-sm btn-primary mb-1">Modifier</a>
  377.                 <a href="'.$this->generateUrl('app_rappel_suppr',['id' => $rappel->getId()]).'" type="button" class="btn btn-sm btn-danger ">Supprimer</a>',
  378.             ];
  379.     }
  380.         // Fetch electric meters and their PDLs
  381.         $electric_meters $doctrine->getRepository(ElectricMeter::class)->findBy(['entreprise_id' => $id]);
  382.         $array_electric_meters array_map(function($meter) {
  383.             return [
  384.                 'pdl' => $meter->getPDL(),
  385.                 'id' => $meter->getId(),
  386.             ];
  387.         }, $electric_meters);
  388.         $electric_pdls array_map(function($meter) {
  389.             return $meter->getPDL();
  390.         }, $electric_meters);
  391.         // Fetch gas meters and their PDLs
  392.         $gas_meters $doctrine->getRepository(GasMeter::class)->findBy(['entreprise_id' => $id]);
  393.         $array_gas_meters array_map(function($meter) {
  394.             return [
  395.                 'pdl' => $meter->getPDL(),
  396.                 'id' => $meter->getId(),
  397.             ];
  398.         }, $gas_meters);
  399.         $gas_pdls array_map(function($meter) {
  400.             return $meter->getPDL();
  401.         }, $gas_meters);
  402.         $cspes $doctrine->getRepository(CSPE::class)->findBy(['entreprise_id' => $id]);
  403.         $array_cspes = array();
  404.         for ($i=0$i count($cspes); $i++) { 
  405.             $array_cspes[$i] = [
  406.                 $cspes[$i]->getNotes(),
  407.                 date_format($cspes[$i]->getDate(),'d/m/Y'),
  408.                 $cspes[$i]->getValeur(),
  409.                 '<a href="'.$this->generateUrl('app_cspe_edit',['id' => $cspes[$i]->getId()]).'" type="button" class="btn btn-sm btn-warning mb-1">Modifier</a>
  410.                 <a href="'.$this->generateUrl('app_cspe_suppr',['id' => $cspes[$i]->getId()]).'" type="button" class="btn btn-sm btn-danger ">Supprimer</a>',
  411.             ];
  412.         };
  413.         $espace_clients $doctrine->getRepository(EspaceClient::class)->findBy(['entreprise_id' => $id]);
  414.         $array_espace_clients = array();
  415.         for ($i=0$i count($espace_clients); $i++) {
  416.             $lien $espace_clients[$i]->getLien();
  417.             // Add http:// if no protocol specified
  418.             if (!preg_match("~^(?:f|ht)tps?://~i"$lien)) {
  419.                 $lien "http://" $lien;
  420.             }
  421.             
  422.             // Extract domain name for button text
  423.             $domain parse_url($lienPHP_URL_HOST) ?: $lien;
  424.             $domainParts explode('.'$domain);
  425.             $buttonText count($domainParts) > $domainParts[1] : $domain;
  426.             
  427.             $array_espace_clients[$i] = [
  428.                 $espace_clients[$i]->getFournisseur(),
  429.                 $espace_clients[$i]->getLogin(),
  430.                 $espace_clients[$i]->getMdp(),
  431.                 '<a href="'.$lien.'" target="_blank" type="button" class="btn btn-primary">'.$buttonText.'</a>',
  432.                 '<a href="'.$this->generateUrl('app_espace_client_edit',['id' => $espace_clients[$i]->getId()]).'" type="button" class="btn btn-sm btn-warning mb-1">Modifier</a>
  433.                 <a href="'.$this->generateUrl('app_espace_client_suppr',['id' => $espace_clients[$i]->getId()]).'" type="button" class="btn btn-sm btn-danger ">Supprimer</a>',
  434.             ];
  435.         };
  436.         $contacts $doctrine->getRepository(Contact::class)->findBy(['entreprise_id' => $id]);
  437.         $array_contacts = array();
  438.         for ($i=0$i count($contacts); $i++) { 
  439.             $array_contacts[$i] = [
  440.                 $contacts[$i]->getNom(),
  441.                 $contacts[$i]->getPrenom(),
  442.                 $contacts[$i]->getCivilite(),
  443.                 $contacts[$i]->getFonction(),
  444.                 $contacts[$i]->getFixe(),
  445.                 $contacts[$i]->getEmail(),
  446.                 $contacts[$i]->getPortable(),
  447.                 '<a href="'.$this->generateUrl('app_contact_edit',['id' => $contacts[$i]->getId()]).'" type="button" class="btn btn-sm btn-warning mb-1">Modifier</a>
  448.                 <a href="'.$this->generateUrl('app_contact_suppr',['id' => $contacts[$i]->getId()]).'" type="button" class="btn btn-sm btn-danger ">Supprimer</a>',
  449.             ];
  450.         };
  451.         $contrats $doctrine->getRepository(Contrat::class)->findBy(['entreprise' => $entreprise]);
  452.         $array_contrats = array();
  453.         foreach ($contrats as $contrat) {
  454.             $array_contrats[] = [
  455.                 "id" => $contrat->getId(),
  456.                 "duree" => $contrat->getDuree(),
  457.                 "valeur" => $contrat->getValeur(),
  458.                 "pdl" => $contrat->getPdl(),
  459.                 "car" => $contrat->getCar(),
  460.                 "prix_moyen" => $contrat->getPrixMoyen(),
  461.                 "fournisseur" => $contrat->getFournisseur(),
  462.                 "date_debut" => $contrat->getDateDebut() ? $contrat->getDateDebut()->format('d/m/Y') : '',
  463.                 "date_fin" => $contrat->getDateFin() ? $contrat->getDateFin()->format('d/m/Y') : '',
  464.                 "date_signature" => $contrat->getDateSignature() ? $contrat->getDateSignature()->format('d/m/Y') : '',
  465.                 '<a href="'.$this->generateUrl('app_entreprise_edit_contrat', ['entrepriseId' => $entreprise->getId(), 'id' => $contrat->getId()]).'" type="button" class="btn btn-sm btn-warning mb-1">Modifier</a>
  466.                 <a href="'.$this->generateUrl('app_entreprise_delete_contrat', ['entrepriseId' => $entreprise->getId(), 'id' => $contrat->getId()]).'" type="button" class="btn btn-sm btn-danger">Supprimer</a>',
  467.             ];
  468.         }
  469.         return $this->render('entreprise/details.html.twig', [
  470.             'entreprise' => $entreprise_entity,
  471.             'notes' => $array_notes,
  472.             'rappels' => $array_rappels,
  473.             'electric_meters' => $array_electric_meters,
  474.             'gas_meters' => $array_gas_meters,
  475.             'electric_pdls' => $electric_pdls,
  476.             'gas_pdls' => $gas_pdls,
  477.             'cspes' => $array_cspes,
  478.             'espace_clients' => $array_espace_clients,
  479.             'contacts' => $array_contacts,
  480.             'contrats' => $array_contrats,
  481.         ]);
  482.     }
  483.     /**
  484.      * @Route("/entreprise/electric_meter/details/{id}", name="app_electric_meter_details")
  485.      */
  486.     public function electricMeterDetails(Request $requestint $idManagerRegistry $doctrine): JsonResponse
  487.     {
  488.         $pdl $request->query->get('pdl');
  489.         
  490.         if (!$pdl) {
  491.             return new JsonResponse(['error' => 'PDL parameter is required'], 400);
  492.         }
  493.         // First verify the entreprise exists
  494.         $entreprise $doctrine->getRepository(Entreprise::class)->find($id);
  495.         if (!$entreprise) {
  496.             return new JsonResponse(['error' => 'Entreprise not found'], 404);
  497.         }
  498.         // Find the electric meter using standard findOneBy method
  499.         $electricMeter $doctrine->getRepository(ElectricMeter::class)->findOneBy([
  500.             'entreprise_id' => $id,
  501.             'PDL' => $pdl
  502.         ]);
  503.         if (!$electricMeter) {
  504.             return new JsonResponse(['error' => 'Electric meter not found'], 404);
  505.         }
  506.         $meterDetails = [
  507.             'adresseCompteur' => $electricMeter->getAdresseCompteur(),
  508.             'PDL' => $electricMeter->getPDL(),
  509.             'dateDebut' => $electricMeter->getDateDebut() ? $electricMeter->getDateDebut()->format('d/m/Y') : '',
  510.             'dateFin' => $electricMeter->getDateFin() ? $electricMeter->getDateFin()->format('d/m/Y') : '',
  511.             'PS' => $electricMeter->getPS(),
  512.             'profil' => $electricMeter->getProfil(),
  513.             'CAR' => $electricMeter->getCAR(),
  514.             'fournisseur' => $electricMeter->getFournisseur(),
  515.             'prix' => $electricMeter->getPrix()
  516.         ];
  517.         return new JsonResponse($meterDetails);
  518.     }
  519.     /**
  520.      * @Route("/entreprise/{id}/gas-meter-details", name="app_gas_meter_details")
  521.      */
  522.     public function gasMeterDetails(Request $requestint $idManagerRegistry $doctrine): JsonResponse
  523.     {
  524.         $pdl $request->query->get('pdl');
  525.         
  526.         if (!$pdl) {
  527.             return new JsonResponse(['error' => 'PDL parameter is required'], 400);
  528.         }
  529.         // First verify the entreprise exists
  530.         $entreprise $doctrine->getRepository(Entreprise::class)->find($id);
  531.         if (!$entreprise) {
  532.             return new JsonResponse(['error' => 'Entreprise not found'], 404);
  533.         }
  534.         // Find the gas meter using standard findOneBy method
  535.         $gasMeter $doctrine->getRepository(GasMeter::class)->findOneBy([
  536.             'entreprise_id' => $id,
  537.             'PDL' => $pdl
  538.         ]);
  539.         if (!$gasMeter) {
  540.             return new JsonResponse(['error' => 'Gas meter not found'], 404);
  541.         }
  542.         $meterDetails = [
  543.             'adresseCompteur' => $gasMeter->getAdresseCompteur(),
  544.             'PDL' => $gasMeter->getPDL(),  // Added PDL field
  545.             'dateDebut' => $gasMeter->getDateDebut() ? $gasMeter->getDateDebut()->format('d/m/Y') : '',
  546.             'dateFin' => $gasMeter->getDateFin() ? $gasMeter->getDateFin()->format('d/m/Y') : '',
  547.             'profil' => $gasMeter->getProfil(),
  548.             'CAR' => $gasMeter->getCAR(),
  549.             'fournisseur' => $gasMeter->getFournisseur(),
  550.             'prix' => $gasMeter->getPrix(),
  551.         ];
  552.         return new JsonResponse($meterDetails);
  553.     }
  554.     /**
  555.      * @Route("/entreprise/infoclient", name="app_entreprise_infoclient")
  556.      */
  557.     public function infoclient(HttpClientInterface $httpClient): JsonResponse
  558.     {
  559.         // Utilisez les paramètres appropriés pour votre requête
  560.         $url 'https://api.societe.com/api/v1/infoclient';
  561.         $headers = [
  562.             'headers' => [
  563.                 'X-Authorization' => 'socapi 8938e836988619dc20be14360fba30e3',
  564.             ],
  565.         ];
  566.         // Effectuez la requête
  567.         $response $httpClient->request('GET'$url$headers);
  568.         // Renvoie la réponse JSON
  569.         return new JsonResponse($response->toArray());
  570.     }
  571.     /**
  572.      * @Route("/entreprise/info_entreprise/{numero}", name="app_entreprise_info_entreprise")
  573.      */
  574.     public function info_entreprise(HttpClientInterface $httpClientManagerRegistry $doctrine$numero): JsonResponse
  575.     {
  576.         // Vérification que l'entreprise n'est pas déjà enregistré en BDD
  577.         $entreprise $doctrine->getRepository(Entreprise::class)->findOneBy(['Siret' => $numero]);
  578.         if($entreprise !=null){
  579.             return new JsonResponse("existant");
  580.         }
  581.         $url 'https://api.societe.com/api/v1/entreprise/'.$numero.'/infoslegales';
  582.         $headers = [
  583.             'headers' => [
  584.                 'X-Authorization' => 'socapi 8938e836988619dc20be14360fba30e3',
  585.             ],
  586.         ];
  587.         // Effectuez la requête
  588.         $response $httpClient->request('GET'$url$headers);
  589.         // Renvoie la réponse JSON
  590.         return new JsonResponse($response->toArray());
  591.     }
  592.     /**
  593.      * @Route("/entreprise/{id}/new-contrat", name="app_entreprise_new_contrat")
  594.      */
  595.     public function newContrat(Request $requestEntityManagerInterface $entityManagerManagerRegistry $doctrineint $id): Response
  596.     {
  597.         $entreprise $doctrine->getRepository(Entreprise::class)->find($id);
  598.         
  599.         if (!$entreprise) {
  600.             throw $this->createNotFoundException('Entreprise not found');
  601.         }
  602.         $contrat = new Contrat();
  603.         $contrat->setEntreprise($entreprise);
  604.         $meterId $request->query->get('meterId');
  605.         $meterType $request->query->get('meterType');
  606.         if ($meterId && $meterType) {
  607.             $meter null;
  608.             if ($meterType === 'electric') {
  609.                 $meter $doctrine->getRepository(ElectricMeter::class)->find($meterId);
  610.             } elseif ($meterType === 'gas') {
  611.                 $meter $doctrine->getRepository(GasMeter::class)->find($meterId);
  612.             }
  613.             if ($meter) {
  614.                 $contrat->setPdl($meter->getPDL());
  615.                 $contrat->setCar($meter->getCAR());
  616.                 $contrat->setPrixMoyen($meter->getPrix());
  617.                 $contrat->setFournisseur($meter->getFournisseur());
  618.                 // For both types, set the dates
  619.                 $contrat->setDateDebut($meter->getDateDebut());
  620.                 $contrat->setDateFin($meter->getDateFin());
  621.                 // Calculate initial duration and value
  622.                 if ($meter->getDateDebut() && $meter->getDateFin()) {
  623.                     $dateDebut $meter->getDateDebut();
  624.                     if ($dateDebut) {
  625.                         if ($meterType === 'gas') {
  626.                             $dateDebut->modify('+1 day');
  627.                         }
  628.                     }
  629.                     $duration $this->calculateDurationInMonths($dateDebut$meter->getDateFin());
  630.                     $contrat->setDuree($duration);
  631.                     $annualValue $this->pricingService->calculateAnnualValue($contrat);
  632.                     $contrat->setValeur($annualValue);
  633.                 }
  634.             }
  635.         }
  636.         $pdlChoices $this->getPDLChoicesForEntreprise($doctrine$entreprise);
  637.         $form $this->createForm(ContratType::class, $contrat, [
  638.             'pdl_choices' => $pdlChoices
  639.         ]);
  640.         $form->handleRequest($request);
  641.         if ($form->isSubmitted() && $form->isValid()) {
  642.             // Calculate duration in months
  643.             $duration $this->calculateDurationInMonths($contrat->getDateDebut(), $contrat->getDateFin());
  644.             $contrat->setDuree($duration);
  645.             // Only calculate value if not manually set
  646.             $submittedValue $form->get('valeur')->getData();
  647.             if ($submittedValue === null || $submittedValue === 0.0) {
  648.                 $annualValue $this->pricingService->calculateAnnualValue($contrat);
  649.                 $contrat->setValeur($annualValue);
  650.             }
  651.             // Get the first user as the collaborateur (maintain backward compatibility)
  652.             $userIds $entreprise->getUtilisateur();
  653.             if (!empty($userIds)) {
  654.                 $user $doctrine->getRepository(User::class)->find((int)$userIds[0]);
  655.                 if ($user) {
  656.                     $contrat->setCollaborateur($user);
  657.                 }
  658.             }
  659.             $entityManager->persist($contrat);
  660.             $entityManager->flush();
  661.             if ($request->isXmlHttpRequest()) {
  662.                 return new JsonResponse([
  663.                     'success' => true,
  664.                     'contractId' => $contrat->getId(),
  665.                     'message' => 'Le contrat a été créé avec succès.'
  666.                 ]);
  667.             }
  668.             return $this->redirectToRoute('app_entreprise_details', ['id' => $entreprise->getId()]);
  669.         }
  670.         return $this->render('entreprise/new_contrat.html.twig', [
  671.             'entreprise' => $entreprise,
  672.             'form' => $form->createView(),
  673.         ]);
  674.     }
  675.     /**
  676.      * @Route("/entreprise/{entrepriseId}/edit-contrat/{id}", name="app_entreprise_edit_contrat")
  677.      */
  678.     public function editContrat(Request $requestEntityManagerInterface $entityManagerManagerRegistry $doctrineint $entrepriseIdint $id): Response
  679.     {
  680.         $entreprise $doctrine->getRepository(Entreprise::class)->find($entrepriseId);
  681.         $contrat $doctrine->getRepository(Contrat::class)->find($id);
  682.         if (!$entreprise) {
  683.             throw $this->createNotFoundException('Entreprise not found');
  684.         }
  685.         if (!$contrat) {
  686.             throw $this->createNotFoundException('Contrat not found');
  687.         }
  688.         // Determine if this is a gas contract
  689.         $isGasContract false;
  690.         $gasMeter $doctrine->getRepository(GasMeter::class)->findOneBy([
  691.             'entreprise_id' => $entrepriseId,
  692.             'PDL' => $contrat->getPdl()
  693.         ]);
  694.         if ($gasMeter) {
  695.             $isGasContract true;
  696.         }
  697.         // S'assurer que l'entreprise est définie sur le contrat
  698.         $contrat->setEntreprise($entreprise);
  699.         $pdlChoices $this->getPDLChoicesForEntreprise($doctrine$entreprise);
  700.         $form $this->createForm(ContratType::class, $contrat, [
  701.             'pdl_choices' => $pdlChoices
  702.         ]);
  703.         $form->handleRequest($request);
  704.         if ($form->isSubmitted() && $form->isValid()) {
  705.             // S'assurer que l'entreprise est toujours définie après la soumission du formulaire
  706.             $contrat->setEntreprise($entreprise);
  707.             // For gas contracts, ensure the start date is adjusted
  708.             $dateDebut $contrat->getDateDebut();
  709.             if ($dateDebut) {
  710.                 if ($isGasContract) {
  711.                     $dateDebut->modify('+1 day');
  712.                 }
  713.             }
  714.             // Recalculate duration in months
  715.             $duration $this->calculateDurationInMonths($dateDebut$contrat->getDateFin());
  716.             $contrat->setDuree($duration);
  717.             // Only calculate value if not manually set
  718.             $submittedValue $form->get('valeur')->getData();
  719.             if ($submittedValue === null || $submittedValue === 0.0) {
  720.                 $annualValue $this->pricingService->calculateAnnualValue($contrat);
  721.                 $contrat->setValeur($annualValue);
  722.             }
  723.             $entityManager->flush();
  724.             return $this->redirectToRoute('app_entreprise_details', ['id' => $entreprise->getId()]);
  725.         }
  726.         return $this->render('entreprise/edit_contrat.html.twig', [
  727.             'entreprise' => $entreprise,
  728.             'contrat' => $contrat,
  729.             'form' => $form->createView(),
  730.         ]);
  731.     }
  732.     /**
  733.      * @Route("/entreprise/{entrepriseId}/delete-contrat/{id}", name="app_entreprise_delete_contrat")
  734.      */
  735.     public function deleteContrat(Request $requestEntityManagerInterface $entityManagerManagerRegistry $doctrineint $entrepriseIdint $id): Response
  736.     {
  737.         $entreprise $doctrine->getRepository(Entreprise::class)->find($entrepriseId);
  738.         $contrat $doctrine->getRepository(Contrat::class)->find($id);
  739.         if (!$entreprise) {
  740.             throw $this->createNotFoundException('Entreprise not found');
  741.         }
  742.         if (!$contrat) {
  743.             throw $this->createNotFoundException('Contrat not found');
  744.         }
  745.         if ($this->isCsrfTokenValid('delete'.$contrat->getId(), $request->request->get('_token'))) {
  746.             $entityManager->remove($contrat);
  747.             $entityManager->flush();
  748.         }
  749.         return $this->redirectToRoute('app_entreprise_details', ['id' => $entreprise->getId()]);
  750.     }
  751.     private function calculateDurationInMonths(?\DateTimeInterface $dateDebut, ?\DateTimeInterface $dateFin): ?int
  752.     {
  753.         if (!$dateDebut || !$dateFin) {
  754.             return null;
  755.         }
  756.         $interval $dateDebut->diff($dateFin);
  757.         return $interval->12 $interval->m;
  758.     }
  759.     private function getPDLChoicesForEntreprise(ManagerRegistry $doctrineEntreprise $entreprise): array
  760.     {
  761.         $electricMeters $doctrine->getRepository(ElectricMeter::class)->findBy(['entreprise_id' => $entreprise->getId()]);
  762.         $gasMeters $doctrine->getRepository(GasMeter::class)->findBy(['entreprise_id' => $entreprise->getId()]);
  763.         $pdlChoices = [];
  764.         foreach ($electricMeters as $meter) {
  765.             $pdlChoices[$meter->getPDL()] = $meter->getPDL();
  766.         }
  767.         foreach ($gasMeters as $meter) {
  768.             $pdlChoices[$meter->getPDL()] = $meter->getPDL();
  769.         }
  770.         return $pdlChoices;
  771.     }
  772.     /**
  773.      * @Route("/entreprise/associate-user", name="app_entreprise_associate_user")
  774.      */
  775.     public function associateUser(Request $requestEntityManagerInterface $entityManager): Response
  776.     {
  777.         $this->denyAccessUnlessGranted('ROLE_COMPTA');
  778.         try {
  779.             $form $this->createForm(UserEntrepriseType::class);
  780.             $form->handleRequest($request);
  781.             if ($form->isSubmitted() && $form->isValid()) {
  782.                 $data $form->getData();
  783.                 $user $data['user'];
  784.                 $entreprises $data['entreprises'];
  785.                 // Vérification des données
  786.                 if (!$user || !$entreprises || empty($entreprises)) {
  787.                     throw new \InvalidArgumentException('Utilisateur et entreprises sont requis');
  788.                 }
  789.                 // Add ROLE_CLIENT_PRO if user doesn't have it
  790.                 if (!$user->hasRole('ROLE_CLIENT_PRO')) {
  791.                     $roles $user->getRoles();
  792.                     $roles[] = 'ROLE_CLIENT_PRO';
  793.                     $user->setRoles(array_unique($roles));
  794.                 }
  795.                 // Associate user with enterprises
  796.                 foreach ($entreprises as $entreprise) {
  797.                     if (!$user->getEntreprises()->contains($entreprise)) {
  798.                         $user->addEntreprise($entreprise);
  799.                         $entreprise->addUtilisateur(strval($user->getId()));
  800.                     }
  801.                 }
  802.                 
  803.                 $entityManager->persist($user);
  804.                 $entityManager->flush();
  805.                 $this->addFlash('success'sprintf(
  806.                     'L\'utilisateur %s a été associé avec succès à %d entreprise(s)',
  807.                     $user->getUsername(),
  808.                     count($entreprises)
  809.                 ));
  810.                 return $this->redirectToRoute('app_entreprise');
  811.             }
  812.             return $this->render('entreprise/associate_user.html.twig', [
  813.                 'form' => $form->createView(),
  814.             ]);
  815.         } catch (\Exception $e) {
  816.             $this->addFlash('error''Une erreur est survenue lors de l\'association : ' $e->getMessage());
  817.             return $this->redirectToRoute('app_entreprise_associate_user');
  818.         }
  819.     }
  820. }