src/Controller/FirmeUpController.php line 4259

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.         // dd($data['syncFlag']);
  1630.         $roles $user->getRoles();
  1631.         if (in_array('ROLE_CUSTOMER'$roles)) {
  1632.             return $this->render('customer/firme_up/index.html.twig'$data);
  1633.         }
  1634.         if (in_array('ROLE_ADMIN'$roles)) {
  1635.             return $this->render('admin/firme_up/index.html.twig'$data);
  1636.         }
  1637.         if (in_array('ROLE_MODERATOR'$roles)) {
  1638.             return $this->render('moderator/firme_up/index.html.twig'$data);
  1639.         }
  1640.         $this->addFlash('error''Accès interdit.');
  1641.         return $this->redirectToRoute('app_customer');
  1642.     
  1643.     }
  1644.     /**
  1645.      * @Route("/firmeUp/insert", name="insert_firmeUp", methods={"POST"})
  1646.      */
  1647.     public function insertFirmeUp(Request $request,FirmeService $firmeService,ProduitKompassService $produitKompassService,ModificationLoggerService $ModificationLoggerService): Response
  1648.     {
  1649.         $codeFirme $request->request->get('codeFirme'); 
  1650.         $data $request->request->all();        
  1651.         $firmeCRM $this->firmeService->getAllFirmeData($codeFirme);
  1652.             $kompassProduitsCRM $firmeCRM['produits'];
  1653.             $wproduitsCRM $firmeCRM['activites_w13'];
  1654.             $kompassProduitsUD $this->produitKompassService->getProduitsKompass($codeFirme);
  1655.             $wproduitsUD $this->produitKompassService->getLienProduitW13($codeFirme);
  1656.             // 🧩 Décodage JSON si nécessaire
  1657.             if (is_string($kompassProduitsCRM)) {
  1658.                 $kompassProduitsCRM json_decode($kompassProduitsCRMtrue) ?? [];
  1659.             }
  1660.             if (is_string($wproduitsCRM)) {
  1661.                 $wproduitsCRM json_decode($wproduitsCRMtrue) ?? [];
  1662.             }
  1663.             if (is_string($kompassProduitsUD)) {
  1664.                 $kompassProduitsUD json_decode($kompassProduitsUDtrue) ?? [];
  1665.             }
  1666.             if (is_string($wproduitsUD)) {
  1667.                 $wproduitsUD json_decode($wproduitsUDtrue) ?? [];
  1668.             }
  1669.         // dd($wproduitsUD,$wproduitsCRM,$kompassProduitsUD ,$kompassProduitsCRM);
  1670.             // ========================
  1671.             // 🔹 Préparer les produits W13
  1672.             // ========================
  1673.             $oldWProduits array_map(fn($p) => [
  1674.                 'code_produit' => $p['CODE_WF13'] ?? $p['code_produit'] ?? '',
  1675.                 // 'lib_produit' => $p['lib_produit'] ?? $p['LIB_PRODUIT'] ?? '',
  1676.                 'export' => $p['EXPORTATEUR'] ?? '',
  1677.                 'import' => $p['IMPORTATEUR'] ?? '',
  1678.                 'fda' => $p['FDA'] ?? '',
  1679.             ], $wproduitsCRM);
  1680.             $newWProduits array_map(fn($p) => [
  1681.                 'code_produit' => $p['CODE_PRODUIT_WF13'] ?? '',
  1682.                 // 'lib_produit' => $p['lib_produit'] ?? $p['LIB_PRODUIT'] ?? '',
  1683.                 'export' => $p['export'] ?? '',
  1684.                 'import' => $p['import'] ?? '',
  1685.                 'fda' => $p['fda'] ?? '',
  1686.             ], $wproduitsUD);
  1687.             // 🔹 Logger les différences W13
  1688.             $this->ModificationLoggerService->logComplexeDifferencesProduit(
  1689.                 'BD_EDICOM',
  1690.                 'updatedata',
  1691.                 'up_activite_WF13',
  1692.                 $oldWProduits,
  1693.                 $newWProduits,
  1694.                 $codeFirme,
  1695.                 null,
  1696.                 'UPDATE'
  1697.             );
  1698.             // ========================
  1699.             // 🔹 Préparer les produits Kompass
  1700.             // ========================
  1701.             $oldKompass array_map(fn($p) => [
  1702.                 'code_produit' => $p['code_produit'] ?? '',
  1703.                 // 'lib_produit' => $p['lib_produit'] ?? $p['LIB_PRODUIT'] ?? '',
  1704.                 'export' => $p['export'] ?? '',
  1705.                 'import' => $p['import'] ?? '',
  1706.                 'fda' => $p['fda'] ?? '',
  1707.             ], $kompassProduitsCRM);
  1708.             $newKompass array_map(fn($p) => [
  1709.                 'code_produit' => $p['code_produit'] ?? '',
  1710.                 // 'lib_produit' => $p['lib_produit'] ?? '',
  1711.                 'export' => $p['export'] ?? '',
  1712.                 'import' => $p['import'] ?? '',
  1713.                 'fda' => $p['fda'] ?? '',
  1714.             ], $kompassProduitsUD);
  1715.             // 🔹 Logger les différences Kompass
  1716.             $this->ModificationLoggerService->logComplexeDifferencesProduit(
  1717.                 'BD_EDICOM',
  1718.                 'updatedata',
  1719.                 'up_produits_kompass',
  1720.                 $oldKompass,
  1721.                 $newKompass,
  1722.                 $codeFirme,
  1723.                 null,
  1724.                 'UPDATE'
  1725.             );
  1726.         $firme $firmeService->getFirmeByCodeAdmin($codeFirme); 
  1727.         $localisation $firmeService->getLocalisationByCodeFirme($codeFirme); 
  1728.         $coordonnee $firmeService->getCoordonneeByCodeFirme($codeFirme); 
  1729.         $finance $firmeService->getFinanceByCodeFirme($codeFirme); 
  1730.         $juridique $firmeService->getJuridiqueByCodeFirme($codeFirme); 
  1731.         $dirigeants $firmeService->getDirigeantsByCodeFirme($codeFirme); 
  1732.          function isNotEmpty($value): bool {
  1733.             if (is_array($value)) {
  1734.                 foreach ($value as $v) {
  1735.                     if (trim((string)$v) !== '') {
  1736.                         return true;
  1737.                     }
  1738.                 }
  1739.                 return false;
  1740.             }
  1741.             return trim((string)$value) !== '';
  1742.         }
  1743.         $jours = ['lundi''mardi''mercredi''jeudi''vendredi''samedi''dimanche'];
  1744.         $horaires = [];
  1745.         foreach ($jours as $jour) {
  1746.             $isChecked $request->request->get('checkbox_' $jour);
  1747.             if ($isChecked) {
  1748.                 $start $request->request->get('start_' $jour);
  1749.                 $end $request->request->get('end_' $jour);
  1750.                 $horaires[$jour] = [
  1751.                     'actif' => true,
  1752.                     'start' => $start,
  1753.                     'end' => $end
  1754.                 ];
  1755.             } else {
  1756.                 $horaires[$jour] = [
  1757.                     'actif' => false,
  1758.                     'start' => null,
  1759.                     'end' => null
  1760.                 ];
  1761.             }
  1762.         }
  1763.         // ➕ Traitement cohérent pour la pause
  1764.         $pauseEnabled $request->request->get('pause_enabled'); // existe uniquement si cochée
  1765.         $pauseStart $request->request->get('pause_start');
  1766.         $pauseEnd $request->request->get('pause_end');
  1767.         $pause = [];
  1768.         if ($pauseEnabled) {
  1769.             $pause = [
  1770.                 'actif' => true,
  1771.                 'start' => $pauseStart,
  1772.                 'end' => $pauseEnd
  1773.             ];
  1774.         } else {
  1775.             $pause = [
  1776.                 'actif' => false,
  1777.                 'start' => null,
  1778.                 'end' => null
  1779.             ];
  1780.         }
  1781.         $horairesJson json_encode($horaires);
  1782.         $pauseJson json_encode($pause);
  1783.         $produits $request->request->get('field29');
  1784.         $positionsProduits $request->request->get('Prfield31');
  1785.         $marques $request->request->get('field30');
  1786.         $positionsMarques $request->request->get('field31');
  1787.         // Filtrer les produits avec valeurs non vides
  1788.         $produitsAvecPositions = [];
  1789.         if (!empty($produits) && is_array($produits)) {
  1790.             foreach ($produits as $index => $produit) {
  1791.                 if (trim($produit) !== '') {
  1792.                     $produitsAvecPositions[] = [
  1793.                         'produit' => $produit,
  1794.                         'position' => $positionsProduits[$index] ?? null
  1795.                     ];
  1796.                 }
  1797.             }
  1798.         }
  1799.         // // Filtrer les marques avec valeurs non vides
  1800.         $marquesAvecPositions = [];
  1801.         if (!empty($marques) && is_array($marques)) {
  1802.             foreach ($marques as $index => $marque) {
  1803.                 if (trim($produit) !== '') {
  1804.                     $marquesAvecPositions[] = [
  1805.                         'marque' => $marque,
  1806.                         'position' => $positionsMarques[$index] ?? null
  1807.                     ];
  1808.                 }
  1809.             }
  1810.         }
  1811.         //up_firme
  1812.         $raison_social $request->request->get('field1');
  1813.         $nature $request->request->get('field2');
  1814.         $horaires $horairesJson;
  1815.         $pause $pauseJson;
  1816.         $rubriques =  $this->filterJsonField($request->request->all('field26'));
  1817.         $prestations =  $this->filterJsonField($request->request->all('field28'));
  1818.         // Filtrer la description_rub
  1819.         $description_rub trim($request->request->get('field27') ?? '');
  1820.         // Encodage final
  1821.         $produits = !empty($produitsAvecPositions) ? json_encode($produitsAvecPositions) : null;
  1822.         $marques = !empty($marquesAvecPositions) ? json_encode($marquesAvecPositions) : null;
  1823.         // $produits =  $this->filterJsonField($request->request->all('field29'));;
  1824.         // $marques =  $this->filterJsonField($request->request->all('field30'));;
  1825.         $validation $request->request->get('validation') ?? null;
  1826.         $date_creation = new \DateTime();
  1827.         $date_validation $validation === '1' ? new \DateTime() : null;
  1828.         $pl_or_societe "S";
  1829.         if (trim($codeFirme) !== '' || trim($raison_social) !== '' || trim($nature) !== '' || $horaires !== '[]' || $pause !== '[]' || $rubriques !== null ||$description_rub !== '' || $prestations !== null || !empty($produits) || !empty($marques)) 
  1830.         {
  1831.             if ($firme) {
  1832.                 $etat='U';
  1833.                 $synchroniser="0";
  1834.                 $this->firmeService->updateFirme(
  1835.                     null,
  1836.                     $codeFirme,
  1837.                     $raison_social,
  1838.                     $nature,
  1839.                     $horairesJson,
  1840.                     $pauseJson,
  1841.                     $rubriques,
  1842.                     $description_rub,
  1843.                     $prestations,
  1844.                     $produits,
  1845.                     $marques,
  1846.                     $validation,
  1847.                     $date_validation,
  1848.                     null// nom
  1849.                     null// prenom
  1850.                     null// actes
  1851.                     null// activite
  1852.                     null// description
  1853.                     $pl_or_societe,
  1854.                     $etat,
  1855.                     $synchroniser
  1856.                 );
  1857.             } else {
  1858.                 $etat='C';
  1859.                 $synchroniser="0";
  1860.                 $this->firmeService->insererFirme(
  1861.                     null,
  1862.                     $codeFirme,
  1863.                     $raison_social,
  1864.                     $nature,
  1865.                     $horairesJson,
  1866.                     $pauseJson,
  1867.                     $rubriques,
  1868.                     $description_rub,
  1869.                     $prestations,
  1870.                     $produits,
  1871.                     $marques,
  1872.                     $validation,
  1873.                     $date_validation,
  1874.                     $date_creation,
  1875.                     null,
  1876.                     null,
  1877.                     null,
  1878.                     null,
  1879.                     null,
  1880.                     $pl_or_societe,
  1881.                     $etat,
  1882.                     $synchroniser
  1883.                 );
  1884.             }        
  1885.         }
  1886.         // les données anciennes
  1887.         $oldDataFirme = [
  1888.             'raison_social' => $firmeCRM['firme']['rs_comp'] ,
  1889.             'nature' =>  $firmeCRM['firme']['code_nature'],
  1890.             'rubriques' =>  $firmeCRM['rubriques'],
  1891.             'description_rub' =>  $firmeCRM['firme']['tp_48'],
  1892.             'prestations' =>  $firmeCRM['prestations'],
  1893.             'produits' =>  $produits,
  1894.             'marques' =>  $marques,
  1895.             'horaires' => json_encode$firmeCRM['horaires'])
  1896.         ];
  1897.         // dd($firmeCRM);
  1898.         // lesdonnées nouvelles (après modification)
  1899.         $newDataFirme = [
  1900.             'raison_social' => $raison_social,
  1901.             'nature' => $nature,       
  1902.             'rubriques' =>  $rubriques,            
  1903.             'description_rub' =>  $description_rub,
  1904.             'prestations' => $prestations,     
  1905.             'produits' =>  $produits
  1906.             'marques' => $marques,       
  1907.             'horaires' =>  $horaires,
  1908.         ];
  1909.         $this->ModificationLoggerService->logDifferences(
  1910.             'BD_EDICOM',
  1911.             'updatedata',              
  1912.             'up_firme',        
  1913.             $oldDataFirme,
  1914.             $newDataFirme,
  1915.             $codeFirme,
  1916.             null
  1917.             'UPDATE'
  1918.         );
  1919.         // dd($oldDataFirme,$newDataFirme);
  1920.         //up_localisations
  1921.         $adresse $request->request->get('field3');
  1922.         $code_ville $request->request->get('field4');
  1923.         $nom_ville $this->firmeService->getNomVille($code_ville);
  1924.         $code_quartier $request->request->get('field5');
  1925.         $nom_quartier $this->firmeService->getNomQuartier($code_quartier);
  1926.         $code_postal $request->request->get('field6');
  1927.         $longitude $request->request->get('field11');
  1928.         $latitude $request->request->get('field12');
  1929.         if (trim($adresse) !== '' || trim($code_ville) !== '' || trim($nom_ville) !== '' || trim($code_quartier) !== '' || trim($nom_quartier) !== '' || trim($code_postal) !== '' || trim($longitude) !== '' || trim($latitude) !== '')
  1930.         {
  1931.             if ($localisation) {
  1932.                 $this->firmeService->updateLocalisation(null,$codeFirme$adresse$code_ville$nom_ville$code_quartier$nom_quartier$code_postal$longitude$latitude);
  1933.             } else {
  1934.                 $this->firmeService->insererLocalisation(null,$codeFirme$adresse$code_ville$nom_ville$code_quartier$nom_quartier$code_postal$longitude$latitude);
  1935.             }
  1936.         }
  1937.         // les données anciennes
  1938.         $oldDataLocalisation = [
  1939.             'adresse' => $firmeCRM['firme']['num_voie'] . ' ' $firmeCRM['firme']['lib_voie'] . ' ' $firmeCRM['firme']['comp_voie'] . '' $firmeCRM['firme']['ville'] . ' - Maroc',
  1940.             'code_ville' => $firmeCRM['firme']['code_ville'],       
  1941.             'ville' =>  $firmeCRM['firme']['ville'],            
  1942.             'code_quartier' =>  $firmeCRM['firme']['code_quart'],
  1943.             'quartier' => $firmeCRM['firme']['quartier'],     
  1944.             'code_postal' =>  $firmeCRM['firme']['code_postal'], 
  1945.             'longitude' => $firmeCRM['firme']['longitude'],       
  1946.             'latitude' =>  $firmeCRM['firme']['latitude'],
  1947.         ];
  1948.         // dd($firmeCRM);
  1949.         // lesdonnées nouvelles (après modification)
  1950.         $newDataLocalisation = [
  1951.             'adresse' => $adresse,
  1952.             'code_ville' => $code_ville,       
  1953.             'ville' =>  $nom_ville,            
  1954.             'code_quartier' =>  $code_quartier,
  1955.             'quartier' => $nom_quartier,     
  1956.             'code_postal' =>  $code_postal
  1957.             'longitude' => $longitude,       
  1958.             'latitude' =>  $latitude,
  1959.         ];
  1960.         // dd($oldDataLocalisation, $newDataLocalisation);
  1961.         $this->ModificationLoggerService->logDifferences(
  1962.             'BD_EDICOM',
  1963.             'updatedata',              
  1964.             'up_localisations',        
  1965.             $oldDataLocalisation,
  1966.             $newDataLocalisation,
  1967.             $codeFirme,
  1968.             null
  1969.             'UPDATE'
  1970.         );
  1971.         //up_coordonnées
  1972.         $telefone =  $this->filterJsonField($request->request->all('field7'));
  1973.         $portable =  $this->filterJsonField($request->request->all('field8'));
  1974.         $whatsapp =  $this->filterJsonField($request->request->all('wfield8'));
  1975.         $email =  $this->filterJsonField($request->request->all('field9'));
  1976.         $site_web =  $this->filterJsonField($request->request->all('field10'));
  1977.         $facebook =  $this->filterJsonField($request->request->all('facebook'));
  1978.         $instagram =  $this->filterJsonField($request->request->all('instagram'));
  1979.         $linkedin =  $this->filterJsonField($request->request->all('linkedin'));
  1980.         // Puis tu peux appeler ton service
  1981.         if ($telefone !== null || $portable !== null || $whatsapp !== null || $email !== null || $site_web !== null || $facebook !== null || $instagram !== null || $linkedin !== null) {
  1982.             if ($coordonnee) {
  1983.             $this->firmeService->updateCoordonnees(null,$codeFirme$telefone$portable$whatsapp$email$site_web$facebook$instagram$linkedin);
  1984.             } else {
  1985.                 $this->firmeService->insererCoordonnees(null,$codeFirme$telefone$portable$whatsapp$email$site_web$facebook$instagram$linkedin);
  1986.             }
  1987.         }
  1988.         // les données anciennes
  1989.         $oldDataCoordonnee = [
  1990.             'telefone' => $firmeCRM['telefones'] ?? [],
  1991.             'portable' => $firmeCRM['portables'] ?? [],
  1992.             'whatsapp' => $firmeCRM['whatsapps'] ?? [],            
  1993.             'email' => $firmeCRM['emails'] ?? [],
  1994.             'site_web' => $firmeCRM['sites'] ?? [],     
  1995.             'facebook' => $firmeCRM['reseaux_sociaux']['facebook'] ?? null
  1996.             'instagram' => $firmeCRM['reseaux_sociaux']['instagram'] ?? null,       
  1997.             'linkedin' => $firmeCRM['reseaux_sociaux']['linkedin'] ?? null,
  1998.         ];
  1999.         // lesdonnées nouvelles (après modification)
  2000.         $newDataCoordonnee = [
  2001.             'telefone' =>  $telefone,
  2002.             'portable' =>  $portable,       
  2003.             'whatsapp' =>  $whatsapp,            
  2004.             'email' =>  $email,
  2005.             'site_web' =>  $site_web,     
  2006.             'facebook' =>  $facebook
  2007.             'instagram' =>  $instagram,       
  2008.             'linkedin' =>  $linkedin,
  2009.         ];
  2010.         // Synchroniser les tableaux vides entre old et new
  2011.         foreach ($oldDataCoordonnee as $champ => $ancienneValeur) {
  2012.             // Si l’ancienne valeur est un tableau vide
  2013.             if (is_array($ancienneValeur) && empty($ancienneValeur)) {
  2014.                 $newDataCoordonnee[$champ] = [];
  2015.             }
  2016.             // // Si les deux sont des chaînes JSON vides ("[]")
  2017.             // if ($ancienneValeur === '[]') {
  2018.             //     $newDataCoordonnee[$champ] = '[]';
  2019.             // }
  2020.         }
  2021.                 // dd($oldDataCoordonnee, $newDataCoordonnee);
  2022.         $this->ModificationLoggerService->logDifferences(
  2023.             'BD_EDICOM',
  2024.             'updatedata',              
  2025.             'up_coordonnees',        
  2026.             $oldDataCoordonnee,
  2027.             $newDataCoordonnee,
  2028.             $codeFirme,
  2029.             null
  2030.             'UPDATE'
  2031.         );
  2032.         //up_juridiques
  2033.         $forme_juridique $request->request->get('field13');
  2034.         $annee_creation $request->request->get('field14');
  2035.         // dd($annee_creation);
  2036.         $effectif $request->request->get('field15');
  2037.         $ice $request->request->get('field17');
  2038.         $identifiant_fiscal $request->request->get('field18');
  2039.         $patente $request->request->get('field19');
  2040.         $capital $request->request->get('field16');
  2041.         $inp $request->request->get('PLfield31');
  2042.         $rc $request->request->get('field20');
  2043.         $ville_rc $request->request->get('field21');
  2044.         $effectif trim($effectif) !== '' ? (int)$effectif null;
  2045.         $capital trim($capital) !== '' ? (int)$capital null;
  2046.         $user_id null;
  2047.         // dd($forme_juridique);
  2048.         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) !== '') {
  2049.             if ($juridique) {
  2050.                 $this->firmeService->updateJuridiques$user_id,$codeFirme,$forme_juridique,$annee_creation,$effectif,$capital,$ice,null,$patente,$rc,$ville_rc,$identifiant_fiscal);
  2051.             } else {
  2052.                 $this->firmeService->insererJuridiques$user_id,$codeFirme,$forme_juridique,$annee_creation,$effectif,$capital,$ice,null,$patente,$rc,$ville_rc,$identifiant_fiscal);
  2053.             }
  2054.         }
  2055.         $effectif trim($effectif) !== '' ? (string)$effectif null;
  2056.         $capital trim($capital) !== '' ? (string)$capital null;
  2057.         $firmeCRM['firme']['date_creation'] = date('Y'strtotime($firmeCRM['firme']['date_creation']));
  2058.                 // les données anciennes
  2059.         $oldDataJuridique = [
  2060.             'annee_creation' =>$firmeCRM['firme']['date_creation'],
  2061.             'effectif' =>$firmeCRM['firme']['eff_max'],
  2062.             'ice' => $firmeCRM['firme']['ref_ann_leg'],            
  2063.             'inp' =>$firmeCRM['firme']['inp'],
  2064.             'identifiant_fiscal' =>$firmeCRM['firme']['ident_fisc'],
  2065.             'ville_rc' =>$firmeCRM['firme']['code_ville_rc'],  
  2066.             'rc' =>$firmeCRM['firme']['rc'],        
  2067.             'forme_juridique' =>$firmeCRM['firme']['code_forme_jur'], 
  2068.             'patente' => $firmeCRM['firme']['patente'],       
  2069.             'capital' =>  $firmeCRM['firme']['cap'],
  2070.         ];
  2071.         // lesdonnées nouvelles (après modification)
  2072.         $newDataJuridique = [
  2073.             'annee_creation' =>  $annee_creation,
  2074.             'effectif' =>  $effectif,       
  2075.             'ice' =>  $ice,            
  2076.             'inp' =>  $inp,
  2077.             'identifiant_fiscal' =>  $identifiant_fiscal,     
  2078.             'ville_rc' =>  $ville_rc
  2079.             'rc' =>  $rc,       
  2080.             'forme_juridique' =>  $forme_juridique,
  2081.             'patente' =>  $patente,
  2082.             'capital' =>  $capital,
  2083.         ];
  2084.         // dd($oldDataJuridique, $newDataJuridique);
  2085.         $this->ModificationLoggerService->logDifferences(
  2086.             'BD_EDICOM',
  2087.             'updatedata',              
  2088.             'up_juridiques',        
  2089.             $oldDataJuridique,
  2090.             $newDataJuridique,
  2091.             $codeFirme,
  2092.             null
  2093.             'UPDATE'
  2094.         );
  2095.         //up_finances
  2096.         // Nettoyage des champs
  2097.         $banques      $this->cleanValue($request->request->get('field34'));
  2098.         $zone_export  $this->cleanValue($request->request->get('field35'));
  2099.         $pourc_export $this->cleanValue($request->request->get('field36'));
  2100.         $annee_ca $this->cleanValue($request->request->get('field32', []));
  2101.         $gamme_ca $this->cleanValue($request->request->get('field33', []));
  2102.         // Forcer en tableau si ce n’est pas déjà un
  2103.         $annee_ca is_array($annee_ca) ? $annee_ca : [$annee_ca];
  2104.         $gamme_ca is_array($gamme_ca) ? $gamme_ca : [$gamme_ca];
  2105.         $anneesGammes = [];
  2106.         foreach ($annee_ca as $i => $annee) {
  2107.             if (!empty($annee) && isset($gamme_ca[$i]) && !empty($gamme_ca[$i])) {
  2108.                 $anneesGammes[] = [
  2109.                     'annee_ca' => $annee,
  2110.                     'gamme_ca' => $gamme_ca[$i],
  2111.                 ];
  2112.             }
  2113.         }
  2114.         // Insertion ou mise à jour si au moins un champ est renseigné
  2115.         if ($annee_ca !== null || $gamme_ca !== null || $banques !== null || $zone_export !== null || $pourc_export !== null) {
  2116.             if ($finance) {
  2117.                 $firmeService->updateFinances(null,$codeFirme$annee_ca$gamme_ca$banques$zone_export$pourc_export);
  2118.             } else {
  2119.                 $firmeService->insererFinances(null,$codeFirme$annee_ca$gamme_ca$banques$zone_export$pourc_export);
  2120.             }
  2121.         }
  2122.         $oldBanques $firmeCRM['banques'] ?? [];
  2123.         if (is_string($oldBanques)) {
  2124.             $decoded json_decode($oldBanquestrue);
  2125.             $oldBanques json_last_error() === JSON_ERROR_NONE $decoded : [$oldBanques];
  2126.         }
  2127.         $oldZones = [];
  2128.         $oldPourcentages = [];
  2129.         if (!empty($firmeCRM['exports'])) {
  2130.             foreach ($firmeCRM['exports'] as $exp) {
  2131.                 $oldZones[] = $exp['CODE_ZONE'] ?? null;
  2132.                 $oldPourcentages[] = $exp['TAUX'] ?? null;
  2133.             }
  2134.         }
  2135.         $oldAnnees = [];
  2136.         $oldGammes = [];
  2137.         if (!empty($firmeCRM['finances'])) {
  2138.             foreach ($firmeCRM['finances'] as $financeItem) {
  2139.                 $oldAnnees[] = $financeItem['ANNEE'] ?? null;
  2140.                 $oldGammes[] = $financeItem['CA'] ?? null;
  2141.             }
  2142.         }
  2143.         // --- Construction du tableau final cohérent ---
  2144.         $oldDataFinance = [
  2145.             'banques'     => $oldBanques,
  2146.             'zone_export' => $oldZones,
  2147.             'pourc_export'=> $oldPourcentages,
  2148.             'annee_ca'    => $oldAnnees,
  2149.             'gamme_ca'    => $oldGammes,
  2150.         ];
  2151.         $newDataFinance = [
  2152.             'banques' =>  $banques,
  2153.             'zone_export' =>  $zone_export,       
  2154.             'pourc_export' =>  $pourc_export,            
  2155.             'annee_ca' =>  $annee_ca,
  2156.             'gamme_ca' =>  $gamme_ca,     
  2157.         ];
  2158.                 // dd($firmeCRM,$newDataFinance);
  2159.         // Synchroniser les tableaux vides entre old et new
  2160.         // dd($oldDataFinance, $newDataFinance);
  2161.         $this->ModificationLoggerService->logDifferences(
  2162.             'BD_EDICOM',
  2163.             'updatedata',              
  2164.             'up_finances',        
  2165.             $oldDataFinance,
  2166.             $newDataFinance,
  2167.             $codeFirme,
  2168.             null
  2169.             'UPDATE'
  2170.         );
  2171.         //up_dirigeants
  2172.         $noms $request->request->get('field22', []);
  2173.         $prenoms $request->request->get('field23', []);
  2174.         $civilites $request->request->get('civilite', []);
  2175.         $fonctionCodes $request->request->get('field24', []);
  2176.         $portables $request->request->get('field25', []);
  2177.         $whatsapps $request->request->get('whatsappd', []);
  2178.         $emails $request->request->get('emaild', []);
  2179.         $ids $request->request->get('id', []);
  2180.         $deletedRaw $request->request->get('deleted_dirigeants''');
  2181.         // Convertir en tableau
  2182.         $deletedIds = [];
  2183.         if (is_string($deletedRaw) && $deletedRaw !== '') {
  2184.             $deletedIds explode(','$deletedRaw);
  2185.         }
  2186.         // dd($deletedIds); // Vérifier si on reçoit bien les IDs supprimés
  2187.         // Supprimer les dirigeants supprimés
  2188.         if (!empty($deletedIds)) {
  2189.             $firmeService->supprimerDirigeants($deletedIds);
  2190.         }
  2191.         $userId null;
  2192.         // Synchroniser les autres (insert/update)
  2193.         $this->firmeService->synchroniserDirigeants($ids$noms$prenoms$civilites$fonctionCodes$portables$whatsapps$emails$codeFirme$userId);
  2194.         $dirigeantsCRM $firmeCRM['dirigeants'];
  2195.         // dd($dirigeantsCRM);
  2196.         // Table de correspondance code → civilité
  2197.         $codeToCivilite = [
  2198.             '01' => 'M',
  2199.             '02' => 'Mme',
  2200.             '04' => 'Dr',
  2201.             '18' => 'Pr',
  2202.         ];
  2203.         // =========================
  2204.         // Anciennes données (depuis CRM)
  2205.         // =========================
  2206. // ============================
  2207. // 🧩 Préparation des anciennes données (depuis le CRM)
  2208. // ============================
  2209. $oldDataDirigeant = [];
  2210. foreach ($dirigeantsCRM as $dir) {
  2211.     $civilite $dir['civilite'] ?? '';
  2212.     // 🔹 Traduction du code vers texte si nécessaire
  2213.     if (isset($codeToCivilite[$civilite])) {
  2214.         $civilite $codeToCivilite[$civilite];
  2215.     }
  2216.     $row = [
  2217.         'civilite' => $civilite,
  2218.         'nom' => trim($dir['nom'] ?? ''),
  2219.         'prenom' => trim($dir['prenom'] ?? ''),
  2220.         'fonction' => trim($dir['code_fonction'] ?? ''),
  2221.         'portable' => json_encode(array_filter([$dir['tel_1'] ?? ''$dir['tel_2'] ?? '']), JSON_UNESCAPED_UNICODE),
  2222.         'whatsapp' => ''// champ inexistant côté CRM
  2223.         'email' => trim($dir['email'] ?? ''),
  2224.     ];
  2225.     // ✅ Clé unique : nom_prenom_email
  2226.     $key strtolower(trim(($row['nom'] ?? '') . '_' . ($row['prenom'] ?? '') . '_' . ($row['email'] ?? '')));
  2227.     $oldDataDirigeant[$key] = $row;
  2228. }
  2229. // ============================
  2230. // 🧩 Préparation des nouvelles données (formulaire soumis)
  2231. // ============================
  2232. $newDataDirigeant = [];
  2233. for ($i 0$i count($noms); $i++) {
  2234.     $portableValue $portables[$i] ?? '';
  2235.     if (is_array($portableValue)) {
  2236.         $portableValue json_encode(array_map('trim'$portableValue), JSON_UNESCAPED_UNICODE);
  2237.     } else {
  2238.         $portableValue trim($portableValue);
  2239.     }
  2240.     $row = [
  2241.         'civilite' => trim($civilites[$i] ?? ''),
  2242.         'nom' => trim($noms[$i] ?? ''),
  2243.         'prenom' => trim($prenoms[$i] ?? ''),
  2244.         'fonction' => trim($fonctionCodes[$i] ?? ''),
  2245.         'portable' => $portableValue,
  2246.         'whatsapp' => trim($whatsapps[$i] ?? ''),
  2247.         'email' => trim($emails[$i] ?? ''),
  2248.     ];
  2249.     // ✅ Même clé unique
  2250.     $key strtolower(trim(($row['nom'] ?? '') . '_' . ($row['prenom'] ?? '') . '_' . ($row['email'] ?? '')));
  2251.     $newDataDirigeant[$key] = $row;
  2252. }
  2253. // ============================
  2254. // 🧠 Journalisation (comparaison des deux tableaux)
  2255. // ============================
  2256. $this->ModificationLoggerService->logComplexeDifferences(
  2257.     'BD_EDICOM',
  2258.     'updatedata',
  2259.     'up_dirigeants',
  2260.     $oldDataDirigeant,
  2261.     $newDataDirigeant,
  2262.     $codeFirme,
  2263.     $userId,
  2264.     'UPDATE'
  2265. );
  2266.         // up_certifications
  2267.         // Récupération des champs du formulaire
  2268.         $certification      $request->request->get('certification');
  2269.         $organisme          $request->request->get('organisme');
  2270.         $type               $request->request->get('type_certification');
  2271.         $produit            $request->request->get('produit_certification');
  2272.         $date_expiration    $request->request->get('date_expiration');
  2273.         // Vérifier s’il y a une certification existante pour ce code_firme
  2274.         $certificationExist $this->firmeService->getCertificationByFirme($codeFirme);
  2275.         // dd($certificationExist);
  2276.         // Vérifier s'il y a des données remplies
  2277.         if (
  2278.             trim($certification) !== '' || trim($organisme) !== '' ||
  2279.             trim($type) !== '' || trim($produit) !== '' || trim($date_expiration) !== ''
  2280.         ) {
  2281.             if ($certificationExist) {
  2282.                 // faire update
  2283.                 $this->firmeService->updateCertification(
  2284.                     null,
  2285.                     $codeFirme,
  2286.                     $certification,
  2287.                     $organisme,
  2288.                     $type,
  2289.                     $produit,
  2290.                     $date_expiration
  2291.                 );
  2292.             } else {
  2293.                 // faire insert
  2294.                 $this->firmeService->insererCertification(
  2295.                     null,
  2296.                     $codeFirme,
  2297.                     $certification,
  2298.                     $organisme,
  2299.                     $type,
  2300.                     $produit,
  2301.                     $date_expiration
  2302.                 );
  2303.             }
  2304.         }
  2305.         $certifications $firmeCRM['certifications'] ?? [];
  2306.         $oldDataCertification = [
  2307.             'certification' => $certifications['CERTIFICATION'] ?? '',
  2308.             'organisme' => $certifications['AUT_CERTIFICATION'] ?? '',
  2309.             'type'=> $certifications['NUM_CERTIFICATION'] ?? '',
  2310.             'produit' => $certifications['PRODUIT'] ?? '',
  2311.             'date_expiration' => $certifications['CERT_EXPIRATION'] ?? '',
  2312.         ];
  2313.         $newDataCertification = [
  2314.             'certification'     => $certification,
  2315.             'organisme' => $organisme,
  2316.             'type'=> $type,
  2317.             'produit' => $produit,
  2318.             'date_expiration' => $date_expiration,
  2319.         ];
  2320.                 
  2321.         // dd($newDataCertification, $oldDataCertification);
  2322.         $this->ModificationLoggerService->logDifferences(
  2323.             'BD_EDICOM',
  2324.             'updatedata',              
  2325.             'up_certifications',        
  2326.             $oldDataCertification,
  2327.             $newDataCertification,
  2328.             $codeFirme,
  2329.             null
  2330.             'UPDATE'
  2331.         );
  2332.             $ficheCustomer =$this->firmeService->getFirmeByCodeCustomer($codeFirme);
  2333.             $natures =$this->rubriqueprestationService->getAllNatures();
  2334.             $villes =$this->localisationService->getAllVilles();
  2335.             $rubriques =$this->rubriqueprestationService->getAllRubriques();
  2336.             $fonctions =$this->rubriqueprestationService->getAllFonctions();
  2337.             $fichiers =$this->rubriqueprestationService->getAllProfLib();
  2338.             $formeJur =$this->rubriqueprestationService->getAllFormeJur();
  2339.             $gammeCA =$this->rubriqueprestationService->getAllGammeCA();
  2340.             $banques =$this->rubriqueprestationService->getAllBanques();
  2341.             $zonesExp $this->localisationService->getAllZonesExport();       
  2342.             $themes $this->produitKompassService->getThemes(); 
  2343.             $wproduits $this->produitKompassService->getLienProduitW13($codeFirme);
  2344.         $user $this->getUser();
  2345.         if (in_array('ROLE_ADMIN'$user->getRoles()) || in_array('ROLE_MODERATOR'$user->getRoles())) {
  2346.             return $this->redirectToRoute('fiches');
  2347.         } elseif (in_array('ROLE_CUSTOMER'$user->getRoles())) {
  2348.             return $this->render('customer/firme_up/home.html.twig', [
  2349.                 'firme' => $firme,
  2350.                 'codeFirme' => $codeFirme,               
  2351.     
  2352.             ]);
  2353.         }
  2354.     }
  2355. // /**
  2356. //  * @Route("/firmeUp/insert", name="insert_firmeUp", methods={"POST"})
  2357. //  */
  2358. // public function insertFirmeUp(Request $request, FirmeService $firmeService, FirmeUpService $firmeUpService): Response
  2359. // {
  2360. //     $user = $this->getUser();
  2361. //     if (!$user instanceof \App\Entity\User) {
  2362. //         $this->addFlash('error', 'Veuillez vous connecter.');
  2363. //         return $this->redirectToRoute('app_login');
  2364. //     }
  2365. //     $clientData = $request->request->all();
  2366. //     $codeFirme = $clientData['codeFirme'] ?? null;
  2367. //     // Appel du service principal
  2368. //     $firmeUpService->insertFirmeUp($clientData);
  2369. //     // Vérification du rôle utilisateur
  2370. //     if (in_array('ROLE_ADMIN', $user->getRoles()) || in_array('ROLE_MODERATOR', $user->getRoles())) {
  2371. //         return $this->redirectToRoute('fiches');
  2372. //     } elseif (in_array('ROLE_CUSTOMER', $user->getRoles())) {
  2373. //         $firme = $firmeService->getFirmeByCodeAdmin($codeFirme);
  2374. //         return $this->render('customer/firme_up/home.html.twig', [
  2375. //             'firme' => $firme,
  2376. //             'codeFirme' => $codeFirme,
  2377. //         ]);
  2378. //     }
  2379. //     return new JsonResponse(['status' => 'success']);
  2380. // }
  2381.     /**
  2382.      * @Route("/fiches", name="fiches")
  2383.      */
  2384.     public function toutesLesFiches(): Response
  2385.     {
  2386.         $user $this->getUser();
  2387.         if (!$user instanceof \App\Entity\User) {
  2388.             $this->addFlash('error''Veuillez vous connecter.');
  2389.             return $this->redirectToRoute('app_login');
  2390.         }
  2391.         $fiches $this->firmeService->getAllFirmes();
  2392.         // Décoder le JSON dans chaque fiche pour avoir un tableau de codes rubriques
  2393.         foreach ($fiches as &$fiche) {
  2394.             if (!empty($fiche['rubriques'])) {
  2395.                 $fiche['rubriques_decoded'] = json_decode($fiche['rubriques'], true); // tableau de codes rubriques
  2396.             } else {
  2397.                 $fiche['rubriques_decoded'] = [];
  2398.             }
  2399.         }
  2400.         // unset($fiche); // pour éviter effets secondaires
  2401.         // $fiche['actes'] = json_decode($fiche['actes'], true);
  2402.         // dd($fiche['actes']);
  2403.         // Récupération de la liste complète code => libellé rubriques
  2404.         $rubriquesRaw $this->rubriqueprestationService->getAllRubriques();
  2405.         $rubriques = [];
  2406.         foreach ($rubriquesRaw as $r) {
  2407.             $rubriques[$r['Code_Rubrique']] = $r['Lib_Rubrique'];
  2408.         }
  2409.         foreach ($fiches as &$fiche) {
  2410.             if (!empty($fiche['actes']) && is_string($fiche['actes'])) {
  2411.                 $decoded json_decode($fiche['actes'], true);
  2412.                 if (json_last_error() === JSON_ERROR_NONE && is_array($decoded)) {
  2413.                     $fiche['actes_decoded_array'] = $decoded;
  2414.                 } else {
  2415.                     $fiche['actes_decoded_array'] = [];
  2416.                 }
  2417.             } else {
  2418.                 $fiche['actes_decoded_array'] = [];
  2419.             }
  2420.         }
  2421.         // dd($fiches);
  2422.         $pageSubtitle 'Liste des fiches firmes';
  2423.         if (in_array('ROLE_ADMIN'$user->getRoles())) {
  2424.             return $this->render('admin/firme_up/list.html.twig', [
  2425.                 'pageSubtitle' => 'Liste des fiches firmes','rubriques' => $rubriques,
  2426.                 'fiches' => $fiches,                
  2427.                 'rubriques' => $rubriques,
  2428.             ]);
  2429.         } elseif (in_array('ROLE_MODERATOR'$user->getRoles())) {
  2430.             return $this->render('moderator/firme_up/list.html.twig', [
  2431.                 'pageSubtitle' => 'Liste des fiches firmes',
  2432.                 'fiches' => $fiches,
  2433.             ]);
  2434.         }
  2435.     }
  2436.     
  2437.     /**
  2438.      * @Route("/nonfiches", name="nonfiches")
  2439.      */
  2440.     public function toutesLesNonFiches(): Response
  2441.     {
  2442.         $fiches $this->firmeService->getAllNonFirmes();
  2443.         $user $this->getUser();
  2444.         if (!$user instanceof \App\Entity\User) {
  2445.             $this->addFlash('error''Veuillez vous connecter.');
  2446.             return $this->redirectToRoute('app_login');
  2447.         }
  2448.         $pageSubtitle 'Liste des fiches firmes';
  2449.             foreach ($fiches as &$fiche) {
  2450.                 if (!empty($fiche['rubriques'])) {
  2451.                     $fiche['rubriques_decoded'] = json_decode($fiche['rubriques'], true); // tableau de codes rubriques
  2452.                 } else {
  2453.                     $fiche['rubriques_decoded'] = [];
  2454.                 }
  2455.             }
  2456.         foreach ($fiches as &$fiche) {
  2457.             if (!empty($fiche['actes']) && is_string($fiche['actes'])) {
  2458.                 $decoded json_decode($fiche['actes'], true);
  2459.                 if (json_last_error() === JSON_ERROR_NONE && is_array($decoded)) {
  2460.                     $fiche['actes_decoded_array'] = $decoded;
  2461.                 } else {
  2462.                     $fiche['actes_decoded_array'] = [];
  2463.                 }
  2464.             } else {
  2465.                 $fiche['actes_decoded_array'] = [];
  2466.             }
  2467.         }
  2468.         if (in_array('ROLE_ADMIN'$user->getRoles())) {
  2469.             return $this->render('admin/nonFirme_up/list.html.twig', [
  2470.                 'pageSubtitle' => 'Liste des fiches non firmes',
  2471.                 'fiches' => $fiches,
  2472.             ]);
  2473.         } elseif (in_array('ROLE_MODERATOR'$user->getRoles())) {
  2474.             return $this->render('moderator/nonFirme_up/list.html.twig', [
  2475.                 'pageSubtitle' => 'Liste des fiches non firmes',
  2476.                 'fiches' => $fiches,
  2477.             ]);
  2478.         }
  2479.     }
  2480.     /**
  2481.      * @Route("/firme/delete/{codeFirme}", name="app_firme_delete")
  2482.      */
  2483.     public function deleteFirme(Request $requeststring $codeFirme): Response
  2484.     {
  2485.         $user $this->getUser();
  2486.         if (!$user) {
  2487.             $this->addFlash('error''Veuillez vous connecter.');
  2488.             return $this->redirectToRoute('app_login');
  2489.         }
  2490.         $roles $user->getRoles();
  2491.         if (!in_array('ROLE_ADMIN'$roles) && !in_array('ROLE_MODERATOR'$roles)) {
  2492.             $this->addFlash('error''Accès interdit.');
  2493.             return $this->redirectToRoute('lu');
  2494.         }
  2495.         try {
  2496.             $this->firmeService->deleteFirme($codeFirme);
  2497.             $this->addFlash('success''Fiche supprimée avec succès.');
  2498.         } catch (\Exception $e) {
  2499.             $this->addFlash('error''Erreur lors de la suppression de la fiche.');
  2500.         }
  2501.         return $this->redirectToRoute('fiches');
  2502.     }
  2503.     /**
  2504.      * @Route("/nonFirme/delete/{userId}", name="app_nonFirme_delete")
  2505.      */
  2506.     public function deleteNonFirme(Request $requeststring $userIdFirmeService $firmeService): Response
  2507.     {
  2508.         $user $this->getUser();
  2509.         $firme $firmeService->getFirmeByUserId($userId);
  2510.         if (!$user) {
  2511.             $this->addFlash('error''Veuillez vous connecter.');
  2512.             return $this->redirectToRoute('app_login');
  2513.         }
  2514.         $roles $user->getRoles();
  2515.         if (!in_array('ROLE_ADMIN'$roles) && !in_array('ROLE_MODERATOR'$roles)) {
  2516.             $this->addFlash('error''Accès interdit.');
  2517.             return $this->redirectToRoute('app_customer');
  2518.         }
  2519.         try {
  2520.             $this->firmeService->deleteNonFirme($userId);
  2521.             $this->addFlash('success''Fiche supprimée avec succès.');
  2522.         } catch (\Exception $e) {
  2523.             $this->addFlash('error''Erreur lors de la suppression de la fiche.');
  2524.         }
  2525.         return $this->redirectToRoute('nonfiches');
  2526.     }
  2527.     /**
  2528.      * @Route("/api/quartiers/{codeVille}", name="api_quartiers")
  2529.      */
  2530.     public function getQuartiers(string $codeVille): JsonResponse
  2531.     {
  2532.         $quartiers $this->localisationService->getQuartiersByVille($codeVille);
  2533.         return $this->json($quartiers);
  2534.     }
  2535.     /**
  2536.      * @Route("/api/code-postal/{codeQuartier}", name="api_code_postal")
  2537.      */
  2538.     public function getCodePostale(string $codeQuartier): JsonResponse
  2539.     {
  2540.         // dd($codeQuartier);
  2541.         $codePostale $this->localisationService->getCodePostalByQuartier($codeQuartier);
  2542.         return $this->json($codePostale);
  2543.     }
  2544.     
  2545.     /**
  2546.      * @Route("/rebrique/productSearch", name="app_reb_productSearch")
  2547.      */
  2548.     public function productSearch(Request $requestProduitKompassService $rebriqueService): Response
  2549.     {  
  2550.       $product $request->get('product');
  2551.      return  $this->json($rebriqueService->produitWSearch($product));
  2552.        
  2553.     }
  2554.     
  2555.     
  2556.     /**
  2557.      * @Route("/rebrique/productKompassSearch", name="app_kompass_productSearch")
  2558.      */
  2559.     public function productKompassSearch(Request $requestProduitKompassService $rebriqueService): Response
  2560.     {  
  2561.       $product $request->get('product');
  2562.      return  $this->json($rebriqueService->productKompassSearch($product));
  2563.        
  2564.     }
  2565.      /**
  2566.      * @Route("/rebrique/secteurs", name="app_reb_secteurs")
  2567.      */
  2568.     public function getSecteurs(Request $requestProduitKompassService $rebriqueService): Response
  2569.     {  
  2570.       $codeTheme $request->get('codeTheme');
  2571.       $codeSecteur $request->get('codeSecteur');
  2572.       $codeBranch $request->get('codeBranch');
  2573.       if($codeTheme){
  2574.         return  $this->json($rebriqueService->getSecteur($codeTheme));
  2575.       }
  2576.       else if($codeBranch){
  2577.         return  $this->json($rebriqueService->getProductBranches($codeBranch));
  2578.       } else{
  2579.         return  $this->json($rebriqueService->getBranches($codeSecteur));
  2580.       }
  2581.      
  2582.     }
  2583.     /**
  2584.      * @Route("/firme/wproduitAjouter", name="app_wproduitAjouter")
  2585.      */
  2586.     // public function wproduitAjouter(Request $request, ProduitKompassService $firmesService): Response
  2587.     // {  
  2588.     //    $productsData = json_decode($request->get('productsData'), true);
  2589.     //   $product = $firmesService->wproduitAjouter($productsData);
  2590.     //  return  $this->json('');
  2591.        
  2592.     // }
  2593.     /**
  2594.      * @Route("/firme/wproduitAjouter", name="wproduit_ajouter", methods={"POST"})
  2595.      */
  2596.         public function wproduitAjouter(Request $requestProduitKompassService $ProduitKompassService): JsonResponse
  2597.     {
  2598.         $json $request->request->get('productsData');
  2599.         $productsData json_decode($jsontrue);
  2600.         //  dd($productsData);
  2601.         if (!is_array($productsData)) {
  2602.             return new JsonResponse(['status' => 'error''message' => 'Format de données invalide'], 400);
  2603.         }
  2604.         $userId null;
  2605.         $success $ProduitKompassService->wproduitAjouter($productsData$userId);
  2606.         return new JsonResponse(['status' => $success 'ok' 'error']);
  2607.     }
  2608.     /**
  2609.      * @Route("/firme/wproduitSupprimer", name="app_wproduitSupprimer", methods={"POST"})
  2610.      */
  2611.     public function wproduitSupprimer(Request $requestProduitKompassService $firmesService): Response
  2612.     {
  2613.         // Récupérer les IDs envoyés en JSON
  2614.         $productsData json_decode($request->getContent(), true);
  2615.         if (empty($productsData)) {
  2616.             return $this->json(['error' => 'Aucun produit sélectionné pour suppression.'], 400);
  2617.         }
  2618.         $result $firmesService->wproduitSupprimer($productsData);
  2619.         if ($result) {
  2620.             return $this->json(['success' => 'Produits supprimés avec succès.']);
  2621.         }
  2622.         return $this->json(['error' => 'Erreur lors de la suppression.'], 500);
  2623.     }
  2624. /**
  2625.  * @Route("/firme/wproduitAjouterUserId", name="wproduit_ajouter_user", methods={"POST"})
  2626.  */
  2627. public function wproduitAjouterUserId(Request $requestProduitKompassService $ProduitKompassService): JsonResponse
  2628. {
  2629.     // Récupération de toutes les données envoyées par AJAX
  2630.     $json $request->request->all();
  2631.     // Récupération du tableau JSON des produits
  2632.     $productsData json_decode($json['productsData'] ?? '[]'true);
  2633.     // Récupération du user_id envoyé
  2634.     $userId $json['user_id'] ?? null;
  2635.     // Appel du service avec le userId
  2636.     $success $ProduitKompassService->wproduitAjouterUserId($productsData$userId);
  2637.     return new JsonResponse(['status' => $success 'ok' 'error']);
  2638. }
  2639.     
  2640.     /**
  2641.      * @Route("/firme/wproduitSupprimerUser", name="app_wproduitSupprimerUser", methods={"POST"})
  2642.      */
  2643.     public function wproduitSupprimerUser(Request $requestProduitKompassService $firmesService): Response
  2644.     {
  2645.         // Récupérer les IDs envoyés en JSON
  2646.         $productsData json_decode($request->getContent(), true);
  2647.         if (empty($productsData)) {
  2648.             return $this->json(['error' => 'Aucun produit sélectionné pour suppression.'], 400);
  2649.         }
  2650.         $result $firmesService->wproduitSupprimerUser($productsData);
  2651.         if ($result) {
  2652.             return $this->json(['success' => 'Produits supprimés avec succès.']);
  2653.         }
  2654.         return $this->json(['error' => 'Erreur lors de la suppression.'], 500);
  2655.     }
  2656.     /**
  2657.      * @Route("/reload-table", name="reload_table", methods={"GET"})
  2658.      */
  2659.         public function reloadTable(Request $requestProduitKompassService $firmesService): Response
  2660.     {
  2661.         $codeFirme $request->query->get('codeFirme');
  2662.         // dd($codeFirme);
  2663.         $wproduits $firmesService->getLienProduitW13($codeFirme);
  2664.         return new JsonResponse($wproduits);
  2665.    }
  2666.    /**
  2667.      * @Route("/reload-usertable", name="reload_user_table", methods={"GET"})
  2668.      */
  2669.     public function reloadUserTable(Request $requestProduitKompassService $firmesService): Response
  2670.     {
  2671.         // Récupérer le userId envoyé en GET
  2672.         $userId $request->query->get('userId');
  2673.         if (!$userId) {
  2674.             return new JsonResponse(['error' => 'userId manquant'], 400);
  2675.         }
  2676.         // Appel au service pour récupérer les produits liés à cet utilisateur
  2677.         $wproduits $firmesService->getLienProduitW13ByUserId($userId);
  2678.         return new JsonResponse($wproduits);
  2679.     }
  2680.        /**
  2681.      * @Route("/reload-kompasstable", name="reload_kompasstable", methods={"GET"})
  2682.      */
  2683.         public function reloadKompassTable(Request $requestProduitKompassService $firmesService): Response
  2684.     {
  2685.         $codeFirme $request->query->get('codeFirme');
  2686.         // dd($codeFirme);
  2687.         $kproduits $firmesService->getProduitsKompass($codeFirme);
  2688.         return new JsonResponse($kproduits);
  2689.    }
  2690.    
  2691.        /**
  2692.      * @Route("/reload-userkompasstable", name="reload_user_kompasstable", methods={"GET"})
  2693.      */
  2694.         public function reloadUserKompassTable(Request $requestProduitKompassService $firmesService): Response
  2695.     {
  2696.         $userId $request->query->get('userId'); // 🔹 on récupère bien "userId"
  2697.         $kproduits $firmesService->getProduitsKompassUserId($userId);
  2698.         return new JsonResponse($kproduits);
  2699.    }
  2700.     /**
  2701.      * @Route("/firme/kproduitAjouter", name="kproduit_ajouter", methods={"POST"})
  2702.      */
  2703.     public function kproduitAjouter(Request $requestProduitKompassService $produitKompassService): JsonResponse
  2704.     {
  2705.         $productsData json_decode($request->request->get('productsData'), true);
  2706.         // dd($productsData);
  2707.         if (!is_array($productsData)) {
  2708.             return new JsonResponse(['status' => 'error''message' => 'Format de données invalide'], 400);
  2709.         }
  2710.         $userId null;
  2711.         $success $produitKompassService->kproduitAjouter($productsData$userId);
  2712.         // dd($success);
  2713.         return new JsonResponse(['status' => $success 'ok' 'error']);
  2714.     }
  2715.     /**
  2716.      * @Route("/firme/kproduitSupprimer", name="app_kproduitSupprimer", methods={"POST"})
  2717.      */
  2718.     public function kproduitSupprimer(Request $requestProduitKompassService $firmesService): Response
  2719.     {
  2720.         // Récupérer les IDs envoyés en JSON
  2721.         $productsData json_decode($request->getContent(), true);
  2722.         // dd($productsData);
  2723.         if (empty($productsData)) {
  2724.             return $this->json(['error' => 'Aucun produit sélectionné pour suppression.'], 400);
  2725.         }
  2726.         $result $firmesService->kproduitSupprimer($productsData);
  2727.         if ($result) {
  2728.             return $this->json(['success' => 'Produits supprimés avec succès.']);
  2729.         }
  2730.         return $this->json(['error' => 'Erreur lors de la suppression.'], 500);
  2731.     }
  2732. /**
  2733.  * @Route("/firme/kproduitAjouterUserId", name="kproduit_ajouter_user", methods={"POST"})
  2734.  */
  2735. public function kproduitAjouterUserId(Request $requestProduitKompassService $ProduitKompassService): JsonResponse
  2736. {
  2737.     // Récupération de toutes les données envoyées par AJAX
  2738.     $json $request->request->all();
  2739.     // Récupération du tableau JSON des produits
  2740.     $productsData json_decode($json['productsData'] ?? '[]'true);
  2741.     // Récupération du user_id envoyé
  2742.     $userId $json['user_id'] ?? null;
  2743.     // Appel du service avec le userId
  2744.     $success $ProduitKompassService->kproduitAjouterUserId($productsData$userId);
  2745.     return new JsonResponse(['status' => $success 'ok' 'error']);
  2746. }
  2747.     
  2748.     /**
  2749.      * @Route("/firme/kproduitSupprimerUser", name="app_kproduitSupprimerUser", methods={"POST"})
  2750.      */
  2751.     public function kproduitSupprimerUser(Request $requestProduitKompassService $firmesService): Response
  2752.     {
  2753.         // Récupérer les IDs envoyés en JSON
  2754.         $productsData json_decode($request->getContent(), true);
  2755.         if (empty($productsData)) {
  2756.             return $this->json(['error' => 'Aucun produit sélectionné pour suppression.'], 400);
  2757.         }
  2758.         $result $firmesService->wproduitSupprimerUser($productsData);
  2759.         if ($result) {
  2760.             return $this->json(['success' => 'Produits supprimés avec succès.']);
  2761.         }
  2762.         return $this->json(['error' => 'Erreur lors de la suppression.'], 500);
  2763.     }
  2764.     // /**
  2765.     //  * @Route("/fiche/{id}/details", name="fiche_details")
  2766.     //  */
  2767.     // public function ficheDetails($id): Response
  2768.     // {
  2769.     //     // Récupérer la fiche depuis la base de données
  2770.     //     $fiche = $this->firmeService->getFicheFirmeById($id);
  2771.     //     if (!$fiche) {
  2772.     //         throw $this->createNotFoundException('Fiche non trouvée');
  2773.     //     }
  2774.     //     return $this->render('fiche/details.html.twig', [
  2775.     //         'fiche' => $fiche,
  2776.     //     ]);
  2777.     // }
  2778.     /**
  2779.      * @Route("/nonFirmePL/up/{userId}", name="details_non_profession_lib")
  2780.      */
  2781.     public function nonFirmeUpPLDetails(int $userIdFirmeService $firmeService): Response
  2782.     {   
  2783.         // dd($userId);
  2784.         $user $this->getUser();
  2785.         if (
  2786.             !$user instanceof \App\Entity\User &&
  2787.             !$user instanceof \App\Entity\UserRegistration
  2788.         ) {
  2789.             $this->addFlash('error''Veuillez vous connecter.');
  2790.             return $this->redirectToRoute('app_login');
  2791.         }
  2792.         $pageSubtitle 'Fiche client';
  2793.         $firme $firmeService->getFirmeByUserId($userId);
  2794.         if ($firme) {
  2795.             $firme['horaires'] = json_decode($firme['horaires'] ?? '[]'true);
  2796.             $firme['pause'] = json_decode($firme['pause'] ?? '[]'true);
  2797.             $firme['rubriques'] = json_decode($firme['rubriques'] ?? '[]'true);
  2798.             $firme['prestations'] = json_decode($firme['prestations'] ?? '[]'true);
  2799.             $firme['produits'] = json_decode($firme['produits'] ?? '[]'true);
  2800.             $firme['marques'] = json_decode($firme['marques'] ?? '[]'true);
  2801.             $firme['actes'] = json_decode($firme['actes'] ?? '[]'true);
  2802.             $firme['activite'] = $firme['activite'] ?? '';
  2803.         } else {
  2804.             // Par exemple, on passe un tableau vide au template
  2805.             $firme = [
  2806.                 'horaires' => [],
  2807.                 'pause' => [],
  2808.                 'rubriques' => [],
  2809.                 'prestations' => [],
  2810.                 'produits' => [],
  2811.                 'marques' => [],
  2812.                 'actes' => [],
  2813.                 'activite' => '',
  2814.             ];
  2815.         }
  2816.         $localisation $firmeService->getLocalisationByUserId($userId); 
  2817.         $coordonnee $firmeService->getCoordonneeByUserId($userId); 
  2818.         $juridique $firmeService->getJuridiqueByUserId($userId);
  2819.         $finance $firmeService->getFinanceByUserId($userId);
  2820.         $dirigeants $firmeService->getDirigeantsByUserId($userId);
  2821.         $certification $firmeService->getCertificationByUserId($userId);
  2822.         $anneesCA json_decode($finance['annee_ca'] ?? '[]'true);        
  2823.         rsort($anneesCASORT_NUMERIC);
  2824.         $gammesCA json_decode($finance['gamme_ca'] ?? '[]'true);
  2825.         $zoneExport json_decode($finance['zone_export'] ?? '[]'true);
  2826.         $pourcExport json_decode($finance['pourc_export'] ?? '[]'true); 
  2827.         $anneesGammes = [];
  2828.         foreach ($anneesCA as $index => $annee) {
  2829.             $anneesGammes[] = [
  2830.                 'annee_ca' => $annee,
  2831.                 'gamme_ca' => $gammesCA[$index] ?? null
  2832.             ];
  2833.         }
  2834.         $zonesExportList = [];
  2835.         foreach ($zoneExport as $index => $zone) {
  2836.             $zonesExportList[] = [
  2837.                 'zone' => $zone,
  2838.                 'pourcentage' => $pourcExport[$index] ?? null
  2839.             ];
  2840.         }
  2841.         // dd($juridique,$finance);
  2842.         if ($coordonnee) {
  2843.             $coordonnee['telefone']   = json_decode($coordonnee['telefone'] ?? '[]'true);
  2844.             $coordonnee['portable']   = json_decode($coordonnee['portable'] ?? '[]'true);
  2845.             $coordonnee['whatsapp']   = json_decode($coordonnee['whatsapp'] ?? '[]'true);
  2846.             $coordonnee['email']      = json_decode($coordonnee['email'] ?? '[]'true);
  2847.             $coordonnee['site_web']   = json_decode($coordonnee['site_web'] ?? '[]'true);
  2848.             $coordonnee['facebook']   = json_decode($coordonnee['facebook'] ?? '[]'true);
  2849.             $coordonnee['instagram']  = json_decode($coordonnee['instagram'] ?? '[]'true);
  2850.             $coordonnee['linkedin']   = json_decode($coordonnee['linkedin'] ?? '[]'true);
  2851.         } else {
  2852.             // On initialise à vide pour éviter toute erreur dans le template
  2853.             $coordonnee = [
  2854.                 'telefone' => [],
  2855.                 'portable' => [],
  2856.                 'whatsapp' => [],
  2857.                 'email' => [],
  2858.                 'site_web' => [],
  2859.                 'facebook' => [],
  2860.                 'instagram' => [],
  2861.                 'linkedin' => [],
  2862.             ];
  2863.         }
  2864.         $villes =$this->localisationService->getAllVilles();
  2865.         $rubriques =$this->rubriqueprestationService->getAllRubriques();
  2866.         $fonctions =$this->rubriqueprestationService->getAllFonctions();
  2867.         $natures =$this->rubriqueprestationService->getAllNatures();
  2868.         $fichiers =$this->rubriqueprestationService->getAllProfLib();
  2869.         $formeJur =$this->rubriqueprestationService->getAllFormeJur();
  2870.         $gammeCA =$this->rubriqueprestationService->getAllGammeCA();
  2871.         $banques =$this->rubriqueprestationService->getAllBanques();
  2872.         $zonesExp $this->localisationService->getAllZonesExport();       
  2873.         $themes $this->produitKompassService->getThemes(); 
  2874.         // dd($ficheCustomer);
  2875.         return $this->render('admin/nonFirme_up/profession_lib.html.twig', [
  2876.             'villes' => $villes,
  2877.             'rubriques' => $rubriques,
  2878.             'fonctions' => $fonctions,
  2879.             'natures' => $natures,
  2880.             'fichiers' => $fichiers,
  2881.             'formeJur' =>  $formeJur,
  2882.             'banques' => $banques,                
  2883.             'zonesExp' => $zonesExp,
  2884.             'themes' => $themes,
  2885.             'firme' =>  $firme,
  2886.             'localisation' =>  $localisation,
  2887.             'coordonnee' =>  $coordonnee,
  2888.             'rubriques' =>  $rubriques,
  2889.             'juridique' =>  $juridique,
  2890.             'finance' =>  $finance,
  2891.             'pourcExport' => $pourcExport,
  2892.             'anneesGammes' => $anneesGammes,
  2893.             'gammeCA' => $gammeCA
  2894.             'zonesExportList' => $zonesExportList,
  2895.             'dirigeants' => $dirigeants,
  2896.             'certification' => $certification,
  2897.         ]);
  2898.     }
  2899.     
  2900.     /**
  2901.      * @Route("/DetailsNonFirme/up/{userId}", name="details_non_societe")
  2902.      */
  2903.     public function nonFirmeUpSocieteDetails(int $userIdFirmeService $firmeService): Response
  2904.     {   
  2905.         $pageSubtitle 'Fiche client';
  2906.         $user $this->getUser();
  2907.             if (
  2908.                 !$user instanceof \App\Entity\User &&
  2909.                 !$user instanceof \App\Entity\UserRegistration
  2910.             ) {
  2911.                 $this->addFlash('error''Veuillez vous connecter.');
  2912.                 return $this->redirectToRoute('app_login');
  2913.             }
  2914.         $firme $firmeService->getFirmeByUserId($userId);
  2915.         if ($firme) {
  2916.             $firme['horaires'] = json_decode($firme['horaires'] ?? '[]'true);
  2917.             $firme['pause'] = json_decode($firme['pause'] ?? '[]'true);
  2918.             $firme['rubriques'] = json_decode($firme['rubriques'] ?? '[]'true);
  2919.             $firme['prestations'] = json_decode($firme['prestations'] ?? '[]'true);
  2920.             $firme['produits'] = json_decode($firme['produits'] ?? '[]'true);
  2921.             $firme['marques'] = json_decode($firme['marques'] ?? '[]'true);
  2922.             $firme['actes'] = json_decode($firme['actes'] ?? '[]'true);
  2923.         } else {
  2924.             // Par exemple, on passe un tableau vide au template
  2925.             $firme = [
  2926.                 'horaires' => [],
  2927.                 'pause' => [],
  2928.                 'rubriques' => [],
  2929.                 'prestations' => [],
  2930.                 'produits' => [],
  2931.                 'marques' => [],
  2932.                 'actes' => [],
  2933.             ];
  2934.         }
  2935.         $localisation $firmeService->getLocalisationByUserId($userId); 
  2936.         $coordonnee $firmeService->getCoordonneeByUserId($userId); 
  2937.         $juridique $firmeService->getJuridiqueByUserId($userId);
  2938.         $finance $firmeService->getFinanceByUserId($userId);
  2939.         $dirigeants $firmeService->getDirigeantsByUserId($userId);
  2940.         $certification $firmeService->getCertificationByUserId($userId);
  2941.         $anneesCA json_decode($finance['annee_ca'] ?? '[]'true);
  2942.         rsort($anneesCASORT_NUMERIC);
  2943.         $gammesCA json_decode($finance['gamme_ca'] ?? '[]'true);
  2944.         $zoneExport json_decode($finance['zone_export'] ?? '[]'true);
  2945.         $pourcExport json_decode($finance['pourc_export'] ?? '[]'true); 
  2946.         $anneesGammes = [];
  2947.         foreach ($anneesCA as $index => $annee) {
  2948.             $anneesGammes[] = [
  2949.                 'annee_ca' => $annee,
  2950.                 'gamme_ca' => $gammesCA[$index] ?? null
  2951.             ];
  2952.         }
  2953.         $zonesExportList = [];
  2954.         foreach ($zoneExport as $index => $zone) {
  2955.             $zonesExportList[] = [
  2956.                 'zone' => $zone,
  2957.                 'pourcentage' => $pourcExport[$index] ?? null
  2958.             ];
  2959.         }
  2960.         // dd($juridique,$finance);
  2961.         if ($coordonnee) {
  2962.             $coordonnee['telefone']   = json_decode($coordonnee['telefone'] ?? '[]'true);
  2963.             $coordonnee['portable']   = json_decode($coordonnee['portable'] ?? '[]'true);
  2964.             $coordonnee['whatsapp']   = json_decode($coordonnee['whatsapp'] ?? '[]'true);
  2965.             $coordonnee['email']      = json_decode($coordonnee['email'] ?? '[]'true);
  2966.             $coordonnee['site_web']   = json_decode($coordonnee['site_web'] ?? '[]'true);
  2967.             $coordonnee['facebook']   = json_decode($coordonnee['facebook'] ?? '[]'true);
  2968.             $coordonnee['instagram']  = json_decode($coordonnee['instagram'] ?? '[]'true);
  2969.             $coordonnee['linkedin']   = json_decode($coordonnee['linkedin'] ?? '[]'true);
  2970.         } else {
  2971.             // On initialise à vide pour éviter toute erreur dans le template
  2972.             $coordonnee = [
  2973.                 'telefone' => [],
  2974.                 'portable' => [],
  2975.                 'whatsapp' => [],
  2976.                 'email' => [],
  2977.                 'site_web' => [],
  2978.                 'facebook' => [],
  2979.                 'instagram' => [],
  2980.                 'linkedin' => [],
  2981.             ];
  2982.         }
  2983.         $villes =$this->localisationService->getAllVilles();
  2984.         $rubriques =$this->rubriqueprestationService->getAllRubriques();
  2985.         $fonctions =$this->rubriqueprestationService->getAllFonctions();
  2986.         $natures =$this->rubriqueprestationService->getAllNatures();
  2987.         $fichiers =$this->rubriqueprestationService->getAllProfLib();
  2988.         $formeJur =$this->rubriqueprestationService->getAllFormeJur();
  2989.         $gammeCA =$this->rubriqueprestationService->getAllGammeCA();
  2990.         $banques =$this->rubriqueprestationService->getAllBanques();
  2991.         $zonesExp $this->localisationService->getAllZonesExport();       
  2992.         $themes $this->produitKompassService->getThemes(); 
  2993.         $codesProduits $firme['produits'] ?? [];
  2994.         // // Transformer les codes en tableau associatif code => libellé
  2995.         // $firme['produits'] = $this->rubriqueprestationService->getLibellesProduits($codesProduits);
  2996.         // $codesMarques = $firme['marques'] ?? [];
  2997.         // // Transformer les codes en tableau associatif code => libellé
  2998.         // $firme['marques'] = $this->rubriqueprestationService->getLibellesMarques($codesMarques);
  2999.         if (!empty($dirigeants) && is_array($dirigeants)) {
  3000.             foreach ($dirigeants as &$d) {
  3001.                 $p $d['portable'] ?? null;
  3002.                 if ($p && $p[0] === '[') {
  3003.                     $d['portables'] = json_decode($ptrue);
  3004.                 } elseif ($p) {
  3005.                     $d['portables'] = [$p];
  3006.                 } else {
  3007.                     $d['portables'] = [];
  3008.                 }
  3009.             }
  3010.         } else {
  3011.             $dirigeants = []; // tu initialises à un tableau vide pour éviter d'autres erreurs plus loin
  3012.         }
  3013.         $kompassProduits $this->produitKompassService->getProduitsKompassUserId($userId);
  3014.         $produits =$this->rubriqueprestationService->getAllProduits();
  3015.         $wproduits $this->produitKompassService->getLienProduitW13ByUserId($userId);
  3016.         // dd($ficheCustomer);
  3017.                 return $this->render('admin/nonFirme_up/societe.html.twig', [
  3018.                     'villes' => $villes,
  3019.                     'rubriques' => $rubriques,
  3020.                     'fonctions' => $fonctions,
  3021.                     'natures' => $natures,
  3022.                     'fichiers' => $fichiers,
  3023.                     'formeJur' =>  $formeJur,
  3024.                     'banques' => $banques,                
  3025.                     'zonesExp' => $zonesExp,
  3026.                     'themes' => $themes,
  3027.                     'firme' =>  $firme,
  3028.                     'localisation' =>  $localisation,
  3029.                     'coordonnee' =>  $coordonnee,
  3030.                     'rubriques' =>  $rubriques,
  3031.                     'juridique' =>  $juridique,
  3032.                     'finance' =>  $finance,
  3033.                     'pourcExport' => $pourcExport,
  3034.                     'anneesGammes' => $anneesGammes,
  3035.                     'gammeCA' => $gammeCA
  3036.                     'zonesExportList' => $zonesExportList,
  3037.                     'dirigeants' => $dirigeants,
  3038.                     'certification' => $certification,
  3039.                     'pageSubtitle' => 'Liste des fiches non firmes',
  3040.                     'firme' => $firme,                
  3041.                     'kompassProduits' => $kompassProduits
  3042.                     'produits' => $produits,                
  3043.                     'wproduits' => $wproduits,                
  3044.                 ]);
  3045.     }
  3046.     /**
  3047.      * @Route("/DetailsNonFirmeUp/insertDetails", name="insert_details_nonFirmeUp", methods={"POST"})
  3048.      */
  3049.     public function insertNonFirmeUpDetails(Request $request,FirmeService $firmeService): Response
  3050.     {         
  3051.         $user $this->getUser();
  3052.         if (!$user instanceof \App\Entity\UserRegistration) {
  3053.             $this->addFlash('error''Veuillez vous connecter.');
  3054.             return $this->redirectToRoute('app_login');
  3055.         }
  3056.         // Récupération de toutes les données
  3057.         $data $request->request->all();
  3058.          $userId $request->request->get('user_id');
  3059.         $wproduits $this->produitKompassService->getLienProduitW13ByUserId($userId);
  3060.         $firme $firmeService->getFirmeByUserId($userId); 
  3061.         $localisation $firmeService->getLocalisationByUserId($userId); 
  3062.         $coordonnee $firmeService->getCoordonneeByUserId($userId); 
  3063.         $finance $firmeService->getFinanceByUserId($userId); 
  3064.         // dd($firme);
  3065.         $juridique $firmeService->getJuridiqueByUserId($userId); 
  3066.         // dd($juridique);
  3067.         $dirigeants $firmeService->getDirigeantsByUserId($userId); 
  3068.          function isNotEmpty($value): bool {
  3069.             if (is_array($value)) {
  3070.                 foreach ($value as $v) {
  3071.                     if (trim((string)$v) !== '') {
  3072.                         return true;
  3073.                     }
  3074.                 }
  3075.                 return false;
  3076.             }
  3077.             return trim((string)$value) !== '';
  3078.         }
  3079.         // dd($data);
  3080.         $jours = ['lundi''mardi''mercredi''jeudi''vendredi''samedi''dimanche'];
  3081.         $horaires = [];
  3082.         foreach ($jours as $jour) {
  3083.             $isChecked $request->request->get('checkbox_' $jour);
  3084.             if ($isChecked) {
  3085.                 $start $request->request->get('start_' $jour);
  3086.                 $end $request->request->get('end_' $jour);
  3087.                 $horaires[$jour] = [
  3088.                     'actif' => true,
  3089.                     'start' => $start,
  3090.                     'end' => $end
  3091.                 ];
  3092.             } else {
  3093.                 $horaires[$jour] = [
  3094.                     'actif' => false,
  3095.                     'start' => null,
  3096.                     'end' => null
  3097.                 ];
  3098.             }
  3099.         }
  3100.         // ➕ Traitement cohérent pour la pause
  3101.         $pauseEnabled $request->request->get('pause_enabled'); // existe uniquement si cochée
  3102.         $pauseStart $request->request->get('pause_start');
  3103.         $pauseEnd $request->request->get('pause_end');
  3104.         $pause = [];
  3105.         if ($pauseEnabled) {
  3106.             $pause = [
  3107.                 'actif' => true,
  3108.                 'start' => $pauseStart,
  3109.                 'end' => $pauseEnd
  3110.             ];
  3111.         } else {
  3112.             $pause = [
  3113.                 'actif' => false,
  3114.                 'start' => null,
  3115.                 'end' => null
  3116.             ];
  3117.         }
  3118.         $horairesJson json_encode($horaires);
  3119.         $pauseJson json_encode($pause);
  3120.         $produits $request->request->get('field29');
  3121.         $positionsProduits $request->request->get('Prfield31');
  3122.         $marques $request->request->get('field30');
  3123.         $positionsMarques $request->request->get('field31');
  3124.         // Filtrer les produits avec valeurs non vides
  3125.         $produitsAvecPositions = [];
  3126.         if (!empty($produits) && is_array($produits)) {
  3127.             foreach ($produits as $index => $produit) {
  3128.                 if (trim($produit) !== '') {
  3129.                     $produitsAvecPositions[] = [
  3130.                         'produit' => $produit,
  3131.                         'position' => $positionsProduits[$index] ?? null
  3132.                     ];
  3133.                 }
  3134.             }
  3135.         }
  3136.         // // Filtrer les marques avec valeurs non vides
  3137.         $marquesAvecPositions = [];
  3138.         if (!empty($marques) && is_array($marques)) {
  3139.             foreach ($marques as $index => $marque) {
  3140.                 if (trim($produit) !== '') {
  3141.                     $marquesAvecPositions[] = [
  3142.                         'marque' => $marque,
  3143.                         'position' => $positionsMarques[$index] ?? null
  3144.                     ];
  3145.                 }
  3146.             }
  3147.         }
  3148.         //up_firme
  3149.         $raison_social $request->request->get('field1');
  3150.         $nature $request->request->get('field2');
  3151.         $horaires $horairesJson;
  3152.         $pause $pauseJson;
  3153.         $rubriques =  $this->filterJsonField($request->request->all('field26'));
  3154.         $prestations =  $this->filterJsonField($request->request->all('field28'));
  3155.         // Filtrer la description_rub
  3156.         $description_rub trim($request->request->get('field27') ?? '');
  3157.         $produits = !empty($produitsAvecPositions) ? json_encode($produitsAvecPositions) : null;
  3158.         $marques = !empty($marquesAvecPositions) ? json_encode($marquesAvecPositions) : null;
  3159.         // // Encodage final
  3160.         // $produits =  $this->filterJsonField($request->request->all('field29'));;
  3161.         // $marques =  $this->filterJsonField($request->request->all('field30'));;
  3162.         $validation $request->request->get('validation') ?? null;
  3163.         $date_creation = new \DateTime(); 
  3164.         $validation '1' ;
  3165.         $date_validation $validation === '1' ? new \DateTime() : null;
  3166.         $pl_or_societe "S";                
  3167.         $etat='C';
  3168.         if (trim($userId) !== '' || trim($raison_social) !== '' || trim($nature) !== '' || $horaires !== '[]' || $pause !== '[]' || $rubriques !== null ||$description_rub !== '' || $prestations !== null || !empty($produits) || !empty($marques)) 
  3169.         {
  3170.             if ($firme) {
  3171.                 $synchroniser ="0";
  3172.                 $this->firmeService->updateFirme(
  3173.                     $userId,null,
  3174.                     $raison_social,
  3175.                     $nature,
  3176.                     $horairesJson,
  3177.                     $pauseJson,
  3178.                     $rubriques,
  3179.                     $description_rub,
  3180.                     $prestations,
  3181.                     $produits,
  3182.                     $marques,
  3183.                     $validation,
  3184.                     $date_validation,
  3185.                     null// nom
  3186.                     null// prenom
  3187.                     null// actes
  3188.                     null// activite
  3189.                     null// description
  3190.                     $pl_or_societe,
  3191.                     $etat,
  3192.                     $synchroniser
  3193.                 );
  3194.             } else {
  3195.                 $synchroniser ="0";
  3196.                 $this->firmeService->insererFirme(
  3197.                     $userId,null,
  3198.                     $raison_social,
  3199.                     $nature,
  3200.                     $horairesJson,
  3201.                     $pauseJson,
  3202.                     $rubriques,
  3203.                     $description_rub,
  3204.                     $prestations,
  3205.                     $produits,
  3206.                     $marques,
  3207.                     $validation,
  3208.                     $date_validation,
  3209.                     $date_creation,
  3210.                     null,
  3211.                     null,
  3212.                     null,
  3213.                     null,
  3214.                     null,
  3215.                     $pl_or_societe,
  3216.                     $etat,
  3217.                     $synchroniser
  3218.                 );
  3219.             }        
  3220.         }
  3221.         //up_localisations
  3222.         $adresse $request->request->get('field3');
  3223.         $code_ville $request->request->get('field4');
  3224.         $nom_ville $this->firmeService->getNomVille($code_ville);
  3225.         $code_quartier $request->request->get('field5');
  3226.         $nom_quartier $this->firmeService->getNomQuartier($code_quartier);
  3227.         $code_postal $request->request->get('field6');
  3228.         $longitude $request->request->get('field11');
  3229.         $latitude $request->request->get('field12');
  3230.         if (trim($adresse) !== '' || trim($code_ville) !== '' || trim($nom_ville) !== '' || trim($code_quartier) !== '' || trim($nom_quartier) !== '' || trim($code_postal) !== '' || trim($longitude) !== '' || trim($latitude) !== '')
  3231.         {
  3232.             if ($localisation) {
  3233.                 $this->firmeService->updateLocalisation($userId,null$adresse$code_ville$nom_ville$code_quartier$nom_quartier$code_postal$longitude$latitude);
  3234.             } else {
  3235.                 $this->firmeService->insererLocalisation($userId,null$adresse$code_ville$nom_ville$code_quartier$nom_quartier$code_postal$longitude$latitude);
  3236.             }
  3237.         }
  3238.         //up_coordonnées
  3239.         $telefone =  $this->filterJsonField($request->request->all('field7'));
  3240.         $portable =  $this->filterJsonField($request->request->all('field8'));
  3241.         $whatsapp =  $this->filterJsonField($request->request->all('wfield8'));
  3242.         $email =  $this->filterJsonField($request->request->all('field9'));
  3243.         $site_web =  $this->filterJsonField($request->request->all('field10'));
  3244.         $facebook =  $this->filterJsonField($request->request->all('facebook'));
  3245.         $instagram =  $this->filterJsonField($request->request->all('instagram'));
  3246.         $linkedin =  $this->filterJsonField($request->request->all('linkedin'));
  3247.         // Puis tu peux appeler ton service
  3248.         if ($telefone !== null || $portable !== null || $whatsapp !== null || $email !== null || $site_web !== null || $facebook !== null || $instagram !== null || $linkedin !== null) {
  3249.             if ($coordonnee) {
  3250.             $this->firmeService->updateCoordonnees($userId,null$telefone$portable$whatsapp$email$site_web$facebook$instagram$linkedin);
  3251.             } else {
  3252.                 $this->firmeService->insererCoordonnees($userId,null$telefone$portable$whatsapp$email$site_web$facebook$instagram$linkedin);
  3253.             }
  3254.         }
  3255.         //up_juridiques
  3256.         $forme_juridique $request->request->get('field13');
  3257.         $annee_creation $request->request->get('field14');
  3258.         // dd($annee_creation);
  3259.         $effectif $request->request->get('field15');
  3260.         $ice $request->request->get('field17');
  3261.         $identifiant_fiscal $request->request->get('field18');
  3262.         $patente $request->request->get('field19');
  3263.         $capital $request->request->get('field16');
  3264.         $inp $request->request->get('PLfield31');
  3265.         $rc $request->request->get('field20');
  3266.         $ville_rc $request->request->get('field21');
  3267.         $effectif trim($effectif) !== '' ? (int)$effectif null;
  3268.         $capital trim($capital) !== '' ? (int)$capital null;
  3269.         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) !== '') {
  3270.             if ($juridique) {
  3271.                 $this->firmeService->updateJuridiques($userId,null,$forme_juridique,$annee_creation,$effectif,$capital,$ice,null,$patente,$rc,$ville_rc,$identifiant_fiscal);
  3272.             } else {
  3273.                 $this->firmeService->insererJuridiques($userId,null,$forme_juridique,$annee_creation,$effectif,$capital,$ice,null,$patente,$rc,$ville_rc,$identifiant_fiscal);
  3274.             }
  3275.         }
  3276.         
  3277.         //up_finances
  3278.         // Nettoyage des champs
  3279.         $banques      $this->cleanValue($request->request->get('field34'));
  3280.         $zone_export  $this->cleanValue($request->request->get('field35'));
  3281.         $pourc_export $this->cleanValue($request->request->get('field36'));
  3282.         $annee_ca     $this->cleanValue($request->request->get('field32', []));
  3283.         $gamme_ca     $this->cleanValue($request->request->get('field33', []));
  3284.         $anneesGammes = [];
  3285.         foreach ($annee_ca as $i => $annee) {
  3286.             if (!empty($annee) && isset($gamme_ca[$i]) && !empty($gamme_ca[$i])) {
  3287.                 $anneesGammes[] = [
  3288.                     'annee_ca' => $annee,
  3289.                     'gamme_ca' => $gamme_ca[$i],
  3290.                 ];
  3291.             }
  3292.         }
  3293.         // Sauvegarde en JSON
  3294.         $annee_ca array_column($anneesGammes'annee_ca');
  3295.         $gamme_ca array_column($anneesGammes'gamme_ca');
  3296.         // Insertion ou mise à jour si au moins un champ est renseigné
  3297.         if ($annee_ca !== null || $gamme_ca !== null || $banques !== null || $zone_export !== null || $pourc_export !== null) {
  3298.             if ($finance) {
  3299.                 $firmeService->updateFinances($userId,null$annee_ca$gamme_ca$banques$zone_export$pourc_export);
  3300.             } else {
  3301.                 $firmeService->insererFinances($userId,null$annee_ca$gamme_ca$banques$zone_export$pourc_export);
  3302.             }
  3303.         }
  3304.         //up_dirigeants
  3305.         $noms $request->request->get('field22', []);
  3306.         $prenoms $request->request->get('field23', []);
  3307.         $civilites $request->request->get('civilite', []);
  3308.         $fonctionCodes $request->request->get('field24', []);
  3309.         $portables $request->request->get('field25', []);
  3310.         $whatsapps $request->request->get('whatsappd', []);
  3311.         $emails $request->request->get('emaild', []);
  3312.         $ids $request->request->get('id', []);
  3313.         $deletedRaw $request->request->get('deleted_dirigeants''');
  3314.         // Convertir en tableau
  3315.         $deletedIds = [];
  3316.         if (is_string($deletedRaw) && $deletedRaw !== '') {
  3317.             $deletedIds explode(','$deletedRaw);
  3318.         }
  3319.         // dd($deletedIds); // Vérifier si on reçoit bien les IDs supprimés
  3320.         // Supprimer les dirigeants supprimés
  3321.         if (!empty($deletedIds)) {
  3322.             $firmeService->supprimerDirigeants($deletedIds);
  3323.         }
  3324.         $codeFirme null;
  3325.         // Synchroniser les autres (insert/update)
  3326.         $firmeService->synchroniserDirigeants($ids$noms$prenoms$civilites$fonctionCodes$portables$whatsapps$emails$codeFirme$userId);
  3327.         // up_certifications
  3328.         // Récupération des champs du formulaire
  3329.         $certification      $request->request->get('certification');
  3330.         $organisme          $request->request->get('organisme');
  3331.         $type               $request->request->get('type_certification');
  3332.         $produit            $request->request->get('produit_certification');
  3333.         $date_expiration    $request->request->get('date_expiration');
  3334.         // Vérifier s’il y a une certification existante pour ce code_firme
  3335.         $certificationExist $this->firmeService->getCertificationByUserId($userId);
  3336.         // dd($certificationExist);
  3337.         // Vérifier s'il y a des données remplies
  3338.         if (
  3339.             trim($certification) !== '' || trim($organisme) !== '' ||
  3340.             trim($type) !== '' || trim($produit) !== '' || trim($date_expiration) !== ''
  3341.         ) {
  3342.             if ($certificationExist) {
  3343.                 // faire update
  3344.                 $this->firmeService->updateCertification(
  3345.                     $userId,null,
  3346.                     $certification,
  3347.                     $organisme,
  3348.                     $type,
  3349.                     $produit,
  3350.                     $date_expiration
  3351.                 );
  3352.             } else {
  3353.                 // faire insert
  3354.                 $this->firmeService->insererCertification(
  3355.                     $userId,null,
  3356.                     $certification,
  3357.                     $organisme,
  3358.                     $type,
  3359.                     $produit,
  3360.                     $date_expiration
  3361.                 );
  3362.             }
  3363.         }
  3364.             $natures =$this->rubriqueprestationService->getAllNatures();
  3365.             $villes =$this->localisationService->getAllVilles();
  3366.             $rubriques =$this->rubriqueprestationService->getAllRubriques();
  3367.             $fonctions =$this->rubriqueprestationService->getAllFonctions();
  3368.             $fichiers =$this->rubriqueprestationService->getAllProfLib();
  3369.             $formeJur =$this->rubriqueprestationService->getAllFormeJur();
  3370.             $gammeCA =$this->rubriqueprestationService->getAllGammeCA();
  3371.             $banques =$this->rubriqueprestationService->getAllBanques();
  3372.             $zonesExp $this->localisationService->getAllZonesExport();       
  3373.             $themes $this->produitKompassService->getThemes(); 
  3374.             $wproduits $this->produitKompassService->getLienProduitW13($codeFirme);
  3375.             $fiches $this->firmeService->getAllNonFirmes();
  3376.         
  3377.             return $this->render('admin/nonFirme_up/list.html.twig', [
  3378.                 'pageSubtitle' => 'Liste des fiches non firmes',
  3379.                 'fiches' => $fiches,
  3380.                 'firme' => $firme,                
  3381.                 'codeFirme' => $codeFirme,               
  3382.             ]);
  3383.     
  3384.     }
  3385.     /**
  3386.      * @Route("/PlNonFirmeUp/insertDetails", name="insert_details_nonFirmeUpPL", methods={"POST"})
  3387.      */
  3388.     public function insertNonFirmeUpPLDetails(Request $request,FirmeService $firmeService): Response
  3389.     {         
  3390.         $user $this->getUser();
  3391.         if (!$user instanceof \App\Entity\UserRegistration) {
  3392.             $this->addFlash('error''Veuillez vous connecter.');
  3393.             return $this->redirectToRoute('app_login');
  3394.         }
  3395.         $description $data['PLfield28'] ?? null;
  3396.         // Récupération de toutes les données
  3397.         $data $request->request->all();
  3398.         // dd($data);
  3399.         $userId $request->request->get('user_id');
  3400.         //  dd($data);
  3401.         $firme $firmeService->getFirmeByUserId($userId); 
  3402.         $localisation $firmeService->getLocalisationByUserId($userId); 
  3403.         $coordonnee $firmeService->getCoordonneeByUserId($userId); 
  3404.         $finance $firmeService->getFinanceByUserId($userId); 
  3405.         // dd($firme);
  3406.         $juridique $firmeService->getJuridiqueByUserId($userId); 
  3407.         // dd($juridique);
  3408.         $dirigeants $firmeService->getDirigeantsByUserId($userId); 
  3409.         // Fonction utilitaire pour nettoyer les champs JSON
  3410.         // dd($data);
  3411.         $jours = ['lundi''mardi''mercredi''jeudi''vendredi''samedi''dimanche'];
  3412.         $horaires = [];
  3413.         foreach ($jours as $jour) {
  3414.             $isChecked $request->request->get('checkbox_' $jour);
  3415.             if ($isChecked) {
  3416.                 $start $request->request->get('start_' $jour);
  3417.                 $end $request->request->get('end_' $jour);
  3418.                 $horaires[$jour] = [
  3419.                     'actif' => true,
  3420.                     'start' => $start,
  3421.                     'end' => $end
  3422.                 ];
  3423.             } else {
  3424.                 $horaires[$jour] = [
  3425.                     'actif' => false,
  3426.                     'start' => null,
  3427.                     'end' => null
  3428.                 ];
  3429.             }
  3430.         }
  3431.         // ➕ Traitement cohérent pour la pause
  3432.         $pauseEnabled $request->request->get('pause_enabled'); // existe uniquement si cochée
  3433.         $pauseStart $request->request->get('pause_start');
  3434.         $pauseEnd $request->request->get('pause_end');
  3435.         $pause = [];
  3436.         if ($pauseEnabled) {
  3437.             $pause = [
  3438.                 'actif' => true,
  3439.                 'start' => $pauseStart,
  3440.                 'end' => $pauseEnd
  3441.             ];
  3442.         } else {
  3443.             $pause = [
  3444.                 'actif' => false,
  3445.                 'start' => null,
  3446.                 'end' => null
  3447.             ];
  3448.         }
  3449.         $horairesJson json_encode($horaires);
  3450.         $pauseJson json_encode($pause);
  3451.         //up_firme
  3452.         $nom $request->request->get('PLfield1');
  3453.         $prenom $request->request->get('PLfield2');
  3454.         $activite $request->request->get('PLfield26');
  3455.         $description $request->request->get('PLfield28');
  3456.         $horaires $horairesJson;
  3457.         $pause $pauseJson;
  3458.         $actes =  $this->filterJsonField($request->request->all('acte'));
  3459.         $validation $request->request->get('validation') ?? null;
  3460.         $date_creation = new \DateTime();
  3461.         $validation '1' ;
  3462.         $date_validation $validation === '1' ? new \DateTime() : null;
  3463.         $pl_or_societe "P";
  3464.         $etat='C';
  3465.         if (trim($userId) !== '' || trim($nom) !== '' || trim($prenom) !== '' || trim($activite) !== '' || trim($description) !== '' || $horaires !== '[]' || $pause !== '[]' || $actes !== null
  3466.         { 
  3467.             if ($firme) {
  3468.                 $synchroniser ="0";
  3469.                 $this->firmeService->updateFirme(
  3470.                     $userId,
  3471.                     null,
  3472.                     null,   // raison_social (pas dans ce contexte)
  3473.                     null,   // nature (pas dans ce contexte)
  3474.                     $horairesJson,
  3475.                     $pauseJson,
  3476.                     null,   // rubriques (pas dans ce contexte)
  3477.                     null,   // description_rub
  3478.                     null,   // prestations
  3479.                     null,   // produits
  3480.                     null,   // marques
  3481.                     $validation,
  3482.                     $date_validation,
  3483.                     $nom,
  3484.                     $prenom,
  3485.                     $actes,
  3486.                     $activite,
  3487.                     $description,
  3488.                     $pl_or_societe,
  3489.                     $etat,
  3490.                     $synchroniser
  3491.                 );
  3492.             } else {
  3493.                 $synchroniser ="0";
  3494.                 $this->firmeService->insererFirme(
  3495.                     $userId,null,
  3496.                     null,
  3497.                     null,
  3498.                     $horairesJson,
  3499.                     $pauseJson,
  3500.                     null,
  3501.                     null,
  3502.                     null,
  3503.                     null,
  3504.                     null,
  3505.                     $validation,
  3506.                     $date_validation,
  3507.                     $date_creation,
  3508.                     $nom,
  3509.                     $prenom,
  3510.                     $actes,
  3511.                     $activite,
  3512.                     $description,
  3513.                     $pl_or_societe,
  3514.                     $etat,
  3515.                     $synchroniser
  3516.                 );
  3517.             }
  3518.         }
  3519.         //up_localisations
  3520.         $adresse $request->request->get('PLfield3');
  3521.         $code_ville $request->request->get('PLfield4');
  3522.         $nom_ville $this->firmeService->getNomVille($code_ville);
  3523.         $code_quartier $request->request->get('PLfield5');
  3524.         $nom_quartier $this->firmeService->getNomQuartier($code_quartier);
  3525.         $code_postal $request->request->get('PLfield6');
  3526.         $longitude $request->request->get('PLfield11');
  3527.         $latitude $request->request->get('PLfield12');
  3528.         if (trim($adresse) !== '' || trim($code_ville) !== '' || trim($nom_ville) !== '' || trim($code_quartier) !== '' || trim($nom_quartier) !== '' || trim($code_postal) !== '' || trim($longitude) !== '' || trim($latitude) !== '')
  3529.         {
  3530.             if ($localisation) {
  3531.                 $this->firmeService->updateLocalisation($userId,null$adresse$code_ville$nom_ville$code_quartier$nom_quartier$code_postal$longitude$latitude);
  3532.             } else {
  3533.                 $this->firmeService->insererLocalisation($userId,null$adresse$code_ville$nom_ville$code_quartier$nom_quartier$code_postal$longitude$latitude);
  3534.             }
  3535.         }
  3536.         //up_coordonnées
  3537.         $telefone =  $this->filterJsonField($request->request->all('Pfield7'));
  3538.         $whatsapp =  $this->filterJsonField($request->request->all('Pwhatsapp'));
  3539.         $email =  $this->filterJsonField($request->request->all('Pemail'));
  3540.         $site_web =  $this->filterJsonField($request->request->all('Psite'));
  3541.         $facebook =  $this->filterJsonField($request->request->all('PLfacebook'));
  3542.         $instagram =  $this->filterJsonField($request->request->all('PLinstagram'));
  3543.         $linkedin =  $this->filterJsonField($request->request->all('PLlinkedin'));
  3544.         // Puis tu peux appeler ton service
  3545.         if ($telefone !== null || $whatsapp !== null || $email !== null || $site_web !== null || $facebook !== null || $instagram !== null || $linkedin !== null) {
  3546.             if ($coordonnee) {
  3547.             $this->firmeService->updateCoordonnees($userId,null$telefonenull$whatsapp$email$site_web$facebook$instagram$linkedin);
  3548.             } else {
  3549.                 $this->firmeService->insererCoordonnees($userId,null$telefonenull$whatsapp$email$site_web$facebook$instagram$linkedin);
  3550.             }
  3551.         }
  3552.         //up_juridiques
  3553.         $annee_creation $request->request->get('PLfield14');
  3554.         $ice $request->request->get('PLfield29');
  3555.         $identifiant_fiscal $request->request->get('PLfield30');
  3556.         $inp $request->request->get('PLfield31');
  3557.         $rc $request->request->get('PLfield20');
  3558.         $ville_rc $request->request->get('PLfield21');
  3559.         if (trim($annee_creation) !== '' || trim($ice) !== '' || trim($identifiant_fiscal) !== '' || trim($rc) !== '' || trim($ville_rc) !== '' || trim($inp) !== '') {
  3560.             if ($juridique) {
  3561.                 $this->firmeService->updateJuridiques($userId,null,null,$annee_creation,null,null,$ice,$inp,null,$rc,$ville_rc,$identifiant_fiscal);
  3562.             } else {
  3563.                 $this->firmeService->insererJuridiques($userId,null,null,$annee_creation,null,null,$ice,$inp,null,$rc,$ville_rc,$identifiant_fiscal);
  3564.             }
  3565.         }
  3566.         
  3567.         //up_finances
  3568.         // Nettoyage des champs
  3569.         $banques      $this->cleanValue($request->request->get('PLfield34'));
  3570.         $zone_export  $this->cleanValue($request->request->get('PLfield35'));
  3571.         $pourc_export $this->cleanValue($request->request->get('PLfield36'));
  3572.         
  3573.         $annee_ca     $this->cleanValue($request->request->get('PLfield32', []));
  3574.         $gamme_ca     $this->cleanValue($request->request->get('PLfield33', []));
  3575.         $anneesGammes = [];
  3576.         foreach ($annee_ca as $i => $annee) {
  3577.             if (!empty($annee) && isset($gamme_ca[$i]) && !empty($gamme_ca[$i])) {
  3578.                 $anneesGammes[] = [
  3579.                     'annee_ca' => $annee,
  3580.                     'gamme_ca' => $gamme_ca[$i],
  3581.                 ];
  3582.             }
  3583.         }
  3584.         // Sauvegarde en JSON
  3585.         $annee_ca array_column($anneesGammes'annee_ca');
  3586.         $gamme_ca array_column($anneesGammes'gamme_ca');
  3587.         // Insertion ou mise à jour si au moins un champ est renseigné
  3588.         if ($annee_ca !== null || $gamme_ca !== null || $banques !== null || $zone_export !== null || $pourc_export !== null) {
  3589.             if ($finance) {
  3590.                 $firmeService->updateFinances($userId,null$annee_ca$gamme_ca$banques$zone_export$pourc_export);
  3591.             } else {
  3592.                 $firmeService->insererFinances($userId,null$annee_ca$gamme_ca$banques$zone_export$pourc_export);
  3593.             }
  3594.         }
  3595.             $villes =$this->localisationService->getAllVilles();
  3596.             $rubriques =$this->rubriqueprestationService->getAllRubriques();
  3597.             $fonctions =$this->rubriqueprestationService->getAllFonctions();
  3598.             $fichiers =$this->rubriqueprestationService->getAllProfLib();
  3599.             $formeJur =$this->rubriqueprestationService->getAllFormeJur();
  3600.             $gammeCA =$this->rubriqueprestationService->getAllGammeCA();
  3601.             $banques =$this->rubriqueprestationService->getAllBanques();
  3602.             $zonesExp $this->localisationService->getAllZonesExport();       
  3603.             $themes $this->produitKompassService->getThemes(); 
  3604.             $fiches $this->firmeService->getAllNonFirmes();
  3605.             return $this->redirectToRoute('nonfiches'); 
  3606.     }
  3607.     /**
  3608.      * @Route("/promouvoir-utilisateur/{userId}", name="promouvoir_utilisateur")
  3609.      */
  3610.     public function promouvoirUtilisateur(int $userIdFirmeService $firmeService): Response
  3611.     {
  3612.         $result $firmeService->promouvoirUtilisateur($userId);
  3613.         // dd($result );
  3614.         if (!$result['success']) {
  3615.             $this->addFlash('error'$result['message']);
  3616.         } else {
  3617.             $this->addFlash('success'$result['message']);
  3618.         }
  3619.         return $this->redirectToRoute('nonfiches');
  3620.     }
  3621.     /**
  3622.      * @Route("/DetailsFirmePL/up/{codeFirme}", name="details_profession_lib")
  3623.      */
  3624.     public function FirmeUpPLDetails(string $codeFirmeFirmeService $firmeService): Response
  3625.     {   
  3626.         $user $this->getUser();
  3627.         if (!$user instanceof \App\Entity\User) {
  3628.             $this->addFlash('error''Veuillez vous connecter.');
  3629.             return $this->redirectToRoute('app_login');
  3630.         }
  3631.         $pageSubtitle 'Fiche client';
  3632.         $firme $firmeService->getFirmeByCodeAdmin($codeFirme);
  3633.         $modification $firmeService->getNewData($codeFirme);
  3634.         // dd($modification);
  3635.         if ($firme) {
  3636.             $firme['horaires'] = json_decode($firme['horaires'] ?? '[]'true);
  3637.             $firme['pause'] = json_decode($firme['pause'] ?? '[]'true);
  3638.             $firme['rubriques'] = json_decode($firme['rubriques'] ?? '[]'true);
  3639.             $firme['prestations'] = json_decode($firme['prestations'] ?? '[]'true);
  3640.             $firme['produits'] = json_decode($firme['produits'] ?? '[]'true);
  3641.             $firme['marques'] = json_decode($firme['marques'] ?? '[]'true);
  3642.             $firme['actes'] = json_decode($firme['actes'] ?? '[]'true);
  3643.             $firme['activite'] = $firme['activite'] ?? '';
  3644.         } else {
  3645.             $firme = [
  3646.                 'horaires' => [],
  3647.                 'pause' => [],
  3648.                 'rubriques' => [],
  3649.                 'prestations' => [],
  3650.                 'produits' => [],
  3651.                 'marques' => [],
  3652.                 'actes' => [],
  3653.                 'activite' => '',
  3654.             ];
  3655.         }
  3656.                     
  3657.         $wproduits $this->produitKompassService->getLienProduitW13($codeFirme);
  3658.         $localisation $firmeService->getLocalisationByCodeFirme($codeFirme); 
  3659.         $coordonnee $firmeService->getCoordonneeByCodeFirme($codeFirme); 
  3660.         $juridique $firmeService->getJuridiqueByCodeFirme($codeFirme);
  3661.         $finance $firmeService->getFinanceByCodeFirme($codeFirme);
  3662.         $dirigeants $firmeService->getDirigeantsByCodeFirme($codeFirme);
  3663.         $certification $firmeService->getCertificationByCodeFirme($codeFirme);
  3664.         $anneesCA json_decode($finance['annee_ca'] ?? '[]'true);
  3665.         rsort($anneesCASORT_NUMERIC);
  3666.         $gammesCA json_decode($finance['gamme_ca'] ?? '[]'true);
  3667.         $zoneExport json_decode($finance['zone_export'] ?? '[]'true);
  3668.         $pourcExport json_decode($finance['pourc_export'] ?? '[]'true); 
  3669.                 // Construire le tableau années + gammes
  3670.                 $anneesGammes = [];
  3671.                 foreach ($anneesCA as $index => $annee) {
  3672.                     $anneesGammes[] = [
  3673.                         'annee_ca' => $annee,
  3674.                         'gamme_ca' => $gammesCA[$index] ?? null
  3675.                     ];
  3676.                 }
  3677.                 // Trier en ordre décroissant (comme dans Cas 1)
  3678.                 usort($anneesGammes, fn($a$b) => $b['annee_ca'] <=> $a['annee_ca']);
  3679.                 // Construire le tableau zones + pourcentage
  3680.                 $zonesExportList = [];
  3681.                 foreach ($zoneExport as $index => $zone) {
  3682.                     $zonesExportList[] = [
  3683.                         'zone' => $zone,
  3684.                         'pourcentage' => $pourcExport[$index] ?? null
  3685.                     ];
  3686.                 }
  3687.         // dd($juridique,$finance);
  3688.         if ($coordonnee) {
  3689.             $coordonnee['telefone']   = json_decode($coordonnee['telefone'] ?? '[]'true);
  3690.             $coordonnee['portable']   = json_decode($coordonnee['portable'] ?? '[]'true);
  3691.             $coordonnee['whatsapp']   = json_decode($coordonnee['whatsapp'] ?? '[]'true);
  3692.             $coordonnee['email']      = json_decode($coordonnee['email'] ?? '[]'true);
  3693.             $coordonnee['site_web']   = json_decode($coordonnee['site_web'] ?? '[]'true);
  3694.             $coordonnee['facebook']   = json_decode($coordonnee['facebook'] ?? '[]'true);
  3695.             $coordonnee['instagram']  = json_decode($coordonnee['instagram'] ?? '[]'true);
  3696.             $coordonnee['linkedin']   = json_decode($coordonnee['linkedin'] ?? '[]'true);
  3697.         } else {
  3698.             // On initialise à vide pour éviter toute erreur dans le template
  3699.             $coordonnee = [
  3700.                 'telefone' => [],
  3701.                 'portable' => [],
  3702.                 'whatsapp' => [],
  3703.                 'email' => [],
  3704.                 'site_web' => [],
  3705.                 'facebook' => [],
  3706.                 'instagram' => [],
  3707.                 'linkedin' => [],
  3708.             ];
  3709.         }
  3710.         $villes =$this->localisationService->getAllVilles();        
  3711.         $villesRC =$this->localisationService->getAllVillesRC();
  3712.         $rubriques =$this->rubriqueprestationService->getAllRubriques();
  3713.         $fonctions =$this->rubriqueprestationService->getAllFonctions();
  3714.         $natures =$this->rubriqueprestationService->getAllNatures();
  3715.         $fichiers =$this->rubriqueprestationService->getAllProfLib();
  3716.         $formeJur =$this->rubriqueprestationService->getAllFormeJur();
  3717.         $gammeCA =$this->rubriqueprestationService->getAllGammeCA();
  3718.         $banques =$this->rubriqueprestationService->getAllBanques();
  3719.         $zonesExp $this->localisationService->getAllZonesExport();       
  3720.         $themes $this->produitKompassService->getThemes();
  3721.  
  3722.         return $this->render('admin/firme_up/indexPl.html.twig', [
  3723.             'villes' => $villes,            
  3724.             'villesRC' => $villesRC,
  3725.             'rubriques' => $rubriques,
  3726.             'fonctions' => $fonctions,
  3727.             'natures' => $natures,
  3728.             'fichiers' => $fichiers,
  3729.             'formeJur' =>  $formeJur,
  3730.             'banques' => $banques,                
  3731.             'zonesExp' => $zonesExp,
  3732.             'themes' => $themes,
  3733.             'firme' =>  $firme,
  3734.             'localisation' =>  $localisation,
  3735.             'coordonnee' =>  $coordonnee,
  3736.             'rubriques' =>  $rubriques,
  3737.             'juridique' =>  $juridique,
  3738.             'finance' =>  $finance,
  3739.             'pourcExport' => $pourcExport,
  3740.             'anneesGammes' => $anneesGammes,
  3741.             'gammeCA' => $gammeCA
  3742.             'zonesExportList' => $zonesExportList,
  3743.             'dirigeants' => $dirigeants,
  3744.             'certification' => $certification,
  3745.             'wproduits' => $wproduits,
  3746.             'modification' => $modification,
  3747.         ]);
  3748.     }
  3749.     
  3750.     // /**
  3751.     //  * @Route("/DetailsFirme/up/{codeFirme}", name="details_societe")
  3752.     //  */
  3753.     // public function FirmeUpSocieteDetails(string $codeFirme, FirmeService $firmeService): Response
  3754.     // {           
  3755.     //     $user = $this->getUser();
  3756.     //     if (!$user instanceof \App\Entity\User) {
  3757.     //         $this->addFlash('error', 'Veuillez vous connecter.');
  3758.     //         return $this->redirectToRoute('app_login');
  3759.     //     }
  3760.     //     $pageSubtitle = 'Fiche client';
  3761.     //     $firme = $firmeService->getFirmeByCodeAdmin($codeFirme);
  3762.     //     // $oldValueFirme = $firmeService->getAllFirmeData($codeFirme);
  3763.     //     // dd($firme,$oldValueFirme);
  3764.     //     if ($firme) {
  3765.     //         $firme['horaires'] = json_decode($firme['horaires'] ?? '[]', true);
  3766.     //         $firme['pause'] = json_decode($firme['pause'] ?? '[]', true);
  3767.     //         $firme['rubriques'] = json_decode($firme['rubriques'] ?? '[]', true);
  3768.     //         $firme['prestations'] = json_decode($firme['prestations'] ?? '[]', true);
  3769.     //         $firme['produits'] = json_decode($firme['produits'] ?? '[]', true);
  3770.     //         $firme['marques'] = json_decode($firme['marques'] ?? '[]', true);
  3771.     //         $firme['actes'] = json_decode($firme['actes'] ?? '[]', true);
  3772.     //     } else {
  3773.     //         // Par exemple, on passe un tableau vide au template
  3774.     //         $firme = [
  3775.     //             'horaires' => [],
  3776.     //             'pause' => [],
  3777.     //             'rubriques' => [],
  3778.     //             'prestations' => [],
  3779.     //             'produits' => [],
  3780.     //             'marques' => [],
  3781.     //             'actes' => [],
  3782.     //         ];
  3783.     //     }
  3784.     //     $wproduits = $this->produitKompassService->getLienProduitW13($codeFirme);
  3785.     //     $kompassProduits = $this->produitKompassService->getProduitsKompass($codeFirme);
  3786.     //     $localisation = $firmeService->getLocalisationByCodeFirme($codeFirme); 
  3787.     //     $coordonnee = $firmeService->getCoordonneeByCodeFirme($codeFirme); 
  3788.     //     $juridique = $firmeService->getJuridiqueByCodeFirme($codeFirme);
  3789.     //     $finance = $firmeService->getFinanceByCodeFirme($codeFirme);
  3790.     //     $dirigeants = $firmeService->getDirigeantsByCodeFirme($codeFirme);
  3791.     //     $certification = $firmeService->getCertificationByCodeFirme($codeFirme);
  3792.     //     $anneesCA = json_decode($finance['annee_ca'] ?? '[]', true);
  3793.     //     rsort($anneesCA, SORT_NUMERIC);
  3794.     //     $gammesCA = json_decode($finance['gamme_ca'] ?? '[]', true);
  3795.     //     $zoneExport = json_decode($finance['zone_export'] ?? '[]', true);
  3796.     //     $pourcExport = json_decode($finance['pourc_export'] ?? '[]', true); 
  3797.     //     // dd($finance);
  3798.     //     $anneesGammes = [];
  3799.     //     foreach ($anneesCA as $index => $annee) {
  3800.     //         $anneesGammes[] = [
  3801.     //             'annee_ca' => $annee,
  3802.     //             'gamme_ca' => $gammesCA[$index] ?? null
  3803.     //         ];
  3804.     //     }
  3805.     //     $zonesExportList = [];
  3806.     //     foreach ($zoneExport as $index => $zone) {
  3807.     //         $zonesExportList[] = [
  3808.     //             'zone' => $zone,
  3809.     //             'pourcentage' => $pourcExport[$index] ?? null
  3810.     //         ];
  3811.     //     }
  3812.     //     // dd($juridique,$finance);
  3813.     //     if ($coordonnee) {
  3814.     //         $coordonnee['telefone']   = json_decode($coordonnee['telefone'] ?? '[]', true);
  3815.     //         $coordonnee['portable']   = json_decode($coordonnee['portable'] ?? '[]', true);
  3816.     //         $coordonnee['whatsapp']   = json_decode($coordonnee['whatsapp'] ?? '[]', true);
  3817.     //         $coordonnee['email']      = json_decode($coordonnee['email'] ?? '[]', true);
  3818.     //         $coordonnee['site_web']   = json_decode($coordonnee['site_web'] ?? '[]', true);
  3819.     //         $coordonnee['facebook']   = json_decode($coordonnee['facebook'] ?? '[]', true);
  3820.     //         $coordonnee['instagram']  = json_decode($coordonnee['instagram'] ?? '[]', true);
  3821.     //         $coordonnee['linkedin']   = json_decode($coordonnee['linkedin'] ?? '[]', true);
  3822.     //     } else {
  3823.     //         // On initialise à vide pour éviter toute erreur dans le template
  3824.     //         $coordonnee = [
  3825.     //             'telefone' => [],
  3826.     //             'portable' => [],
  3827.     //             'whatsapp' => [],
  3828.     //             'email' => [],
  3829.     //             'site_web' => [],
  3830.     //             'facebook' => [],
  3831.     //             'instagram' => [],
  3832.     //             'linkedin' => [],
  3833.     //         ];
  3834.     //     }
  3835.     //     $villes =$this->localisationService->getAllVilles();       
  3836.     //     $villesRC =$this->localisationService->getAllVillesRC();
  3837.     //     $rubriques =$this->rubriqueprestationService->getAllRubriques();
  3838.     //     // $marques =$this->rubriqueprestationService->getAllMarques();
  3839.     //     $produits =$this->rubriqueprestationService->getAllProduits();
  3840.     //     $fonctions =$this->rubriqueprestationService->getAllFonctions();
  3841.     //     $natures =$this->rubriqueprestationService->getAllNatures();
  3842.     //     $fichiers =$this->rubriqueprestationService->getAllProfLib();
  3843.     //     $formeJur =$this->rubriqueprestationService->getAllFormeJur();
  3844.     //     $gammeCA =$this->rubriqueprestationService->getAllGammeCA();
  3845.     //     $banques =$this->rubriqueprestationService->getAllBanques();
  3846.     //     $zonesExp = $this->localisationService->getAllZonesExport();       
  3847.     //     $themes = $this->produitKompassService->getThemes(); 
  3848.     //     // $codesProduits = $firme['produits'] ?? [];
  3849.     //     // // Transformer les codes en tableau associatif code => libellé
  3850.     //     // $firme['produits'] = $this->rubriqueprestationService->getLibellesProduits($codesProduits);
  3851.     //     // $codesMarques = $firme['marques'] ?? [];
  3852.     //     // // Transformer les codes en tableau associatif code => libellé
  3853.     //     // $firme['marques'] = $this->rubriqueprestationService->getLibellesMarques($codesMarques);
  3854.     //     if (is_array($dirigeants)) {
  3855.     //         foreach ($dirigeants as &$d) {
  3856.     //             $p = $d['portable'] ?? null;
  3857.     //             if ($p && $p[0] === '[') {
  3858.     //                 $d['portables'] = json_decode($p, true);
  3859.     //             } else {
  3860.     //                 $d['portables'] = []; // <--- toujours définir la clé
  3861.     //             }
  3862.     //         }
  3863.     //     } else {
  3864.     //         $dirigeants = []; // éviter d'avoir un foreach sur null
  3865.     //     }
  3866.     //     // dd($firme);
  3867.     //             return $this->render('admin/firme_up/index.html.twig', [
  3868.     //                 'villes' => $villes,                    
  3869.     //                 'villesRC' => $villesRC,
  3870.     //                 'rubriques' => $rubriques,
  3871.     //                 'fonctions' => $fonctions,
  3872.     //                 'natures' => $natures,
  3873.     //                 'fichiers' => $fichiers,
  3874.     //                 'formeJur' =>  $formeJur,
  3875.     //                 'banques' => $banques,   
  3876.     //                 'produits' => $produits,                
  3877.     //                 // 'marques' => $marques,                
  3878.     //                 'zonesExp' => $zonesExp,
  3879.     //                 'themes' => $themes,
  3880.     //                 'firme' =>  $firme,
  3881.     //                 'localisation' =>  $localisation,
  3882.     //                 'coordonnee' =>  $coordonnee,
  3883.     //                 'rubriques' =>  $rubriques,
  3884.     //                 'juridique' =>  $juridique,
  3885.     //                 'finance' =>  $finance,
  3886.     //                 'pourcExport' => $pourcExport,
  3887.     //                 'anneesGammes' => $anneesGammes,
  3888.     //                 'gammeCA' => $gammeCA, 
  3889.     //                 'zonesExportList' => $zonesExportList,
  3890.     //                 'dirigeants' => $dirigeants,
  3891.     //                 'certification' => $certification,
  3892.     //                 'pageSubtitle' => 'Liste des fiches non firmes',
  3893.     //                 'firme' => $firme,                
  3894.     //                 'wproduits' => $wproduits,
  3895.     //                 'kompassProduits' => $kompassProduits,
  3896.     //             ]);
  3897.     // }
  3898.     /**
  3899.      * @Route("/DetailsFirme/up/{codeFirme}", name="details_societe")
  3900.      */
  3901.      public function FirmeUpSocieteDetails(string $codeFirmeFirmeDetailsService $FirmeDetailsService,FirmeUpService $firmeUpService,FirmeService $firmeService): Response
  3902.     {
  3903.         $user $this->getUser();
  3904.         if (!$user instanceof \App\Entity\User) {
  3905.             $this->addFlash('error''Veuillez vous connecter.');
  3906.             return $this->redirectToRoute('app_login');
  3907.         }
  3908.         $data $FirmeDetailsService->getFirmeDetails($codeFirme);
  3909.         $dataCRM $firmeUpService->prepareFirmeData($codeFirme);
  3910.         $modification $firmeService->getNewData($codeFirme);
  3911.         foreach ($modification as &$modif) {
  3912.             if (!empty($modif['ancienne_valeur']) && ($modif['ancienne_valeur'][0] === '{' || $modif['ancienne_valeur'][0] === '[')) {
  3913.                 $decoded json_decode($modif['ancienne_valeur'], true);
  3914.                 $modif['ancienne_valeur_decoded'] = $decoded;
  3915.                 // Produits Kompass
  3916.                 if ($modif['table_source'] === 'up_produits_kompass' && isset($decoded['code_produit'])) {
  3917.                     $lib $firmeService->getLibProduitByCode($decoded['code_produit']);
  3918.                     $decoded['lib_produit'] = $lib ?? '';
  3919.                 }
  3920.                 // Activités WF13
  3921.                 if ($modif['table_source'] === 'up_activite_WF13' && isset($decoded['code_produit'])) {
  3922.                     $lib $firmeService->getLibWF13ByCode($decoded['code_produit']);
  3923.                     $decoded['lib_produit'] = $lib ?? '';
  3924.                 }
  3925.                 // ✅ Réordonner pour que lib_produit soit le premier
  3926.                 if (isset($decoded['lib_produit'])) {
  3927.                     $decoded array_merge(
  3928.                         ['lib_produit' => $decoded['lib_produit']],
  3929.                         array_diff_key($decoded, ['lib_produit' => ''])
  3930.                     );
  3931.                 }
  3932.                 $modif['ancienne_valeur_decoded'] = $decoded;
  3933.             } else {
  3934.                 $modif['ancienne_valeur_decoded'] = $modif['ancienne_valeur'];
  3935.             }
  3936.         }
  3937.         // dd( $modification);
  3938.         return $this->render('admin/firme_up/index.html.twig'array_merge($data, [
  3939.             'pageSubtitle' => 'Fiche client',
  3940.             'modification' => $modification,
  3941.         ]));
  3942.     }
  3943.      /**
  3944.      * @Route("/ajax/produits", name="ajax_produits")
  3945.      */
  3946.     public function getProduits(Request $request): JsonResponse
  3947.     {
  3948.         $search $request->query->get('q''');
  3949.         $items $this->rubriqueprestationService->searchProduits($search);
  3950.         return $this->json(['items' => $items]);
  3951.     }
  3952.      /**
  3953.      * @Route("/ajax/marques", name="ajax_marques")
  3954.      */
  3955.     public function getMarques(Request $request): JsonResponse
  3956.     {
  3957.         $search $request->query->get('q''');
  3958.         $items $this->rubriqueprestationService->searchMarques($search);
  3959.         return $this->json(['items' => $items]);
  3960.     }
  3961.     /**
  3962.      * @Route("/delete-multiple-fiches", name="delete_multiple_fiches", methods={"POST"})
  3963.      */
  3964.     public function deleteMultiple(Request $requestFirmeService $firmeService)
  3965.     {
  3966.         $data json_decode($request->getContent(), true);
  3967.         $ids $data['ids'] ?? [];
  3968.         // dd($ids);
  3969.         $firmeService->deleteMultipleFiches($ids);
  3970.         return new JsonResponse(['success' => true]);
  3971.     }
  3972.      /**
  3973.      * @Route("/synchroniser/{codeFirme}", name="synchroniser_firme")
  3974.      */
  3975.     public function transfer(string $codeFirme): Response
  3976.     {
  3977.         try {
  3978.             $this->firmeService->transferFirme($codeFirme);
  3979.             return $this->redirectToRoute('fiches');
  3980.             // return new Response("✅ Transfert terminé pour la firme $codeFirme");
  3981.         } catch (\Exception $e) {
  3982.             return new Response(
  3983.                 "❌ Erreur lors du transfert : " $e->getMessage() . "<br>" .
  3984.                 "📌 Fichier : " $e->getFile() . "<br>" .
  3985.                 "📌 Ligne : " $e->getLine() . "<br>" .
  3986.                 "📌 Trace : <pre>" $e->getTraceAsString() . "</pre>",
  3987.                 500
  3988.             );
  3989.         }
  3990.     }
  3991.     // Fonction utilitaire pour nettoyer les champs JSON
  3992.         function  filterJsonField(?array $values): ?string 
  3993.         {
  3994.             if (!$values || !is_array($values)) return null;
  3995.             
  3996.             // Enlève les valeurs nulles, vides ou composées uniquement d'espaces
  3997.             $filtered array_filter($values, fn($v) => trim($v) !== '');
  3998.             return empty($filtered) ? null json_encode(array_values($filtered));
  3999.         }
  4000.         function cleanValue($value) {
  4001.             if (is_array($value)) {
  4002.                 $filtered array_filter($value, fn($v) => trim((string)$v) !== '');
  4003.                 return empty($filtered) ? null array_values($filtered);
  4004.             }
  4005.             $valueStr trim((string)$value);
  4006.             return $valueStr === '' null $valueStr;
  4007.         }
  4008. }