src/Controller/EntrepriseController.php line 501

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