src/Controller/FirmeUpController.php line 4260

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