src/Controller/FirmeUpController.php line 4254

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\HttpFoundation\Response;
  5. use Symfony\Component\Routing\Annotation\Route;
  6. use Doctrine\DBAL\Connection;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use App\Service\FirmeService;
  9. use App\Service\LocalisationService;
  10. use App\Service\RubriquePrestationService;
  11. use App\Service\ProduitKompassService;
  12. use App\Service\FirmeDetailsService;
  13. use App\Service\FirmeUpService;
  14. use App\Service\ModificationLoggerService;
  15. use Symfony\Component\HttpFoundation\JsonResponse;
  16. class FirmeUpController extends AbstractController
  17. {
  18.     private $connection;
  19.     private $firmeService;
  20.     private $localisationService;
  21.     private $rubriqueprestationService;
  22.     private $produitKompassService;
  23.     private $FirmeDetailsService;
  24.     private $FirmeUpService;
  25.     private $ModificationLoggerService;
  26.     public function __construct(Connection $connection,FirmeService $firmeService,LocalisationService $localisationService ,RubriquePrestationService $rubriqueprestationService,ProduitKompassService $produitKompassService,FirmeDetailsService $FirmeDetailsService,FirmeUpService $FirmeUpService,ModificationLoggerService $ModificationLoggerService)
  27.     {
  28.         $this->connection $connection;
  29.         $this->firmeService $firmeService;
  30.         $this->localisationService $localisationService;
  31.         $this->rubriqueprestationService $rubriqueprestationService;
  32.         $this->produitKompassService $produitKompassService;
  33.         $this->FirmeDetailsService $FirmeDetailsService;
  34.         $this->FirmeUpService $FirmeUpService;
  35.         $this->ModificationLoggerService $ModificationLoggerService;
  36.     }
  37.     /**
  38.      * @Route("/nonFirmePL/up", name="app_non_profession_lib")
  39.      */
  40.     public function nonFirmeUpPL(Request $request,FirmeService $firmeService): Response
  41.     {   
  42.         $pageSubtitle 'Fiche client';
  43.         $user $this->getUser();
  44.         if (!$user instanceof \App\Entity\UserRegistration) {
  45.             $this->addFlash('error''Veuillez vous connecter.');
  46.             return $this->redirectToRoute('app_login');
  47.         }
  48.         $userId $user->getId();
  49.         // $codeFirme = $user->getCodeFirme();
  50.         $firme $firmeService->getFirmeByUserId($userId);
  51.         if ($firme) {
  52.             $firme['horaires'] = json_decode($firme['horaires'] ?? '[]'true);
  53.             $firme['pause'] = json_decode($firme['pause'] ?? '[]'true);
  54.             $firme['rubriques'] = json_decode($firme['rubriques'] ?? '[]'true);
  55.             $firme['prestations'] = json_decode($firme['prestations'] ?? '[]'true);
  56.             $firme['produits'] = json_decode($firme['produits'] ?? '[]'true);
  57.             $firme['marques'] = json_decode($firme['marques'] ?? '[]'true);
  58.             $firme['actes'] = json_decode($firme['actes'] ?? '[]'true);
  59.             $firme['activite'] = $firme['activite'] ?? '';
  60.         } else {
  61.             // Par exemple, on passe un tableau vide au template
  62.             $firme = [
  63.                 'horaires' => [],
  64.                 'pause' => [],
  65.                 'rubriques' => [],
  66.                 'prestations' => [],
  67.                 'produits' => [],
  68.                 'marques' => [],
  69.                 'actes' => [],
  70.                 'activite' => '',
  71.             ];
  72.         }
  73.         $localisation $firmeService->getLocalisationByUserId($userId); 
  74.         $coordonnee $firmeService->getCoordonneeByUserId($userId); 
  75.         $juridique $firmeService->getJuridiqueByUserId($userId);
  76.         $finance $firmeService->getFinanceByUserId($userId);
  77.         $dirigeants $firmeService->getDirigeantsByUserId($userId);
  78.         $certification $firmeService->getCertificationByUserId($userId);
  79.         $anneesCA json_decode($finance['annee_ca'] ?? '[]'true);        
  80.         rsort($anneesCASORT_NUMERIC);
  81.         $gammesCA json_decode($finance['gamme_ca'] ?? '[]'true);
  82.         $zoneExport json_decode($finance['zone_export'] ?? '[]'true);
  83.         $pourcExport json_decode($finance['pourc_export'] ?? '[]'true); 
  84.         $anneesGammes = [];
  85.         foreach ($anneesCA as $index => $annee) {
  86.             $anneesGammes[] = [
  87.                 'annee_ca' => $annee,
  88.                 'gamme_ca' => $gammesCA[$index] ?? null
  89.             ];
  90.         }
  91.         $zonesExportList = [];
  92.         foreach ($zoneExport as $index => $zone) {
  93.             $zonesExportList[] = [
  94.                 'zone' => $zone,
  95.                 'pourcentage' => $pourcExport[$index] ?? null
  96.             ];
  97.         }
  98.         // dd($juridique,$finance);
  99.         if ($coordonnee) {
  100.             $coordonnee['telefone']   = json_decode($coordonnee['telefone'] ?? '[]'true);
  101.             $coordonnee['portable']   = json_decode($coordonnee['portable'] ?? '[]'true);
  102.             $coordonnee['whatsapp']   = json_decode($coordonnee['whatsapp'] ?? '[]'true);
  103.             $coordonnee['email']      = json_decode($coordonnee['email'] ?? '[]'true);
  104.             $coordonnee['site_web']   = json_decode($coordonnee['site_web'] ?? '[]'true);
  105.             $coordonnee['facebook']   = json_decode($coordonnee['facebook'] ?? '[]'true);
  106.             $coordonnee['instagram']  = json_decode($coordonnee['instagram'] ?? '[]'true);
  107.             $coordonnee['linkedin']   = json_decode($coordonnee['linkedin'] ?? '[]'true);
  108.         } else {
  109.             // On initialise à vide pour éviter toute erreur dans le template
  110.             $coordonnee = [
  111.                 'telefone' => [],
  112.                 'portable' => [],
  113.                 'whatsapp' => [],
  114.                 'email' => [],
  115.                 'site_web' => [],
  116.                 'facebook' => [],
  117.                 'instagram' => [],
  118.                 'linkedin' => [],
  119.             ];
  120.         }
  121.         if (!$user) {
  122.             $this->addFlash('error''Veuillez vous connecter.');
  123.             return $this->redirectToRoute('app_login');
  124.         }
  125.         $roles $user->getRoles();
  126.         $villes =$this->localisationService->getAllVilles();
  127.         $rubriques =$this->rubriqueprestationService->getAllRubriques();
  128.         // $produits =$this->rubriqueprestationService->getAllProduits();
  129.         $fonctions =$this->rubriqueprestationService->getAllFonctions();
  130.         $natures =$this->rubriqueprestationService->getAllNatures();
  131.         $fichiers =$this->rubriqueprestationService->getAllProfLib();
  132.         $formeJur =$this->rubriqueprestationService->getAllFormeJur();
  133.         $gammeCA =$this->rubriqueprestationService->getAllGammeCA();
  134.         $banques =$this->rubriqueprestationService->getAllBanques();
  135.         $zonesExp $this->localisationService->getAllZonesExport();       
  136.         $themes $this->produitKompassService->getThemes(); 
  137.         // dd($ficheCustomer);
  138.         return $this->render('nonCustomer/firme_up/profession_lib.html.twig', [
  139.             'villes' => $villes,
  140.             'rubriques' => $rubriques,
  141.             'fonctions' => $fonctions,
  142.             'natures' => $natures,
  143.             'fichiers' => $fichiers,
  144.             'formeJur' =>  $formeJur,
  145.             'banques' => $banques,                
  146.             'zonesExp' => $zonesExp,
  147.             'themes' => $themes,
  148.             'firme' =>  $firme,
  149.             'localisation' =>  $localisation,
  150.             'coordonnee' =>  $coordonnee,
  151.             'rubriques' =>  $rubriques,
  152.             'juridique' =>  $juridique,
  153.             'finance' =>  $finance,
  154.             'pourcExport' => $pourcExport,
  155.             'anneesGammes' => $anneesGammes,
  156.             'gammeCA' => $gammeCA
  157.             'zonesExportList' => $zonesExportList,
  158.             'dirigeants' => $dirigeants,
  159.             'certification' => $certification,
  160.             // 'produits' => $produits,
  161.         ]);
  162.     }
  163.     /**
  164.      * @Route("/nonFirme/up", name="app_non_societe")
  165.      */
  166.     public function nonFirmeUpSociete(Request $request,FirmeService $firmeService): Response
  167.     {   
  168.         $pageSubtitle 'Fiche client';
  169.         $user $this->getUser();
  170.         if (!$user instanceof \App\Entity\UserRegistration) {
  171.             $this->addFlash('error''Veuillez vous connecter.');
  172.             return $this->redirectToRoute('app_login');
  173.         }
  174.         $userId $user->getId();
  175.         // $codeFirme = $user->getCodeFirme();
  176.         $firme $firmeService->getFirmeByUserId($userId);
  177.         if ($firme) {
  178.             $firme['horaires'] = json_decode($firme['horaires'] ?? '[]'true);
  179.             $firme['pause'] = json_decode($firme['pause'] ?? '[]'true);
  180.             $firme['rubriques'] = json_decode($firme['rubriques'] ?? '[]'true);
  181.             $firme['prestations'] = json_decode($firme['prestations'] ?? '[]'true);
  182.             $firme['produits'] = json_decode($firme['produits'] ?? '[]'true);
  183.             $firme['marques'] = json_decode($firme['marques'] ?? '[]'true);
  184.             $firme['actes'] = json_decode($firme['actes'] ?? '[]'true);
  185.         } else {
  186.             // Par exemple, on passe un tableau vide au template
  187.             $firme = [
  188.                 'horaires' => [],
  189.                 'pause' => [],
  190.                 'rubriques' => [],
  191.                 'prestations' => [],
  192.                 'produits' => [],
  193.                 'marques' => [],
  194.                 'actes' => [],
  195.             ];
  196.         }        
  197.         $wproduits $this->produitKompassService->getLienProduitW13ByUserId($userId);
  198.         $localisation $firmeService->getLocalisationByUserId($userId); 
  199.         $coordonnee $firmeService->getCoordonneeByUserId($userId); 
  200.         $juridique $firmeService->getJuridiqueByUserId($userId);
  201.         $finance $firmeService->getFinanceByUserId($userId);
  202.         $dirigeants $firmeService->getDirigeantsByUserId($userId);
  203.         $certification $firmeService->getCertificationByUserId($userId);
  204.         $anneesCA json_decode($finance['annee_ca'] ?? '[]'true);        
  205.         rsort($anneesCASORT_NUMERIC);
  206.         $gammesCA json_decode($finance['gamme_ca'] ?? '[]'true);
  207.         $zoneExport json_decode($finance['zone_export'] ?? '[]'true);
  208.         $pourcExport json_decode($finance['pourc_export'] ?? '[]'true); 
  209.         $anneesGammes = [];
  210.         foreach ($anneesCA as $index => $annee) {
  211.             $anneesGammes[] = [
  212.                 'annee_ca' => $annee,
  213.                 'gamme_ca' => $gammesCA[$index] ?? null
  214.             ];
  215.         }
  216.         $zonesExportList = [];
  217.         foreach ($zoneExport as $index => $zone) {
  218.             $zonesExportList[] = [
  219.                 'zone' => $zone,
  220.                 'pourcentage' => $pourcExport[$index] ?? null
  221.             ];
  222.         }
  223.         // dd($juridique,$finance);
  224.         if ($coordonnee) {
  225.             $coordonnee['telefone']   = json_decode($coordonnee['telefone'] ?? '[]'true);
  226.             $coordonnee['portable']   = json_decode($coordonnee['portable'] ?? '[]'true);
  227.             $coordonnee['whatsapp']   = json_decode($coordonnee['whatsapp'] ?? '[]'true);
  228.             $coordonnee['email']      = json_decode($coordonnee['email'] ?? '[]'true);
  229.             $coordonnee['site_web']   = json_decode($coordonnee['site_web'] ?? '[]'true);
  230.             $coordonnee['facebook']   = json_decode($coordonnee['facebook'] ?? '[]'true);
  231.             $coordonnee['instagram']  = json_decode($coordonnee['instagram'] ?? '[]'true);
  232.             $coordonnee['linkedin']   = json_decode($coordonnee['linkedin'] ?? '[]'true);
  233.         } else {
  234.             // On initialise à vide pour éviter toute erreur dans le template
  235.             $coordonnee = [
  236.                 'telefone' => [],
  237.                 'portable' => [],
  238.                 'whatsapp' => [],
  239.                 'email' => [],
  240.                 'site_web' => [],
  241.                 'facebook' => [],
  242.                 'instagram' => [],
  243.                 'linkedin' => [],
  244.             ];
  245.         }
  246.         if (!$user) {
  247.             $this->addFlash('error''Veuillez vous connecter.');
  248.             return $this->redirectToRoute('app_login');
  249.         }
  250.         $roles $user->getRoles();
  251.         $villes =$this->localisationService->getAllVilles();
  252.         $rubriques =$this->rubriqueprestationService->getAllRubriques();
  253.         $fonctions =$this->rubriqueprestationService->getAllFonctions();
  254.         $natures =$this->rubriqueprestationService->getAllNatures();
  255.         $fichiers =$this->rubriqueprestationService->getAllProfLib();
  256.         $formeJur =$this->rubriqueprestationService->getAllFormeJur();
  257.         $gammeCA =$this->rubriqueprestationService->getAllGammeCA();
  258.         $produits =$this->rubriqueprestationService->getAllProduits();
  259.         // $marques =$this->rubriqueprestationService->getAllMarques();
  260.         $banques =$this->rubriqueprestationService->getAllBanques();
  261.         $zonesExp $this->localisationService->getAllZonesExport();       
  262.         $themes $this->produitKompassService->getThemes(); 
  263.         // $codesProduits = $firme['produits'] ?? [];
  264.         // // Transformer les codes en tableau associatif code => libellé
  265.         // $firme['produits'] = $this->rubriqueprestationService->getLibellesProduits($codesProduits);
  266.         // $codesMarques = $firme['marques'] ?? [];
  267.         // Transformer les codes en tableau associatif code => libellé
  268.         // $firme['marques'] = $this->rubriqueprestationService->getLibellesMarques($codesMarques);
  269.         // dd($dirigeants);
  270.         if (!empty($dirigeants) && is_array($dirigeants)) {
  271.             foreach ($dirigeants as &$d) {
  272.                 $p $d['portable'] ?? null;
  273.                 if ($p && $p[0] === '[') {
  274.                     $d['portables'] = json_decode($ptrue);
  275.                 } elseif ($p) {
  276.                     $d['portables'] = [$p];
  277.                 } else {
  278.                     $d['portables'] = [];
  279.                 }
  280.             }
  281.         } else {
  282.             $dirigeants = []; // tu initialises à un tableau vide pour éviter d'autres erreurs plus loin
  283.         }
  284.         $kompassProduits $this->produitKompassService->getProduitsKompassUserId($userId);
  285.         // dd($ficheCustomer);
  286.                 return $this->render('nonCustomer/firme_up/societe.html.twig', [
  287.                     'villes' => $villes,
  288.                     'rubriques' => $rubriques,
  289.                     'fonctions' => $fonctions,
  290.                     'natures' => $natures,
  291.                     'fichiers' => $fichiers,
  292.                     'formeJur' =>  $formeJur,
  293.                     'banques' => $banques,                
  294.                     'zonesExp' => $zonesExp,
  295.                     'themes' => $themes,
  296.                     'firme' =>  $firme,
  297.                     'localisation' =>  $localisation,
  298.                     'coordonnee' =>  $coordonnee,
  299.                     'rubriques' =>  $rubriques,
  300.                     'juridique' =>  $juridique,
  301.                     'finance' =>  $finance,
  302.                     'pourcExport' => $pourcExport,
  303.                     'anneesGammes' => $anneesGammes,
  304.                     'gammeCA' => $gammeCA
  305.                     'zonesExportList' => $zonesExportList,
  306.                     'dirigeants' => $dirigeants,
  307.                     'certification' => $certification,
  308.                     'produits' => $produits,
  309.                     // 'marques' => $marques,
  310.                     'wproduits' => $wproduits,
  311.                     'kompassProduits' => $kompassProduits,
  312.                 ]);
  313.     }
  314.     /**
  315.      * @Route("/nonFirmeUp/insert", name="insert_nonFirmeUp", methods={"POST"})
  316.      */
  317.     public function insertNonFirmeUp(Request $request,FirmeService $firmeService): Response
  318.     {
  319.         $user $this->getUser();
  320.         if (!$user instanceof \App\Entity\UserRegistration) {
  321.             $this->addFlash('error''Veuillez vous connecter.');
  322.             return $this->redirectToRoute('app_login');
  323.         }
  324.         $userId $user->getId();
  325.         // Récupération de toutes les données
  326.         $data $request->request->all();
  327.         $wproduits $this->produitKompassService->getLienProduitW13ByUserId($userId);
  328.         // dd($wproduits);
  329.         $firme $firmeService->getFirmeByUserId($userId); 
  330.         $localisation $firmeService->getLocalisationByUserId($userId); 
  331.         $coordonnee $firmeService->getCoordonneeByUserId($userId); 
  332.         $finance $firmeService->getFinanceByUserId($userId); 
  333.         // dd($firme);
  334.         $juridique $firmeService->getJuridiqueByUserId($userId); 
  335.         // dd($juridique);
  336.         $dirigeants $firmeService->getDirigeantsByUserId($userId); 
  337.          function isNotEmpty($value): bool {
  338.             if (is_array($value)) {
  339.                 foreach ($value as $v) {
  340.                     if (trim((string)$v) !== '') {
  341.                         return true;
  342.                     }
  343.                 }
  344.                 return false;
  345.             }
  346.             return trim((string)$value) !== '';
  347.         }
  348.         // dd($data);
  349.         $jours = ['lundi''mardi''mercredi''jeudi''vendredi''samedi''dimanche'];
  350.         $horaires = [];
  351.         foreach ($jours as $jour) {
  352.             $isChecked $request->request->get('checkbox_' $jour);
  353.             if ($isChecked) {
  354.                 $start $request->request->get('start_' $jour);
  355.                 $end $request->request->get('end_' $jour);
  356.                 $horaires[$jour] = [
  357.                     'actif' => true,
  358.                     'start' => $start,
  359.                     'end' => $end
  360.                 ];
  361.             } else {
  362.                 $horaires[$jour] = [
  363.                     'actif' => false,
  364.                     'start' => null,
  365.                     'end' => null
  366.                 ];
  367.             }
  368.         }
  369.         // ➕ Traitement cohérent pour la pause
  370.         $pauseEnabled $request->request->get('pause_enabled'); // existe uniquement si cochée
  371.         $pauseStart $request->request->get('pause_start');
  372.         $pauseEnd $request->request->get('pause_end');
  373.         $pause = [];
  374.         if ($pauseEnabled) {
  375.             $pause = [
  376.                 'actif' => true,
  377.                 'start' => $pauseStart,
  378.                 'end' => $pauseEnd
  379.             ];
  380.         } else {
  381.             $pause = [
  382.                 'actif' => false,
  383.                 'start' => null,
  384.                 'end' => null
  385.             ];
  386.         }
  387.         $horairesJson json_encode($horaires);
  388.         $pauseJson json_encode($pause);
  389.         $produits $request->request->get('field29');
  390.         $positionsProduits $request->request->get('Prfield31');
  391.         $marques $request->request->get('field30');
  392.         $positionsMarques $request->request->get('field31');
  393.         // Filtrer les produits avec valeurs non vides
  394.         $produitsAvecPositions = [];
  395.         if (!empty($produits) && is_array($produits)) {
  396.             foreach ($produits as $index => $produit) {
  397.                 if (trim($produit) !== '') {
  398.                     $produitsAvecPositions[] = [
  399.                         'produit' => $produit,
  400.                         'position' => $positionsProduits[$index] ?? null
  401.                     ];
  402.                 }
  403.             }
  404.         }
  405.         // // Filtrer les marques avec valeurs non vides
  406.         $marquesAvecPositions = [];
  407.         if (!empty($marques) && is_array($marques)) {
  408.             foreach ($marques as $index => $marque) {
  409.                 if (trim($produit) !== '') {
  410.                     $marquesAvecPositions[] = [
  411.                         'marque' => $marque,
  412.                         'position' => $positionsMarques[$index] ?? null
  413.                     ];
  414.                 }
  415.             }
  416.         }
  417.         //up_firme
  418.         $raison_social $request->request->get('field1');
  419.         $nature $request->request->get('field2');
  420.         $horaires $horairesJson;
  421.         $pause $pauseJson;
  422.         $rubriques =  $this->filterJsonField($request->request->all('field26'));
  423.         $prestations =  $this->filterJsonField($request->request->all('field28'));
  424.         // Filtrer la description_rub
  425.         $description_rub trim($request->request->get('field27') ?? '');
  426.         // Encodage final
  427.         $produits = !empty($produitsAvecPositions) ? json_encode($produitsAvecPositions) : null;
  428.         $marques = !empty($marquesAvecPositions) ? json_encode($marquesAvecPositions) : null;
  429.         // $produits =  $this->filterJsonField($request->request->all('field29'));;
  430.         // $marques =  $this->filterJsonField($request->request->all('field30'));;
  431.         $validation $request->request->get('validation') ?? null;
  432.         $date_creation = new \DateTime();
  433.         $date_validation $validation === '1' ? new \DateTime() : null;
  434.         $pl_or_societe "S";                
  435.         $etat='C';
  436.         if (trim($userId) !== '' || trim($raison_social) !== '' || trim($nature) !== '' || $horaires !== '[]' || $pause !== '[]' || $rubriques !== null ||$description_rub !== '' || $prestations !== null || !empty($produits) || !empty($marques)) 
  437.         {
  438.             if ($firme) {
  439.                 $synchroniser ="0";
  440.                 $this->firmeService->updateFirme(
  441.                     $userId,null,
  442.                     $raison_social,
  443.                     $nature,
  444.                     $horairesJson,
  445.                     $pauseJson,
  446.                     $rubriques,
  447.                     $description_rub,
  448.                     $prestations,
  449.                     $produits,
  450.                     $marques,
  451.                     $validation,
  452.                     $date_validation,
  453.                     null// nom
  454.                     null// prenom
  455.                     null// actes
  456.                     null// activite
  457.                     null// description
  458.                     $pl_or_societe,
  459.                     $etat,
  460.                     $synchroniser
  461.                 );
  462.             } else {
  463.                 $synchroniser ="0";
  464.                 $this->firmeService->insererFirme(
  465.                     $userId,null,
  466.                     $raison_social,
  467.                     $nature,
  468.                     $horairesJson,
  469.                     $pauseJson,
  470.                     $rubriques,
  471.                     $description_rub,
  472.                     $prestations,
  473.                     $produits,
  474.                     $marques,
  475.                     $validation,
  476.                     $date_validation,
  477.                     $date_creation,
  478.                     null,
  479.                     null,
  480.                     null,
  481.                     null,
  482.                     null,
  483.                     $pl_or_societe,
  484.                     $etat,
  485.                     $synchroniser
  486.                 );
  487.             }        
  488.         }
  489.         //up_localisations
  490.         $adresse $request->request->get('field3');
  491.         $code_ville $request->request->get('field4');
  492.         $nom_ville $this->firmeService->getNomVille($code_ville);
  493.         $code_quartier $request->request->get('field5');
  494.         $nom_quartier $this->firmeService->getNomQuartier($code_quartier);
  495.         $code_postal $request->request->get('field6');
  496.         $longitude $request->request->get('field11');
  497.         $latitude $request->request->get('field12');
  498.         if (trim($adresse) !== '' || trim($code_ville) !== '' || trim($nom_ville) !== '' || trim($code_quartier) !== '' || trim($nom_quartier) !== '' || trim($code_postal) !== '' || trim($longitude) !== '' || trim($latitude) !== '')
  499.         {
  500.             if ($localisation) {
  501.                 $this->firmeService->updateLocalisation($userId,null$adresse$code_ville$nom_ville$code_quartier$nom_quartier$code_postal$longitude$latitude);
  502.             } else {
  503.                 $this->firmeService->insererLocalisation($userId,null$adresse$code_ville$nom_ville$code_quartier$nom_quartier$code_postal$longitude$latitude);
  504.             }
  505.         }
  506.         //up_coordonnées
  507.         $telefone =  $this->filterJsonField($request->request->all('field7'));
  508.         $portable =  $this->filterJsonField($request->request->all('field8'));
  509.         $whatsapp =  $this->filterJsonField($request->request->all('wfield8'));
  510.         $email =  $this->filterJsonField($request->request->all('field9'));
  511.         $site_web =  $this->filterJsonField($request->request->all('field10'));
  512.         $facebook =  $this->filterJsonField($request->request->all('facebook'));
  513.         $instagram =  $this->filterJsonField($request->request->all('instagram'));
  514.         $linkedin =  $this->filterJsonField($request->request->all('linkedin'));
  515.         // Puis tu peux appeler ton service
  516.         if ($telefone !== null || $portable !== null || $whatsapp !== null || $email !== null || $site_web !== null || $facebook !== null || $instagram !== null || $linkedin !== null) {
  517.             if ($coordonnee) {
  518.             $this->firmeService->updateCoordonnees($userId,null$telefone$portable$whatsapp$email$site_web$facebook$instagram$linkedin);
  519.             } else {
  520.                 $this->firmeService->insererCoordonnees($userId,null$telefone$portable$whatsapp$email$site_web$facebook$instagram$linkedin);
  521.             }
  522.         }
  523.         //up_juridiques
  524.         $forme_juridique $request->request->get('field13');
  525.         $annee_creation $request->request->get('field14');
  526.         // dd($annee_creation);
  527.         $effectif $request->request->get('field15');
  528.         $ice $request->request->get('field17');
  529.         $identifiant_fiscal $request->request->get('field18');
  530.         $patente $request->request->get('field19');
  531.         $capital $request->request->get('field16');
  532.         $inp $request->request->get('PLfield31');
  533.         $rc $request->request->get('field20');
  534.         $ville_rc $request->request->get('field21');
  535.         $effectif trim($effectif) !== '' ? (int)$effectif null;
  536.         $capital trim($capital) !== '' ? (int)$capital null;
  537.         if (trim($forme_juridique) !== '' || trim($annee_creation) !== '' || trim($effectif) !== '' || trim($capital) !== '' || trim($ice) !== '' || trim($identifiant_fiscal) !== '' || trim($patente) !== '' || trim($rc) !== '' || trim($ville_rc) !== '' || trim($inp) !== '') {
  538.             if ($juridique) {
  539.                 $this->firmeService->updateJuridiques($userId,null,$forme_juridique,$annee_creation,$effectif,$capital,$ice,null,$patente,$rc,$ville_rc,$identifiant_fiscal);
  540.             } else {
  541.                 $this->firmeService->insererJuridiques($userId,null,$forme_juridique,$annee_creation,$effectif,$capital,$ice,null,$patente,$rc,$ville_rc,$identifiant_fiscal);
  542.             }
  543.         }
  544.         
  545.         //up_finances
  546.         // Nettoyage des champs
  547.         $banques      $this->cleanValue($request->request->get('field34'));
  548.         $zone_export  $this->cleanValue($request->request->get('field35'));
  549.         $pourc_export $this->cleanValue($request->request->get('field36'));
  550.         $annee_ca     $this->cleanValue($request->request->get('field32', []));
  551.         $gamme_ca     $this->cleanValue($request->request->get('field33', []));
  552.         // ⚠️ Sécuriser pour éviter foreach sur null
  553.         $annee_ca is_array($annee_ca) ? $annee_ca : [];
  554.         $gamme_ca is_array($gamme_ca) ? $gamme_ca : [];
  555.         $anneesGammes = [];
  556.         foreach ($annee_ca as $i => $annee) {
  557.             if (!empty($annee) && isset($gamme_ca[$i]) && !empty($gamme_ca[$i])) {
  558.                 $anneesGammes[] = [
  559.                     'annee_ca' => $annee,
  560.                     'gamme_ca' => $gamme_ca[$i],
  561.                 ];
  562.             }
  563.         }
  564.         // Sauvegarde en JSON
  565.         $annee_ca array_column($anneesGammes'annee_ca');
  566.         $gamme_ca array_column($anneesGammes'gamme_ca');
  567.         // Insertion ou mise à jour si au moins un champ est renseigné
  568.         if ($annee_ca !== null || $gamme_ca !== null || $banques !== null || $zone_export !== null || $pourc_export !== null) {
  569.             if ($finance) {
  570.                 $firmeService->updateFinances($userId,null$annee_ca$gamme_ca$banques$zone_export$pourc_export);
  571.             } else {
  572.                 $firmeService->insererFinances($userId,null$annee_ca$gamme_ca$banques$zone_export$pourc_export);
  573.             }
  574.         }
  575.         //up_dirigeants
  576.         $noms $request->request->get('field22', []);
  577.         $prenoms $request->request->get('field23', []);
  578.         $civilites $request->request->get('civilite', []);
  579.         $fonctionCodes $request->request->get('field24', []);
  580.         $portables $request->request->get('field25', []);
  581.         $whatsapps $request->request->get('whatsappd', []);
  582.         $emails $request->request->get('emaild', []);
  583.         $ids $request->request->get('id', []);
  584.         $deletedRaw $request->request->get('deleted_dirigeants''');
  585.         // Convertir en tableau
  586.         $deletedIds = [];
  587.         if (is_string($deletedRaw) && $deletedRaw !== '') {
  588.             $deletedIds explode(','$deletedRaw);
  589.         }
  590.         // dd($deletedIds); // Vérifier si on reçoit bien les IDs supprimés
  591.         // Supprimer les dirigeants supprimés
  592.         if (!empty($deletedIds)) {
  593.             $firmeService->supprimerDirigeants($deletedIds);
  594.         }
  595.         $codeFirme null;
  596.         // Synchroniser les autres (insert/update)
  597.         $firmeService->synchroniserDirigeants($ids$noms$prenoms$civilites$fonctionCodes$portables$whatsapps$emails$codeFirme$userId);
  598.         // up_certifications
  599.         // Récupération des champs du formulaire
  600.         $certification      $request->request->get('certification');
  601.         $organisme          $request->request->get('organisme');
  602.         $type               $request->request->get('type_certification');
  603.         $produit            $request->request->get('produit_certification');
  604.         $date_expiration    $request->request->get('date_expiration');
  605.         // Vérifier s’il y a une certification existante pour ce code_firme
  606.         $certificationExist $this->firmeService->getCertificationByUserId($userId);
  607.         // dd($certificationExist);
  608.         // Vérifier s'il y a des données remplies
  609.         if (
  610.             trim($certification) !== '' || trim($organisme) !== '' ||
  611.             trim($type) !== '' || trim($produit) !== '' || trim($date_expiration) !== ''
  612.         ) {
  613.             if ($certificationExist) {
  614.                 // faire update
  615.                 $this->firmeService->updateCertification(
  616.                     $userId,null,
  617.                     $certification,
  618.                     $organisme,
  619.                     $type,
  620.                     $produit,
  621.                     $date_expiration
  622.                 );
  623.             } else {
  624.                 // faire insert
  625.                 $this->firmeService->insererCertification(
  626.                     $userId,null,
  627.                     $certification,
  628.                     $organisme,
  629.                     $type,
  630.                     $produit,
  631.                     $date_expiration
  632.                 );
  633.             }
  634.         }
  635.             $natures =$this->rubriqueprestationService->getAllNatures();
  636.             $villes =$this->localisationService->getAllVilles();
  637.             $rubriques =$this->rubriqueprestationService->getAllRubriques();
  638.             $fonctions =$this->rubriqueprestationService->getAllFonctions();
  639.             $fichiers =$this->rubriqueprestationService->getAllProfLib();
  640.             $formeJur =$this->rubriqueprestationService->getAllFormeJur();
  641.             $gammeCA =$this->rubriqueprestationService->getAllGammeCA();
  642.             $banques =$this->rubriqueprestationService->getAllBanques();
  643.             $zonesExp $this->localisationService->getAllZonesExport();       
  644.             $themes $this->produitKompassService->getThemes(); 
  645.             $wproduits $this->produitKompassService->getLienProduitW13ByUserId($userId);
  646.         return $this->render('nonCustomer/firme_up/home.html.twig', [
  647.             'firme' => $firme,               
  648.             'codeFirme' => $codeFirme,               
  649.              
  650.   
  651.         ]);
  652.     }
  653.     /**
  654.      * @Route("/PlNonFirmeUp/insert", name="insert_nonFirmeUpPL", methods={"POST"})
  655.      */
  656.     public function insertNonFirmeUpPL(Request $request,FirmeService $firmeService): Response
  657.     {
  658.         $user $this->getUser();
  659.         // if (!$user instanceof \App\Entity\UserRegistration) {
  660.         //     $this->addFlash('error', 'Veuillez vous connecter.');
  661.         //     return $this->redirectToRoute('app_login');
  662.         // }
  663.         $userId $user->getId();
  664.         // Récupération de toutes les données
  665.         $data $request->request->all();
  666.         // dd($data);
  667.         $description $data['PLfield28'] ?? null;
  668.         // Récupération de toutes les données
  669.         $data $request->request->all();
  670.         //  dd($data);
  671.         $firme $firmeService->getFirmeByUserId($userId); 
  672.         $localisation $firmeService->getLocalisationByUserId($userId); 
  673.         $coordonnee $firmeService->getCoordonneeByUserId($userId); 
  674.         $finance $firmeService->getFinanceByUserId($userId); 
  675.         // dd($firme);
  676.         $juridique $firmeService->getJuridiqueByUserId($userId); 
  677.         // dd($juridique);
  678.         $dirigeants $firmeService->getDirigeantsByUserId($userId); 
  679.         // Fonction utilitaire pour nettoyer les champs JSON
  680.         // dd($data);
  681.         $jours = ['lundi''mardi''mercredi''jeudi''vendredi''samedi''dimanche'];
  682.         $horaires = [];
  683.         foreach ($jours as $jour) {
  684.             $isChecked $request->request->get('checkbox_' $jour);
  685.             if ($isChecked) {
  686.                 $start $request->request->get('start_' $jour);
  687.                 $end $request->request->get('end_' $jour);
  688.                 $horaires[$jour] = [
  689.                     'actif' => true,
  690.                     'start' => $start,
  691.                     'end' => $end
  692.                 ];
  693.             } else {
  694.                 $horaires[$jour] = [
  695.                     'actif' => false,
  696.                     'start' => null,
  697.                     'end' => null
  698.                 ];
  699.             }
  700.         }
  701.         // ➕ Traitement cohérent pour la pause
  702.         $pauseEnabled $request->request->get('pause_enabled'); // existe uniquement si cochée
  703.         $pauseStart $request->request->get('pause_start');
  704.         $pauseEnd $request->request->get('pause_end');
  705.         $pause = [];
  706.         if ($pauseEnabled) {
  707.             $pause = [
  708.                 'actif' => true,
  709.                 'start' => $pauseStart,
  710.                 'end' => $pauseEnd
  711.             ];
  712.         } else {
  713.             $pause = [
  714.                 'actif' => false,
  715.                 'start' => null,
  716.                 'end' => null
  717.             ];
  718.         }
  719.         $horairesJson json_encode($horaires);
  720.         $pauseJson json_encode($pause);
  721.         //up_firme
  722.         $nom $request->request->get('PLfield1');
  723.         $prenom $request->request->get('PLfield2');
  724.         $activite $request->request->get('PLfield26');
  725.         $description $request->request->get('PLfield28');
  726.         $horaires $horairesJson;
  727.         $pause $pauseJson;
  728.         $actes =  $this->filterJsonField($request->request->all('acte'));
  729.         $validation $request->request->get('validation') ?? null;
  730.         $date_creation = new \DateTime();
  731.         $date_validation $validation === '1' ? new \DateTime() : null;
  732.         $pl_or_societe "P";
  733.         $etat='C';
  734.         if (trim($userId) !== '' || trim($nom) !== '' || trim($prenom) !== '' || trim($activite) !== '' || trim($description) !== '' || $horaires !== '[]' || $pause !== '[]' || $actes !== null
  735.         { 
  736.             if ($firme) {
  737.                 $synchroniser ="0";
  738.                 $this->firmeService->updateFirme(
  739.                     $userId,
  740.                     null,
  741.                     null,   // raison_social (pas dans ce contexte)
  742.                     null,   // nature (pas dans ce contexte)
  743.                     $horairesJson,
  744.                     $pauseJson,
  745.                     null,   // rubriques (pas dans ce contexte)
  746.                     null,   // description_rub
  747.                     null,   // prestations
  748.                     null,   // produits
  749.                     null,   // marques
  750.                     $validation,
  751.                     $date_validation,
  752.                     $nom,
  753.                     $prenom,
  754.                     $actes,
  755.                     $activite,
  756.                     $description,
  757.                     $pl_or_societe,
  758.                     $etat,
  759.                     $synchroniser
  760.                 );
  761.             } else {
  762.                 $synchroniser ="0";
  763.                 $this->firmeService->insererFirme(
  764.                     $userId,null,
  765.                     null,
  766.                     null,
  767.                     $horairesJson,
  768.                     $pauseJson,
  769.                     null,
  770.                     null,
  771.                     null,
  772.                     null,
  773.                     null,
  774.                     $validation,
  775.                     $date_validation,
  776.                     $date_creation,
  777.                     $nom,
  778.                     $prenom,
  779.                     $actes,
  780.                     $activite,
  781.                     $description,
  782.                     $pl_or_societe,
  783.                     $etat,
  784.                     $synchroniser
  785.                 );
  786.             }
  787.         }
  788.         //up_localisations
  789.         $adresse $request->request->get('PLfield3');
  790.         $code_ville $request->request->get('PLfield4');
  791.         $nom_ville $this->firmeService->getNomVille($code_ville);
  792.         $code_quartier $request->request->get('PLfield5');
  793.         $nom_quartier $this->firmeService->getNomQuartier($code_quartier);
  794.         $code_postal $request->request->get('PLfield6');
  795.         $longitude $request->request->get('PLfield11');
  796.         $latitude $request->request->get('PLfield12');
  797.         if (trim($adresse) !== '' || trim($code_ville) !== '' || trim($nom_ville) !== '' || trim($code_quartier) !== '' || trim($nom_quartier) !== '' || trim($code_postal) !== '' || trim($longitude) !== '' || trim($latitude) !== '')
  798.         {
  799.             if ($localisation) {
  800.                 $this->firmeService->updateLocalisation($userId,null$adresse$code_ville$nom_ville$code_quartier$nom_quartier$code_postal$longitude$latitude);
  801.             } else {
  802.                 $this->firmeService->insererLocalisation($userId,null$adresse$code_ville$nom_ville$code_quartier$nom_quartier$code_postal$longitude$latitude);
  803.             }
  804.         }
  805.         //up_coordonnées
  806.         $telefone =  $this->filterJsonField($request->request->all('Pfield7'));
  807.         $whatsapp =  $this->filterJsonField($request->request->all('Pwhatsapp'));
  808.         $email =  $this->filterJsonField($request->request->all('Pemail'));
  809.         $site_web =  $this->filterJsonField($request->request->all('Psite'));
  810.         $facebook =  $this->filterJsonField($request->request->all('PLfacebook'));
  811.         $instagram =  $this->filterJsonField($request->request->all('PLinstagram'));
  812.         $linkedin =  $this->filterJsonField($request->request->all('PLlinkedin'));
  813.         // Puis tu peux appeler ton service
  814.         if ($telefone !== null || $whatsapp !== null || $email !== null || $site_web !== null || $facebook !== null || $instagram !== null || $linkedin !== null) {
  815.             if ($coordonnee) {
  816.             $this->firmeService->updateCoordonnees($userId,null$telefonenull$whatsapp$email$site_web$facebook$instagram$linkedin);
  817.             } else {
  818.                 $this->firmeService->insererCoordonnees($userId,null$telefonenull$whatsapp$email$site_web$facebook$instagram$linkedin);
  819.             }
  820.         }
  821.         //up_juridiques
  822.         $annee_creation $request->request->get('PLfield14');
  823.         $ice $request->request->get('PLfield29');
  824.         $identifiant_fiscal $request->request->get('PLfield30');
  825.         $inp $request->request->get('PLfield31');
  826.         $rc $request->request->get('PLfield20');
  827.         $ville_rc $request->request->get('PLfield21');
  828.         if (trim($annee_creation) !== '' || trim($ice) !== '' || trim($identifiant_fiscal) !== '' || trim($rc) !== '' || trim($ville_rc) !== '' || trim($inp) !== '') {
  829.             if ($juridique) {
  830.                 $this->firmeService->updateJuridiques($userId,null,null,$annee_creation,null,null,$ice,$inp,null,$rc,$ville_rc,$identifiant_fiscal);
  831.             } else {
  832.                 $this->firmeService->insererJuridiques($userId,null,null,$annee_creation,null,null,$ice,$inp,null,$rc,$ville_rc,$identifiant_fiscal);
  833.             }
  834.         }
  835.         
  836.         //up_finances
  837.         // Nettoyage des champs
  838.         $banques      $this->cleanValue($request->request->get('PLfield34'));
  839.         $zone_export  $this->cleanValue($request->request->get('PLfield35'));
  840.         $pourc_export $this->cleanValue($request->request->get('PLfield36'));
  841.         $annee_ca     $this->cleanValue($request->request->get('PLfield32', []));
  842.         $gamme_ca     $this->cleanValue($request->request->get('PLfield33', []));
  843.         $anneesGammes = [];
  844.         foreach ($annee_ca as $i => $annee) {
  845.             if (!empty($annee) && isset($gamme_ca[$i]) && !empty($gamme_ca[$i])) {
  846.                 $anneesGammes[] = [
  847.                     'annee_ca' => $annee,
  848.                     'gamme_ca' => $gamme_ca[$i],
  849.                 ];
  850.             }
  851.         }
  852.         // Sauvegarde en JSON
  853.         $annee_ca array_column($anneesGammes'annee_ca');
  854.         $gamme_ca array_column($anneesGammes'gamme_ca');
  855.         // Insertion ou mise à jour si au moins un champ est renseigné
  856.         if ($annee_ca !== null || $gamme_ca !== null || $banques !== null || $zone_export !== null || $pourc_export !== null) {
  857.             if ($finance) {
  858.                 $firmeService->updateFinances($userId,null$annee_ca$gamme_ca$banques$zone_export$pourc_export);
  859.             } else {
  860.                 $firmeService->insererFinances($userId,null$annee_ca$gamme_ca$banques$zone_export$pourc_export);
  861.             }
  862.         }
  863.             $villes =$this->localisationService->getAllVilles();
  864.             $rubriques =$this->rubriqueprestationService->getAllRubriques();
  865.             $fonctions =$this->rubriqueprestationService->getAllFonctions();
  866.             $fichiers =$this->rubriqueprestationService->getAllProfLib();
  867.             $formeJur =$this->rubriqueprestationService->getAllFormeJur();
  868.             $gammeCA =$this->rubriqueprestationService->getAllGammeCA();
  869.             $banques =$this->rubriqueprestationService->getAllBanques();
  870.             $zonesExp $this->localisationService->getAllZonesExport();       
  871.             $themes $this->produitKompassService->getThemes(); 
  872.         return $this->render('nonCustomer/firme_up/home.html.twig', [
  873.             'firme' => $firme,                
  874.   
  875.         ]);
  876.     }
  877.     /**
  878.      * @Route("/PlFirmeUp/insert", name="insert_PlFirmeUp", methods={"POST"})
  879.      */
  880.     public function insertPLFirmeUp(Request $request,FirmeService $firmeService): Response
  881.     {
  882.         $description $data['PLfield28'] ?? null;
  883.         // Récupération de toutes les données
  884.         $data $request->request->all();
  885.         $codeFirme $request->request->get('codeFirme');  
  886.         $firmeCRM $this->firmeService->getAllFirmeData($codeFirme);
  887.         $firme $firmeService->getFirmeByCodeAdmin($codeFirme); 
  888.         $localisation $firmeService->getLocalisationByCodeFirme($codeFirme); 
  889.         $coordonnee $firmeService->getCoordonneeByCodeFirme($codeFirme); 
  890.         $finance $firmeService->getFinanceByCodeFirme($codeFirme); 
  891.         // dd($finance);
  892.         $juridique $firmeService->getJuridiqueByCodeFirme($codeFirme); 
  893.         // Fonction utilitaire pour nettoyer les champs JSON
  894.         // dd($data);
  895.         $jours = ['lundi''mardi''mercredi''jeudi''vendredi''samedi''dimanche'];
  896.         $horaires = [];
  897.         foreach ($jours as $jour) {
  898.             $isChecked $request->request->get('checkbox_' $jour);
  899.             if ($isChecked) {
  900.                 $start $request->request->get('start_' $jour);
  901.                 $end $request->request->get('end_' $jour);
  902.                 $horaires[$jour] = [
  903.                     'actif' => true,
  904.                     'start' => $start,
  905.                     'end' => $end
  906.                 ];
  907.             } else {
  908.                 $horaires[$jour] = [
  909.                     'actif' => false,
  910.                     'start' => null,
  911.                     'end' => null
  912.                 ];
  913.             }
  914.         }
  915.         // ➕ Traitement cohérent pour la pause
  916.         $pauseEnabled $request->request->get('pause_enabled'); // existe uniquement si cochée
  917.         $pauseStart $request->request->get('pause_start');
  918.         $pauseEnd $request->request->get('pause_end');
  919.         $pause = [];
  920.         if ($pauseEnabled) {
  921.             $pause = [
  922.                 'actif' => true,
  923.                 'start' => $pauseStart,
  924.                 'end' => $pauseEnd
  925.             ];
  926.         } else {
  927.             $pause = [
  928.                 'actif' => false,
  929.                 'start' => null,
  930.                 'end' => null
  931.             ];
  932.         }
  933.         $horairesJson json_encode($horaires);
  934.         $pauseJson json_encode($pause);
  935.         //up_firme
  936.         $nom $request->request->get('PLfield1');
  937.         $prenom $request->request->get('PLfield2');
  938.         $activite $request->request->get('PLfield26');
  939.         $description $request->request->get('PLfield28');
  940.         $horaires $horairesJson;
  941.         $pause $pauseJson;
  942.         $actes =  $this->filterJsonField($request->request->all('acte'));
  943.         $validation $request->request->get('validation') ?? null;
  944.         $date_creation = new \DateTime();
  945.         $date_validation $validation === '1' ? new \DateTime() : null;
  946.         $pl_or_societe "P";
  947.         if (trim($codeFirme) !== '' || trim($nom) !== '' || trim($prenom) !== '' || trim($activite) !== '' || trim($description) !== '' || $horaires !== '[]' || $pause !== '[]' || $actes !== null
  948.         { 
  949.             if ($firme) {
  950.                 $etat='U';
  951.                 $synchroniser ="0";
  952.                 $this->firmeService->updateFirme(
  953.                     null,
  954.                     $codeFirme,
  955.                     null,   // raison_social (pas dans ce contexte)
  956.                     null,   // nature (pas dans ce contexte)
  957.                     $horairesJson,
  958.                     $pauseJson,
  959.                     null,   // rubriques (pas dans ce contexte)
  960.                     null,   // description_rub
  961.                     null,   // prestations
  962.                     null,   // produits
  963.                     null,   // marques
  964.                     $validation,
  965.                     $date_validation,
  966.                     $nom,
  967.                     $prenom,
  968.                     $actes,
  969.                     $activite,
  970.                     $description,
  971.                     $pl_or_societe,
  972.                     $etat,
  973.                     $synchroniser
  974.                 );
  975.             } else {                
  976.                 $etat='C';
  977.                 $synchroniser ="1";
  978.                 $this->firmeService->insererFirme(
  979.                     null,
  980.                     $codeFirme,
  981.                     null,
  982.                     null,
  983.                     $horairesJson,
  984.                     $pauseJson,
  985.                     null,
  986.                     null,
  987.                     null,
  988.                     null,
  989.                     null,
  990.                     $validation,
  991.                     $date_validation,
  992.                     $date_creation,
  993.                     $nom,
  994.                     $prenom,
  995.                     $actes,
  996.                     $activite,
  997.                     $description,
  998.                     $pl_or_societe,
  999.                     $etat,
  1000.                     $synchroniser
  1001.                 );
  1002.             }
  1003.         }
  1004.             $rsComp trim($firmeCRM['firme']['rs_comp']);
  1005.             $mots preg_split('/\s+/'$rsComp); // Séparer par les espaces multiples
  1006.             $nombreMots count($mots);
  1007.             if ($nombreMots === 2) {
  1008.                 $firmeCRM['nom'] = $mots[0];
  1009.                 $firmeCRM['prenom'] = $mots[1];
  1010.             } elseif ($nombreMots >= 3) {
  1011.                 $firmeCRM['nom'] = $mots[0] . ' ' $mots[1];
  1012.                 $firmeCRM['prenom'] = $mots[$nombreMots 1];
  1013.             } else {
  1014.                 // Cas limite : un seul mot
  1015.                 $firmeCRM['nom'] = $rsComp;
  1016.                 $firmeCRM['prenom'] = '';
  1017.             }
  1018.             // dd($firmeCRM);
  1019.         // les données anciennes
  1020.         $oldDataFirme = [
  1021.             'horaires' => json_encode$firmeCRM['horaires']),
  1022.             'nom' => $firmeCRM['nom'] ,
  1023.             'prenom' =>  $firmeCRM['prenom'],
  1024.             'actes' =>  $firmeCRM['actes'],
  1025.             'activite' =>  $firmeCRM['firme']['code_fichier'],
  1026.             'description_activite' =>  $firmeCRM['firme']['tp_48'],
  1027.         ];
  1028.         // lesdonnées nouvelles (après modification)
  1029.         $newDataFirme = [
  1030.             'horaires' => $horaires,
  1031.             'nom' => $nom ,
  1032.             'prenom' => $prenom,
  1033.             'actes' => $actes,
  1034.             'activite' => $activite,
  1035.             'description_activite' => $description,
  1036.         ];
  1037.         $this->ModificationLoggerService->logDifferences(
  1038.             'BD_EDICOM',
  1039.             'updatedata',              
  1040.             'up_firme',        
  1041.             $oldDataFirme,
  1042.             $newDataFirme,
  1043.             $codeFirme,
  1044.             null
  1045.             'UPDATE'
  1046.         );
  1047.         // dd($actes, $newDataFirme);
  1048.         // dd([
  1049.         //     'actes' => $actes,
  1050.         //     'newDataFirme' => $newDataFirme,
  1051.         // ]);
  1052.         //up_localisations
  1053.         $adresse $request->request->get('PLfield3');
  1054.         $code_ville $request->request->get('PLfield4');
  1055.         $nom_ville $this->firmeService->getNomVille($code_ville);
  1056.         $code_quartier $request->request->get('PLfield5');
  1057.         $nom_quartier $this->firmeService->getNomQuartier($code_quartier);
  1058.         $code_postal $request->request->get('PLfield6');
  1059.         $longitude $request->request->get('PLfield11');
  1060.         $latitude $request->request->get('PLfield12');
  1061.         if (trim($adresse) !== '' || trim($code_ville) !== '' || trim($nom_ville) !== '' || trim($code_quartier) !== '' || trim($nom_quartier) !== '' || trim($code_postal) !== '' || trim($longitude) !== '' || trim($latitude) !== '')
  1062.         {
  1063.             if ($localisation) {
  1064.                 $this->firmeService->updateLocalisation(null,$codeFirme$adresse$code_ville$nom_ville$code_quartier$nom_quartier$code_postal$longitude$latitude);
  1065.             } else {
  1066.                 $this->firmeService->insererLocalisation(null,$codeFirme$adresse$code_ville$nom_ville$code_quartier$nom_quartier$code_postal$longitude$latitude);
  1067.             }
  1068.         }
  1069.             // les données anciennes
  1070.             $oldDataLocalisation = [
  1071.                 'adresse' => $firmeCRM['firme']['num_voie'] . ' ' $firmeCRM['firme']['lib_voie'] . ' ' $firmeCRM['firme']['comp_voie'] . '' $firmeCRM['firme']['ville'] . ' - Maroc',
  1072.                 'code_ville' => $firmeCRM['firme']['code_ville'],       
  1073.                 'ville' =>  $firmeCRM['firme']['ville'],            
  1074.                 'code_quartier' =>  $firmeCRM['firme']['code_quart'],
  1075.                 'quartier' => $firmeCRM['firme']['quartier'],     
  1076.                 'code_postal' =>  $firmeCRM['firme']['code_postal'], 
  1077.                 'longitude' => $firmeCRM['firme']['longitude'],       
  1078.                 'latitude' =>  $firmeCRM['firme']['latitude'],
  1079.             ];
  1080.             // dd($firmeCRM);
  1081.             // lesdonnées nouvelles (après modification)
  1082.             $newDataLocalisation = [
  1083.                 'adresse' => $adresse,
  1084.                 'code_ville' => $code_ville,       
  1085.                 'ville' =>  $nom_ville,            
  1086.                 'code_quartier' =>  $code_quartier,
  1087.                 'quartier' => $nom_quartier,     
  1088.                 'code_postal' =>  $code_postal
  1089.                 'longitude' => $longitude,       
  1090.                 'latitude' =>  $latitude,
  1091.             ];
  1092.             // dd($oldDataLocalisation, $newDataLocalisation);
  1093.             $this->ModificationLoggerService->logDifferences(
  1094.                 'BD_EDICOM',
  1095.                 'updatedata',              
  1096.                 'up_localisations',        
  1097.                 $oldDataLocalisation,
  1098.                 $newDataLocalisation,
  1099.                 $codeFirme,
  1100.                 null
  1101.                 'UPDATE'
  1102.             );
  1103.         //up_coordonnées
  1104.         $telefone $this->filterJsonField($request->request->all('Pfield7'));
  1105.         $whatsapp =  $this->filterJsonField($request->request->all('Pwhatsapp'));
  1106.         $email =  $this->filterJsonField($request->request->all('Pemail'));
  1107.         $site_web =  $this->filterJsonField($request->request->all('Psite'));
  1108.         $facebook =  $this->filterJsonField($request->request->all('PLfacebook'));
  1109.         $instagram =  $this->filterJsonField($request->request->all('PLinstagram'));
  1110.         $linkedin =  $this->filterJsonField($request->request->all('PLlinkedin'));
  1111.         // Puis tu peux appeler ton service
  1112.         if ($telefone !== null || $whatsapp !== null || $email !== null || $site_web !== null || $facebook !== null || $instagram !== null || $linkedin !== null) {
  1113.             if ($coordonnee) {
  1114.             $this->firmeService->updateCoordonnees(null,$codeFirme$telefonenull$whatsapp$email$site_web$facebook$instagram$linkedin);
  1115.             } else {
  1116.                 $this->firmeService->insererCoordonnees(null,$codeFirme$telefonenull$whatsapp$email$site_web$facebook$instagram$linkedin);
  1117.             }
  1118.         }
  1119.         
  1120.         $oldDataCoordonnee = [
  1121.             'telefone' => $firmeCRM['telefones'] ?? [],
  1122.             'portable' => $firmeCRM['portables'] ?? [],
  1123.             'whatsapp' => $firmeCRM['whatsapps'] ?? [],            
  1124.             'email' => $firmeCRM['emails'] ?? [],
  1125.             'site_web' => $firmeCRM['sites'] ?? [],     
  1126.             'facebook' => $firmeCRM['reseaux_sociaux']['facebook'] ?? null
  1127.             'instagram' => $firmeCRM['reseaux_sociaux']['instagram'] ?? null,       
  1128.             'linkedin' => $firmeCRM['reseaux_sociaux']['linkedin'] ?? null,
  1129.         ];
  1130.         // lesdonnées nouvelles (après modification)
  1131.         $newDataCoordonnee = [
  1132.             'telefone' =>  $telefone,
  1133.             'whatsapp' =>  $whatsapp,            
  1134.             'email' =>  $email,
  1135.             'site_web' =>  $site_web,     
  1136.             'facebook' =>  $facebook
  1137.             'instagram' =>  $instagram,       
  1138.             'linkedin' =>  $linkedin,
  1139.         ];
  1140.         // // Synchroniser les tableaux vides entre old et new
  1141.         // foreach ($oldDataCoordonnee as $champ => $ancienneValeur) {
  1142.         //     // Si l’ancienne valeur est un tableau vide
  1143.         //     if (is_array($ancienneValeur) && empty($ancienneValeur)) {
  1144.         //         $newDataCoordonnee[$champ] = [];
  1145.         //     }
  1146.         //     // Si les deux sont des chaînes JSON vides ("[]")
  1147.         //     if ($ancienneValeur === '[]') {
  1148.         //         $newDataCoordonnee[$champ] = '[]';
  1149.         //     }
  1150.         // }
  1151.         $this->ModificationLoggerService->logDifferences(
  1152.             'BD_EDICOM',
  1153.             'updatedata',              
  1154.             'up_coordonnees',        
  1155.             $oldDataCoordonnee,
  1156.             $newDataCoordonnee,
  1157.             $codeFirme,
  1158.             null
  1159.             'UPDATE'
  1160.         );
  1161.         //up_juridiques
  1162.         $annee_creation $request->request->get('PLfield14');
  1163.         $ice $request->request->get('PLfield29');
  1164.         $identifiant_fiscal $request->request->get('PLfield30');
  1165.         $inp $request->request->get('PLfield31');
  1166.         $rc $request->request->get('PLfield20');
  1167.         $ville_rc $request->request->get('PLfield21');
  1168.         $user_id null;
  1169.         if (trim($annee_creation) !== '' || trim($ice) !== '' || trim($identifiant_fiscal) !== '' || trim($rc) !== '' || trim($ville_rc) !== '' || trim($inp) !== '') {
  1170.             if ($juridique) {
  1171.                 $this->firmeService->updateJuridiques($user_id,$codeFirme,null,$annee_creation,null,null,$ice,$inp,null,$rc,$ville_rc,$identifiant_fiscal);
  1172.             } else {
  1173.                 $this->firmeService->insererJuridiques($user_id,$codeFirme,null,$annee_creation,null,null,$ice,$inp,null,$rc,$ville_rc,$identifiant_fiscal);
  1174.             }
  1175.         }
  1176.         $firmeCRM['firme']['date_creation'] = date('Y'strtotime($firmeCRM['firme']['date_creation']));
  1177.                 // les données anciennes
  1178.         $oldDataJuridique = [
  1179.             'annee_creation' =>$firmeCRM['firme']['date_creation'],
  1180.             'ice' => $firmeCRM['firme']['ref_ann_leg'],            
  1181.             'inp' =>$firmeCRM['firme']['inp'],
  1182.             'identifiant_fiscal' =>$firmeCRM['firme']['ident_fisc'],
  1183.             'ville_rc' =>$firmeCRM['firme']['code_ville_rc'],  
  1184.             'rc' =>$firmeCRM['firme']['rc'],        
  1185.         ];
  1186.         // lesdonnées nouvelles (après modification)
  1187.         $newDataJuridique = [
  1188.             'annee_creation' =>  $annee_creation,
  1189.             'ice' =>  $ice,            
  1190.             'inp' =>  $inp,
  1191.             'identifiant_fiscal' =>  $identifiant_fiscal,     
  1192.             'ville_rc' =>  $ville_rc
  1193.             'rc' =>  $rc,       
  1194.         ];
  1195.         // dd($oldDataJuridique, $newDataJuridique);
  1196.         $this->ModificationLoggerService->logDifferences(
  1197.             'BD_EDICOM',
  1198.             'updatedata',              
  1199.             'up_juridiques',        
  1200.             $oldDataJuridique,
  1201.             $newDataJuridique,
  1202.             $codeFirme,
  1203.             null
  1204.             'UPDATE'
  1205.         );
  1206.         //up_finances
  1207.         // Nettoyage des champs
  1208.         $banques      $this->cleanValue($request->request->get('PLfield34'));
  1209.         $zone_export  $this->cleanValue($request->request->get('PLfield35'));
  1210.         $pourc_export $this->cleanValue($request->request->get('PLfield36'));
  1211.         $annee_ca     $this->cleanValue($request->request->get('PLfield32', []));
  1212.         $gamme_ca     $this->cleanValue($request->request->get('PLfield33', []));
  1213.         // dd($zone_export,$pourc_export);
  1214.         // S’assurer que les valeurs sont bien des tableaux
  1215.         if (!is_array($annee_ca)) {
  1216.             $annee_ca = [];
  1217.         }
  1218.         if (!is_array($gamme_ca)) {
  1219.             $gamme_ca = [];
  1220.         }
  1221.         $anneesGammes = [];
  1222.         foreach ($annee_ca as $i => $annee) {
  1223.             if (!empty($annee) && isset($gamme_ca[$i]) && !empty($gamme_ca[$i])) {
  1224.                 $anneesGammes[] = [
  1225.                     'annee_ca' => $annee,
  1226.                     'gamme_ca' => $gamme_ca[$i],
  1227.                 ];
  1228.             }
  1229.         }
  1230.         // Sauvegarde en JSON
  1231.         $annee_ca array_column($anneesGammes'annee_ca');
  1232.         $gamme_ca array_column($anneesGammes'gamme_ca');
  1233.         // Insertion ou mise à jour si au moins un champ est renseigné
  1234.         if ($annee_ca !== null || $gamme_ca !== null || $banques !== null || $zone_export !== null || $pourc_export !== null) {
  1235.             if ($finance) {
  1236.                 $firmeService->updateFinances(null,$codeFirme$annee_ca$gamme_ca$banques$zone_export$pourc_export);
  1237.             } else {
  1238.                 $firmeService->insererFinances(null,$codeFirme$annee_ca$gamme_ca$banques$zone_export$pourc_export);
  1239.             }
  1240.         }
  1241.                 
  1242.         $oldBanques $firmeCRM['banques'] ?? [];
  1243.         if (is_string($oldBanques)) {
  1244.             $decoded json_decode($oldBanquestrue);
  1245.             $oldBanques json_last_error() === JSON_ERROR_NONE $decoded : [$oldBanques];
  1246.         }
  1247.         $oldZones = [];
  1248.         $oldPourcentages = [];
  1249.         if (!empty($firmeCRM['exports'])) {
  1250.             foreach ($firmeCRM['exports'] as $exp) {
  1251.                 $oldZones[] = $exp['CODE_ZONE'] ?? null;
  1252.                 $oldPourcentages[] = $exp['TAUX'] ?? null;
  1253.             }
  1254.         }
  1255.         $oldAnnees = [];
  1256.         $oldGammes = [];
  1257.         if (!empty($firmeCRM['finances'])) {
  1258.             foreach ($firmeCRM['finances'] as $financeItem) {
  1259.                 $oldAnnees[] = $financeItem['ANNEE'] ?? null;
  1260.                 $oldGammes[] = $financeItem['CA'] ?? null;
  1261.             }
  1262.         }
  1263.         // --- Construction du tableau final cohérent ---
  1264.         $oldDataFinance = [
  1265.             'banques'     => $oldBanques,
  1266.             'zone_export' => $oldZones,
  1267.             'pourc_export'=> $oldPourcentages,
  1268.             'annee_ca'    => $oldAnnees,
  1269.             'gamme_ca'    => $oldGammes,
  1270.         ];
  1271.         $newDataFinance = [
  1272.             'banques' =>  $banques,
  1273.             'zone_export' =>  $zone_export,       
  1274.             'pourc_export' =>  $pourc_export,            
  1275.             'annee_ca' =>  $annee_ca,
  1276.             'gamme_ca' =>  $gamme_ca,     
  1277.         ];
  1278.                 // dd($firmeCRM,$newDataFinance);
  1279.         // Synchroniser les tableaux vides entre old et new
  1280.         // dd($oldDataFinance, $newDataFinance);
  1281.         $this->ModificationLoggerService->logDifferences(
  1282.             'BD_EDICOM',
  1283.             'updatedata',              
  1284.             'up_finances',        
  1285.             $oldDataFinance,
  1286.             $newDataFinance,
  1287.             $codeFirme,
  1288.             null
  1289.             'UPDATE'
  1290.         );
  1291.             $ficheCustomer =$this->firmeService->getFirmeByCodeCustomer($codeFirme);
  1292.             $villes =$this->localisationService->getAllVilles();
  1293.             $rubriques =$this->rubriqueprestationService->getAllRubriques();
  1294.             $fonctions =$this->rubriqueprestationService->getAllFonctions();
  1295.             $fichiers =$this->rubriqueprestationService->getAllProfLib();
  1296.             $formeJur =$this->rubriqueprestationService->getAllFormeJur();
  1297.             $gammeCA =$this->rubriqueprestationService->getAllGammeCA();
  1298.             $banques =$this->rubriqueprestationService->getAllBanques();
  1299.             $zonesExp $this->localisationService->getAllZonesExport();       
  1300.             $themes $this->produitKompassService->getThemes(); 
  1301.         return $this->render('customer/firme_up/home.html.twig', [
  1302.             'firme' => $firme,                
  1303.             'codeFirme' => $codeFirme,                
  1304.         ]);
  1305.     }
  1306.     // /**
  1307.     //  * @Route("/firme/up/{codeFirme}", name="app_firme_up")
  1308.     //  */    
  1309.     // public function firmeUp(string $codeFirme,Request $request,FirmeService $firmeService): Response
  1310.     // {   
  1311.     //     $data = $request->request->all();
  1312.     //     //  dd($data);
  1313.     //     $pageSubtitle = 'Fiche client';
  1314.     //     $user = $this->getUser();
  1315.         
  1316.     //     if (!$user instanceof \App\Entity\User) {
  1317.     //         $this->addFlash('error', 'Veuillez vous connecter.');
  1318.     //         return $this->redirectToRoute('app_login');
  1319.     //     }
  1320.     //     // $codeFirme = $user->getCodeFirme();
  1321.     //     $codeFichier = $firmeService->getValidatedCodeFichier($codeFirme);
  1322.     //     $firme = $firmeService->getAllFirmeData($codeFirme);
  1323.     //     // dd($firme['produits']); 
  1324.     //     if ($firme) {
  1325.     //         $firme['raison_social'] = $firme['firme']['rs_comp'];
  1326.     //         $firme['nature'] = $firme['firme']['code_nature'];
  1327.     //         $firme['description_activite'] = $firme['firme']['tp_48'];
  1328.     //         $firme['description_rub'] = $firme['firme']['tp_48'];
  1329.     //         $firme['activite'] = $firme['firme']['code_fichier'];
  1330.     //         $rsComp = trim($firme['firme']['rs_comp']);
  1331.     //         $mots = preg_split('/\s+/', $rsComp); // Séparer par les espaces multiples
  1332.     //         $nombreMots = count($mots);
  1333.     //         if ($nombreMots === 2) {
  1334.     //             $firme['nom'] = $mots[0];
  1335.     //             $firme['prenom'] = $mots[1];
  1336.     //         } elseif ($nombreMots >= 3) {
  1337.     //             $firme['nom'] = $mots[0] . ' ' . $mots[1];
  1338.     //             $firme['prenom'] = $mots[$nombreMots - 1];
  1339.     //         } else {
  1340.     //             // Cas limite : un seul mot
  1341.     //             $firme['nom'] = $rsComp;
  1342.     //             $firme['prenom'] = '';
  1343.     //         }
  1344.     //         $firme['description_activite'] = $firme['firme']['tp_48'];
  1345.     //         $firme['horaires'] = $firme['horaires'];
  1346.     //         $firme['pause'] = '[]';
  1347.     //         $firme['rubriques'] = json_decode($firme['rubriques'] ?? '[]', true);
  1348.     //         $firme['prestations'] = json_decode($firme['prestations'] ?? '[]', true);
  1349.     //         // $firme['produits'] = json_decode($firme['produits'] ?? '[]', true);
  1350.     //         $firme['produits'] = '';
  1351.     //         // $firme['marques'] = json_decode($firme['marques'] ?? '[]', true);
  1352.     //         $firme['marques'] ='';
  1353.     //         $firme['actes'] = json_decode($firme['actes'] ?? '[]', true);
  1354.     //     } else {
  1355.     //         // Par exemple, on passe un tableau vide au template
  1356.     //         $firme = [
  1357.     //             'horaires' => [],
  1358.     //             'pause' => [],
  1359.     //             'rubriques' => [],
  1360.     //             'prestations' => [],
  1361.     //             'produits' => [],
  1362.     //             'marques' => [],
  1363.     //             'actes' => [],
  1364.     //         ];
  1365.     //     }
  1366.     //     $localisation['adresse'] = $firme['firme']['num_voie'] . ' ' . $firme['firme']['lib_voie'] . ' ' . $firme['firme']['comp_voie'] . '' . $firme['firme']['ville'] . ' - Maroc';
  1367.     //     // $localisation['adresse'] = $firme['firme']['adresse_ompic'];
  1368.     //     $localisation['ville'] = $firme['firme']['ville'];
  1369.     //     $localisation['code_ville'] = $firme['firme']['code_ville'];
  1370.     //     $localisation['quartier'] = $firme['firme']['quartier'];
  1371.     //     $localisation['code_quartier'] = $firme['firme']['code_quart'];
  1372.     //     $localisation['code_postal'] = $firme['firme']['code_postal'];
  1373.     //     $localisation['longitude'] = $firme['firme']['longitude'];
  1374.     //     $localisation['latitude'] = $firme['firme']['latitude'];
  1375.     //     // dd($localisation);
  1376.     //     $firme['firme']['date_creation'] = date('Y', strtotime($firme['firme']['date_creation']));
  1377.     //     $juridique['annee_creation'] = $firme['firme']['date_creation'];
  1378.     //     $juridique['effectif'] = $firme['firme']['eff_max'];
  1379.     //     $juridique['ice'] = $firme['firme']['ref_ann_leg'];
  1380.     //     $juridique['inp'] = $firme['firme']['inp'];
  1381.     //     $juridique['identifiant_fiscal'] = $firme['firme']['ident_fisc'];
  1382.     //     $juridique['rc'] = $firme['firme']['rc'];
  1383.     //     $juridique['ville_rc'] = $firme['firme']['code_ville_rc'];
  1384.     //     $juridique['forme_juridique'] = $firme['firme']['code_forme_jur'];
  1385.     //     $juridique['patente'] = $firme['firme']['patente'];
  1386.     //     $juridique['capital'] = $firme['firme']['cap'];
  1387.     //     // $finance['ANNEE_CA'] = $firme['firme']['ANNEE_CA'];
  1388.     //     // $finance['gamme_ca'] = $firme['firme']['gamme_ca'];
  1389.     //     $finance['banques'] = $firme['banques'];
  1390.     //     $finance['zone_export'] = $firme['zones'];
  1391.     //     $finance['pourc_export'] = $firme['pourcentages'];
  1392.     //     // $annee_ca_raw = $finance['annee_ca'] ?? '[]';
  1393.     //     // $gamme_ca_raw = $finance['gamme_ca'] ?? '[]';
  1394.     //     // if (is_string($annee_ca_raw) && str_starts_with(trim($annee_ca_raw), '[')) {
  1395.     //     //     $anneesCA = json_decode($annee_ca_raw, true);        
  1396.     //     //     rsort($anneesCA, SORT_NUMERIC);
  1397.     //     // } else {
  1398.     //     //     $anneesCA = [$annee_ca_raw];        
  1399.     //     //     rsort($anneesCA, SORT_NUMERIC);
  1400.     //     // }
  1401.     //     // if (is_string($gamme_ca_raw) && str_starts_with(trim($gamme_ca_raw), '[')) {
  1402.     //     //     $gammesCA = json_decode($gamme_ca_raw, true);
  1403.     //     // } else {
  1404.     //     //     $gammesCA = [$gamme_ca_raw];
  1405.     //     // }
  1406.     //     $zoneExport = json_decode($finance['zone_export'] ?? '[]', true);
  1407.     //     $pourcExport = json_decode($finance['pourc_export'] ?? '[]', true); 
  1408.     //     // --- ANNEES ET GAMMES CA ---
  1409.     //     $anneesGammes = [];
  1410.     //     if (!empty($firme['finances'])) {
  1411.     //         foreach ($firme['finances'] as $f) {
  1412.     //             $anneesGammes[] = [
  1413.     //                 'annee_ca' => $f['ANNEE'] ?? null,
  1414.     //                 'gamme_ca' => $f['CA'] ?? null
  1415.     //             ];
  1416.     //         }
  1417.     //         // Trier les années décroissantes
  1418.     //         usort($anneesGammes, fn($a, $b) => $b['annee_ca'] <=> $a['annee_ca']);
  1419.     //     }
  1420.     //     $zonesExportList = [];
  1421.     //     if (is_array($zoneExport)) {
  1422.     //         foreach ($zoneExport as $index => $zone) {
  1423.     //             $zonesExportList[] = [
  1424.     //                 'zone' => $zone,
  1425.     //                 'pourcentage' => $pourcExport[$index] ?? null
  1426.     //             ];
  1427.     //         }
  1428.     //     }
  1429.         
  1430.     //     // $coordonnee = $firmeService->getCoordonneeByCodeFirme($codeFirme);
  1431.     //     $coordonnee['telefone'] = $firme['telefones'];
  1432.     //     $coordonnee['portable'] = $firme['portables'];
  1433.     //     $coordonnee['whatsapp'] = $firme['whatsapps'];
  1434.     //     $coordonnee['email'] = $firme['emails'];
  1435.     //     $coordonnee['site_web'] = $firme['sites'];
  1436.     //     $coordonnee['facebook'] = $firme['reseaux_sociaux']['facebook'] ?? null;
  1437.     //     $coordonnee['instagram'] = $firme['reseaux_sociaux']['instagram'] ?? null;
  1438.     //     $coordonnee['linkedin'] = $firme['reseaux_sociaux']['linkedin'] ?? null;
  1439.     //     // dd($coordonnee);
  1440.     //     if ($coordonnee) {
  1441.     //         $coordonnee['telefone'] = json_decode($firme['telefones'] ?? '[]', true);
  1442.     //         $coordonnee['portable'] = json_decode($firme['portables'] ?? '[]', true);
  1443.     //         $coordonnee['whatsapp'] = json_decode($firme['whatsapps'] ?? '[]', true);
  1444.     //         $coordonnee['email'] = json_decode($firme['emails'] ?? '[]', true);
  1445.     //         $coordonnee['site_web'] = json_decode($firme['sites'] ?? '[]', true);
  1446.     //         $coordonnee['facebook'] = json_decode($firme['reseaux_sociaux']['facebook'] ?? '[]', true);
  1447.     //         $coordonnee['instagram'] = json_decode($firme['reseaux_sociaux']['instagram'] ?? '[]', true);
  1448.     //         $coordonnee['linkedin'] = json_decode($firme['reseaux_sociaux']['linkedin'] ?? '[]', true);
  1449.     //     } else {
  1450.     //         // On initialise à vide pour éviter toute erreur dans le template
  1451.     //         $coordonnee = [
  1452.     //             'telefone' => [],
  1453.     //             'portable' => [],
  1454.     //             'whatsapp' => [],
  1455.     //             'email' => [],
  1456.     //             'site_web' => [],
  1457.     //             'facebook' => [],
  1458.     //             'instagram' => [],
  1459.     //             'linkedin' => [],
  1460.     //         ];
  1461.     //     }
  1462.     //     // dd($coordonnee);
  1463.     //     // $certification = $firmeService->getCertificationByFirme($codeFirme);
  1464.     //     $certification['certification'] = $firme['certifications']['CERTIFICATION'] ?? '';
  1465.     //     $certification['organisme'] = $firme['certifications']['AUT_CERTIFICATION'] ?? '';
  1466.     //     $certification['type'] = $firme['certifications']['NUM_CERTIFICATION'] ?? '';
  1467.     //     $certification['produit'] = $firme['certifications']['PRODUIT'] ?? '';
  1468.     //     $certification['date_expiration'] = $firme['certifications']['CERT_EXPIRATION'] ?? null;
  1469.     //     if (!empty($certification['date_expiration'])) {
  1470.     //     $date = new \DateTime($certification['date_expiration']);
  1471.     //     $certification['date_expiration'] = $date->format('Y-m-d');
  1472.     //     }
  1473.     //     $dirigeants = [];
  1474.     //     $codeToCivilite = [
  1475.     //         '01' => 'M',
  1476.     //         '02' => 'Mme',
  1477.     //         '04' => 'Dr',
  1478.     //         '18' => 'Pr', // Prof
  1479.     //     ];
  1480.     //     foreach ($firme['dirigeants'] as $dirigeant) {
  1481.     //         $portables = array_filter([
  1482.     //             $dirigeant['tel_1'] ?? null,
  1483.     //             $dirigeant['tel_2'] ?? null,
  1484.     //         ]);
  1485.     //         $dirigeants[] = [
  1486.     //             'id' => $dirigeant['id'] ?? null,
  1487.     //             'nom' => $dirigeant['nom'] ?? '',
  1488.     //             'prenom' => $dirigeant['prenom'] ?? '',
  1489.     //             'civilite' => $codeToCivilite[$dirigeant['civilite']] ?? '',
  1490.     //             'fonction' => $dirigeant['code_fonction'] ?? '',
  1491.     //             'email' => $dirigeant['email'] ?? '',
  1492.     //             'portable' => implode(', ', $portables),
  1493.     //             'whatsapp' => $dirigeant['whatsapp'] ?? '',
  1494.     //         ];
  1495.     //     }
  1496.     //     foreach ($dirigeants as &$d) {
  1497.     //         $p = $d['portable'];
  1498.     //         // Si c'est un JSON, décoder en tableau
  1499.     //         if ($p && $p[0] === '[') {
  1500.     //             $d['portables'] = json_decode($p, true);
  1501.     //         } 
  1502.     //         // Si c'est un numéro simple, mettre dans un tableau
  1503.     //         elseif ($p) {
  1504.     //             $d['portables'] = [$p];
  1505.     //         } 
  1506.     //         // Si vide
  1507.     //         else {
  1508.     //             $d['portables'] = [];
  1509.     //         }
  1510.     //     }
  1511.     //     $wproduits = $firme['activites_w13'];
  1512.     //     if (!$user) {
  1513.     //         $this->addFlash('error', 'Veuillez vous connecter.');
  1514.     //         return $this->redirectToRoute('app_login');
  1515.     //     }
  1516.     //     $roles = $user->getRoles();
  1517.     //     $villes =$this->localisationService->getAllVilles();
  1518.     //     $villesRC =$this->localisationService->getAllVillesRC();
  1519.     //     $rubriques =$this->rubriqueprestationService->getAllRubriques();
  1520.     //     $fonctions =$this->rubriqueprestationService->getAllFonctions();
  1521.     //     $natures =$this->rubriqueprestationService->getAllNatures();
  1522.     //     $fichiers =$this->rubriqueprestationService->getAllProfLib();
  1523.     //     $formeJur =$this->rubriqueprestationService->getAllFormeJur();
  1524.     //     $gammeCA =$this->rubriqueprestationService->getAllGammeCA();
  1525.     //     $produits =$this->rubriqueprestationService->getAllProduits();
  1526.     //     // $marques =$this->rubriqueprestationService->getAllMarques();
  1527.     //     $banques =$this->rubriqueprestationService->getAllBanques();
  1528.     //     $zonesExp = $this->localisationService->getAllZonesExport();       
  1529.     //     $themes = $this->produitKompassService->getThemes(); 
  1530.     //     $ficheCustomer =$this->firmeService->getFirmeByCodeCustomer($codeFirme);
  1531.     //     $ficheAdmin =$this->firmeService->getFirmeByCodeAdmin($codeFirme);
  1532.     //     $ficheModerator =$this->firmeService->getFirmeByCodeAdmin($codeFirme);
  1533.     //     $codesProduits = $firme['produits'] ?? [];
  1534.     //     $kompassProduits =  $firme['produits'];
  1535.     //     // // Transformer les codes en tableau associatif code => libellé
  1536.     //     // $firme['produits'] = $this->rubriqueprestationService->getLibellesProduits($codesProduits);
  1537.     //     // $codesMarques = $firme['marques'] ?? [];
  1538.     //     // // Transformer les codes en tableau associatif code => libellé
  1539.     //     // $firme['marques'] = $this->rubriqueprestationService->getLibellesMarques($codesMarques);
  1540.     //     // $codeFirme= $codeFirme;
  1541.     //     // dd($ficheCustomer);
  1542.     //     if (in_array('ROLE_CUSTOMER', $roles)) {
  1543.     //         // if (!$codeFichier) {
  1544.     //             return $this->render('customer/firme_up/index.html.twig', [
  1545.     //                 'ficheCustomer' => $ficheCustomer,
  1546.     //                 'villes' => $villes,
  1547.     //                 'villesRC' => $villesRC,
  1548.     //                 'rubriques' => $rubriques,
  1549.     //                 'fonctions' => $fonctions,
  1550.     //                 'natures' => $natures,
  1551.     //                 'fichiers' => $fichiers,
  1552.     //                 'formeJur' =>  $formeJur,
  1553.     //                 'banques' => $banques,                
  1554.     //                 'zonesExp' => $zonesExp,
  1555.     //                 'themes' => $themes,
  1556.     //                 'codeFirme' =>  $codeFirme,
  1557.     //                 'wproduits' =>  $wproduits,
  1558.     //                 'firme' =>  $firme,
  1559.     //                 'localisation' =>  $localisation,
  1560.     //                 'coordonnee' =>  $coordonnee,
  1561.     //                 'juridique' =>  $juridique,
  1562.     //                 'finance' =>  $finance,
  1563.     //                 'pourcExport' => $pourcExport,
  1564.     //                 'anneesGammes' => $anneesGammes,
  1565.     //                 'gammeCA' => $gammeCA, 
  1566.     //                 'zonesExportList' => $zonesExportList,
  1567.     //                 'dirigeants' => $dirigeants,
  1568.     //                 'certification' => $certification,
  1569.     //                 'codeFichier' => $codeFichier,            
  1570.     //                 'produits' => $produits,
  1571.     //                 // 'marques' => $marques,
  1572.     //                 'codeFirme' => $codeFirme,
  1573.     //                 'kompassProduits' => $kompassProduits,
  1574.     //             ]);
  1575.     //     }
  1576.     //     if (in_array('ROLE_ADMIN', $roles)) {
  1577.     //         return $this->render('admin/firme_up/index.html.twig', [
  1578.     //             'ficheAdmin' => $ficheAdmin,
  1579.     //             'pageSubtitle' => 'Fiche administrateur',
  1580.     //              'firme' => $firme,
  1581.     //             // 'produits' => $produits,
  1582.     //             // 'marques' => $marques,
  1583.     //             'villes' => $villes,                    
  1584.     //             'villesRC' => $villesRC,
  1585.     //             'rubriques' => $rubriques,
  1586.     //             'fonctions' => $fonctions,
  1587.     //             'natures' => $natures,
  1588.     //             'fichiers' => $fichiers,
  1589.     //             'formeJur' => $formeJur,
  1590.     //             'banques' => $banques,
  1591.     //             'zonesExp' => $zonesExp,
  1592.     //             'themes' => $themes,
  1593.     //             'wproduits' => $wproduits,
  1594.     //             'localisation' => $localisation,
  1595.     //             'coordonnee' => $coordonnee,
  1596.     //             'juridique' => $juridique,
  1597.     //             'finance' => $finance,
  1598.     //             'pourcExport' => $pourcExport,
  1599.     //             'anneesGammes' => $anneesGammes,
  1600.     //             'gammeCA' => $gammeCA,
  1601.     //             'zonesExportList' => $zonesExportList,
  1602.     //             'dirigeants' => $dirigeants,
  1603.     //             'certification' => $certification,
  1604.     //             'codeFichier' => $codeFichier,
  1605.     //             'codeFirme'    => $codeFirme,
  1606.     //         ]);
  1607.     //     }  
  1608.     //     if (in_array('ROLE_MODERATOR', $roles) || in_array('ROLE_MODERATOR', $roles)) {
  1609.     //         return $this->render('moderator/firme_up/index.html.twig', [
  1610.     //             'ficheAdmin' => $ficheAdmin,
  1611.     //             'pageSubtitle' => 'Fiche moderateur',
  1612.     //         ]);
  1613.     //     }
  1614.     //     $this->addFlash('error', 'Accès interdit.');
  1615.     //     return $this->redirectToRoute('app_customer');
  1616.     // }
  1617.     /**
  1618.      * @Route("/firme/up/{codeFirme}", name="app_firme_up")
  1619.      */
  1620.     public function firmeUp(string $codeFirmeRequest $requestFirmeUpService $firmeUpService): Response
  1621.     {
  1622.         $user $this->getUser();
  1623.         if (!$user instanceof \App\Entity\User) {
  1624.             $this->addFlash('error''Veuillez vous connecter.');
  1625.             return $this->redirectToRoute('app_login');
  1626.         }
  1627.         $data $firmeUpService->prepareFirmeData($codeFirme);
  1628.         // dd($data);
  1629.         $roles $user->getRoles();
  1630.         if (in_array('ROLE_CUSTOMER'$roles)) {
  1631.             return $this->render('customer/firme_up/index.html.twig'$data);
  1632.         }
  1633.         if (in_array('ROLE_ADMIN'$roles)) {
  1634.             return $this->render('admin/firme_up/index.html.twig'$data);
  1635.         }
  1636.         if (in_array('ROLE_MODERATOR'$roles)) {
  1637.             return $this->render('moderator/firme_up/index.html.twig'$data);
  1638.         }
  1639.         $this->addFlash('error''Accès interdit.');
  1640.         return $this->redirectToRoute('app_customer');
  1641.     }
  1642.     /**
  1643.      * @Route("/firmeUp/insert", name="insert_firmeUp", methods={"POST"})
  1644.      */
  1645.     public function insertFirmeUp(Request $request,FirmeService $firmeService,ProduitKompassService $produitKompassService,ModificationLoggerService $ModificationLoggerService): Response
  1646.     {
  1647.         $codeFirme $request->request->get('codeFirme'); 
  1648.         $data $request->request->all();        
  1649.         $firmeCRM $this->firmeService->getAllFirmeData($codeFirme);
  1650.             $kompassProduitsCRM $firmeCRM['produits'];
  1651.             $wproduitsCRM $firmeCRM['activites_w13'];
  1652.             $kompassProduitsUD $this->produitKompassService->getProduitsKompass($codeFirme);
  1653.             $wproduitsUD $this->produitKompassService->getLienProduitW13($codeFirme);
  1654.             // 🧩 Décodage JSON si nécessaire
  1655.             if (is_string($kompassProduitsCRM)) {
  1656.                 $kompassProduitsCRM json_decode($kompassProduitsCRMtrue) ?? [];
  1657.             }
  1658.             if (is_string($wproduitsCRM)) {
  1659.                 $wproduitsCRM json_decode($wproduitsCRMtrue) ?? [];
  1660.             }
  1661.             if (is_string($kompassProduitsUD)) {
  1662.                 $kompassProduitsUD json_decode($kompassProduitsUDtrue) ?? [];
  1663.             }
  1664.             if (is_string($wproduitsUD)) {
  1665.                 $wproduitsUD json_decode($wproduitsUDtrue) ?? [];
  1666.             }
  1667.         // dd($wproduitsUD,$wproduitsCRM,$kompassProduitsUD ,$kompassProduitsCRM);
  1668.             // ========================
  1669.             // 🔹 Préparer les produits W13
  1670.             // ========================
  1671.             $oldWProduits array_map(fn($p) => [
  1672.                 'code_produit' => $p['CODE_WF13'] ?? $p['code_produit'] ?? '',
  1673.                 // 'lib_produit' => $p['lib_produit'] ?? $p['LIB_PRODUIT'] ?? '',
  1674.                 'export' => $p['EXPORTATEUR'] ?? '',
  1675.                 'import' => $p['IMPORTATEUR'] ?? '',
  1676.                 'fda' => $p['FDA'] ?? '',
  1677.             ], $wproduitsCRM);
  1678.             $newWProduits array_map(fn($p) => [
  1679.                 'code_produit' => $p['CODE_PRODUIT_WF13'] ?? '',
  1680.                 // 'lib_produit' => $p['lib_produit'] ?? $p['LIB_PRODUIT'] ?? '',
  1681.                 'export' => $p['export'] ?? '',
  1682.                 'import' => $p['import'] ?? '',
  1683.                 'fda' => $p['fda'] ?? '',
  1684.             ], $wproduitsUD);
  1685.             // 🔹 Logger les différences W13
  1686.             $this->ModificationLoggerService->logComplexeDifferencesProduit(
  1687.                 'BD_EDICOM',
  1688.                 'updatedata',
  1689.                 'up_activite_WF13',
  1690.                 $oldWProduits,
  1691.                 $newWProduits,
  1692.                 $codeFirme,
  1693.                 null,
  1694.                 'UPDATE'
  1695.             );
  1696.             // ========================
  1697.             // 🔹 Préparer les produits Kompass
  1698.             // ========================
  1699.             $oldKompass array_map(fn($p) => [
  1700.                 'code_produit' => $p['code_produit'] ?? '',
  1701.                 // 'lib_produit' => $p['lib_produit'] ?? $p['LIB_PRODUIT'] ?? '',
  1702.                 'export' => $p['export'] ?? '',
  1703.                 'import' => $p['import'] ?? '',
  1704.                 'fda' => $p['fda'] ?? '',
  1705.             ], $kompassProduitsCRM);
  1706.             $newKompass array_map(fn($p) => [
  1707.                 'code_produit' => $p['code_produit'] ?? '',
  1708.                 // 'lib_produit' => $p['lib_produit'] ?? '',
  1709.                 'export' => $p['export'] ?? '',
  1710.                 'import' => $p['import'] ?? '',
  1711.                 'fda' => $p['fda'] ?? '',
  1712.             ], $kompassProduitsUD);
  1713.             // 🔹 Logger les différences Kompass
  1714.             $this->ModificationLoggerService->logComplexeDifferencesProduit(
  1715.                 'BD_EDICOM',
  1716.                 'updatedata',
  1717.                 'up_produits_kompass',
  1718.                 $oldKompass,
  1719.                 $newKompass,
  1720.                 $codeFirme,
  1721.                 null,
  1722.                 'UPDATE'
  1723.             );
  1724.         $firme $firmeService->getFirmeByCodeAdmin($codeFirme); 
  1725.         $localisation $firmeService->getLocalisationByCodeFirme($codeFirme); 
  1726.         $coordonnee $firmeService->getCoordonneeByCodeFirme($codeFirme); 
  1727.         $finance $firmeService->getFinanceByCodeFirme($codeFirme); 
  1728.         $juridique $firmeService->getJuridiqueByCodeFirme($codeFirme); 
  1729.         $dirigeants $firmeService->getDirigeantsByCodeFirme($codeFirme); 
  1730.          function isNotEmpty($value): bool {
  1731.             if (is_array($value)) {
  1732.                 foreach ($value as $v) {
  1733.                     if (trim((string)$v) !== '') {
  1734.                         return true;
  1735.                     }
  1736.                 }
  1737.                 return false;
  1738.             }
  1739.             return trim((string)$value) !== '';
  1740.         }
  1741.         $jours = ['lundi''mardi''mercredi''jeudi''vendredi''samedi''dimanche'];
  1742.         $horaires = [];
  1743.         foreach ($jours as $jour) {
  1744.             $isChecked $request->request->get('checkbox_' $jour);
  1745.             if ($isChecked) {
  1746.                 $start $request->request->get('start_' $jour);
  1747.                 $end $request->request->get('end_' $jour);
  1748.                 $horaires[$jour] = [
  1749.                     'actif' => true,
  1750.                     'start' => $start,
  1751.                     'end' => $end
  1752.                 ];
  1753.             } else {
  1754.                 $horaires[$jour] = [
  1755.                     'actif' => false,
  1756.                     'start' => null,
  1757.                     'end' => null
  1758.                 ];
  1759.             }
  1760.         }
  1761.         // ➕ Traitement cohérent pour la pause
  1762.         $pauseEnabled $request->request->get('pause_enabled'); // existe uniquement si cochée
  1763.         $pauseStart $request->request->get('pause_start');
  1764.         $pauseEnd $request->request->get('pause_end');
  1765.         $pause = [];
  1766.         if ($pauseEnabled) {
  1767.             $pause = [
  1768.                 'actif' => true,
  1769.                 'start' => $pauseStart,
  1770.                 'end' => $pauseEnd
  1771.             ];
  1772.         } else {
  1773.             $pause = [
  1774.                 'actif' => false,
  1775.                 'start' => null,
  1776.                 'end' => null
  1777.             ];
  1778.         }
  1779.         $horairesJson json_encode($horaires);
  1780.         $pauseJson json_encode($pause);
  1781.         $produits $request->request->get('field29');
  1782.         $positionsProduits $request->request->get('Prfield31');
  1783.         $marques $request->request->get('field30');
  1784.         $positionsMarques $request->request->get('field31');
  1785.         // Filtrer les produits avec valeurs non vides
  1786.         $produitsAvecPositions = [];
  1787.         if (!empty($produits) && is_array($produits)) {
  1788.             foreach ($produits as $index => $produit) {
  1789.                 if (trim($produit) !== '') {
  1790.                     $produitsAvecPositions[] = [
  1791.                         'produit' => $produit,
  1792.                         'position' => $positionsProduits[$index] ?? null
  1793.                     ];
  1794.                 }
  1795.             }
  1796.         }
  1797.         // // Filtrer les marques avec valeurs non vides
  1798.         $marquesAvecPositions = [];
  1799.         if (!empty($marques) && is_array($marques)) {
  1800.             foreach ($marques as $index => $marque) {
  1801.                 if (trim($produit) !== '') {
  1802.                     $marquesAvecPositions[] = [
  1803.                         'marque' => $marque,
  1804.                         'position' => $positionsMarques[$index] ?? null
  1805.                     ];
  1806.                 }
  1807.             }
  1808.         }
  1809.         //up_firme
  1810.         $raison_social $request->request->get('field1');
  1811.         $nature $request->request->get('field2');
  1812.         $horaires $horairesJson;
  1813.         $pause $pauseJson;
  1814.         $rubriques =  $this->filterJsonField($request->request->all('field26'));
  1815.         $prestations =  $this->filterJsonField($request->request->all('field28'));
  1816.         // Filtrer la description_rub
  1817.         $description_rub trim($request->request->get('field27') ?? '');
  1818.         // Encodage final
  1819.         $produits = !empty($produitsAvecPositions) ? json_encode($produitsAvecPositions) : null;
  1820.         $marques = !empty($marquesAvecPositions) ? json_encode($marquesAvecPositions) : null;
  1821.         // $produits =  $this->filterJsonField($request->request->all('field29'));;
  1822.         // $marques =  $this->filterJsonField($request->request->all('field30'));;
  1823.         $validation $request->request->get('validation') ?? null;
  1824.         $date_creation = new \DateTime();
  1825.         $date_validation $validation === '1' ? new \DateTime() : null;
  1826.         $pl_or_societe "S";
  1827.         if (trim($codeFirme) !== '' || trim($raison_social) !== '' || trim($nature) !== '' || $horaires !== '[]' || $pause !== '[]' || $rubriques !== null ||$description_rub !== '' || $prestations !== null || !empty($produits) || !empty($marques)) 
  1828.         {
  1829.             if ($firme) {
  1830.                 $etat='U';
  1831.                 $synchroniser="0";
  1832.                 $this->firmeService->updateFirme(
  1833.                     null,
  1834.                     $codeFirme,
  1835.                     $raison_social,
  1836.                     $nature,
  1837.                     $horairesJson,
  1838.                     $pauseJson,
  1839.                     $rubriques,
  1840.                     $description_rub,
  1841.                     $prestations,
  1842.                     $produits,
  1843.                     $marques,
  1844.                     $validation,
  1845.                     $date_validation,
  1846.                     null// nom
  1847.                     null// prenom
  1848.                     null// actes
  1849.                     null// activite
  1850.                     null// description
  1851.                     $pl_or_societe,
  1852.                     $etat,
  1853.                     $synchroniser
  1854.                 );
  1855.             } else {
  1856.                 $etat='C';
  1857.                 $synchroniser="0";
  1858.                 $this->firmeService->insererFirme(
  1859.                     null,
  1860.                     $codeFirme,
  1861.                     $raison_social,
  1862.                     $nature,
  1863.                     $horairesJson,
  1864.                     $pauseJson,
  1865.                     $rubriques,
  1866.                     $description_rub,
  1867.                     $prestations,
  1868.                     $produits,
  1869.                     $marques,
  1870.                     $validation,
  1871.                     $date_validation,
  1872.                     $date_creation,
  1873.                     null,
  1874.                     null,
  1875.                     null,
  1876.                     null,
  1877.                     null,
  1878.                     $pl_or_societe,
  1879.                     $etat,
  1880.                     $synchroniser
  1881.                 );
  1882.             }        
  1883.         }
  1884.         // les données anciennes
  1885.         $oldDataFirme = [
  1886.             'raison_social' => $firmeCRM['firme']['rs_comp'] ,
  1887.             'nature' =>  $firmeCRM['firme']['code_nature'],
  1888.             'rubriques' =>  $firmeCRM['rubriques'],
  1889.             'description_rub' =>  $firmeCRM['firme']['tp_48'],
  1890.             'prestations' =>  $firmeCRM['prestations'],
  1891.             'produits' =>  $produits,
  1892.             'marques' =>  $marques,
  1893.             'horaires' => json_encode$firmeCRM['horaires'])
  1894.         ];
  1895.         // dd($firmeCRM);
  1896.         // lesdonnées nouvelles (après modification)
  1897.         $newDataFirme = [
  1898.             'raison_social' => $raison_social,
  1899.             'nature' => $nature,       
  1900.             'rubriques' =>  $rubriques,            
  1901.             'description_rub' =>  $description_rub,
  1902.             'prestations' => $prestations,     
  1903.             'produits' =>  $produits
  1904.             'marques' => $marques,       
  1905.             'horaires' =>  $horaires,
  1906.         ];
  1907.         $this->ModificationLoggerService->logDifferences(
  1908.             'BD_EDICOM',
  1909.             'updatedata',              
  1910.             'up_firme',        
  1911.             $oldDataFirme,
  1912.             $newDataFirme,
  1913.             $codeFirme,
  1914.             null
  1915.             'UPDATE'
  1916.         );
  1917.         // dd($oldDataFirme,$newDataFirme);
  1918.         //up_localisations
  1919.         $adresse $request->request->get('field3');
  1920.         $code_ville $request->request->get('field4');
  1921.         $nom_ville $this->firmeService->getNomVille($code_ville);
  1922.         $code_quartier $request->request->get('field5');
  1923.         $nom_quartier $this->firmeService->getNomQuartier($code_quartier);
  1924.         $code_postal $request->request->get('field6');
  1925.         $longitude $request->request->get('field11');
  1926.         $latitude $request->request->get('field12');
  1927.         if (trim($adresse) !== '' || trim($code_ville) !== '' || trim($nom_ville) !== '' || trim($code_quartier) !== '' || trim($nom_quartier) !== '' || trim($code_postal) !== '' || trim($longitude) !== '' || trim($latitude) !== '')
  1928.         {
  1929.             if ($localisation) {
  1930.                 $this->firmeService->updateLocalisation(null,$codeFirme$adresse$code_ville$nom_ville$code_quartier$nom_quartier$code_postal$longitude$latitude);
  1931.             } else {
  1932.                 $this->firmeService->insererLocalisation(null,$codeFirme$adresse$code_ville$nom_ville$code_quartier$nom_quartier$code_postal$longitude$latitude);
  1933.             }
  1934.         }
  1935.         // les données anciennes
  1936.         $oldDataLocalisation = [
  1937.             'adresse' => $firmeCRM['firme']['num_voie'] . ' ' $firmeCRM['firme']['lib_voie'] . ' ' $firmeCRM['firme']['comp_voie'] . '' $firmeCRM['firme']['ville'] . ' - Maroc',
  1938.             'code_ville' => $firmeCRM['firme']['code_ville'],       
  1939.             'ville' =>  $firmeCRM['firme']['ville'],            
  1940.             'code_quartier' =>  $firmeCRM['firme']['code_quart'],
  1941.             'quartier' => $firmeCRM['firme']['quartier'],     
  1942.             'code_postal' =>  $firmeCRM['firme']['code_postal'], 
  1943.             'longitude' => $firmeCRM['firme']['longitude'],       
  1944.             'latitude' =>  $firmeCRM['firme']['latitude'],
  1945.         ];
  1946.         // dd($firmeCRM);
  1947.         // lesdonnées nouvelles (après modification)
  1948.         $newDataLocalisation = [
  1949.             'adresse' => $adresse,
  1950.             'code_ville' => $code_ville,       
  1951.             'ville' =>  $nom_ville,            
  1952.             'code_quartier' =>  $code_quartier,
  1953.             'quartier' => $nom_quartier,     
  1954.             'code_postal' =>  $code_postal
  1955.             'longitude' => $longitude,       
  1956.             'latitude' =>  $latitude,
  1957.         ];
  1958.         // dd($oldDataLocalisation, $newDataLocalisation);
  1959.         $this->ModificationLoggerService->logDifferences(
  1960.             'BD_EDICOM',
  1961.             'updatedata',              
  1962.             'up_localisations',        
  1963.             $oldDataLocalisation,
  1964.             $newDataLocalisation,
  1965.             $codeFirme,
  1966.             null
  1967.             'UPDATE'
  1968.         );
  1969.         //up_coordonnées
  1970.         $telefone =  $this->filterJsonField($request->request->all('field7'));
  1971.         $portable =  $this->filterJsonField($request->request->all('field8'));
  1972.         $whatsapp =  $this->filterJsonField($request->request->all('wfield8'));
  1973.         $email =  $this->filterJsonField($request->request->all('field9'));
  1974.         $site_web =  $this->filterJsonField($request->request->all('field10'));
  1975.         $facebook =  $this->filterJsonField($request->request->all('facebook'));
  1976.         $instagram =  $this->filterJsonField($request->request->all('instagram'));
  1977.         $linkedin =  $this->filterJsonField($request->request->all('linkedin'));
  1978.         // Puis tu peux appeler ton service
  1979.         if ($telefone !== null || $portable !== null || $whatsapp !== null || $email !== null || $site_web !== null || $facebook !== null || $instagram !== null || $linkedin !== null) {
  1980.             if ($coordonnee) {
  1981.             $this->firmeService->updateCoordonnees(null,$codeFirme$telefone$portable$whatsapp$email$site_web$facebook$instagram$linkedin);
  1982.             } else {
  1983.                 $this->firmeService->insererCoordonnees(null,$codeFirme$telefone$portable$whatsapp$email$site_web$facebook$instagram$linkedin);
  1984.             }
  1985.         }
  1986.         // les données anciennes
  1987.         $oldDataCoordonnee = [
  1988.             'telefone' => $firmeCRM['telefones'] ?? [],
  1989.             'portable' => $firmeCRM['portables'] ?? [],
  1990.             'whatsapp' => $firmeCRM['whatsapps'] ?? [],            
  1991.             'email' => $firmeCRM['emails'] ?? [],
  1992.             'site_web' => $firmeCRM['sites'] ?? [],     
  1993.             'facebook' => $firmeCRM['reseaux_sociaux']['facebook'] ?? null
  1994.             'instagram' => $firmeCRM['reseaux_sociaux']['instagram'] ?? null,       
  1995.             'linkedin' => $firmeCRM['reseaux_sociaux']['linkedin'] ?? null,
  1996.         ];
  1997.         // lesdonnées nouvelles (après modification)
  1998.         $newDataCoordonnee = [
  1999.             'telefone' =>  $telefone,
  2000.             'portable' =>  $portable,       
  2001.             'whatsapp' =>  $whatsapp,            
  2002.             'email' =>  $email,
  2003.             'site_web' =>  $site_web,     
  2004.             'facebook' =>  $facebook
  2005.             'instagram' =>  $instagram,       
  2006.             'linkedin' =>  $linkedin,
  2007.         ];
  2008.         // Synchroniser les tableaux vides entre old et new
  2009.         foreach ($oldDataCoordonnee as $champ => $ancienneValeur) {
  2010.             // Si l’ancienne valeur est un tableau vide
  2011.             if (is_array($ancienneValeur) && empty($ancienneValeur)) {
  2012.                 $newDataCoordonnee[$champ] = [];
  2013.             }
  2014.             // Si les deux sont des chaînes JSON vides ("[]")
  2015.             if ($ancienneValeur === '[]') {
  2016.                 $newDataCoordonnee[$champ] = '[]';
  2017.             }
  2018.         }
  2019.         // dd($oldDataCoordonnee, $newDataCoordonnee);
  2020.         $this->ModificationLoggerService->logDifferences(
  2021.             'BD_EDICOM',
  2022.             'updatedata',              
  2023.             'up_coordonnees',        
  2024.             $oldDataCoordonnee,
  2025.             $newDataCoordonnee,
  2026.             $codeFirme,
  2027.             null
  2028.             'UPDATE'
  2029.         );
  2030.         //up_juridiques
  2031.         $forme_juridique $request->request->get('field13');
  2032.         $annee_creation $request->request->get('field14');
  2033.         // dd($annee_creation);
  2034.         $effectif $request->request->get('field15');
  2035.         $ice $request->request->get('field17');
  2036.         $identifiant_fiscal $request->request->get('field18');
  2037.         $patente $request->request->get('field19');
  2038.         $capital $request->request->get('field16');
  2039.         $inp $request->request->get('PLfield31');
  2040.         $rc $request->request->get('field20');
  2041.         $ville_rc $request->request->get('field21');
  2042.         $effectif trim($effectif) !== '' ? (int)$effectif null;
  2043.         $capital trim($capital) !== '' ? (int)$capital null;
  2044.         $user_id null;
  2045.         // dd($forme_juridique);
  2046.         if (trim($forme_juridique) !== '' || trim($annee_creation) !== '' || trim($effectif) !== '' || trim($capital) !== '' || trim($ice) !== '' || trim($identifiant_fiscal) !== '' || trim($patente) !== '' || trim($rc) !== '' || trim($ville_rc) !== '' || trim($inp) !== '') {
  2047.             if ($juridique) {
  2048.                 $this->firmeService->updateJuridiques$user_id,$codeFirme,$forme_juridique,$annee_creation,$effectif,$capital,$ice,null,$patente,$rc,$ville_rc,$identifiant_fiscal);
  2049.             } else {
  2050.                 $this->firmeService->insererJuridiques$user_id,$codeFirme,$forme_juridique,$annee_creation,$effectif,$capital,$ice,null,$patente,$rc,$ville_rc,$identifiant_fiscal);
  2051.             }
  2052.         }
  2053.         $effectif trim($effectif) !== '' ? (string)$effectif null;
  2054.         $capital trim($capital) !== '' ? (string)$capital null;
  2055.         $firmeCRM['firme']['date_creation'] = date('Y'strtotime($firmeCRM['firme']['date_creation']));
  2056.                 // les données anciennes
  2057.         $oldDataJuridique = [
  2058.             'annee_creation' =>$firmeCRM['firme']['date_creation'],
  2059.             'effectif' =>$firmeCRM['firme']['eff_max'],
  2060.             'ice' => $firmeCRM['firme']['ref_ann_leg'],            
  2061.             'inp' =>$firmeCRM['firme']['inp'],
  2062.             'identifiant_fiscal' =>$firmeCRM['firme']['ident_fisc'],
  2063.             'ville_rc' =>$firmeCRM['firme']['code_ville_rc'],  
  2064.             'rc' =>$firmeCRM['firme']['rc'],        
  2065.             'forme_juridique' =>$firmeCRM['firme']['code_forme_jur'], 
  2066.             'patente' => $firmeCRM['firme']['patente'],       
  2067.             'capital' =>  $firmeCRM['firme']['cap'],
  2068.         ];
  2069.         // lesdonnées nouvelles (après modification)
  2070.         $newDataJuridique = [
  2071.             'annee_creation' =>  $annee_creation,
  2072.             'effectif' =>  $effectif,       
  2073.             'ice' =>  $ice,            
  2074.             'inp' =>  $inp,
  2075.             'identifiant_fiscal' =>  $identifiant_fiscal,     
  2076.             'ville_rc' =>  $ville_rc
  2077.             'rc' =>  $rc,       
  2078.             'forme_juridique' =>  $forme_juridique,
  2079.             'patente' =>  $patente,
  2080.             'capital' =>  $capital,
  2081.         ];
  2082.         // dd($oldDataJuridique, $newDataJuridique);
  2083.         $this->ModificationLoggerService->logDifferences(
  2084.             'BD_EDICOM',
  2085.             'updatedata',              
  2086.             'up_juridiques',        
  2087.             $oldDataJuridique,
  2088.             $newDataJuridique,
  2089.             $codeFirme,
  2090.             null
  2091.             'UPDATE'
  2092.         );
  2093.         //up_finances
  2094.         // Nettoyage des champs
  2095.         $banques      $this->cleanValue($request->request->get('field34'));
  2096.         $zone_export  $this->cleanValue($request->request->get('field35'));
  2097.         $pourc_export $this->cleanValue($request->request->get('field36'));
  2098.         $annee_ca $this->cleanValue($request->request->get('field32', []));
  2099.         $gamme_ca $this->cleanValue($request->request->get('field33', []));
  2100.         // Forcer en tableau si ce n’est pas déjà un
  2101.         $annee_ca is_array($annee_ca) ? $annee_ca : [$annee_ca];
  2102.         $gamme_ca is_array($gamme_ca) ? $gamme_ca : [$gamme_ca];
  2103.         $anneesGammes = [];
  2104.         foreach ($annee_ca as $i => $annee) {
  2105.             if (!empty($annee) && isset($gamme_ca[$i]) && !empty($gamme_ca[$i])) {
  2106.                 $anneesGammes[] = [
  2107.                     'annee_ca' => $annee,
  2108.                     'gamme_ca' => $gamme_ca[$i],
  2109.                 ];
  2110.             }
  2111.         }
  2112.         // Insertion ou mise à jour si au moins un champ est renseigné
  2113.         if ($annee_ca !== null || $gamme_ca !== null || $banques !== null || $zone_export !== null || $pourc_export !== null) {
  2114.             if ($finance) {
  2115.                 $firmeService->updateFinances(null,$codeFirme$annee_ca$gamme_ca$banques$zone_export$pourc_export);
  2116.             } else {
  2117.                 $firmeService->insererFinances(null,$codeFirme$annee_ca$gamme_ca$banques$zone_export$pourc_export);
  2118.             }
  2119.         }
  2120.         $oldBanques $firmeCRM['banques'] ?? [];
  2121.         if (is_string($oldBanques)) {
  2122.             $decoded json_decode($oldBanquestrue);
  2123.             $oldBanques json_last_error() === JSON_ERROR_NONE $decoded : [$oldBanques];
  2124.         }
  2125.         $oldZones = [];
  2126.         $oldPourcentages = [];
  2127.         if (!empty($firmeCRM['exports'])) {
  2128.             foreach ($firmeCRM['exports'] as $exp) {
  2129.                 $oldZones[] = $exp['CODE_ZONE'] ?? null;
  2130.                 $oldPourcentages[] = $exp['TAUX'] ?? null;
  2131.             }
  2132.         }
  2133.         $oldAnnees = [];
  2134.         $oldGammes = [];
  2135.         if (!empty($firmeCRM['finances'])) {
  2136.             foreach ($firmeCRM['finances'] as $financeItem) {
  2137.                 $oldAnnees[] = $financeItem['ANNEE'] ?? null;
  2138.                 $oldGammes[] = $financeItem['CA'] ?? null;
  2139.             }
  2140.         }
  2141.         // --- Construction du tableau final cohérent ---
  2142.         $oldDataFinance = [
  2143.             'banques'     => $oldBanques,
  2144.             'zone_export' => $oldZones,
  2145.             'pourc_export'=> $oldPourcentages,
  2146.             'annee_ca'    => $oldAnnees,
  2147.             'gamme_ca'    => $oldGammes,
  2148.         ];
  2149.         $newDataFinance = [
  2150.             'banques' =>  $banques,
  2151.             'zone_export' =>  $zone_export,       
  2152.             'pourc_export' =>  $pourc_export,            
  2153.             'annee_ca' =>  $annee_ca,
  2154.             'gamme_ca' =>  $gamme_ca,     
  2155.         ];
  2156.                 // dd($firmeCRM,$newDataFinance);
  2157.         // Synchroniser les tableaux vides entre old et new
  2158.         // dd($oldDataFinance, $newDataFinance);
  2159.         $this->ModificationLoggerService->logDifferences(
  2160.             'BD_EDICOM',
  2161.             'updatedata',              
  2162.             'up_finances',        
  2163.             $oldDataFinance,
  2164.             $newDataFinance,
  2165.             $codeFirme,
  2166.             null
  2167.             'UPDATE'
  2168.         );
  2169.         //up_dirigeants
  2170.         $noms $request->request->get('field22', []);
  2171.         $prenoms $request->request->get('field23', []);
  2172.         $civilites $request->request->get('civilite', []);
  2173.         $fonctionCodes $request->request->get('field24', []);
  2174.         $portables $request->request->get('field25', []);
  2175.         $whatsapps $request->request->get('whatsappd', []);
  2176.         $emails $request->request->get('emaild', []);
  2177.         $ids $request->request->get('id', []);
  2178.         $deletedRaw $request->request->get('deleted_dirigeants''');
  2179.         // Convertir en tableau
  2180.         $deletedIds = [];
  2181.         if (is_string($deletedRaw) && $deletedRaw !== '') {
  2182.             $deletedIds explode(','$deletedRaw);
  2183.         }
  2184.         // dd($deletedIds); // Vérifier si on reçoit bien les IDs supprimés
  2185.         // Supprimer les dirigeants supprimés
  2186.         if (!empty($deletedIds)) {
  2187.             $firmeService->supprimerDirigeants($deletedIds);
  2188.         }
  2189.         $userId null;
  2190.         // Synchroniser les autres (insert/update)
  2191.         $this->firmeService->synchroniserDirigeants($ids$noms$prenoms$civilites$fonctionCodes$portables$whatsapps$emails$codeFirme$userId);
  2192.         $dirigeantsCRM $firmeCRM['dirigeants'];
  2193.         // dd($dirigeantsCRM);
  2194.         // Table de correspondance code → civilité
  2195.         $codeToCivilite = [
  2196.             '01' => 'M',
  2197.             '02' => 'Mme',
  2198.             '04' => 'Dr',
  2199.             '18' => 'Pr',
  2200.         ];
  2201.         // =========================
  2202.         // Anciennes données (depuis CRM)
  2203.         // =========================
  2204. // ============================
  2205. // 🧩 Préparation des anciennes données (depuis le CRM)
  2206. // ============================
  2207. $oldDataDirigeant = [];
  2208. foreach ($dirigeantsCRM as $dir) {
  2209.     $civilite $dir['civilite'] ?? '';
  2210.     // 🔹 Traduction du code vers texte si nécessaire
  2211.     if (isset($codeToCivilite[$civilite])) {
  2212.         $civilite $codeToCivilite[$civilite];
  2213.     }
  2214.     $row = [
  2215.         'civilite' => $civilite,
  2216.         'nom' => trim($dir['nom'] ?? ''),
  2217.         'prenom' => trim($dir['prenom'] ?? ''),
  2218.         'fonction' => trim($dir['code_fonction'] ?? ''),
  2219.         'portable' => json_encode(array_filter([$dir['tel_1'] ?? ''$dir['tel_2'] ?? '']), JSON_UNESCAPED_UNICODE),
  2220.         'whatsapp' => ''// champ inexistant côté CRM
  2221.         'email' => trim($dir['email'] ?? ''),
  2222.     ];
  2223.     // ✅ Clé unique : nom_prenom_email
  2224.     $key strtolower(trim(($row['nom'] ?? '') . '_' . ($row['prenom'] ?? '') . '_' . ($row['email'] ?? '')));
  2225.     $oldDataDirigeant[$key] = $row;
  2226. }
  2227. // ============================
  2228. // 🧩 Préparation des nouvelles données (formulaire soumis)
  2229. // ============================
  2230. $newDataDirigeant = [];
  2231. for ($i 0$i count($noms); $i++) {
  2232.     $portableValue $portables[$i] ?? '';
  2233.     if (is_array($portableValue)) {
  2234.         $portableValue json_encode(array_map('trim'$portableValue), JSON_UNESCAPED_UNICODE);
  2235.     } else {
  2236.         $portableValue trim($portableValue);
  2237.     }
  2238.     $row = [
  2239.         'civilite' => trim($civilites[$i] ?? ''),
  2240.         'nom' => trim($noms[$i] ?? ''),
  2241.         'prenom' => trim($prenoms[$i] ?? ''),
  2242.         'fonction' => trim($fonctionCodes[$i] ?? ''),
  2243.         'portable' => $portableValue,
  2244.         'whatsapp' => trim($whatsapps[$i] ?? ''),
  2245.         'email' => trim($emails[$i] ?? ''),
  2246.     ];
  2247.     // ✅ Même clé unique
  2248.     $key strtolower(trim(($row['nom'] ?? '') . '_' . ($row['prenom'] ?? '') . '_' . ($row['email'] ?? '')));
  2249.     $newDataDirigeant[$key] = $row;
  2250. }
  2251. // ============================
  2252. // 🧠 Journalisation (comparaison des deux tableaux)
  2253. // ============================
  2254. $this->ModificationLoggerService->logComplexeDifferences(
  2255.     'BD_EDICOM',
  2256.     'updatedata',
  2257.     'up_dirigeants',
  2258.     $oldDataDirigeant,
  2259.     $newDataDirigeant,
  2260.     $codeFirme,
  2261.     $userId,
  2262.     'UPDATE'
  2263. );
  2264.         // up_certifications
  2265.         // Récupération des champs du formulaire
  2266.         $certification      $request->request->get('certification');
  2267.         $organisme          $request->request->get('organisme');
  2268.         $type               $request->request->get('type_certification');
  2269.         $produit            $request->request->get('produit_certification');
  2270.         $date_expiration    $request->request->get('date_expiration');
  2271.         // Vérifier s’il y a une certification existante pour ce code_firme
  2272.         $certificationExist $this->firmeService->getCertificationByFirme($codeFirme);
  2273.         // dd($certificationExist);
  2274.         // Vérifier s'il y a des données remplies
  2275.         if (
  2276.             trim($certification) !== '' || trim($organisme) !== '' ||
  2277.             trim($type) !== '' || trim($produit) !== '' || trim($date_expiration) !== ''
  2278.         ) {
  2279.             if ($certificationExist) {
  2280.                 // faire update
  2281.                 $this->firmeService->updateCertification(
  2282.                     null,
  2283.                     $codeFirme,
  2284.                     $certification,
  2285.                     $organisme,
  2286.                     $type,
  2287.                     $produit,
  2288.                     $date_expiration
  2289.                 );
  2290.             } else {
  2291.                 // faire insert
  2292.                 $this->firmeService->insererCertification(
  2293.                     null,
  2294.                     $codeFirme,
  2295.                     $certification,
  2296.                     $organisme,
  2297.                     $type,
  2298.                     $produit,
  2299.                     $date_expiration
  2300.                 );
  2301.             }
  2302.         }
  2303.         $certifications $firmeCRM['certifications'] ?? [];
  2304.         $oldDataCertification = [
  2305.             'certification' => $certifications['CERTIFICATION'] ?? '',
  2306.             'organisme' => $certifications['AUT_CERTIFICATION'] ?? '',
  2307.             'type'=> $certifications['NUM_CERTIFICATION'] ?? '',
  2308.             'produit' => $certifications['PRODUIT'] ?? '',
  2309.             'date_expiration' => $certifications['CERT_EXPIRATION'] ?? '',
  2310.         ];
  2311.         $newDataCertification = [
  2312.             'certification'     => $certification,
  2313.             'organisme' => $organisme,
  2314.             'type'=> $type,
  2315.             'produit' => $produit,
  2316.             'date_expiration' => $date_expiration,
  2317.         ];
  2318.                 
  2319.         // dd($newDataCertification, $oldDataCertification);
  2320.         $this->ModificationLoggerService->logDifferences(
  2321.             'BD_EDICOM',
  2322.             'updatedata',              
  2323.             'up_certifications',        
  2324.             $oldDataCertification,
  2325.             $newDataCertification,
  2326.             $codeFirme,
  2327.             null
  2328.             'UPDATE'
  2329.         );
  2330.             $ficheCustomer =$this->firmeService->getFirmeByCodeCustomer($codeFirme);
  2331.             $natures =$this->rubriqueprestationService->getAllNatures();
  2332.             $villes =$this->localisationService->getAllVilles();
  2333.             $rubriques =$this->rubriqueprestationService->getAllRubriques();
  2334.             $fonctions =$this->rubriqueprestationService->getAllFonctions();
  2335.             $fichiers =$this->rubriqueprestationService->getAllProfLib();
  2336.             $formeJur =$this->rubriqueprestationService->getAllFormeJur();
  2337.             $gammeCA =$this->rubriqueprestationService->getAllGammeCA();
  2338.             $banques =$this->rubriqueprestationService->getAllBanques();
  2339.             $zonesExp $this->localisationService->getAllZonesExport();       
  2340.             $themes $this->produitKompassService->getThemes(); 
  2341.             $wproduits $this->produitKompassService->getLienProduitW13($codeFirme);
  2342.         $user $this->getUser();
  2343.         if (in_array('ROLE_ADMIN'$user->getRoles()) || in_array('ROLE_MODERATOR'$user->getRoles())) {
  2344.             return $this->redirectToRoute('fiches');
  2345.         } elseif (in_array('ROLE_CUSTOMER'$user->getRoles())) {
  2346.             return $this->render('customer/firme_up/home.html.twig', [
  2347.                 'firme' => $firme,
  2348.                 'codeFirme' => $codeFirme,               
  2349.     
  2350.             ]);
  2351.         }
  2352.     }
  2353. // /**
  2354. //  * @Route("/firmeUp/insert", name="insert_firmeUp", methods={"POST"})
  2355. //  */
  2356. // public function insertFirmeUp(Request $request, FirmeService $firmeService, FirmeUpService $firmeUpService): Response
  2357. // {
  2358. //     $user = $this->getUser();
  2359. //     if (!$user instanceof \App\Entity\User) {
  2360. //         $this->addFlash('error', 'Veuillez vous connecter.');
  2361. //         return $this->redirectToRoute('app_login');
  2362. //     }
  2363. //     $clientData = $request->request->all();
  2364. //     $codeFirme = $clientData['codeFirme'] ?? null;
  2365. //     // Appel du service principal
  2366. //     $firmeUpService->insertFirmeUp($clientData);
  2367. //     // Vérification du rôle utilisateur
  2368. //     if (in_array('ROLE_ADMIN', $user->getRoles()) || in_array('ROLE_MODERATOR', $user->getRoles())) {
  2369. //         return $this->redirectToRoute('fiches');
  2370. //     } elseif (in_array('ROLE_CUSTOMER', $user->getRoles())) {
  2371. //         $firme = $firmeService->getFirmeByCodeAdmin($codeFirme);
  2372. //         return $this->render('customer/firme_up/home.html.twig', [
  2373. //             'firme' => $firme,
  2374. //             'codeFirme' => $codeFirme,
  2375. //         ]);
  2376. //     }
  2377. //     return new JsonResponse(['status' => 'success']);
  2378. // }
  2379.     /**
  2380.      * @Route("/fiches", name="fiches")
  2381.      */
  2382.     public function toutesLesFiches(): Response
  2383.     {
  2384.         $user $this->getUser();
  2385.         if (!$user instanceof \App\Entity\User) {
  2386.             $this->addFlash('error''Veuillez vous connecter.');
  2387.             return $this->redirectToRoute('app_login');
  2388.         }
  2389.         $fiches $this->firmeService->getAllFirmes();
  2390.         // Décoder le JSON dans chaque fiche pour avoir un tableau de codes rubriques
  2391.         foreach ($fiches as &$fiche) {
  2392.             if (!empty($fiche['rubriques'])) {
  2393.                 $fiche['rubriques_decoded'] = json_decode($fiche['rubriques'], true); // tableau de codes rubriques
  2394.             } else {
  2395.                 $fiche['rubriques_decoded'] = [];
  2396.             }
  2397.         }
  2398.         // unset($fiche); // pour éviter effets secondaires
  2399.         // $fiche['actes'] = json_decode($fiche['actes'], true);
  2400.         // dd($fiche['actes']);
  2401.         // Récupération de la liste complète code => libellé rubriques
  2402.         $rubriquesRaw $this->rubriqueprestationService->getAllRubriques();
  2403.         $rubriques = [];
  2404.         foreach ($rubriquesRaw as $r) {
  2405.             $rubriques[$r['Code_Rubrique']] = $r['Lib_Rubrique'];
  2406.         }
  2407.         foreach ($fiches as &$fiche) {
  2408.             if (!empty($fiche['actes']) && is_string($fiche['actes'])) {
  2409.                 $decoded json_decode($fiche['actes'], true);
  2410.                 if (json_last_error() === JSON_ERROR_NONE && is_array($decoded)) {
  2411.                     $fiche['actes_decoded_array'] = $decoded;
  2412.                 } else {
  2413.                     $fiche['actes_decoded_array'] = [];
  2414.                 }
  2415.             } else {
  2416.                 $fiche['actes_decoded_array'] = [];
  2417.             }
  2418.         }
  2419.         // dd($fiches);
  2420.         $pageSubtitle 'Liste des fiches firmes';
  2421.         if (in_array('ROLE_ADMIN'$user->getRoles())) {
  2422.             return $this->render('admin/firme_up/list.html.twig', [
  2423.                 'pageSubtitle' => 'Liste des fiches firmes','rubriques' => $rubriques,
  2424.                 'fiches' => $fiches,                
  2425.                 'rubriques' => $rubriques,
  2426.             ]);
  2427.         } elseif (in_array('ROLE_MODERATOR'$user->getRoles())) {
  2428.             return $this->render('moderator/firme_up/list.html.twig', [
  2429.                 'pageSubtitle' => 'Liste des fiches firmes',
  2430.                 'fiches' => $fiches,
  2431.             ]);
  2432.         }
  2433.     }
  2434.     
  2435.     /**
  2436.      * @Route("/nonfiches", name="nonfiches")
  2437.      */
  2438.     public function toutesLesNonFiches(): Response
  2439.     {
  2440.         $fiches $this->firmeService->getAllNonFirmes();
  2441.         $user $this->getUser();
  2442.         if (!$user instanceof \App\Entity\User) {
  2443.             $this->addFlash('error''Veuillez vous connecter.');
  2444.             return $this->redirectToRoute('app_login');
  2445.         }
  2446.         $pageSubtitle 'Liste des fiches firmes';
  2447.             foreach ($fiches as &$fiche) {
  2448.                 if (!empty($fiche['rubriques'])) {
  2449.                     $fiche['rubriques_decoded'] = json_decode($fiche['rubriques'], true); // tableau de codes rubriques
  2450.                 } else {
  2451.                     $fiche['rubriques_decoded'] = [];
  2452.                 }
  2453.             }
  2454.         foreach ($fiches as &$fiche) {
  2455.             if (!empty($fiche['actes']) && is_string($fiche['actes'])) {
  2456.                 $decoded json_decode($fiche['actes'], true);
  2457.                 if (json_last_error() === JSON_ERROR_NONE && is_array($decoded)) {
  2458.                     $fiche['actes_decoded_array'] = $decoded;
  2459.                 } else {
  2460.                     $fiche['actes_decoded_array'] = [];
  2461.                 }
  2462.             } else {
  2463.                 $fiche['actes_decoded_array'] = [];
  2464.             }
  2465.         }
  2466.         if (in_array('ROLE_ADMIN'$user->getRoles())) {
  2467.             return $this->render('admin/nonFirme_up/list.html.twig', [
  2468.                 'pageSubtitle' => 'Liste des fiches non firmes',
  2469.                 'fiches' => $fiches,
  2470.             ]);
  2471.         } elseif (in_array('ROLE_MODERATOR'$user->getRoles())) {
  2472.             return $this->render('moderator/nonFirme_up/list.html.twig', [
  2473.                 'pageSubtitle' => 'Liste des fiches non firmes',
  2474.                 'fiches' => $fiches,
  2475.             ]);
  2476.         }
  2477.     }
  2478.     /**
  2479.      * @Route("/firme/delete/{codeFirme}", name="app_firme_delete")
  2480.      */
  2481.     public function deleteFirme(Request $requeststring $codeFirme): Response
  2482.     {
  2483.         $user $this->getUser();
  2484.         if (!$user) {
  2485.             $this->addFlash('error''Veuillez vous connecter.');
  2486.             return $this->redirectToRoute('app_login');
  2487.         }
  2488.         $roles $user->getRoles();
  2489.         if (!in_array('ROLE_ADMIN'$roles) && !in_array('ROLE_MODERATOR'$roles)) {
  2490.             $this->addFlash('error''Accès interdit.');
  2491.             return $this->redirectToRoute('lu');
  2492.         }
  2493.         try {
  2494.             $this->firmeService->deleteFirme($codeFirme);
  2495.             $this->addFlash('success''Fiche supprimée avec succès.');
  2496.         } catch (\Exception $e) {
  2497.             $this->addFlash('error''Erreur lors de la suppression de la fiche.');
  2498.         }
  2499.         return $this->redirectToRoute('fiches');
  2500.     }
  2501.     /**
  2502.      * @Route("/nonFirme/delete/{userId}", name="app_nonFirme_delete")
  2503.      */
  2504.     public function deleteNonFirme(Request $requeststring $userIdFirmeService $firmeService): Response
  2505.     {
  2506.         $user $this->getUser();
  2507.         $firme $firmeService->getFirmeByUserId($userId);
  2508.         if (!$user) {
  2509.             $this->addFlash('error''Veuillez vous connecter.');
  2510.             return $this->redirectToRoute('app_login');
  2511.         }
  2512.         $roles $user->getRoles();
  2513.         if (!in_array('ROLE_ADMIN'$roles) && !in_array('ROLE_MODERATOR'$roles)) {
  2514.             $this->addFlash('error''Accès interdit.');
  2515.             return $this->redirectToRoute('app_customer');
  2516.         }
  2517.         try {
  2518.             $this->firmeService->deleteNonFirme($userId);
  2519.             $this->addFlash('success''Fiche supprimée avec succès.');
  2520.         } catch (\Exception $e) {
  2521.             $this->addFlash('error''Erreur lors de la suppression de la fiche.');
  2522.         }
  2523.         return $this->redirectToRoute('nonfiches');
  2524.     }
  2525.     /**
  2526.      * @Route("/api/quartiers/{codeVille}", name="api_quartiers")
  2527.      */
  2528.     public function getQuartiers(string $codeVille): JsonResponse
  2529.     {
  2530.         $quartiers $this->localisationService->getQuartiersByVille($codeVille);
  2531.         return $this->json($quartiers);
  2532.     }
  2533.     /**
  2534.      * @Route("/api/code-postal/{codeQuartier}", name="api_code_postal")
  2535.      */
  2536.     public function getCodePostale(string $codeQuartier): JsonResponse
  2537.     {
  2538.         // dd($codeQuartier);
  2539.         $codePostale $this->localisationService->getCodePostalByQuartier($codeQuartier);
  2540.         return $this->json($codePostale);
  2541.     }
  2542.     
  2543.     /**
  2544.      * @Route("/rebrique/productSearch", name="app_reb_productSearch")
  2545.      */
  2546.     public function productSearch(Request $requestProduitKompassService $rebriqueService): Response
  2547.     {  
  2548.       $product $request->get('product');
  2549.      return  $this->json($rebriqueService->produitWSearch($product));
  2550.        
  2551.     }
  2552.     
  2553.     
  2554.     /**
  2555.      * @Route("/rebrique/productKompassSearch", name="app_kompass_productSearch")
  2556.      */
  2557.     public function productKompassSearch(Request $requestProduitKompassService $rebriqueService): Response
  2558.     {  
  2559.       $product $request->get('product');
  2560.      return  $this->json($rebriqueService->productKompassSearch($product));
  2561.        
  2562.     }
  2563.      /**
  2564.      * @Route("/rebrique/secteurs", name="app_reb_secteurs")
  2565.      */
  2566.     public function getSecteurs(Request $requestProduitKompassService $rebriqueService): Response
  2567.     {  
  2568.       $codeTheme $request->get('codeTheme');
  2569.       $codeSecteur $request->get('codeSecteur');
  2570.       $codeBranch $request->get('codeBranch');
  2571.       if($codeTheme){
  2572.         return  $this->json($rebriqueService->getSecteur($codeTheme));
  2573.       }
  2574.       else if($codeBranch){
  2575.         return  $this->json($rebriqueService->getProductBranches($codeBranch));
  2576.       } else{
  2577.         return  $this->json($rebriqueService->getBranches($codeSecteur));
  2578.       }
  2579.      
  2580.     }
  2581.     /**
  2582.      * @Route("/firme/wproduitAjouter", name="app_wproduitAjouter")
  2583.      */
  2584.     // public function wproduitAjouter(Request $request, ProduitKompassService $firmesService): Response
  2585.     // {  
  2586.     //    $productsData = json_decode($request->get('productsData'), true);
  2587.     //   $product = $firmesService->wproduitAjouter($productsData);
  2588.     //  return  $this->json('');
  2589.        
  2590.     // }
  2591.     /**
  2592.      * @Route("/firme/wproduitAjouter", name="wproduit_ajouter", methods={"POST"})
  2593.      */
  2594.         public function wproduitAjouter(Request $requestProduitKompassService $ProduitKompassService): JsonResponse
  2595.     {
  2596.         $json $request->request->get('productsData');
  2597.         $productsData json_decode($jsontrue);
  2598.         //  dd($productsData);
  2599.         if (!is_array($productsData)) {
  2600.             return new JsonResponse(['status' => 'error''message' => 'Format de données invalide'], 400);
  2601.         }
  2602.         $userId null;
  2603.         $success $ProduitKompassService->wproduitAjouter($productsData$userId);
  2604.         return new JsonResponse(['status' => $success 'ok' 'error']);
  2605.     }
  2606.     /**
  2607.      * @Route("/firme/wproduitSupprimer", name="app_wproduitSupprimer", methods={"POST"})
  2608.      */
  2609.     public function wproduitSupprimer(Request $requestProduitKompassService $firmesService): Response
  2610.     {
  2611.         // Récupérer les IDs envoyés en JSON
  2612.         $productsData json_decode($request->getContent(), true);
  2613.         if (empty($productsData)) {
  2614.             return $this->json(['error' => 'Aucun produit sélectionné pour suppression.'], 400);
  2615.         }
  2616.         $result $firmesService->wproduitSupprimer($productsData);
  2617.         if ($result) {
  2618.             return $this->json(['success' => 'Produits supprimés avec succès.']);
  2619.         }
  2620.         return $this->json(['error' => 'Erreur lors de la suppression.'], 500);
  2621.     }
  2622. /**
  2623.  * @Route("/firme/wproduitAjouterUserId", name="wproduit_ajouter_user", methods={"POST"})
  2624.  */
  2625. public function wproduitAjouterUserId(Request $requestProduitKompassService $ProduitKompassService): JsonResponse
  2626. {
  2627.     // Récupération de toutes les données envoyées par AJAX
  2628.     $json $request->request->all();
  2629.     // Récupération du tableau JSON des produits
  2630.     $productsData json_decode($json['productsData'] ?? '[]'true);
  2631.     // Récupération du user_id envoyé
  2632.     $userId $json['user_id'] ?? null;
  2633.     // Appel du service avec le userId
  2634.     $success $ProduitKompassService->wproduitAjouterUserId($productsData$userId);
  2635.     return new JsonResponse(['status' => $success 'ok' 'error']);
  2636. }
  2637.     
  2638.     /**
  2639.      * @Route("/firme/wproduitSupprimerUser", name="app_wproduitSupprimerUser", methods={"POST"})
  2640.      */
  2641.     public function wproduitSupprimerUser(Request $requestProduitKompassService $firmesService): Response
  2642.     {
  2643.         // Récupérer les IDs envoyés en JSON
  2644.         $productsData json_decode($request->getContent(), true);
  2645.         if (empty($productsData)) {
  2646.             return $this->json(['error' => 'Aucun produit sélectionné pour suppression.'], 400);
  2647.         }
  2648.         $result $firmesService->wproduitSupprimerUser($productsData);
  2649.         if ($result) {
  2650.             return $this->json(['success' => 'Produits supprimés avec succès.']);
  2651.         }
  2652.         return $this->json(['error' => 'Erreur lors de la suppression.'], 500);
  2653.     }
  2654.     /**
  2655.      * @Route("/reload-table", name="reload_table", methods={"GET"})
  2656.      */
  2657.         public function reloadTable(Request $requestProduitKompassService $firmesService): Response
  2658.     {
  2659.         $codeFirme $request->query->get('codeFirme');
  2660.         // dd($codeFirme);
  2661.         $wproduits $firmesService->getLienProduitW13($codeFirme);
  2662.         return new JsonResponse($wproduits);
  2663.    }
  2664.    /**
  2665.      * @Route("/reload-usertable", name="reload_user_table", methods={"GET"})
  2666.      */
  2667.     public function reloadUserTable(Request $requestProduitKompassService $firmesService): Response
  2668.     {
  2669.         // Récupérer le userId envoyé en GET
  2670.         $userId $request->query->get('userId');
  2671.         if (!$userId) {
  2672.             return new JsonResponse(['error' => 'userId manquant'], 400);
  2673.         }
  2674.         // Appel au service pour récupérer les produits liés à cet utilisateur
  2675.         $wproduits $firmesService->getLienProduitW13ByUserId($userId);
  2676.         return new JsonResponse($wproduits);
  2677.     }
  2678.        /**
  2679.      * @Route("/reload-kompasstable", name="reload_kompasstable", methods={"GET"})
  2680.      */
  2681.         public function reloadKompassTable(Request $requestProduitKompassService $firmesService): Response
  2682.     {
  2683.         $codeFirme $request->query->get('codeFirme');
  2684.         // dd($codeFirme);
  2685.         $kproduits $firmesService->getProduitsKompass($codeFirme);
  2686.         return new JsonResponse($kproduits);
  2687.    }
  2688.    
  2689.        /**
  2690.      * @Route("/reload-userkompasstable", name="reload_user_kompasstable", methods={"GET"})
  2691.      */
  2692.         public function reloadUserKompassTable(Request $requestProduitKompassService $firmesService): Response
  2693.     {
  2694.         $userId $request->query->get('userId'); // 🔹 on récupère bien "userId"
  2695.         $kproduits $firmesService->getProduitsKompassUserId($userId);
  2696.         return new JsonResponse($kproduits);
  2697.    }
  2698.     /**
  2699.      * @Route("/firme/kproduitAjouter", name="kproduit_ajouter", methods={"POST"})
  2700.      */
  2701.     public function kproduitAjouter(Request $requestProduitKompassService $produitKompassService): JsonResponse
  2702.     {
  2703.         $productsData json_decode($request->request->get('productsData'), true);
  2704.         // dd($productsData);
  2705.         if (!is_array($productsData)) {
  2706.             return new JsonResponse(['status' => 'error''message' => 'Format de données invalide'], 400);
  2707.         }
  2708.         $userId null;
  2709.         $success $produitKompassService->kproduitAjouter($productsData$userId);
  2710.         // dd($success);
  2711.         return new JsonResponse(['status' => $success 'ok' 'error']);
  2712.     }
  2713.     /**
  2714.      * @Route("/firme/kproduitSupprimer", name="app_kproduitSupprimer", methods={"POST"})
  2715.      */
  2716.     public function kproduitSupprimer(Request $requestProduitKompassService $firmesService): Response
  2717.     {
  2718.         // Récupérer les IDs envoyés en JSON
  2719.         $productsData json_decode($request->getContent(), true);
  2720.         // dd($productsData);
  2721.         if (empty($productsData)) {
  2722.             return $this->json(['error' => 'Aucun produit sélectionné pour suppression.'], 400);
  2723.         }
  2724.         $result $firmesService->kproduitSupprimer($productsData);
  2725.         if ($result) {
  2726.             return $this->json(['success' => 'Produits supprimés avec succès.']);
  2727.         }
  2728.         return $this->json(['error' => 'Erreur lors de la suppression.'], 500);
  2729.     }
  2730. /**
  2731.  * @Route("/firme/kproduitAjouterUserId", name="kproduit_ajouter_user", methods={"POST"})
  2732.  */
  2733. public function kproduitAjouterUserId(Request $requestProduitKompassService $ProduitKompassService): JsonResponse
  2734. {
  2735.     // Récupération de toutes les données envoyées par AJAX
  2736.     $json $request->request->all();
  2737.     // Récupération du tableau JSON des produits
  2738.     $productsData json_decode($json['productsData'] ?? '[]'true);
  2739.     // Récupération du user_id envoyé
  2740.     $userId $json['user_id'] ?? null;
  2741.     // Appel du service avec le userId
  2742.     $success $ProduitKompassService->kproduitAjouterUserId($productsData$userId);
  2743.     return new JsonResponse(['status' => $success 'ok' 'error']);
  2744. }
  2745.     
  2746.     /**
  2747.      * @Route("/firme/kproduitSupprimerUser", name="app_kproduitSupprimerUser", methods={"POST"})
  2748.      */
  2749.     public function kproduitSupprimerUser(Request $requestProduitKompassService $firmesService): Response
  2750.     {
  2751.         // Récupérer les IDs envoyés en JSON
  2752.         $productsData json_decode($request->getContent(), true);
  2753.         if (empty($productsData)) {
  2754.             return $this->json(['error' => 'Aucun produit sélectionné pour suppression.'], 400);
  2755.         }
  2756.         $result $firmesService->wproduitSupprimerUser($productsData);
  2757.         if ($result) {
  2758.             return $this->json(['success' => 'Produits supprimés avec succès.']);
  2759.         }
  2760.         return $this->json(['error' => 'Erreur lors de la suppression.'], 500);
  2761.     }
  2762.     // /**
  2763.     //  * @Route("/fiche/{id}/details", name="fiche_details")
  2764.     //  */
  2765.     // public function ficheDetails($id): Response
  2766.     // {
  2767.     //     // Récupérer la fiche depuis la base de données
  2768.     //     $fiche = $this->firmeService->getFicheFirmeById($id);
  2769.     //     if (!$fiche) {
  2770.     //         throw $this->createNotFoundException('Fiche non trouvée');
  2771.     //     }
  2772.     //     return $this->render('fiche/details.html.twig', [
  2773.     //         'fiche' => $fiche,
  2774.     //     ]);
  2775.     // }
  2776.     /**
  2777.      * @Route("/nonFirmePL/up/{userId}", name="details_non_profession_lib")
  2778.      */
  2779.     public function nonFirmeUpPLDetails(int $userIdFirmeService $firmeService): Response
  2780.     {   
  2781.         // dd($userId);
  2782.         $user $this->getUser();
  2783.         if (
  2784.             !$user instanceof \App\Entity\User &&
  2785.             !$user instanceof \App\Entity\UserRegistration
  2786.         ) {
  2787.             $this->addFlash('error''Veuillez vous connecter.');
  2788.             return $this->redirectToRoute('app_login');
  2789.         }
  2790.         $pageSubtitle 'Fiche client';
  2791.         $firme $firmeService->getFirmeByUserId($userId);
  2792.         if ($firme) {
  2793.             $firme['horaires'] = json_decode($firme['horaires'] ?? '[]'true);
  2794.             $firme['pause'] = json_decode($firme['pause'] ?? '[]'true);
  2795.             $firme['rubriques'] = json_decode($firme['rubriques'] ?? '[]'true);
  2796.             $firme['prestations'] = json_decode($firme['prestations'] ?? '[]'true);
  2797.             $firme['produits'] = json_decode($firme['produits'] ?? '[]'true);
  2798.             $firme['marques'] = json_decode($firme['marques'] ?? '[]'true);
  2799.             $firme['actes'] = json_decode($firme['actes'] ?? '[]'true);
  2800.             $firme['activite'] = $firme['activite'] ?? '';
  2801.         } else {
  2802.             // Par exemple, on passe un tableau vide au template
  2803.             $firme = [
  2804.                 'horaires' => [],
  2805.                 'pause' => [],
  2806.                 'rubriques' => [],
  2807.                 'prestations' => [],
  2808.                 'produits' => [],
  2809.                 'marques' => [],
  2810.                 'actes' => [],
  2811.                 'activite' => '',
  2812.             ];
  2813.         }
  2814.         $localisation $firmeService->getLocalisationByUserId($userId); 
  2815.         $coordonnee $firmeService->getCoordonneeByUserId($userId); 
  2816.         $juridique $firmeService->getJuridiqueByUserId($userId);
  2817.         $finance $firmeService->getFinanceByUserId($userId);
  2818.         $dirigeants $firmeService->getDirigeantsByUserId($userId);
  2819.         $certification $firmeService->getCertificationByUserId($userId);
  2820.         $anneesCA json_decode($finance['annee_ca'] ?? '[]'true);        
  2821.         rsort($anneesCASORT_NUMERIC);
  2822.         $gammesCA json_decode($finance['gamme_ca'] ?? '[]'true);
  2823.         $zoneExport json_decode($finance['zone_export'] ?? '[]'true);
  2824.         $pourcExport json_decode($finance['pourc_export'] ?? '[]'true); 
  2825.         $anneesGammes = [];
  2826.         foreach ($anneesCA as $index => $annee) {
  2827.             $anneesGammes[] = [
  2828.                 'annee_ca' => $annee,
  2829.                 'gamme_ca' => $gammesCA[$index] ?? null
  2830.             ];
  2831.         }
  2832.         $zonesExportList = [];
  2833.         foreach ($zoneExport as $index => $zone) {
  2834.             $zonesExportList[] = [
  2835.                 'zone' => $zone,
  2836.                 'pourcentage' => $pourcExport[$index] ?? null
  2837.             ];
  2838.         }
  2839.         // dd($juridique,$finance);
  2840.         if ($coordonnee) {
  2841.             $coordonnee['telefone']   = json_decode($coordonnee['telefone'] ?? '[]'true);
  2842.             $coordonnee['portable']   = json_decode($coordonnee['portable'] ?? '[]'true);
  2843.             $coordonnee['whatsapp']   = json_decode($coordonnee['whatsapp'] ?? '[]'true);
  2844.             $coordonnee['email']      = json_decode($coordonnee['email'] ?? '[]'true);
  2845.             $coordonnee['site_web']   = json_decode($coordonnee['site_web'] ?? '[]'true);
  2846.             $coordonnee['facebook']   = json_decode($coordonnee['facebook'] ?? '[]'true);
  2847.             $coordonnee['instagram']  = json_decode($coordonnee['instagram'] ?? '[]'true);
  2848.             $coordonnee['linkedin']   = json_decode($coordonnee['linkedin'] ?? '[]'true);
  2849.         } else {
  2850.             // On initialise à vide pour éviter toute erreur dans le template
  2851.             $coordonnee = [
  2852.                 'telefone' => [],
  2853.                 'portable' => [],
  2854.                 'whatsapp' => [],
  2855.                 'email' => [],
  2856.                 'site_web' => [],
  2857.                 'facebook' => [],
  2858.                 'instagram' => [],
  2859.                 'linkedin' => [],
  2860.             ];
  2861.         }
  2862.         $villes =$this->localisationService->getAllVilles();
  2863.         $rubriques =$this->rubriqueprestationService->getAllRubriques();
  2864.         $fonctions =$this->rubriqueprestationService->getAllFonctions();
  2865.         $natures =$this->rubriqueprestationService->getAllNatures();
  2866.         $fichiers =$this->rubriqueprestationService->getAllProfLib();
  2867.         $formeJur =$this->rubriqueprestationService->getAllFormeJur();
  2868.         $gammeCA =$this->rubriqueprestationService->getAllGammeCA();
  2869.         $banques =$this->rubriqueprestationService->getAllBanques();
  2870.         $zonesExp $this->localisationService->getAllZonesExport();       
  2871.         $themes $this->produitKompassService->getThemes(); 
  2872.         // dd($ficheCustomer);
  2873.         return $this->render('admin/nonFirme_up/profession_lib.html.twig', [
  2874.             'villes' => $villes,
  2875.             'rubriques' => $rubriques,
  2876.             'fonctions' => $fonctions,
  2877.             'natures' => $natures,
  2878.             'fichiers' => $fichiers,
  2879.             'formeJur' =>  $formeJur,
  2880.             'banques' => $banques,                
  2881.             'zonesExp' => $zonesExp,
  2882.             'themes' => $themes,
  2883.             'firme' =>  $firme,
  2884.             'localisation' =>  $localisation,
  2885.             'coordonnee' =>  $coordonnee,
  2886.             'rubriques' =>  $rubriques,
  2887.             'juridique' =>  $juridique,
  2888.             'finance' =>  $finance,
  2889.             'pourcExport' => $pourcExport,
  2890.             'anneesGammes' => $anneesGammes,
  2891.             'gammeCA' => $gammeCA
  2892.             'zonesExportList' => $zonesExportList,
  2893.             'dirigeants' => $dirigeants,
  2894.             'certification' => $certification,
  2895.         ]);
  2896.     }
  2897.     
  2898.     /**
  2899.      * @Route("/DetailsNonFirme/up/{userId}", name="details_non_societe")
  2900.      */
  2901.     public function nonFirmeUpSocieteDetails(int $userIdFirmeService $firmeService): Response
  2902.     {   
  2903.         $pageSubtitle 'Fiche client';
  2904.         $user $this->getUser();
  2905.             if (
  2906.                 !$user instanceof \App\Entity\User &&
  2907.                 !$user instanceof \App\Entity\UserRegistration
  2908.             ) {
  2909.                 $this->addFlash('error''Veuillez vous connecter.');
  2910.                 return $this->redirectToRoute('app_login');
  2911.             }
  2912.         $firme $firmeService->getFirmeByUserId($userId);
  2913.         if ($firme) {
  2914.             $firme['horaires'] = json_decode($firme['horaires'] ?? '[]'true);
  2915.             $firme['pause'] = json_decode($firme['pause'] ?? '[]'true);
  2916.             $firme['rubriques'] = json_decode($firme['rubriques'] ?? '[]'true);
  2917.             $firme['prestations'] = json_decode($firme['prestations'] ?? '[]'true);
  2918.             $firme['produits'] = json_decode($firme['produits'] ?? '[]'true);
  2919.             $firme['marques'] = json_decode($firme['marques'] ?? '[]'true);
  2920.             $firme['actes'] = json_decode($firme['actes'] ?? '[]'true);
  2921.         } else {
  2922.             // Par exemple, on passe un tableau vide au template
  2923.             $firme = [
  2924.                 'horaires' => [],
  2925.                 'pause' => [],
  2926.                 'rubriques' => [],
  2927.                 'prestations' => [],
  2928.                 'produits' => [],
  2929.                 'marques' => [],
  2930.                 'actes' => [],
  2931.             ];
  2932.         }
  2933.         $localisation $firmeService->getLocalisationByUserId($userId); 
  2934.         $coordonnee $firmeService->getCoordonneeByUserId($userId); 
  2935.         $juridique $firmeService->getJuridiqueByUserId($userId);
  2936.         $finance $firmeService->getFinanceByUserId($userId);
  2937.         $dirigeants $firmeService->getDirigeantsByUserId($userId);
  2938.         $certification $firmeService->getCertificationByUserId($userId);
  2939.         $anneesCA json_decode($finance['annee_ca'] ?? '[]'true);
  2940.         rsort($anneesCASORT_NUMERIC);
  2941.         $gammesCA json_decode($finance['gamme_ca'] ?? '[]'true);
  2942.         $zoneExport json_decode($finance['zone_export'] ?? '[]'true);
  2943.         $pourcExport json_decode($finance['pourc_export'] ?? '[]'true); 
  2944.         $anneesGammes = [];
  2945.         foreach ($anneesCA as $index => $annee) {
  2946.             $anneesGammes[] = [
  2947.                 'annee_ca' => $annee,
  2948.                 'gamme_ca' => $gammesCA[$index] ?? null
  2949.             ];
  2950.         }
  2951.         $zonesExportList = [];
  2952.         foreach ($zoneExport as $index => $zone) {
  2953.             $zonesExportList[] = [
  2954.                 'zone' => $zone,
  2955.                 'pourcentage' => $pourcExport[$index] ?? null
  2956.             ];
  2957.         }
  2958.         // dd($juridique,$finance);
  2959.         if ($coordonnee) {
  2960.             $coordonnee['telefone']   = json_decode($coordonnee['telefone'] ?? '[]'true);
  2961.             $coordonnee['portable']   = json_decode($coordonnee['portable'] ?? '[]'true);
  2962.             $coordonnee['whatsapp']   = json_decode($coordonnee['whatsapp'] ?? '[]'true);
  2963.             $coordonnee['email']      = json_decode($coordonnee['email'] ?? '[]'true);
  2964.             $coordonnee['site_web']   = json_decode($coordonnee['site_web'] ?? '[]'true);
  2965.             $coordonnee['facebook']   = json_decode($coordonnee['facebook'] ?? '[]'true);
  2966.             $coordonnee['instagram']  = json_decode($coordonnee['instagram'] ?? '[]'true);
  2967.             $coordonnee['linkedin']   = json_decode($coordonnee['linkedin'] ?? '[]'true);
  2968.         } else {
  2969.             // On initialise à vide pour éviter toute erreur dans le template
  2970.             $coordonnee = [
  2971.                 'telefone' => [],
  2972.                 'portable' => [],
  2973.                 'whatsapp' => [],
  2974.                 'email' => [],
  2975.                 'site_web' => [],
  2976.                 'facebook' => [],
  2977.                 'instagram' => [],
  2978.                 'linkedin' => [],
  2979.             ];
  2980.         }
  2981.         $villes =$this->localisationService->getAllVilles();
  2982.         $rubriques =$this->rubriqueprestationService->getAllRubriques();
  2983.         $fonctions =$this->rubriqueprestationService->getAllFonctions();
  2984.         $natures =$this->rubriqueprestationService->getAllNatures();
  2985.         $fichiers =$this->rubriqueprestationService->getAllProfLib();
  2986.         $formeJur =$this->rubriqueprestationService->getAllFormeJur();
  2987.         $gammeCA =$this->rubriqueprestationService->getAllGammeCA();
  2988.         $banques =$this->rubriqueprestationService->getAllBanques();
  2989.         $zonesExp $this->localisationService->getAllZonesExport();       
  2990.         $themes $this->produitKompassService->getThemes(); 
  2991.         $codesProduits $firme['produits'] ?? [];
  2992.         // // Transformer les codes en tableau associatif code => libellé
  2993.         // $firme['produits'] = $this->rubriqueprestationService->getLibellesProduits($codesProduits);
  2994.         // $codesMarques = $firme['marques'] ?? [];
  2995.         // // Transformer les codes en tableau associatif code => libellé
  2996.         // $firme['marques'] = $this->rubriqueprestationService->getLibellesMarques($codesMarques);
  2997.         if (!empty($dirigeants) && is_array($dirigeants)) {
  2998.             foreach ($dirigeants as &$d) {
  2999.                 $p $d['portable'] ?? null;
  3000.                 if ($p && $p[0] === '[') {
  3001.                     $d['portables'] = json_decode($ptrue);
  3002.                 } elseif ($p) {
  3003.                     $d['portables'] = [$p];
  3004.                 } else {
  3005.                     $d['portables'] = [];
  3006.                 }
  3007.             }
  3008.         } else {
  3009.             $dirigeants = []; // tu initialises à un tableau vide pour éviter d'autres erreurs plus loin
  3010.         }
  3011.         $kompassProduits $this->produitKompassService->getProduitsKompassUserId($userId);
  3012.         $produits =$this->rubriqueprestationService->getAllProduits();
  3013.         $wproduits $this->produitKompassService->getLienProduitW13ByUserId($userId);
  3014.         // dd($ficheCustomer);
  3015.                 return $this->render('admin/nonFirme_up/societe.html.twig', [
  3016.                     'villes' => $villes,
  3017.                     'rubriques' => $rubriques,
  3018.                     'fonctions' => $fonctions,
  3019.                     'natures' => $natures,
  3020.                     'fichiers' => $fichiers,
  3021.                     'formeJur' =>  $formeJur,
  3022.                     'banques' => $banques,                
  3023.                     'zonesExp' => $zonesExp,
  3024.                     'themes' => $themes,
  3025.                     'firme' =>  $firme,
  3026.                     'localisation' =>  $localisation,
  3027.                     'coordonnee' =>  $coordonnee,
  3028.                     'rubriques' =>  $rubriques,
  3029.                     'juridique' =>  $juridique,
  3030.                     'finance' =>  $finance,
  3031.                     'pourcExport' => $pourcExport,
  3032.                     'anneesGammes' => $anneesGammes,
  3033.                     'gammeCA' => $gammeCA
  3034.                     'zonesExportList' => $zonesExportList,
  3035.                     'dirigeants' => $dirigeants,
  3036.                     'certification' => $certification,
  3037.                     'pageSubtitle' => 'Liste des fiches non firmes',
  3038.                     'firme' => $firme,                
  3039.                     'kompassProduits' => $kompassProduits
  3040.                     'produits' => $produits,                
  3041.                     'wproduits' => $wproduits,                
  3042.                 ]);
  3043.     }
  3044.     /**
  3045.      * @Route("/DetailsNonFirmeUp/insertDetails", name="insert_details_nonFirmeUp", methods={"POST"})
  3046.      */
  3047.     public function insertNonFirmeUpDetails(Request $request,FirmeService $firmeService): Response
  3048.     {         
  3049.         $user $this->getUser();
  3050.         if (!$user instanceof \App\Entity\UserRegistration) {
  3051.             $this->addFlash('error''Veuillez vous connecter.');
  3052.             return $this->redirectToRoute('app_login');
  3053.         }
  3054.         // Récupération de toutes les données
  3055.         $data $request->request->all();
  3056.          $userId $request->request->get('user_id');
  3057.         $wproduits $this->produitKompassService->getLienProduitW13ByUserId($userId);
  3058.         $firme $firmeService->getFirmeByUserId($userId); 
  3059.         $localisation $firmeService->getLocalisationByUserId($userId); 
  3060.         $coordonnee $firmeService->getCoordonneeByUserId($userId); 
  3061.         $finance $firmeService->getFinanceByUserId($userId); 
  3062.         // dd($firme);
  3063.         $juridique $firmeService->getJuridiqueByUserId($userId); 
  3064.         // dd($juridique);
  3065.         $dirigeants $firmeService->getDirigeantsByUserId($userId); 
  3066.          function isNotEmpty($value): bool {
  3067.             if (is_array($value)) {
  3068.                 foreach ($value as $v) {
  3069.                     if (trim((string)$v) !== '') {
  3070.                         return true;
  3071.                     }
  3072.                 }
  3073.                 return false;
  3074.             }
  3075.             return trim((string)$value) !== '';
  3076.         }
  3077.         // dd($data);
  3078.         $jours = ['lundi''mardi''mercredi''jeudi''vendredi''samedi''dimanche'];
  3079.         $horaires = [];
  3080.         foreach ($jours as $jour) {
  3081.             $isChecked $request->request->get('checkbox_' $jour);
  3082.             if ($isChecked) {
  3083.                 $start $request->request->get('start_' $jour);
  3084.                 $end $request->request->get('end_' $jour);
  3085.                 $horaires[$jour] = [
  3086.                     'actif' => true,
  3087.                     'start' => $start,
  3088.                     'end' => $end
  3089.                 ];
  3090.             } else {
  3091.                 $horaires[$jour] = [
  3092.                     'actif' => false,
  3093.                     'start' => null,
  3094.                     'end' => null
  3095.                 ];
  3096.             }
  3097.         }
  3098.         // ➕ Traitement cohérent pour la pause
  3099.         $pauseEnabled $request->request->get('pause_enabled'); // existe uniquement si cochée
  3100.         $pauseStart $request->request->get('pause_start');
  3101.         $pauseEnd $request->request->get('pause_end');
  3102.         $pause = [];
  3103.         if ($pauseEnabled) {
  3104.             $pause = [
  3105.                 'actif' => true,
  3106.                 'start' => $pauseStart,
  3107.                 'end' => $pauseEnd
  3108.             ];
  3109.         } else {
  3110.             $pause = [
  3111.                 'actif' => false,
  3112.                 'start' => null,
  3113.                 'end' => null
  3114.             ];
  3115.         }
  3116.         $horairesJson json_encode($horaires);
  3117.         $pauseJson json_encode($pause);
  3118.         $produits $request->request->get('field29');
  3119.         $positionsProduits $request->request->get('Prfield31');
  3120.         $marques $request->request->get('field30');
  3121.         $positionsMarques $request->request->get('field31');
  3122.         // Filtrer les produits avec valeurs non vides
  3123.         $produitsAvecPositions = [];
  3124.         if (!empty($produits) && is_array($produits)) {
  3125.             foreach ($produits as $index => $produit) {
  3126.                 if (trim($produit) !== '') {
  3127.                     $produitsAvecPositions[] = [
  3128.                         'produit' => $produit,
  3129.                         'position' => $positionsProduits[$index] ?? null
  3130.                     ];
  3131.                 }
  3132.             }
  3133.         }
  3134.         // // Filtrer les marques avec valeurs non vides
  3135.         $marquesAvecPositions = [];
  3136.         if (!empty($marques) && is_array($marques)) {
  3137.             foreach ($marques as $index => $marque) {
  3138.                 if (trim($produit) !== '') {
  3139.                     $marquesAvecPositions[] = [
  3140.                         'marque' => $marque,
  3141.                         'position' => $positionsMarques[$index] ?? null
  3142.                     ];
  3143.                 }
  3144.             }
  3145.         }
  3146.         //up_firme
  3147.         $raison_social $request->request->get('field1');
  3148.         $nature $request->request->get('field2');
  3149.         $horaires $horairesJson;
  3150.         $pause $pauseJson;
  3151.         $rubriques =  $this->filterJsonField($request->request->all('field26'));
  3152.         $prestations =  $this->filterJsonField($request->request->all('field28'));
  3153.         // Filtrer la description_rub
  3154.         $description_rub trim($request->request->get('field27') ?? '');
  3155.         $produits = !empty($produitsAvecPositions) ? json_encode($produitsAvecPositions) : null;
  3156.         $marques = !empty($marquesAvecPositions) ? json_encode($marquesAvecPositions) : null;
  3157.         // // Encodage final
  3158.         // $produits =  $this->filterJsonField($request->request->all('field29'));;
  3159.         // $marques =  $this->filterJsonField($request->request->all('field30'));;
  3160.         $validation $request->request->get('validation') ?? null;
  3161.         $date_creation = new \DateTime(); 
  3162.         $validation '1' ;
  3163.         $date_validation $validation === '1' ? new \DateTime() : null;
  3164.         $pl_or_societe "S";                
  3165.         $etat='C';
  3166.         if (trim($userId) !== '' || trim($raison_social) !== '' || trim($nature) !== '' || $horaires !== '[]' || $pause !== '[]' || $rubriques !== null ||$description_rub !== '' || $prestations !== null || !empty($produits) || !empty($marques)) 
  3167.         {
  3168.             if ($firme) {
  3169.                 $synchroniser ="0";
  3170.                 $this->firmeService->updateFirme(
  3171.                     $userId,null,
  3172.                     $raison_social,
  3173.                     $nature,
  3174.                     $horairesJson,
  3175.                     $pauseJson,
  3176.                     $rubriques,
  3177.                     $description_rub,
  3178.                     $prestations,
  3179.                     $produits,
  3180.                     $marques,
  3181.                     $validation,
  3182.                     $date_validation,
  3183.                     null// nom
  3184.                     null// prenom
  3185.                     null// actes
  3186.                     null// activite
  3187.                     null// description
  3188.                     $pl_or_societe,
  3189.                     $etat,
  3190.                     $synchroniser
  3191.                 );
  3192.             } else {
  3193.                 $synchroniser ="0";
  3194.                 $this->firmeService->insererFirme(
  3195.                     $userId,null,
  3196.                     $raison_social,
  3197.                     $nature,
  3198.                     $horairesJson,
  3199.                     $pauseJson,
  3200.                     $rubriques,
  3201.                     $description_rub,
  3202.                     $prestations,
  3203.                     $produits,
  3204.                     $marques,
  3205.                     $validation,
  3206.                     $date_validation,
  3207.                     $date_creation,
  3208.                     null,
  3209.                     null,
  3210.                     null,
  3211.                     null,
  3212.                     null,
  3213.                     $pl_or_societe,
  3214.                     $etat,
  3215.                     $synchroniser
  3216.                 );
  3217.             }        
  3218.         }
  3219.         //up_localisations
  3220.         $adresse $request->request->get('field3');
  3221.         $code_ville $request->request->get('field4');
  3222.         $nom_ville $this->firmeService->getNomVille($code_ville);
  3223.         $code_quartier $request->request->get('field5');
  3224.         $nom_quartier $this->firmeService->getNomQuartier($code_quartier);
  3225.         $code_postal $request->request->get('field6');
  3226.         $longitude $request->request->get('field11');
  3227.         $latitude $request->request->get('field12');
  3228.         if (trim($adresse) !== '' || trim($code_ville) !== '' || trim($nom_ville) !== '' || trim($code_quartier) !== '' || trim($nom_quartier) !== '' || trim($code_postal) !== '' || trim($longitude) !== '' || trim($latitude) !== '')
  3229.         {
  3230.             if ($localisation) {
  3231.                 $this->firmeService->updateLocalisation($userId,null$adresse$code_ville$nom_ville$code_quartier$nom_quartier$code_postal$longitude$latitude);
  3232.             } else {
  3233.                 $this->firmeService->insererLocalisation($userId,null$adresse$code_ville$nom_ville$code_quartier$nom_quartier$code_postal$longitude$latitude);
  3234.             }
  3235.         }
  3236.         //up_coordonnées
  3237.         $telefone =  $this->filterJsonField($request->request->all('field7'));
  3238.         $portable =  $this->filterJsonField($request->request->all('field8'));
  3239.         $whatsapp =  $this->filterJsonField($request->request->all('wfield8'));
  3240.         $email =  $this->filterJsonField($request->request->all('field9'));
  3241.         $site_web =  $this->filterJsonField($request->request->all('field10'));
  3242.         $facebook =  $this->filterJsonField($request->request->all('facebook'));
  3243.         $instagram =  $this->filterJsonField($request->request->all('instagram'));
  3244.         $linkedin =  $this->filterJsonField($request->request->all('linkedin'));
  3245.         // Puis tu peux appeler ton service
  3246.         if ($telefone !== null || $portable !== null || $whatsapp !== null || $email !== null || $site_web !== null || $facebook !== null || $instagram !== null || $linkedin !== null) {
  3247.             if ($coordonnee) {
  3248.             $this->firmeService->updateCoordonnees($userId,null$telefone$portable$whatsapp$email$site_web$facebook$instagram$linkedin);
  3249.             } else {
  3250.                 $this->firmeService->insererCoordonnees($userId,null$telefone$portable$whatsapp$email$site_web$facebook$instagram$linkedin);
  3251.             }
  3252.         }
  3253.         //up_juridiques
  3254.         $forme_juridique $request->request->get('field13');
  3255.         $annee_creation $request->request->get('field14');
  3256.         // dd($annee_creation);
  3257.         $effectif $request->request->get('field15');
  3258.         $ice $request->request->get('field17');
  3259.         $identifiant_fiscal $request->request->get('field18');
  3260.         $patente $request->request->get('field19');
  3261.         $capital $request->request->get('field16');
  3262.         $inp $request->request->get('PLfield31');
  3263.         $rc $request->request->get('field20');
  3264.         $ville_rc $request->request->get('field21');
  3265.         $effectif trim($effectif) !== '' ? (int)$effectif null;
  3266.         $capital trim($capital) !== '' ? (int)$capital null;
  3267.         if (trim($forme_juridique) !== '' || trim($annee_creation) !== '' || trim($effectif) !== '' || trim($capital) !== '' || trim($ice) !== '' || trim($identifiant_fiscal) !== '' || trim($patente) !== '' || trim($rc) !== '' || trim($ville_rc) !== '' || trim($inp) !== '') {
  3268.             if ($juridique) {
  3269.                 $this->firmeService->updateJuridiques($userId,null,$forme_juridique,$annee_creation,$effectif,$capital,$ice,null,$patente,$rc,$ville_rc,$identifiant_fiscal);
  3270.             } else {
  3271.                 $this->firmeService->insererJuridiques($userId,null,$forme_juridique,$annee_creation,$effectif,$capital,$ice,null,$patente,$rc,$ville_rc,$identifiant_fiscal);
  3272.             }
  3273.         }
  3274.         
  3275.         //up_finances
  3276.         // Nettoyage des champs
  3277.         $banques      $this->cleanValue($request->request->get('field34'));
  3278.         $zone_export  $this->cleanValue($request->request->get('field35'));
  3279.         $pourc_export $this->cleanValue($request->request->get('field36'));
  3280.         $annee_ca     $this->cleanValue($request->request->get('field32', []));
  3281.         $gamme_ca     $this->cleanValue($request->request->get('field33', []));
  3282.         $anneesGammes = [];
  3283.         foreach ($annee_ca as $i => $annee) {
  3284.             if (!empty($annee) && isset($gamme_ca[$i]) && !empty($gamme_ca[$i])) {
  3285.                 $anneesGammes[] = [
  3286.                     'annee_ca' => $annee,
  3287.                     'gamme_ca' => $gamme_ca[$i],
  3288.                 ];
  3289.             }
  3290.         }
  3291.         // Sauvegarde en JSON
  3292.         $annee_ca array_column($anneesGammes'annee_ca');
  3293.         $gamme_ca array_column($anneesGammes'gamme_ca');
  3294.         // Insertion ou mise à jour si au moins un champ est renseigné
  3295.         if ($annee_ca !== null || $gamme_ca !== null || $banques !== null || $zone_export !== null || $pourc_export !== null) {
  3296.             if ($finance) {
  3297.                 $firmeService->updateFinances($userId,null$annee_ca$gamme_ca$banques$zone_export$pourc_export);
  3298.             } else {
  3299.                 $firmeService->insererFinances($userId,null$annee_ca$gamme_ca$banques$zone_export$pourc_export);
  3300.             }
  3301.         }
  3302.         //up_dirigeants
  3303.         $noms $request->request->get('field22', []);
  3304.         $prenoms $request->request->get('field23', []);
  3305.         $civilites $request->request->get('civilite', []);
  3306.         $fonctionCodes $request->request->get('field24', []);
  3307.         $portables $request->request->get('field25', []);
  3308.         $whatsapps $request->request->get('whatsappd', []);
  3309.         $emails $request->request->get('emaild', []);
  3310.         $ids $request->request->get('id', []);
  3311.         $deletedRaw $request->request->get('deleted_dirigeants''');
  3312.         // Convertir en tableau
  3313.         $deletedIds = [];
  3314.         if (is_string($deletedRaw) && $deletedRaw !== '') {
  3315.             $deletedIds explode(','$deletedRaw);
  3316.         }
  3317.         // dd($deletedIds); // Vérifier si on reçoit bien les IDs supprimés
  3318.         // Supprimer les dirigeants supprimés
  3319.         if (!empty($deletedIds)) {
  3320.             $firmeService->supprimerDirigeants($deletedIds);
  3321.         }
  3322.         $codeFirme null;
  3323.         // Synchroniser les autres (insert/update)
  3324.         $firmeService->synchroniserDirigeants($ids$noms$prenoms$civilites$fonctionCodes$portables$whatsapps$emails$codeFirme$userId);
  3325.         // up_certifications
  3326.         // Récupération des champs du formulaire
  3327.         $certification      $request->request->get('certification');
  3328.         $organisme          $request->request->get('organisme');
  3329.         $type               $request->request->get('type_certification');
  3330.         $produit            $request->request->get('produit_certification');
  3331.         $date_expiration    $request->request->get('date_expiration');
  3332.         // Vérifier s’il y a une certification existante pour ce code_firme
  3333.         $certificationExist $this->firmeService->getCertificationByUserId($userId);
  3334.         // dd($certificationExist);
  3335.         // Vérifier s'il y a des données remplies
  3336.         if (
  3337.             trim($certification) !== '' || trim($organisme) !== '' ||
  3338.             trim($type) !== '' || trim($produit) !== '' || trim($date_expiration) !== ''
  3339.         ) {
  3340.             if ($certificationExist) {
  3341.                 // faire update
  3342.                 $this->firmeService->updateCertification(
  3343.                     $userId,null,
  3344.                     $certification,
  3345.                     $organisme,
  3346.                     $type,
  3347.                     $produit,
  3348.                     $date_expiration
  3349.                 );
  3350.             } else {
  3351.                 // faire insert
  3352.                 $this->firmeService->insererCertification(
  3353.                     $userId,null,
  3354.                     $certification,
  3355.                     $organisme,
  3356.                     $type,
  3357.                     $produit,
  3358.                     $date_expiration
  3359.                 );
  3360.             }
  3361.         }
  3362.             $natures =$this->rubriqueprestationService->getAllNatures();
  3363.             $villes =$this->localisationService->getAllVilles();
  3364.             $rubriques =$this->rubriqueprestationService->getAllRubriques();
  3365.             $fonctions =$this->rubriqueprestationService->getAllFonctions();
  3366.             $fichiers =$this->rubriqueprestationService->getAllProfLib();
  3367.             $formeJur =$this->rubriqueprestationService->getAllFormeJur();
  3368.             $gammeCA =$this->rubriqueprestationService->getAllGammeCA();
  3369.             $banques =$this->rubriqueprestationService->getAllBanques();
  3370.             $zonesExp $this->localisationService->getAllZonesExport();       
  3371.             $themes $this->produitKompassService->getThemes(); 
  3372.             $wproduits $this->produitKompassService->getLienProduitW13($codeFirme);
  3373.             $fiches $this->firmeService->getAllNonFirmes();
  3374.         
  3375.             return $this->render('admin/nonFirme_up/list.html.twig', [
  3376.                 'pageSubtitle' => 'Liste des fiches non firmes',
  3377.                 'fiches' => $fiches,
  3378.                 'firme' => $firme,                
  3379.                 'codeFirme' => $codeFirme,               
  3380.             ]);
  3381.     
  3382.     }
  3383.     /**
  3384.      * @Route("/PlNonFirmeUp/insertDetails", name="insert_details_nonFirmeUpPL", methods={"POST"})
  3385.      */
  3386.     public function insertNonFirmeUpPLDetails(Request $request,FirmeService $firmeService): Response
  3387.     {         
  3388.         $user $this->getUser();
  3389.         if (!$user instanceof \App\Entity\UserRegistration) {
  3390.             $this->addFlash('error''Veuillez vous connecter.');
  3391.             return $this->redirectToRoute('app_login');
  3392.         }
  3393.         $description $data['PLfield28'] ?? null;
  3394.         // Récupération de toutes les données
  3395.         $data $request->request->all();
  3396.         // dd($data);
  3397.         $userId $request->request->get('user_id');
  3398.         //  dd($data);
  3399.         $firme $firmeService->getFirmeByUserId($userId); 
  3400.         $localisation $firmeService->getLocalisationByUserId($userId); 
  3401.         $coordonnee $firmeService->getCoordonneeByUserId($userId); 
  3402.         $finance $firmeService->getFinanceByUserId($userId); 
  3403.         // dd($firme);
  3404.         $juridique $firmeService->getJuridiqueByUserId($userId); 
  3405.         // dd($juridique);
  3406.         $dirigeants $firmeService->getDirigeantsByUserId($userId); 
  3407.         // Fonction utilitaire pour nettoyer les champs JSON
  3408.         // dd($data);
  3409.         $jours = ['lundi''mardi''mercredi''jeudi''vendredi''samedi''dimanche'];
  3410.         $horaires = [];
  3411.         foreach ($jours as $jour) {
  3412.             $isChecked $request->request->get('checkbox_' $jour);
  3413.             if ($isChecked) {
  3414.                 $start $request->request->get('start_' $jour);
  3415.                 $end $request->request->get('end_' $jour);
  3416.                 $horaires[$jour] = [
  3417.                     'actif' => true,
  3418.                     'start' => $start,
  3419.                     'end' => $end
  3420.                 ];
  3421.             } else {
  3422.                 $horaires[$jour] = [
  3423.                     'actif' => false,
  3424.                     'start' => null,
  3425.                     'end' => null
  3426.                 ];
  3427.             }
  3428.         }
  3429.         // ➕ Traitement cohérent pour la pause
  3430.         $pauseEnabled $request->request->get('pause_enabled'); // existe uniquement si cochée
  3431.         $pauseStart $request->request->get('pause_start');
  3432.         $pauseEnd $request->request->get('pause_end');
  3433.         $pause = [];
  3434.         if ($pauseEnabled) {
  3435.             $pause = [
  3436.                 'actif' => true,
  3437.                 'start' => $pauseStart,
  3438.                 'end' => $pauseEnd
  3439.             ];
  3440.         } else {
  3441.             $pause = [
  3442.                 'actif' => false,
  3443.                 'start' => null,
  3444.                 'end' => null
  3445.             ];
  3446.         }
  3447.         $horairesJson json_encode($horaires);
  3448.         $pauseJson json_encode($pause);
  3449.         //up_firme
  3450.         $nom $request->request->get('PLfield1');
  3451.         $prenom $request->request->get('PLfield2');
  3452.         $activite $request->request->get('PLfield26');
  3453.         $description $request->request->get('PLfield28');
  3454.         $horaires $horairesJson;
  3455.         $pause $pauseJson;
  3456.         $actes =  $this->filterJsonField($request->request->all('acte'));
  3457.         $validation $request->request->get('validation') ?? null;
  3458.         $date_creation = new \DateTime();
  3459.         $validation '1' ;
  3460.         $date_validation $validation === '1' ? new \DateTime() : null;
  3461.         $pl_or_societe "P";
  3462.         $etat='C';
  3463.         if (trim($userId) !== '' || trim($nom) !== '' || trim($prenom) !== '' || trim($activite) !== '' || trim($description) !== '' || $horaires !== '[]' || $pause !== '[]' || $actes !== null
  3464.         { 
  3465.             if ($firme) {
  3466.                 $synchroniser ="0";
  3467.                 $this->firmeService->updateFirme(
  3468.                     $userId,
  3469.                     null,
  3470.                     null,   // raison_social (pas dans ce contexte)
  3471.                     null,   // nature (pas dans ce contexte)
  3472.                     $horairesJson,
  3473.                     $pauseJson,
  3474.                     null,   // rubriques (pas dans ce contexte)
  3475.                     null,   // description_rub
  3476.                     null,   // prestations
  3477.                     null,   // produits
  3478.                     null,   // marques
  3479.                     $validation,
  3480.                     $date_validation,
  3481.                     $nom,
  3482.                     $prenom,
  3483.                     $actes,
  3484.                     $activite,
  3485.                     $description,
  3486.                     $pl_or_societe,
  3487.                     $etat,
  3488.                     $synchroniser
  3489.                 );
  3490.             } else {
  3491.                 $synchroniser ="0";
  3492.                 $this->firmeService->insererFirme(
  3493.                     $userId,null,
  3494.                     null,
  3495.                     null,
  3496.                     $horairesJson,
  3497.                     $pauseJson,
  3498.                     null,
  3499.                     null,
  3500.                     null,
  3501.                     null,
  3502.                     null,
  3503.                     $validation,
  3504.                     $date_validation,
  3505.                     $date_creation,
  3506.                     $nom,
  3507.                     $prenom,
  3508.                     $actes,
  3509.                     $activite,
  3510.                     $description,
  3511.                     $pl_or_societe,
  3512.                     $etat,
  3513.                     $synchroniser
  3514.                 );
  3515.             }
  3516.         }
  3517.         //up_localisations
  3518.         $adresse $request->request->get('PLfield3');
  3519.         $code_ville $request->request->get('PLfield4');
  3520.         $nom_ville $this->firmeService->getNomVille($code_ville);
  3521.         $code_quartier $request->request->get('PLfield5');
  3522.         $nom_quartier $this->firmeService->getNomQuartier($code_quartier);
  3523.         $code_postal $request->request->get('PLfield6');
  3524.         $longitude $request->request->get('PLfield11');
  3525.         $latitude $request->request->get('PLfield12');
  3526.         if (trim($adresse) !== '' || trim($code_ville) !== '' || trim($nom_ville) !== '' || trim($code_quartier) !== '' || trim($nom_quartier) !== '' || trim($code_postal) !== '' || trim($longitude) !== '' || trim($latitude) !== '')
  3527.         {
  3528.             if ($localisation) {
  3529.                 $this->firmeService->updateLocalisation($userId,null$adresse$code_ville$nom_ville$code_quartier$nom_quartier$code_postal$longitude$latitude);
  3530.             } else {
  3531.                 $this->firmeService->insererLocalisation($userId,null$adresse$code_ville$nom_ville$code_quartier$nom_quartier$code_postal$longitude$latitude);
  3532.             }
  3533.         }
  3534.         //up_coordonnées
  3535.         $telefone =  $this->filterJsonField($request->request->all('Pfield7'));
  3536.         $whatsapp =  $this->filterJsonField($request->request->all('Pwhatsapp'));
  3537.         $email =  $this->filterJsonField($request->request->all('Pemail'));
  3538.         $site_web =  $this->filterJsonField($request->request->all('Psite'));
  3539.         $facebook =  $this->filterJsonField($request->request->all('PLfacebook'));
  3540.         $instagram =  $this->filterJsonField($request->request->all('PLinstagram'));
  3541.         $linkedin =  $this->filterJsonField($request->request->all('PLlinkedin'));
  3542.         // Puis tu peux appeler ton service
  3543.         if ($telefone !== null || $whatsapp !== null || $email !== null || $site_web !== null || $facebook !== null || $instagram !== null || $linkedin !== null) {
  3544.             if ($coordonnee) {
  3545.             $this->firmeService->updateCoordonnees($userId,null$telefonenull$whatsapp$email$site_web$facebook$instagram$linkedin);
  3546.             } else {
  3547.                 $this->firmeService->insererCoordonnees($userId,null$telefonenull$whatsapp$email$site_web$facebook$instagram$linkedin);
  3548.             }
  3549.         }
  3550.         //up_juridiques
  3551.         $annee_creation $request->request->get('PLfield14');
  3552.         $ice $request->request->get('PLfield29');
  3553.         $identifiant_fiscal $request->request->get('PLfield30');
  3554.         $inp $request->request->get('PLfield31');
  3555.         $rc $request->request->get('PLfield20');
  3556.         $ville_rc $request->request->get('PLfield21');
  3557.         if (trim($annee_creation) !== '' || trim($ice) !== '' || trim($identifiant_fiscal) !== '' || trim($rc) !== '' || trim($ville_rc) !== '' || trim($inp) !== '') {
  3558.             if ($juridique) {
  3559.                 $this->firmeService->updateJuridiques($userId,null,null,$annee_creation,null,null,$ice,$inp,null,$rc,$ville_rc,$identifiant_fiscal);
  3560.             } else {
  3561.                 $this->firmeService->insererJuridiques($userId,null,null,$annee_creation,null,null,$ice,$inp,null,$rc,$ville_rc,$identifiant_fiscal);
  3562.             }
  3563.         }
  3564.         
  3565.         //up_finances
  3566.         // Nettoyage des champs
  3567.         $banques      $this->cleanValue($request->request->get('PLfield34'));
  3568.         $zone_export  $this->cleanValue($request->request->get('PLfield35'));
  3569.         $pourc_export $this->cleanValue($request->request->get('PLfield36'));
  3570.         
  3571.         $annee_ca     $this->cleanValue($request->request->get('PLfield32', []));
  3572.         $gamme_ca     $this->cleanValue($request->request->get('PLfield33', []));
  3573.         $anneesGammes = [];
  3574.         foreach ($annee_ca as $i => $annee) {
  3575.             if (!empty($annee) && isset($gamme_ca[$i]) && !empty($gamme_ca[$i])) {
  3576.                 $anneesGammes[] = [
  3577.                     'annee_ca' => $annee,
  3578.                     'gamme_ca' => $gamme_ca[$i],
  3579.                 ];
  3580.             }
  3581.         }
  3582.         // Sauvegarde en JSON
  3583.         $annee_ca array_column($anneesGammes'annee_ca');
  3584.         $gamme_ca array_column($anneesGammes'gamme_ca');
  3585.         // Insertion ou mise à jour si au moins un champ est renseigné
  3586.         if ($annee_ca !== null || $gamme_ca !== null || $banques !== null || $zone_export !== null || $pourc_export !== null) {
  3587.             if ($finance) {
  3588.                 $firmeService->updateFinances($userId,null$annee_ca$gamme_ca$banques$zone_export$pourc_export);
  3589.             } else {
  3590.                 $firmeService->insererFinances($userId,null$annee_ca$gamme_ca$banques$zone_export$pourc_export);
  3591.             }
  3592.         }
  3593.             $villes =$this->localisationService->getAllVilles();
  3594.             $rubriques =$this->rubriqueprestationService->getAllRubriques();
  3595.             $fonctions =$this->rubriqueprestationService->getAllFonctions();
  3596.             $fichiers =$this->rubriqueprestationService->getAllProfLib();
  3597.             $formeJur =$this->rubriqueprestationService->getAllFormeJur();
  3598.             $gammeCA =$this->rubriqueprestationService->getAllGammeCA();
  3599.             $banques =$this->rubriqueprestationService->getAllBanques();
  3600.             $zonesExp $this->localisationService->getAllZonesExport();       
  3601.             $themes $this->produitKompassService->getThemes(); 
  3602.             $fiches $this->firmeService->getAllNonFirmes();
  3603.             return $this->redirectToRoute('nonfiches'); 
  3604.     }
  3605.     /**
  3606.      * @Route("/promouvoir-utilisateur/{userId}", name="promouvoir_utilisateur")
  3607.      */
  3608.     public function promouvoirUtilisateur(int $userIdFirmeService $firmeService): Response
  3609.     {
  3610.         $result $firmeService->promouvoirUtilisateur($userId);
  3611.         // dd($result );
  3612.         if (!$result['success']) {
  3613.             $this->addFlash('error'$result['message']);
  3614.         } else {
  3615.             $this->addFlash('success'$result['message']);
  3616.         }
  3617.         return $this->redirectToRoute('nonfiches');
  3618.     }
  3619.     /**
  3620.      * @Route("/DetailsFirmePL/up/{codeFirme}", name="details_profession_lib")
  3621.      */
  3622.     public function FirmeUpPLDetails(string $codeFirmeFirmeService $firmeService): Response
  3623.     {   
  3624.         $user $this->getUser();
  3625.         if (!$user instanceof \App\Entity\User) {
  3626.             $this->addFlash('error''Veuillez vous connecter.');
  3627.             return $this->redirectToRoute('app_login');
  3628.         }
  3629.         $pageSubtitle 'Fiche client';
  3630.         $firme $firmeService->getFirmeByCodeAdmin($codeFirme);
  3631.         $modification $firmeService->getNewData($codeFirme);
  3632.         // dd($modification);
  3633.         if ($firme) {
  3634.             $firme['horaires'] = json_decode($firme['horaires'] ?? '[]'true);
  3635.             $firme['pause'] = json_decode($firme['pause'] ?? '[]'true);
  3636.             $firme['rubriques'] = json_decode($firme['rubriques'] ?? '[]'true);
  3637.             $firme['prestations'] = json_decode($firme['prestations'] ?? '[]'true);
  3638.             $firme['produits'] = json_decode($firme['produits'] ?? '[]'true);
  3639.             $firme['marques'] = json_decode($firme['marques'] ?? '[]'true);
  3640.             $firme['actes'] = json_decode($firme['actes'] ?? '[]'true);
  3641.             $firme['activite'] = $firme['activite'] ?? '';
  3642.         } else {
  3643.             $firme = [
  3644.                 'horaires' => [],
  3645.                 'pause' => [],
  3646.                 'rubriques' => [],
  3647.                 'prestations' => [],
  3648.                 'produits' => [],
  3649.                 'marques' => [],
  3650.                 'actes' => [],
  3651.                 'activite' => '',
  3652.             ];
  3653.         }
  3654.                     
  3655.         $wproduits $this->produitKompassService->getLienProduitW13($codeFirme);
  3656.         $localisation $firmeService->getLocalisationByCodeFirme($codeFirme); 
  3657.         $coordonnee $firmeService->getCoordonneeByCodeFirme($codeFirme); 
  3658.         $juridique $firmeService->getJuridiqueByCodeFirme($codeFirme);
  3659.         $finance $firmeService->getFinanceByCodeFirme($codeFirme);
  3660.         $dirigeants $firmeService->getDirigeantsByCodeFirme($codeFirme);
  3661.         $certification $firmeService->getCertificationByCodeFirme($codeFirme);
  3662.         $anneesCA json_decode($finance['annee_ca'] ?? '[]'true);
  3663.         rsort($anneesCASORT_NUMERIC);
  3664.         $gammesCA json_decode($finance['gamme_ca'] ?? '[]'true);
  3665.         $zoneExport json_decode($finance['zone_export'] ?? '[]'true);
  3666.         $pourcExport json_decode($finance['pourc_export'] ?? '[]'true); 
  3667.                 // Construire le tableau années + gammes
  3668.                 $anneesGammes = [];
  3669.                 foreach ($anneesCA as $index => $annee) {
  3670.                     $anneesGammes[] = [
  3671.                         'annee_ca' => $annee,
  3672.                         'gamme_ca' => $gammesCA[$index] ?? null
  3673.                     ];
  3674.                 }
  3675.                 // Trier en ordre décroissant (comme dans Cas 1)
  3676.                 usort($anneesGammes, fn($a$b) => $b['annee_ca'] <=> $a['annee_ca']);
  3677.                 // Construire le tableau zones + pourcentage
  3678.                 $zonesExportList = [];
  3679.                 foreach ($zoneExport as $index => $zone) {
  3680.                     $zonesExportList[] = [
  3681.                         'zone' => $zone,
  3682.                         'pourcentage' => $pourcExport[$index] ?? null
  3683.                     ];
  3684.                 }
  3685.         // dd($juridique,$finance);
  3686.         if ($coordonnee) {
  3687.             $coordonnee['telefone']   = json_decode($coordonnee['telefone'] ?? '[]'true);
  3688.             $coordonnee['portable']   = json_decode($coordonnee['portable'] ?? '[]'true);
  3689.             $coordonnee['whatsapp']   = json_decode($coordonnee['whatsapp'] ?? '[]'true);
  3690.             $coordonnee['email']      = json_decode($coordonnee['email'] ?? '[]'true);
  3691.             $coordonnee['site_web']   = json_decode($coordonnee['site_web'] ?? '[]'true);
  3692.             $coordonnee['facebook']   = json_decode($coordonnee['facebook'] ?? '[]'true);
  3693.             $coordonnee['instagram']  = json_decode($coordonnee['instagram'] ?? '[]'true);
  3694.             $coordonnee['linkedin']   = json_decode($coordonnee['linkedin'] ?? '[]'true);
  3695.         } else {
  3696.             // On initialise à vide pour éviter toute erreur dans le template
  3697.             $coordonnee = [
  3698.                 'telefone' => [],
  3699.                 'portable' => [],
  3700.                 'whatsapp' => [],
  3701.                 'email' => [],
  3702.                 'site_web' => [],
  3703.                 'facebook' => [],
  3704.                 'instagram' => [],
  3705.                 'linkedin' => [],
  3706.             ];
  3707.         }
  3708.         $villes =$this->localisationService->getAllVilles();        
  3709.         $villesRC =$this->localisationService->getAllVillesRC();
  3710.         $rubriques =$this->rubriqueprestationService->getAllRubriques();
  3711.         $fonctions =$this->rubriqueprestationService->getAllFonctions();
  3712.         $natures =$this->rubriqueprestationService->getAllNatures();
  3713.         $fichiers =$this->rubriqueprestationService->getAllProfLib();
  3714.         $formeJur =$this->rubriqueprestationService->getAllFormeJur();
  3715.         $gammeCA =$this->rubriqueprestationService->getAllGammeCA();
  3716.         $banques =$this->rubriqueprestationService->getAllBanques();
  3717.         $zonesExp $this->localisationService->getAllZonesExport();       
  3718.         $themes $this->produitKompassService->getThemes();
  3719.  
  3720.         return $this->render('admin/firme_up/indexPl.html.twig', [
  3721.             'villes' => $villes,            
  3722.             'villesRC' => $villesRC,
  3723.             'rubriques' => $rubriques,
  3724.             'fonctions' => $fonctions,
  3725.             'natures' => $natures,
  3726.             'fichiers' => $fichiers,
  3727.             'formeJur' =>  $formeJur,
  3728.             'banques' => $banques,                
  3729.             'zonesExp' => $zonesExp,
  3730.             'themes' => $themes,
  3731.             'firme' =>  $firme,
  3732.             'localisation' =>  $localisation,
  3733.             'coordonnee' =>  $coordonnee,
  3734.             'rubriques' =>  $rubriques,
  3735.             'juridique' =>  $juridique,
  3736.             'finance' =>  $finance,
  3737.             'pourcExport' => $pourcExport,
  3738.             'anneesGammes' => $anneesGammes,
  3739.             'gammeCA' => $gammeCA
  3740.             'zonesExportList' => $zonesExportList,
  3741.             'dirigeants' => $dirigeants,
  3742.             'certification' => $certification,
  3743.             'wproduits' => $wproduits,
  3744.             'modification' => $modification,
  3745.         ]);
  3746.     }
  3747.     
  3748.     // /**
  3749.     //  * @Route("/DetailsFirme/up/{codeFirme}", name="details_societe")
  3750.     //  */
  3751.     // public function FirmeUpSocieteDetails(string $codeFirme, FirmeService $firmeService): Response
  3752.     // {           
  3753.     //     $user = $this->getUser();
  3754.     //     if (!$user instanceof \App\Entity\User) {
  3755.     //         $this->addFlash('error', 'Veuillez vous connecter.');
  3756.     //         return $this->redirectToRoute('app_login');
  3757.     //     }
  3758.     //     $pageSubtitle = 'Fiche client';
  3759.     //     $firme = $firmeService->getFirmeByCodeAdmin($codeFirme);
  3760.     //     // $oldValueFirme = $firmeService->getAllFirmeData($codeFirme);
  3761.     //     // dd($firme,$oldValueFirme);
  3762.     //     if ($firme) {
  3763.     //         $firme['horaires'] = json_decode($firme['horaires'] ?? '[]', true);
  3764.     //         $firme['pause'] = json_decode($firme['pause'] ?? '[]', true);
  3765.     //         $firme['rubriques'] = json_decode($firme['rubriques'] ?? '[]', true);
  3766.     //         $firme['prestations'] = json_decode($firme['prestations'] ?? '[]', true);
  3767.     //         $firme['produits'] = json_decode($firme['produits'] ?? '[]', true);
  3768.     //         $firme['marques'] = json_decode($firme['marques'] ?? '[]', true);
  3769.     //         $firme['actes'] = json_decode($firme['actes'] ?? '[]', true);
  3770.     //     } else {
  3771.     //         // Par exemple, on passe un tableau vide au template
  3772.     //         $firme = [
  3773.     //             'horaires' => [],
  3774.     //             'pause' => [],
  3775.     //             'rubriques' => [],
  3776.     //             'prestations' => [],
  3777.     //             'produits' => [],
  3778.     //             'marques' => [],
  3779.     //             'actes' => [],
  3780.     //         ];
  3781.     //     }
  3782.     //     $wproduits = $this->produitKompassService->getLienProduitW13($codeFirme);
  3783.     //     $kompassProduits = $this->produitKompassService->getProduitsKompass($codeFirme);
  3784.     //     $localisation = $firmeService->getLocalisationByCodeFirme($codeFirme); 
  3785.     //     $coordonnee = $firmeService->getCoordonneeByCodeFirme($codeFirme); 
  3786.     //     $juridique = $firmeService->getJuridiqueByCodeFirme($codeFirme);
  3787.     //     $finance = $firmeService->getFinanceByCodeFirme($codeFirme);
  3788.     //     $dirigeants = $firmeService->getDirigeantsByCodeFirme($codeFirme);
  3789.     //     $certification = $firmeService->getCertificationByCodeFirme($codeFirme);
  3790.     //     $anneesCA = json_decode($finance['annee_ca'] ?? '[]', true);
  3791.     //     rsort($anneesCA, SORT_NUMERIC);
  3792.     //     $gammesCA = json_decode($finance['gamme_ca'] ?? '[]', true);
  3793.     //     $zoneExport = json_decode($finance['zone_export'] ?? '[]', true);
  3794.     //     $pourcExport = json_decode($finance['pourc_export'] ?? '[]', true); 
  3795.     //     // dd($finance);
  3796.     //     $anneesGammes = [];
  3797.     //     foreach ($anneesCA as $index => $annee) {
  3798.     //         $anneesGammes[] = [
  3799.     //             'annee_ca' => $annee,
  3800.     //             'gamme_ca' => $gammesCA[$index] ?? null
  3801.     //         ];
  3802.     //     }
  3803.     //     $zonesExportList = [];
  3804.     //     foreach ($zoneExport as $index => $zone) {
  3805.     //         $zonesExportList[] = [
  3806.     //             'zone' => $zone,
  3807.     //             'pourcentage' => $pourcExport[$index] ?? null
  3808.     //         ];
  3809.     //     }
  3810.     //     // dd($juridique,$finance);
  3811.     //     if ($coordonnee) {
  3812.     //         $coordonnee['telefone']   = json_decode($coordonnee['telefone'] ?? '[]', true);
  3813.     //         $coordonnee['portable']   = json_decode($coordonnee['portable'] ?? '[]', true);
  3814.     //         $coordonnee['whatsapp']   = json_decode($coordonnee['whatsapp'] ?? '[]', true);
  3815.     //         $coordonnee['email']      = json_decode($coordonnee['email'] ?? '[]', true);
  3816.     //         $coordonnee['site_web']   = json_decode($coordonnee['site_web'] ?? '[]', true);
  3817.     //         $coordonnee['facebook']   = json_decode($coordonnee['facebook'] ?? '[]', true);
  3818.     //         $coordonnee['instagram']  = json_decode($coordonnee['instagram'] ?? '[]', true);
  3819.     //         $coordonnee['linkedin']   = json_decode($coordonnee['linkedin'] ?? '[]', true);
  3820.     //     } else {
  3821.     //         // On initialise à vide pour éviter toute erreur dans le template
  3822.     //         $coordonnee = [
  3823.     //             'telefone' => [],
  3824.     //             'portable' => [],
  3825.     //             'whatsapp' => [],
  3826.     //             'email' => [],
  3827.     //             'site_web' => [],
  3828.     //             'facebook' => [],
  3829.     //             'instagram' => [],
  3830.     //             'linkedin' => [],
  3831.     //         ];
  3832.     //     }
  3833.     //     $villes =$this->localisationService->getAllVilles();       
  3834.     //     $villesRC =$this->localisationService->getAllVillesRC();
  3835.     //     $rubriques =$this->rubriqueprestationService->getAllRubriques();
  3836.     //     // $marques =$this->rubriqueprestationService->getAllMarques();
  3837.     //     $produits =$this->rubriqueprestationService->getAllProduits();
  3838.     //     $fonctions =$this->rubriqueprestationService->getAllFonctions();
  3839.     //     $natures =$this->rubriqueprestationService->getAllNatures();
  3840.     //     $fichiers =$this->rubriqueprestationService->getAllProfLib();
  3841.     //     $formeJur =$this->rubriqueprestationService->getAllFormeJur();
  3842.     //     $gammeCA =$this->rubriqueprestationService->getAllGammeCA();
  3843.     //     $banques =$this->rubriqueprestationService->getAllBanques();
  3844.     //     $zonesExp = $this->localisationService->getAllZonesExport();       
  3845.     //     $themes = $this->produitKompassService->getThemes(); 
  3846.     //     // $codesProduits = $firme['produits'] ?? [];
  3847.     //     // // Transformer les codes en tableau associatif code => libellé
  3848.     //     // $firme['produits'] = $this->rubriqueprestationService->getLibellesProduits($codesProduits);
  3849.     //     // $codesMarques = $firme['marques'] ?? [];
  3850.     //     // // Transformer les codes en tableau associatif code => libellé
  3851.     //     // $firme['marques'] = $this->rubriqueprestationService->getLibellesMarques($codesMarques);
  3852.     //     if (is_array($dirigeants)) {
  3853.     //         foreach ($dirigeants as &$d) {
  3854.     //             $p = $d['portable'] ?? null;
  3855.     //             if ($p && $p[0] === '[') {
  3856.     //                 $d['portables'] = json_decode($p, true);
  3857.     //             } else {
  3858.     //                 $d['portables'] = []; // <--- toujours définir la clé
  3859.     //             }
  3860.     //         }
  3861.     //     } else {
  3862.     //         $dirigeants = []; // éviter d'avoir un foreach sur null
  3863.     //     }
  3864.     //     // dd($firme);
  3865.     //             return $this->render('admin/firme_up/index.html.twig', [
  3866.     //                 'villes' => $villes,                    
  3867.     //                 'villesRC' => $villesRC,
  3868.     //                 'rubriques' => $rubriques,
  3869.     //                 'fonctions' => $fonctions,
  3870.     //                 'natures' => $natures,
  3871.     //                 'fichiers' => $fichiers,
  3872.     //                 'formeJur' =>  $formeJur,
  3873.     //                 'banques' => $banques,   
  3874.     //                 'produits' => $produits,                
  3875.     //                 // 'marques' => $marques,                
  3876.     //                 'zonesExp' => $zonesExp,
  3877.     //                 'themes' => $themes,
  3878.     //                 'firme' =>  $firme,
  3879.     //                 'localisation' =>  $localisation,
  3880.     //                 'coordonnee' =>  $coordonnee,
  3881.     //                 'rubriques' =>  $rubriques,
  3882.     //                 'juridique' =>  $juridique,
  3883.     //                 'finance' =>  $finance,
  3884.     //                 'pourcExport' => $pourcExport,
  3885.     //                 'anneesGammes' => $anneesGammes,
  3886.     //                 'gammeCA' => $gammeCA, 
  3887.     //                 'zonesExportList' => $zonesExportList,
  3888.     //                 'dirigeants' => $dirigeants,
  3889.     //                 'certification' => $certification,
  3890.     //                 'pageSubtitle' => 'Liste des fiches non firmes',
  3891.     //                 'firme' => $firme,                
  3892.     //                 'wproduits' => $wproduits,
  3893.     //                 'kompassProduits' => $kompassProduits,
  3894.     //             ]);
  3895.     // }
  3896.     /**
  3897.      * @Route("/DetailsFirme/up/{codeFirme}", name="details_societe")
  3898.      */
  3899.      public function FirmeUpSocieteDetails(string $codeFirmeFirmeDetailsService $FirmeDetailsService,FirmeUpService $firmeUpService,FirmeService $firmeService): Response
  3900.     {
  3901.         $user $this->getUser();
  3902.         if (!$user instanceof \App\Entity\User) {
  3903.             $this->addFlash('error''Veuillez vous connecter.');
  3904.             return $this->redirectToRoute('app_login');
  3905.         }
  3906.         $data $FirmeDetailsService->getFirmeDetails($codeFirme);
  3907.         $dataCRM $firmeUpService->prepareFirmeData($codeFirme);
  3908.         $modification $firmeService->getNewData($codeFirme);
  3909.         foreach ($modification as &$modif) {
  3910.             if (!empty($modif['ancienne_valeur']) && ($modif['ancienne_valeur'][0] === '{' || $modif['ancienne_valeur'][0] === '[')) {
  3911.                 $decoded json_decode($modif['ancienne_valeur'], true);
  3912.                 $modif['ancienne_valeur_decoded'] = $decoded;
  3913.                 // Produits Kompass
  3914.                 if ($modif['table_source'] === 'up_produits_kompass' && isset($decoded['code_produit'])) {
  3915.                     $lib $firmeService->getLibProduitByCode($decoded['code_produit']);
  3916.                     $decoded['lib_produit'] = $lib ?? '';
  3917.                 }
  3918.                 // Activités WF13
  3919.                 if ($modif['table_source'] === 'up_activite_WF13' && isset($decoded['code_produit'])) {
  3920.                     $lib $firmeService->getLibWF13ByCode($decoded['code_produit']);
  3921.                     $decoded['lib_produit'] = $lib ?? '';
  3922.                 }
  3923.                 // ✅ Réordonner pour que lib_produit soit le premier
  3924.                 if (isset($decoded['lib_produit'])) {
  3925.                     $decoded array_merge(
  3926.                         ['lib_produit' => $decoded['lib_produit']],
  3927.                         array_diff_key($decoded, ['lib_produit' => ''])
  3928.                     );
  3929.                 }
  3930.                 $modif['ancienne_valeur_decoded'] = $decoded;
  3931.             } else {
  3932.                 $modif['ancienne_valeur_decoded'] = $modif['ancienne_valeur'];
  3933.             }
  3934.         }
  3935.         // dd( $modification);
  3936.         return $this->render('admin/firme_up/index.html.twig'array_merge($data, [
  3937.             'pageSubtitle' => 'Fiche client',
  3938.             'modification' => $modification,
  3939.         ]));
  3940.     }
  3941.      /**
  3942.      * @Route("/ajax/produits", name="ajax_produits")
  3943.      */
  3944.     public function getProduits(Request $request): JsonResponse
  3945.     {
  3946.         $search $request->query->get('q''');
  3947.         $items $this->rubriqueprestationService->searchProduits($search);
  3948.         return $this->json(['items' => $items]);
  3949.     }
  3950.      /**
  3951.      * @Route("/ajax/marques", name="ajax_marques")
  3952.      */
  3953.     public function getMarques(Request $request): JsonResponse
  3954.     {
  3955.         $search $request->query->get('q''');
  3956.         $items $this->rubriqueprestationService->searchMarques($search);
  3957.         return $this->json(['items' => $items]);
  3958.     }
  3959.     /**
  3960.      * @Route("/delete-multiple-fiches", name="delete_multiple_fiches", methods={"POST"})
  3961.      */
  3962.     public function deleteMultiple(Request $requestFirmeService $firmeService)
  3963.     {
  3964.         $data json_decode($request->getContent(), true);
  3965.         $ids $data['ids'] ?? [];
  3966.         // dd($ids);
  3967.         $firmeService->deleteMultipleFiches($ids);
  3968.         return new JsonResponse(['success' => true]);
  3969.     }
  3970.      /**
  3971.      * @Route("/synchroniser/{codeFirme}", name="synchroniser_firme")
  3972.      */
  3973.     public function transfer(string $codeFirme): Response
  3974.     {
  3975.         try {
  3976.             $this->firmeService->transferFirme($codeFirme);
  3977.             return $this->redirectToRoute('fiches');
  3978.             // return new Response("✅ Transfert terminé pour la firme $codeFirme");
  3979.         } catch (\Exception $e) {
  3980.             return new Response(
  3981.                 "❌ Erreur lors du transfert : " $e->getMessage() . "<br>" .
  3982.                 "📌 Fichier : " $e->getFile() . "<br>" .
  3983.                 "📌 Ligne : " $e->getLine() . "<br>" .
  3984.                 "📌 Trace : <pre>" $e->getTraceAsString() . "</pre>",
  3985.                 500
  3986.             );
  3987.         }
  3988.     }
  3989.     // Fonction utilitaire pour nettoyer les champs JSON
  3990.         function  filterJsonField(?array $values): ?string 
  3991.         {
  3992.             if (!$values || !is_array($values)) return null;
  3993.             
  3994.             // Enlève les valeurs nulles, vides ou composées uniquement d'espaces
  3995.             $filtered array_filter($values, fn($v) => trim($v) !== '');
  3996.             return empty($filtered) ? null json_encode(array_values($filtered));
  3997.         }
  3998.         function cleanValue($value) {
  3999.             if (is_array($value)) {
  4000.                 $filtered array_filter($value, fn($v) => trim((string)$v) !== '');
  4001.                 return empty($filtered) ? null array_values($filtered);
  4002.             }
  4003.             $valueStr trim((string)$value);
  4004.             return $valueStr === '' null $valueStr;
  4005.         }
  4006. }