src/Controller/DevisController.php line 3454

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Archivearticle;
  4. use App\Entity\Articleimportdirect;
  5. use App\Entity\Devis;
  6. use App\Entity\Historiquedemandedevis;
  7. use App\Entity\Historiqueproduit;
  8. use App\Entity\Importdirect;
  9. use App\Entity\Intervention;
  10. use App\Entity\Produit;
  11. use App\Form\DevisfffType;
  12. use App\Form\DevisTechType;
  13. use App\Form\DevisType;
  14. use App\Repository\AiguillesRepository;
  15. use App\Repository\ArchivearticleRepository;
  16. use App\Repository\ArticleimportdirectRepository;
  17. use App\Repository\ClientRepository;
  18. use App\Repository\CourroieRepository;
  19. use App\Repository\DevisRepository;
  20. use App\Repository\FamillesdarticlesRepository;
  21. use App\Repository\FamillesRepository;
  22. use App\Repository\FournisseurRepository;
  23. use App\Repository\GestionmachinesRepository;
  24. use App\Repository\HistoriquedemandedevisRepository;
  25. use App\Repository\HistoriqueinterventionRepository;
  26. use App\Repository\HistoriqueproduitRepository;
  27. use App\Repository\ImportdirectRepository;
  28. use App\Repository\InterventionRepository;
  29. use App\Repository\MachineInterventionRepository;
  30. use App\Repository\MessageerreurRepository;
  31. use App\Repository\PaymentdeviRepository;
  32. use App\Repository\PlatinesRepository;
  33. use App\Repository\ProduitRepository;
  34. use App\Repository\UserRepository;
  35. use App\Service\BlStockMovementFusionService;
  36. use App\Service\DevisStockArchiveSynchronizer;
  37. use DateTimeZone;
  38. use Doctrine\ORM\EntityManagerInterface;
  39. use Dompdf\Dompdf;
  40. use Dompdf\Options;
  41. use NumberFormatter;
  42. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  43. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  44. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  45. use Symfony\Component\HttpFoundation\JsonResponse;
  46. use Symfony\Component\HttpFoundation\Request;
  47. use Symfony\Component\HttpFoundation\Response;
  48. use Symfony\Component\HttpFoundation\ResponseHeaderBag;
  49. use Symfony\Component\HttpFoundation\StreamedResponse;
  50. use Symfony\Component\Routing\Annotation\Route;
  51. use DateTime;
  52. use Symfony\Component\Security\Core\Security;
  53. use NumberToWords\NumberToWords;
  54. #[Route('/devis')]
  55. class DevisController extends AbstractController
  56. {
  57.     private function formatMontant(float $montant): string
  58.     {
  59.         return number_format(max(0, round($montant, 3)), 3, '.', '');
  60.     }
  61.     private function recalculerMontantNetFacture(
  62.         Devis $facture,
  63.         DevisRepository $devisRepository,
  64.         PaymentdeviRepository $paymentdeviRepository
  65.     ): void {
  66.         $documentsLies = $devisRepository->createQueryBuilder('document')
  67.             ->where('(document.statut = :statutRetour AND document.frtour = :factureId)')
  68.             ->orWhere('(document.statut = :statutAvoir AND document.fav = :factureId)')
  69.             ->setParameter('statutRetour', 'Facture-R')
  70.             ->setParameter('statutAvoir', 'Facture-A')
  71.             ->setParameter('factureId', (string) $facture->getId())
  72.             ->getQuery()
  73.             ->getResult();
  74.         $totalDocuments = 0.0;
  75.         foreach ($documentsLies as $document) {
  76.             $totalDocuments += (float) ($document->getTotalttc() ?? 0);
  77.         }
  78.         $totalFacture = (float) ($facture->getTotalttc() ?? 0);
  79.         $montantNet = max(0, $totalFacture - $totalDocuments);
  80.         $facture->setMontantNet(
  81.             count($documentsLies) > 0 ? $this->formatMontant($montantNet) : null
  82.         );
  83.         $paymentdevi = $paymentdeviRepository->findOneBy(['devis' => $facture]);
  84.         if ($paymentdevi) {
  85.             $totalRegle = 0.0;
  86.             foreach ($paymentdevi->getHistoriquepaiementsdevis() as $historique) {
  87.                 $totalRegle += (float) ($historique->getAcompte() ?? 0);
  88.                 $totalRegle += (float) ($historique->getRemise() ?? 0);
  89.             }
  90.             $montantReference = count($documentsLies) > 0 ? $montantNet : $totalFacture;
  91.             $nouveauReste = $this->formatMontant($montantReference - $totalRegle);
  92.             $paymentdevi->setMontant($nouveauReste);
  93.             $paymentdevi->setReste($nouveauReste);
  94.             $paymentdeviRepository->save($paymentdevi);
  95.         }
  96.         $devisRepository->save($facture, true);
  97.     }
  98.     #[Route('/Filter_BLP', name: 'app_devis_filter_blp', methods: ['POST'])]
  99.     public function filterdevisblp(PaymentdeviRepository $paymentdeviRepository, ClientRepository $clientRepository, Request $request, DevisRepository $devisRepository): Response
  100.     {
  101.         $fr =  $devisRepository->findBy(['statut'=>"Facture-R"]);
  102.         $fra =  $devisRepository->findBy(['statut'=>"Facture-A"]);
  103.         // 1) Récupération des filtres
  104.         $client = $request->request->get('client');
  105.         $dateRangeRaw  = trim($request->request->get('dateRangePicker', ''));
  106.         $action        = $request->request->get('action');
  107.         $listeclient = $clientRepository->findAll();
  108.         $clientselected = null;
  109.         if ($client){
  110.             $clientselected = $clientRepository->find($client);
  111.         }
  112. //        dd($client,$clientselected);
  113.         // 2) Préparation du mapping FR → ENG pour créer avec DateTime::createFromFormat
  114.         $months = [
  115.             'janv'      => 'Jan',   'févr' => 'Feb',  'mars' => 'Mar',
  116.             'avr'       => 'Apr',   'mai'  => 'May',  'juin' => 'Jun',
  117.             'juil'      => 'Jul',   'août' => 'Aug',  'sept' => 'Sep',
  118.             'oct'       => 'Oct',   'nov'  => 'Nov',  'déc'  => 'Dec',
  119.             'janvier'   => 'Jan',   'février'  => 'Feb', 'mars'     => 'Mar',
  120.             'avril'     => 'Apr',   'mai'      => 'May', 'juin'     => 'Jun',
  121.             'juillet'   => 'Jul',   'août'     => 'Aug', 'septembre'=> 'Sep',
  122.             'octobre'   => 'Oct',   'novembre' => 'Nov', 'décembre' => 'Dec',
  123.         ];
  124.         // 3) Split sur " to " (flatpickr) ou " au " (votre ancien plugin)
  125.         if (strpos($dateRangeRaw, ' to ') !== false) {
  126.             $parts = explode(' to ', $dateRangeRaw);
  127.         }
  128.         elseif (strpos($dateRangeRaw, ' au ') !== false) {
  129.             $parts = explode(' au ', $dateRangeRaw);
  130.         }
  131.         elseif ($dateRangeRaw !== '') {
  132.             $parts = [ $dateRangeRaw ];
  133.         }
  134.         else {
  135.             $parts = [];
  136.         }
  137.         $startDate = $endDate = null;
  138.         if (count($parts) > 0) {
  139.             $clean = function(string $str) use ($months): \DateTime {
  140.                 $s = trim(mb_strtolower($str));
  141.                 // si ISO "YYYY-MM-DD"
  142.                 if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $s)) {
  143.                     $dt = \DateTime::createFromFormat('Y-m-d', $s);
  144.                 } else {
  145.                     // on remplace les mois FR par des abbrv ENG
  146.                     $mapped = strtr($s, $months);
  147.                     // ex. "22 Jul, 2025"
  148.                     $dt = \DateTime::createFromFormat('d M, Y', $mapped);
  149.                 }
  150.                 if (! $dt) {
  151.                     throw new \Exception("Format de date invalide : « {$str} »");
  152.                 }
  153.                 return $dt;
  154.             };
  155.             // parsing
  156.             if (count($parts) === 2) {
  157.                 $startDate = $clean($parts[0])->setTime(0, 0, 0);
  158.                 $endDate   = $clean($parts[1])->setTime(23, 59, 59);
  159.             } else {
  160.                 // date unique
  161.                 $dt = $clean($parts[0]);
  162.                 $startDate = (clone $dt)->setTime(0, 0, 0);
  163.                 $endDate   = (clone $dt)->setTime(23, 59, 59);
  164.             }
  165.         }
  166.         // 4) Construction du QueryBuilder
  167.         $qb = $devisRepository
  168.             ->createQueryBuilder('f')
  169.             ->where('f.statut = :statut') // Filtrer par fiches archivées
  170.             ->setParameter('statut', 'BLP')
  171.             ->orderBy('f.id', 'DESC');
  172.         if ($client) {
  173.             $qb->andWhere('f.client = :client')
  174.                 ->setParameter('client', $client);
  175.         }
  176.         if ($startDate && $endDate) {
  177.             $qb->andWhere('f.date BETWEEN :start AND :end')
  178.                 ->setParameter('start', $startDate)
  179.                 ->setParameter('end',   $endDate);
  180.         }
  181.         $devis = $qb->getQuery()->getResult();
  182.         // 5) Calcul des totaux
  183.         $totalsByFournisseur = [];
  184.         foreach ($devis as $f) {
  185.             $four = $f->getClient();
  186.             $key  = $four->getId();
  187.             if (!isset($totalsByFournisseur[$key])) {
  188.                 $totalsByFournisseur[$key] = [
  189.                     'client' => $four,
  190.                     'totalTTC'    => 0,
  191.                     'totalPaye'   => 0,
  192.                     'resteAPayer' => 0,
  193.                 ];
  194.             }
  195. //            $totalsByFournisseur[$key]['totalTTC'] += $f->getTotalttc();
  196.             $totalsByFournisseur[$key]['totalTTC'] += (float) $f->getTotalttc();
  197.             $paiements = $paymentdeviRepository->findBy(['devis' => $f]);
  198.             foreach ($paiements as $p) {
  199.                 foreach ($p->getHistoriquepaiementsdevis() as $h) {
  200.                     $totalsByFournisseur[$key]['totalPaye'] += (float) $h->getAcompte();
  201.                 }
  202.             }
  203.             $totalsByFournisseur[$key]['resteAPayer'] =
  204.                 $totalsByFournisseur[$key]['totalTTC']
  205.                 - $totalsByFournisseur[$key]['totalPaye'];
  206.         }
  207.         if (count($devis) === 0) {
  208.             $this->addFlash('info', 'Aucun résultat trouvé pour les critères sélectionnés.');
  209.         }
  210.         // 6) Export Excel (sans $typefiche)
  211.         if ($action === 'excel') {
  212.             $totalsImpayes = array_filter(
  213.                 $totalsByFournisseur,
  214.                 static fn (array $data): bool => round((float) $data['resteAPayer'], 3) > 0.001
  215.             );
  216.             if (count($totalsImpayes) === 0) {
  217.                 $this->addFlash('warningfilter', 'Aucun impayé trouvé — fichier Excel non généré.');
  218.                 return $this->redirectToRoute('app_devis_particulier_index');
  219.             }
  220.             $spreadsheet = new Spreadsheet();
  221.             $sheet = $spreadsheet->getActiveSheet();
  222.             // Construire le titre
  223.             $titre = 'Rapport des fiches de vente';
  224.             $datePlage = ($startDate && $endDate)
  225.                 ? $startDate->format('d/m/Y') . ' au ' . $endDate->format('d/m/Y')
  226.                 : 'Toutes les dates';
  227.             $sheet->mergeCells('A1:D1');
  228.             $sheet->setCellValue('A1', $titre . ' | Plage de dates : ' . $datePlage);
  229.             $sheet->getStyle('A1')->getFont()->setBold(true)->getColor()->setRGB('FF0000');
  230.             $sheet->getStyle('A1')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  231.             // En-têtes
  232.             $sheet->setCellValue('A3', 'Raison sociale');
  233.             $sheet->setCellValue('B3', 'Total TTC');
  234.             $sheet->setCellValue('C3', 'Total réglé');
  235.             $sheet->setCellValue('D3', 'Reste à payer');
  236.             foreach (range('A', 'D') as $col) {
  237.                 $sheet->getColumnDimension($col)->setWidth(20);
  238.             }
  239.             $sheet->getColumnDimension('A')->setWidth(35);
  240.             $headerStyle = $sheet->getStyle('A3:D3');
  241.             $headerStyle->getFont()->setBold(true)->getColor()->setRGB('0000FF');
  242.             $headerStyle->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
  243.                 ->getStartColor()->setRGB('D0E3FA');
  244.             $row = 4;
  245.             $totalGlobalTTC = 0;
  246.             $totalGlobalPaye = 0;
  247.             $totalGlobalReste = 0;
  248.             foreach ($totalsImpayes as $data) {
  249.                 $raisonSociale = $data['client']->getRaisonsocial();
  250.                 $ttc = $data['totalTTC'];
  251.                 $paye = $data['totalPaye'];
  252.                 $reste = $data['resteAPayer'];
  253.                 $sheet->setCellValue("A$row", $raisonSociale);
  254.                 $sheet->setCellValue("B$row", $ttc);
  255.                 $sheet->setCellValue("C$row", $paye);
  256.                 $sheet->setCellValue("D$row", $reste);
  257.                 $sheet->getStyle("A$row:D$row")->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
  258.                     ->getStartColor()->setRGB('D0E3FA');
  259.                 $totalGlobalTTC += (float)  $ttc;
  260.                 $totalGlobalPaye += (float) $paye;
  261.                 $totalGlobalReste += (float)  $reste;
  262.                 $row++;
  263.             }
  264.             $sheet->setCellValue("A$row", 'Total');
  265.             $sheet->setCellValue("B$row", $totalGlobalTTC);
  266.             $sheet->setCellValue("C$row", $totalGlobalPaye);
  267.             $sheet->setCellValue("D$row", $totalGlobalReste);
  268.             $sheet->getStyle("A$row:D$row")->getFont()->setBold(true)->getColor()->setRGB('FF0000');
  269.             $sheet->getStyle("A$row:D$row")->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  270.             $sheet->getStyle("A$row:D$row")->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
  271.                 ->getStartColor()->setRGB('FFD9D9');
  272.             // Générer le fichier Excel
  273.             $filename = ($startDate && $endDate)
  274.                 ? 'rapport_vente_blp' . $startDate->format('Ymd') . '_au_' . $endDate->format('Ymd') . '.xlsx'
  275.                 : 'rapport_vente_blp_toutes_les_dates.xlsx';
  276.             $writer = new Xlsx($spreadsheet);
  277.             $response = new StreamedResponse(function () use ($writer) {
  278.                 $writer->save('php://output');
  279.             });
  280.             $dispositionHeader = $response->headers->makeDisposition(
  281.                 ResponseHeaderBag::DISPOSITION_ATTACHMENT,
  282.                 $filename
  283.             );
  284.             $response->headers->set('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  285.             $response->headers->set('Content-Disposition', $dispositionHeader);
  286.             return $response;
  287.         }
  288.         // 7) Retour à la vue
  289.         return $this->render('devis_particulier/filterblp.html.twig', [
  290.             'devis'        => $devis,
  291.             'clients'       => $client,
  292.             'totalsByFournisseur'=> $totalsByFournisseur,
  293.             'totalereste'        => array_sum(array_column($totalsByFournisseur, 'resteAPayer')),
  294.             'totalTTC'           => array_sum(array_column($totalsByFournisseur, 'totalTTC')),
  295.             'totalPaye'          => array_sum(array_column($totalsByFournisseur, 'totalPaye')),
  296.             'frtour' => $fr,
  297.             'frtouaa' => $fra,
  298.             'listeclient'=>$listeclient,
  299.             'clientselected'=>$clientselected,
  300.             'selectedRangeRaw'      => $dateRangeRaw,
  301.         ]);
  302.     }
  303.     #[Route('/Filter', name: 'app_devis_filter_facture', methods: ['GET', 'POST'])]
  304.     public function filterdevis(PaymentdeviRepository $paymentdeviRepository, ClientRepository $clientRepository, Request $request, DevisRepository $devisRepository): Response
  305.     {
  306.         $fr =  $devisRepository->findBy(['statut'=>"Facture-R"]);
  307.         $fra =  $devisRepository->findBy(['statut'=>"Facture-A"]);
  308.         // 1) Récupération des filtres
  309.         $filtres = $request->isMethod('GET') ? $request->query : $request->request;
  310.         $client = $filtres->get('client');
  311.         $dateRangeRaw  = trim($filtres->get('dateRangePicker', ''));
  312.         $action        = $filtres->get('action');
  313.         $listeclient = $clientRepository->findAll();
  314.         $clientselected = null;
  315.         if ($client){
  316.             $clientselected = $clientRepository->find($client);
  317.         }
  318. //        dd($client,$clientselected);
  319.         // 2) Préparation du mapping FR → ENG pour créer avec DateTime::createFromFormat
  320.         $months = [
  321.             'janv'      => 'Jan',   'févr' => 'Feb',  'mars' => 'Mar',
  322.             'avr'       => 'Apr',   'mai'  => 'May',  'juin' => 'Jun',
  323.             'juil'      => 'Jul',   'août' => 'Aug',  'sept' => 'Sep',
  324.             'oct'       => 'Oct',   'nov'  => 'Nov',  'déc'  => 'Dec',
  325.             'janvier'   => 'Jan',   'février'  => 'Feb', 'mars'     => 'Mar',
  326.             'avril'     => 'Apr',   'mai'      => 'May', 'juin'     => 'Jun',
  327.             'juillet'   => 'Jul',   'août'     => 'Aug', 'septembre'=> 'Sep',
  328.             'octobre'   => 'Oct',   'novembre' => 'Nov', 'décembre' => 'Dec',
  329.         ];
  330.         // 3) Split sur " to " (flatpickr) ou " au " (votre ancien plugin)
  331.         if (strpos($dateRangeRaw, ' to ') !== false) {
  332.             $parts = explode(' to ', $dateRangeRaw);
  333.         }
  334.         elseif (strpos($dateRangeRaw, ' au ') !== false) {
  335.             $parts = explode(' au ', $dateRangeRaw);
  336.         }
  337.         elseif ($dateRangeRaw !== '') {
  338.             $parts = [ $dateRangeRaw ];
  339.         }
  340.         else {
  341.             $parts = [];
  342.         }
  343.         $startDate = $endDate = null;
  344.         if (count($parts) > 0) {
  345.             $clean = function(string $str) use ($months): \DateTime {
  346.                 $s = trim(mb_strtolower($str));
  347.                 // si ISO "YYYY-MM-DD"
  348.                 if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $s)) {
  349.                     $dt = \DateTime::createFromFormat('Y-m-d', $s);
  350.                 } else {
  351.                     // on remplace les mois FR par des abbrv ENG
  352.                     $mapped = strtr($s, $months);
  353.                     // ex. "22 Jul, 2025"
  354.                     $dt = \DateTime::createFromFormat('d M, Y', $mapped);
  355.                 }
  356.                 if (! $dt) {
  357.                     throw new \Exception("Format de date invalide : « {$str} »");
  358.                 }
  359.                 return $dt;
  360.             };
  361.             // parsing
  362.             if (count($parts) === 2) {
  363.                 $startDate = $clean($parts[0])->setTime(0, 0, 0);
  364.                 $endDate   = $clean($parts[1])->setTime(23, 59, 59);
  365.             } else {
  366.                 // date unique
  367.                 $dt = $clean($parts[0]);
  368.                 $startDate = (clone $dt)->setTime(0, 0, 0);
  369.                 $endDate   = (clone $dt)->setTime(23, 59, 59);
  370.             }
  371.         }
  372.         // 4) Construction du QueryBuilder
  373.         $qb = $devisRepository
  374.             ->createQueryBuilder('f')
  375.             ->where('f.statut IN (:statuts)')
  376.             ->setParameter('statuts', ['Facture', 'Facture-R', 'Facture-A'])
  377.             ->orderBy('f.id', 'DESC');
  378.         if ($client) {
  379.             $qb->andWhere('f.client = :client')
  380.                 ->setParameter('client', $client);
  381.         }
  382.         if ($startDate && $endDate) {
  383.             $qb->andWhere('f.date BETWEEN :start AND :end')
  384.                 ->setParameter('start', $startDate)
  385.                 ->setParameter('end',   $endDate);
  386.         }
  387.         $devis = $qb->getQuery()->getResult();
  388.         // 5) Calcul des totaux
  389.         // Les factures de retour et d'avoir restent dans la liste, mais ne sont
  390.         // pas comptées comme des ventes séparées dans les statistiques.
  391.         $facturesOriginalesParId = [];
  392.         $facturesOriginalesParNumero = [];
  393.         foreach ($devis as $document) {
  394.             if ($document->getStatut() === 'Facture') {
  395.                 $facturesOriginalesParId[(string) $document->getId()] = $document;
  396.                 $facturesOriginalesParNumero[trim((string) $document->getNum())] = $document;
  397.             }
  398.         }
  399.         $resoudreFactureOriginale = static function (Devis $ajustement, ?string $idLien) use (
  400.             $facturesOriginalesParId,
  401.             $facturesOriginalesParNumero
  402.         ): ?Devis {
  403.             if ($idLien && isset($facturesOriginalesParId[(string) $idLien])) {
  404.                 return $facturesOriginalesParId[(string) $idLien];
  405.             }
  406.             $reference = trim((string) $ajustement->getReference());
  407.             if ($reference !== '' && isset($facturesOriginalesParNumero[$reference])) {
  408.                 return $facturesOriginalesParNumero[$reference];
  409.             }
  410.             // Anciennes données : le lien peut viser une facture supprimée puis recréée.
  411.             // Pour un retour total, le client et le montant permettent un rapprochement unique.
  412.             $candidats = [];
  413.             $totalAjustement = (float) ($ajustement->getTotalttc() ?? 0);
  414.             foreach ($facturesOriginalesParId as $factureOriginale) {
  415.                 if ($factureOriginale->getClient()?->getId() !== $ajustement->getClient()?->getId()) {
  416.                     continue;
  417.                 }
  418.                 $ecart = (float) ($factureOriginale->getTotalttc() ?? 0) - $totalAjustement;
  419.                 $timbre = (float) ($factureOriginale->getTimbre() ?? 0);
  420.                 if ($ecart >= -0.001 && $ecart <= $timbre + 0.001) {
  421.                     $candidats[] = $factureOriginale;
  422.                 }
  423.             }
  424.             return count($candidats) === 1 ? $candidats[0] : null;
  425.         };
  426.         $ajustementsParFacture = [];
  427.         foreach ($fr as $factureRetour) {
  428.             $factureOriginale = $resoudreFactureOriginale($factureRetour, $factureRetour->getFrtour());
  429.             if ($factureOriginale) {
  430.                 $factureId = (string) $factureOriginale->getId();
  431.                 $ajustementsParFacture[$factureId] = ($ajustementsParFacture[$factureId] ?? 0.0)
  432.                     + (float) ($factureRetour->getTotalttc() ?? 0);
  433.             }
  434.         }
  435.         foreach ($fra as $factureAvoir) {
  436.             $factureOriginale = $resoudreFactureOriginale($factureAvoir, $factureAvoir->getFav());
  437.             if ($factureOriginale) {
  438.                 $factureId = (string) $factureOriginale->getId();
  439.                 $ajustementsParFacture[$factureId] = ($ajustementsParFacture[$factureId] ?? 0.0)
  440.                     + (float) ($factureAvoir->getTotalttc() ?? 0);
  441.             }
  442.         }
  443.         $totalsByFournisseur = [];
  444.         foreach ($devis as $f) {
  445.             if ($f->getStatut() !== 'Facture') {
  446.                 continue;
  447.             }
  448.             $four = $f->getClient();
  449.             $key  = $four->getId();
  450.             if (!isset($totalsByFournisseur[$key])) {
  451.                 $totalsByFournisseur[$key] = [
  452.                     'client' => $four,
  453.                     'totalTTC'    => 0,
  454.                     'totalPaye'   => 0,
  455.                     'resteAPayer' => 0,
  456.                 ];
  457.             }
  458.             $totalFacture = (float) $f->getTotalttc();
  459.             $factureId = (string) $f->getId();
  460.             $aUnAjustement = array_key_exists($factureId, $ajustementsParFacture);
  461.             if ($aUnAjustement && $f->getMontantNet() !== null && $f->getMontantNet() !== '') {
  462.                 $totalFacture = max(0.0, (float) $f->getMontantNet());
  463.             } elseif ($aUnAjustement) {
  464.                 $totalFacture = max(0.0, $totalFacture - $ajustementsParFacture[$factureId]);
  465.                 $timbre = (float) ($f->getTimbre() ?? 0);
  466.                 if ($totalFacture <= $timbre + 0.001) {
  467.                     $totalFacture = 0.0;
  468.                 }
  469.             }
  470.             $resteFacture = $totalFacture;
  471.             $paiements = $paymentdeviRepository->findBy(['devis' => $f], ['id' => 'ASC']);
  472.             foreach ($paiements as $p) {
  473.                 $resteFacture = (float) ($p->getReste() ?? $resteFacture);
  474.             }
  475.             $totalFacture = round($totalFacture, 3);
  476.             $resteFacture = round(max(0.0, min($resteFacture, $totalFacture)), 3);
  477.             if (abs($resteFacture) < 0.001) {
  478.                 $resteFacture = 0.0;
  479.             }
  480.             $totalsByFournisseur[$key]['totalTTC'] += $totalFacture;
  481.             $totalsByFournisseur[$key]['resteAPayer'] += $resteFacture;
  482.             $totalsByFournisseur[$key]['totalPaye'] += $totalFacture - $resteFacture;
  483.         }
  484.         if (count($devis) === 0) {
  485.             $this->addFlash('info', 'Aucun résultat trouvé pour les critères sélectionnés.');
  486.         }
  487.         // 6) Export Excel (sans $typefiche)
  488.         if ($action === 'excel') {
  489.             if (count($totalsByFournisseur) === 0) {
  490.                 $this->addFlash('warningfilter', 'Aucune facture trouvée — fichier Excel non généré.');
  491.                 return $this->redirectToRoute('app_devis_liste_facture');
  492.             }
  493.             $spreadsheet = new Spreadsheet();
  494.             $sheet = $spreadsheet->getActiveSheet();
  495.             // Construire le titre
  496.             $titre = 'Rapport des fiches de vente';
  497.             $datePlage = ($startDate && $endDate)
  498.                 ? $startDate->format('d/m/Y') . ' au ' . $endDate->format('d/m/Y')
  499.                 : 'Toutes les dates';
  500.             $sheet->mergeCells('A1:D1');
  501.             $sheet->setCellValue('A1', $titre . ' | Plage de dates : ' . $datePlage);
  502.             $sheet->getStyle('A1')->getFont()->setBold(true)->getColor()->setRGB('FF0000');
  503.             $sheet->getStyle('A1')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  504.             // En-têtes
  505.             $sheet->setCellValue('A3', 'Raison sociale');
  506.             $sheet->setCellValue('B3', 'Total TTC');
  507.             $sheet->setCellValue('C3', 'Total réglé');
  508.             $sheet->setCellValue('D3', 'Reste à payer');
  509.             foreach (range('A', 'D') as $col) {
  510.                 $sheet->getColumnDimension($col)->setWidth(20);
  511.             }
  512.             $sheet->getColumnDimension('A')->setWidth(35);
  513.             $headerStyle = $sheet->getStyle('A3:D3');
  514.             $headerStyle->getFont()->setBold(true)->getColor()->setRGB('0000FF');
  515.             $headerStyle->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
  516.                 ->getStartColor()->setRGB('D0E3FA');
  517.             $row = 4;
  518.             $totalGlobalTTC = 0;
  519.             $totalGlobalPaye = 0;
  520.             $totalGlobalReste = 0;
  521.             foreach ($totalsByFournisseur as $data) {
  522.                 $raisonSociale = $data['client']->getRaisonsocial();
  523.                 $ttc = $data['totalTTC'];
  524.                 $paye = $data['totalPaye'];
  525.                 $reste = $data['resteAPayer'];
  526.                 $sheet->setCellValue("A$row", $raisonSociale);
  527.                 $sheet->setCellValue("B$row", $ttc);
  528.                 $sheet->setCellValue("C$row", $paye);
  529.                 $sheet->setCellValue("D$row", $reste);
  530.                 $sheet->getStyle("A$row:D$row")->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
  531.                     ->getStartColor()->setRGB('D0E3FA');
  532.                 $totalGlobalTTC += (float)  $ttc;
  533.                 $totalGlobalPaye += (float)  $paye;
  534.                 $totalGlobalReste += (float)  $reste;
  535.                 $row++;
  536.             }
  537.             $sheet->setCellValue("A$row", 'Total');
  538.             $sheet->setCellValue("B$row", $totalGlobalTTC);
  539.             $sheet->setCellValue("C$row", $totalGlobalPaye);
  540.             $sheet->setCellValue("D$row", $totalGlobalReste);
  541.             $sheet->getStyle("A$row:D$row")->getFont()->setBold(true)->getColor()->setRGB('FF0000');
  542.             $sheet->getStyle("A$row:D$row")->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  543.             $sheet->getStyle("A$row:D$row")->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
  544.                 ->getStartColor()->setRGB('FFD9D9');
  545.             // Générer le fichier Excel
  546.             $filename = ($startDate && $endDate)
  547.                 ? 'rapport_vente_' . $startDate->format('Ymd') . '_au_' . $endDate->format('Ymd') . '.xlsx'
  548.                 : 'rapport_vente_toutes_les_dates.xlsx';
  549.             $writer = new Xlsx($spreadsheet);
  550.             $response = new StreamedResponse(function () use ($writer) {
  551.                 $writer->save('php://output');
  552.             });
  553.             $dispositionHeader = $response->headers->makeDisposition(
  554.                 ResponseHeaderBag::DISPOSITION_ATTACHMENT,
  555.                 $filename
  556.             );
  557.             $response->headers->set('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  558.             $response->headers->set('Content-Disposition', $dispositionHeader);
  559.             return $response;
  560.         }
  561.         // 7) Retour à la vue
  562.         return $this->render('devis/filterfacture.html.twig', [
  563.             'devis'        => $devis,
  564.             'clients'       => $client,
  565.             'totalsByFournisseur'=> $totalsByFournisseur,
  566.             'totalereste'        => array_sum(array_column($totalsByFournisseur, 'resteAPayer')),
  567.             'totalTTC'           => array_sum(array_column($totalsByFournisseur, 'totalTTC')),
  568.             'totalPaye'          => array_sum(array_column($totalsByFournisseur, 'totalPaye')),
  569.             'frtour' => $fr,
  570.             'frtouaa' => $fra,
  571.             'listeclient'=>$listeclient,
  572.             'clientselected'=>$clientselected,
  573.             'selectedRangeRaw'      => $dateRangeRaw,
  574.             'blRefsByFacture'       => $this->buildBlRefsByFacture($devis, $devisRepository),
  575.         ]);
  576.     }
  577.     #[Route('/get-prix-par-reference', name: 'get-prix-par-reference', methods: ['GET', 'POST'])]
  578.     public function getPriceByReference(ClientRepository $clientRepository, Request $request, FamillesdarticlesRepository $famillesdarticlesRepository): Response
  579.     {
  580.         $reference = $request->get('reference');
  581.         $client = $request->get('client');
  582.         $clientexo = $clientRepository->findOneBy(['id' => $client]);
  583.         // Vérifiez si le client existe
  584.         if (!$clientexo) {
  585.             return new JsonResponse(['error' => 'Client introuvable'], 404);
  586.         }
  587.         // Récupérez la valeur de exoneres du client
  588.         $exo = $clientexo->getExoneres();
  589.         // Recherchez la FamilleArticle en fonction de la référence
  590.         $familleArticle = $famillesdarticlesRepository->findOneBy(['reference' => $reference]);
  591.         // Vérifiez si la FamilleArticle existe
  592.         if (!$familleArticle) {
  593.             return new JsonResponse(['error' => 'Référence introuvable'], 404);
  594.         }
  595.         $designation = $familleArticle->getDesignation();
  596.         $price = $familleArticle->getPrixvente();
  597.         $quantity = $familleArticle->getQunatity();
  598.         $tva = $familleArticle->getTva();
  599.         $deviss = $familleArticle->getFournisseur()->getDevise();
  600.         // Si le client n'est pas exonéré
  601.         if (!$exo) {
  602.             // Modifier la valeur de la TVA à 0
  603.             $familleArticle->setTva(0);
  604.             // Récupérer la valeur de la TVA mise à jour
  605.             $tva = $familleArticle->getTva();
  606.         }
  607.         return new JsonResponse(['devis' => $deviss, 'price' => $price, 'tva' => $tva, 'quantity' => $quantity, 'designation' => $designation]);
  608.     }
  609.     #[Route('/get-qte', name: 'get-qte', methods: ['GET', 'POST'])]
  610.     public function getPriceByReferenceqte(ClientRepository $clientRepository, Request $request, FamillesdarticlesRepository $famillesdarticlesRepository): Response
  611.     {
  612.         $reference = $request->get('reference');
  613.         $client = $request->get('client');
  614.         $clientexo = $clientRepository->findOneBy(['id' => $client]);
  615.         // Recherchez la FamilleArticle en fonction de la référence
  616.         $familleArticle = $famillesdarticlesRepository->findOneBy(['reference' => $reference]);
  617. //        dump($reference,$familleArticle);
  618.         // Vérifiez si la FamilleArticle existe
  619.         if (!$familleArticle) {
  620.             return new JsonResponse(['error' => 'Référence introuvable'], 404);
  621.         }
  622.         $designation = $familleArticle->getDesignation();
  623.         $price = $familleArticle->getPrixvente();
  624.         $quantity = $familleArticle->getQunatity();
  625.         $tva = $familleArticle->getTva();
  626.         $deviss = $familleArticle->getFournisseur()->getDevise();
  627. //        dump($quantity,$familleArticle);
  628.         return new JsonResponse(['devis' => $deviss, 'price' => $price, 'tva' => $tva, 'quantity' => $quantity, 'designation' => $designation]);
  629.     }
  630.     #[Route('/status_check', name: 'status_check', methods: ['GET', 'POST'])]
  631.     public function status_check(ClientRepository $clientRepository, DevisRepository $devisRepository, Request $request, FamillesdarticlesRepository $famillesdarticlesRepository): Response
  632.     {
  633.         $status = $request->get('status');
  634. //        dump($status);
  635.         $test = $devisRepository->findOneBy(['num' => $status]);
  636.         $testexiste = $test ? 1 : 0;
  637.         return new JsonResponse(['test' => $testexiste]);
  638.     }
  639.     #[Route('/intervention_fusion_pdf_impress', name: 'app_intervention_fusion_pdf_impress', methods: ['POST'])]
  640.     public function pdfInterventionFusion(Request $request, EntityManagerInterface $em, DevisRepository $devisRepository, InterventionRepository $interventionRepository, MessageerreurRepository $messageerreurRepository, MachineInterventionRepository $machineInterventionRepository, GestionmachinesRepository $gestionmachinesRepository, FournisseurRepository $fournisseurRepository): Response
  641.     {
  642.         // sécurité : uniquement AJAX + POST
  643.         if (!$request->isXmlHttpRequest()) {
  644.             return $this->redirectToRoute('app_intershow');
  645.         }
  646.         // 1) Récupérer les IDs cochés
  647.         $selectedIds = json_decode($request->request->get('selectedIntervention', '[]'), true) ?: [];
  648.         if (count($selectedIds) < 2) {
  649.             return new Response('Sélection insuffisante (min 2 interventions).', 400);
  650.         }
  651.         // 2) Charger les interventions correspondantes
  652.         $interventions = $interventionRepository->findBy(['id' => $selectedIds]);
  653.         if (count($interventions) !== count($selectedIds)) {
  654.             return new Response('Certaines interventions n\'existent plus.', 404);
  655.         }
  656.         // 3) Vérifier que :
  657.         //    - même client
  658.         //    - statut pas déjà archivé/facturé
  659.         //    - type = "Intervention"
  660.         $clientIds = [];
  661.         foreach ($interventions as $itv) {
  662.             // ici on autorise statut NULL ou "Intervention"
  663.             if ($itv->getStatut() !== null && $itv->getStatut() !== 'Intervention') {
  664.                 return new Response("Une intervention est déjà archivée / facturée.", 400);
  665.             }
  666.             if ($itv->getType() !== 'Intervention') {
  667.                 return new Response("Toutes les interventions doivent être de type 'Intervention'.", 400);
  668.             }
  669.             $clientIds[$itv->getClient()->getId()] = true;
  670.         }
  671.         if (count($clientIds) > 1) {
  672.             return new Response("Les interventions doivent appartenir au même client.", 400);
  673.         }
  674.         // 4) Totaux globaux
  675.         $totalHT        = 0;
  676.         $totalTransport = 0;
  677.         $totalTTC       = 0;
  678.         $tvaUsed        = null;
  679.         foreach ($interventions as $itv) {
  680.             $totalHT        += (float) ($itv->getMontantht()     ?? 0);
  681.             $totalTransport += (float) ($itv->getPrixtransport() ?? 0);
  682.             $totalTTC       += (float) ($itv->getTotalttc()      ?? 0);
  683.             if ($tvaUsed === null && $itv->getTva() !== null) {
  684.                 $tvaUsed = $itv->getTva();
  685.             }
  686.         }
  687.         // *** timbre = 1 DT fixe
  688.         $timbre = 1;
  689.         // *** Net à payer = total TTC global + timbre
  690.         $netAPayer = $totalTTC + $timbre;
  691.         // 5) Génération du numéro de facture
  692.         //
  693.         // On copie la logique de ton status_devis :
  694.         // - On prend toutes les devis avec statut 'Facture'
  695.         // - On cherche le plus grand suffixe numérique derrière le préfixe "F"
  696.         // - On fabrique F<max+1> en s'assurant qu'il n'existe pas déjà
  697.         //
  698.         $prefix = 'F';
  699.         $existingFactures = $devisRepository->findBy(['statut' => 'Facture']);
  700.         $maxNumber = 0;
  701.         foreach ($existingFactures as $dv) {
  702.             $num = $dv->getNum(); // ex "F83"
  703.             if (strpos($num, $prefix) === 0) {
  704.                 $suffix = substr($num, strlen($prefix));
  705.                 if (ctype_digit($suffix)) {
  706.                     $suffixInt = (int)$suffix;
  707.                     if ($suffixInt > $maxNumber) {
  708.                         $maxNumber = $suffixInt;
  709.                     }
  710.                 }
  711.             }
  712.         }
  713.         // incrémente jusqu'à un numéro libre
  714.         do {
  715.             $maxNumber++;
  716.             $generatedNum = $prefix . $maxNumber; // ex F84
  717.             $exists = $devisRepository->findOneBy(['num' => $generatedNum]);
  718.         } while ($exists);
  719.         // 6) Créer le Devis qui sert de facture intervention
  720.         $client = $interventions[0]->getClient();
  721.         $devis = new Devis();
  722.         $devis->setClient($client);
  723.         // *** très important :
  724.         // statut = 'Facture' => cohérent avec le reste du système
  725.         $devis->setStatut('Facture');
  726.         // numéro trouvé ci-dessus
  727.         $devis->setNum($generatedNum);
  728.         // date facture = maintenant
  729.         $devis->setDate(new DateTime('now', new DateTimeZone('Africa/Tunis')));
  730.         // champs financiers sur la facture globale, si l'entité Devis les a
  731.         if (method_exists($devis, 'setMontantht'))       { $devis->setMontantht($totalHT); }
  732.         if (method_exists($devis, 'setPrixtransport'))   { $devis->setPrixtransport($totalTransport); }
  733.         if (method_exists($devis, 'setTva'))             { $devis->setTva($tvaUsed ?? 0); }
  734.         if (method_exists($devis, 'setTotalttc'))        { $devis->setTotalttc($totalTTC); }
  735.         if (method_exists($devis, 'setTimbre'))          { $devis->setTimbre($timbre); }          // si tu as un champ timbre
  736.         if (method_exists($devis, 'setNetapayer'))       { $devis->setNetapayer($netAPayer); }    // si tu as un champ netapayer
  737.         // garder trace des IDs fusionnées
  738.         $idsString = json_encode(array_map(fn($i) => $i->getId(), $interventions));
  739.         if (method_exists($devis, 'setIdintervold')) {
  740.             $devis->setIdintervold($idsString);
  741.         }
  742.         $em->persist($devis);
  743.         // 7) Marquer chaque intervention comme archivée ET la lier à la facture
  744.         foreach ($interventions as $itv) {
  745.             $itv->setStatut('Archive');     // elle sort de la liste active
  746.             $itv->setDevis($devis);         // lien vers la facture créée
  747.             if (method_exists($devis, 'addIntervention')) {
  748.                 $devis->addIntervention($itv);
  749.             }
  750.             $em->persist($itv);
  751.         }
  752.         // Sauvegarde en BDD
  753.         $em->flush();
  754.         // 8) Préparer les données "blocks" pour le PDF
  755.         $fournisseur = $fournisseurRepository->find(7);
  756.         $blocks = [];
  757.         foreach ($interventions as $interv) {
  758.             // Machines liées
  759.             $machineIds = $interv->getMachineIds() ?: [];
  760.             $machines = $gestionmachinesRepository->findBy(['id' => $machineIds]);
  761.             // machine_intervention liées
  762.             $machineIntervs = $machineInterventionRepository->findBy([
  763.                 'intervention' => $interv,
  764.             ]);
  765.             // rowsForTwig = lignes "message erreur / solution / remarque" lisibles
  766.             $rowsForTwig = [];
  767.             foreach ($machineIntervs as $mi) {
  768.                 $rawIds = $mi->getMessageErreurs(); // "1,5"
  769.                 $ids = [];
  770.                 if (!empty($rawIds)) {
  771.                     $ids = array_map('trim', explode(',', $rawIds));
  772.                 }
  773.                 $messagesText = [];
  774.                 $solutionsText = [];
  775.                 foreach ($ids as $mid) {
  776.                     if ($mid === '') continue;
  777.                     $err = $messageerreurRepository->find($mid);
  778.                     if ($err) {
  779.                         if ($err->getMeesage()) {
  780.                             $messagesText[] = $err->getMeesage();
  781.                         }
  782.                         if ($err->getSolution()) {
  783.                             $solutionsText[] = $err->getSolution();
  784.                         }
  785.                     }
  786.                 }
  787.                 // solution manuelle éventuellement saisie sur MachineIntervention
  788.                 if ($mi->getSolutions()) {
  789.                     $solutionsText[] = $mi->getSolutions();
  790.                 }
  791.                 $rowsForTwig[] = [
  792.                     'machine'   => $mi->getMachine(),
  793.                     'messages'  => implode(', ', $messagesText),
  794.                     'solutions' => implode(', ', $solutionsText),
  795.                     'remarque'  => $mi->getRemarque(),
  796.                 ];
  797.             }
  798.             $blocks[] = [
  799.                 'intervention'          => $interv,
  800.                 'machines'              => $machines,
  801.                 'rowsForTwig'           => $rowsForTwig,
  802.                 'machineInterventions'  => $machineIntervs,
  803.             ];
  804.         }
  805.         // 9) Génération PDF avec Dompdf
  806.         $pdfOptions = new Options();
  807.         $pdfOptions->set('isHtml5ParserEnabled', true);
  808.         $pdfOptions->set('isRemoteEnabled', true);
  809.         $dompdf = new Dompdf($pdfOptions);
  810.         $html = $this->renderView('intervention/pdfintervnetion.html.twig', [
  811.             'devis'           => $devis,
  812.             'client'          => $client,
  813.             'fournisseur'     => $fournisseur,
  814.             'blocks'          => $blocks,
  815.             'totalHT'         => $totalHT,
  816.             'totalTransport'  => $totalTransport,
  817.             'tva'             => $tvaUsed ?? 0,
  818.             'totalTTC'        => $totalTTC,
  819.             'timbre'          => $timbre,
  820.             'netAPayer'       => $netAPayer,
  821.         ]);
  822.         $dompdf->loadHtml($html);
  823.         $dompdf->setPaper('A4', 'portrait');
  824.         $dompdf->setHttpContext(stream_context_create([
  825.             'ssl' => [
  826.                 'verify_peer' => false,
  827.                 'verify_peer_name' => false,
  828.                 'allow_self_signed' => true
  829.             ]
  830.         ]));
  831.         $dompdf->render();
  832.         $pdfOutput = $dompdf->output();
  833.         $response = new Response($pdfOutput);
  834.         $response->headers->set('Content-Type', 'application/pdf');
  835.         $response->headers->set(
  836.             'Content-Disposition',
  837.             sprintf('attachment; filename="Facture-%s.pdf"', $devis->getNum())
  838.         );
  839.         return $response;
  840.     }
  841.     #[Route('/status_devis', name: 'status_devis', methods: ['GET', 'POST'])]
  842.     public function status_devis(ClientRepository $clientRepository, DevisRepository $devisRepository, Request $request, FamillesdarticlesRepository $famillesdarticlesRepository): Response {
  843.         $status = $request->get('status');
  844.         $client = $request->get('client');
  845.         $clientexo = $clientRepository->findOneBy(['id' => $client]);
  846.         $prefixMap = [
  847.             'Demande devis' => 'Dd',
  848.             'Devis' => 'D',
  849.             'Commande' => 'C',
  850.             'BL' => 'BL',
  851.             'BLP' => 'BLP',
  852.             'Facture' => 'F'
  853.         ];
  854.         if (!isset($prefixMap[$status])) {
  855.             return new JsonResponse(['error' => 'Statut inconnu'], 400);
  856.         }
  857.         $prefix = $prefixMap[$status];
  858.         $maxNumber = 0;
  859.         // Récupérer tous les numéros de devis correspondant au préfixe quel que soit le statut actuel
  860.         // (prend en compte les BL archivés 'Blf', les BL fusionnés 'BL_FUSIONNE', 'BLFUS', etc.)
  861.         $rows = $devisRepository->createQueryBuilder('d')
  862.             ->select('d.num')
  863.             ->where('d.num LIKE :prefixPattern')
  864.             ->setParameter('prefixPattern', $prefix . '%')
  865.             ->getQuery()
  866.             ->getScalarResult();
  867.         foreach ($rows as $row) {
  868.             $num = trim((string)($row['num'] ?? ''));
  869.             if ($num !== '' && preg_match('/^' . preg_quote($prefix, '/') . '(\d+)$/', $num, $matches)) {
  870.                 $suffixInt = (int)$matches[1];
  871.                 if ($suffixInt > $maxNumber) {
  872.                     $maxNumber = $suffixInt;
  873.                 }
  874.             }
  875.         }
  876.         $testexiste = 0;
  877.         do {
  878.             $maxNumber++;
  879.             $generatedNum = $prefix . $maxNumber;
  880.             $exists = $devisRepository->findOneBy(['num' => $generatedNum]);
  881.             if ($exists) {
  882.                 $testexiste = 1;
  883.             }
  884.         } while ($exists);
  885.         return new JsonResponse(['num' => $generatedNum, 'test' => $testexiste]);
  886.     }
  887. //    #[Route('/status_devis', name: 'status_devis', methods: ['GET', 'POST'])]
  888. //    public function status_devis(
  889. //        ClientRepository $clientRepository,
  890. //        DevisRepository $devisRepository,
  891. //        Request $request,
  892. //        FamillesdarticlesRepository $famillesdarticlesRepository
  893. //    ): Response {
  894. //        $status = $request->get('status');
  895. //        $client = $request->get('client');
  896. //
  897. //        $clientexo = $clientRepository->findOneBy(['id' => $client]);
  898. //
  899. //        $devisList = $devisRepository->findBy(['statut' => $status]);
  900. //
  901. //        $prefixMap = [
  902. //            'Demande devis' => 'Dd',
  903. //            'Devis' => 'D',
  904. //            'Commande' => 'C',
  905. //            'BL' => 'BL',
  906. //            'BLP' => 'BLP',
  907. //            'Facture' => 'F'
  908. //        ];
  909. //
  910. //        if (!isset($prefixMap[$status])) {
  911. //            return new JsonResponse(['error' => 'Statut inconnu'], 400);
  912. //        }
  913. //
  914. //        $prefix = $prefixMap[$status];
  915. //        $maxNumber = 0;
  916. //
  917. //        foreach ($devisList as $devis) {
  918. //            $num = $devis->getNum();
  919. //            if (strpos($num, $prefix) === 0) {
  920. //                $suffix = substr($num, strlen($prefix));
  921. //                if (ctype_digit($suffix)) {
  922. //                    $suffixInt = (int)$suffix;
  923. //                    if ($suffixInt > $maxNumber) {
  924. //                        $maxNumber = $suffixInt;
  925. //                    }
  926. //                }
  927. //            }
  928. //        }
  929. //
  930. //        $testexiste = 0;
  931. //        do {
  932. //            $maxNumber++;
  933. //            $generatedNum = $prefix . $maxNumber;
  934. //            $exists = $devisRepository->findOneBy(['num' => $generatedNum]);
  935. //            if ($exists) {
  936. //                $testexiste = 1;
  937. //            }
  938. //        } while ($exists);
  939. //
  940. //        return new JsonResponse(['num' => $generatedNum, 'test' => $testexiste]);
  941. //    }
  942.     // avant modification le 07/05/2025
  943. //    #[Route('/status_devis', name: 'status_devis', methods: ['GET', 'POST'])]
  944. //    public function status_devis(ClientRepository $clientRepository, DevisRepository $devisRepository, Request $request, FamillesdarticlesRepository $famillesdarticlesRepository): Response
  945. //    {
  946. //        $status = $request->get('status');
  947. //        $client = $request->get('client');
  948. //
  949. //
  950. //        $clientexo = $clientRepository->findOneBy(['id' => $client]);
  951. //
  952. //        // Recherchez la FamilleArticle en fonction de la référence
  953. //        $totstatu = $devisRepository->findBy(['statut' => $status]);
  954. //
  955. //        $count = count($totstatu);
  956. //
  957. //
  958. //        if ($count == 0) {
  959. //            $count = 1;
  960. //        }
  961. //        else {
  962. //            $count++;
  963. //        }
  964. //
  965. //        // Génération du numéro de base
  966. //        $tt = "";
  967. //        switch ($status) {
  968. //            case "Demande devis":
  969. //                $tt = "Dd" . $count;
  970. //                break;
  971. //            case "Devis":
  972. //                $tt = "D" . $count;
  973. //                break;
  974. //            case "Commande":
  975. //                $tt = "C" . $count;
  976. //                break;
  977. //            case "BL":
  978. //                $tt = "BL" . $count;
  979. //                break;
  980. //            case "BLP":
  981. //                $tt = "BLP" . $count;
  982. //                break;
  983. //            case "Facture":
  984. //                $tt = "F" . $count;
  985. //                break;
  986. //            default:
  987. //                return new JsonResponse(['error' => 'Statut inconnu'], 400);
  988. //        }
  989. //
  990. //        // Vérification de l'existence du numéro et génération d'un nouveau si nécessaire
  991. //        $testexiste = 0;
  992. //        while ($devisRepository->findOneBy(['num' => $tt])) {
  993. //            $count++;
  994. //            switch ($status) {
  995. //                case "Demande devis":
  996. //                    $tt = "Dd" . $count;
  997. //                    break;
  998. //                case "Devis":
  999. //                    $tt = "D" . $count;
  1000. //                    break;
  1001. //                case "Commande":
  1002. //                    $tt = "C" . $count;
  1003. //                    break;
  1004. //                case "BL":
  1005. //                    $tt = "BL" . $count;
  1006. //                    break;
  1007. //                case "BLP":
  1008. //                    $tt = "BLP" . $count;
  1009. //                    break;
  1010. //                case "Facture":
  1011. //                    $tt = "F" . $count;
  1012. //                    break;
  1013. //            }
  1014. //            $testexiste = 1; // Numéro existant, donc on a dû générer un nouveau
  1015. //        }
  1016. //
  1017. //
  1018. //        return new JsonResponse(['num' => $tt, 'test' => $testexiste]);
  1019. //    }
  1020.     //fin avant modification le 07/05/2025
  1021. //    #[Route('/status_devis', name: 'status_devis', methods: ['GET', 'POST'])]
  1022. //    public function status_devis(ClientRepository $clientRepository, DevisRepository $devisRepository, Request $request, FamillesdarticlesRepository $famillesdarticlesRepository): Response
  1023. //    {
  1024. //        $status = $request->get('status');
  1025. //        $client = $request->get('client');
  1026. //
  1027. //        $clientexo = $clientRepository->findOneBy(['id' => $client]);
  1028. //        // Recherchez la FamilleArticle en fonction de la référence
  1029. //        $totstatu = $devisRepository->findBy(['statut' => $status]);
  1030. //
  1031. //
  1032. //        $count = count($totstatu);
  1033. //
  1034. //
  1035. //        if ($count == 0) {
  1036. //            $count = 1;
  1037. //        }
  1038. //        else {
  1039. //            $count = $count + 1;
  1040. //        }
  1041. //
  1042. //        // Vérifiez si la FamilleArticle existe
  1043. //        if ($status == "Demande devis") {
  1044. //            $tt = "Dd" . $count;
  1045. //        } elseif ($status == "Devis") {
  1046. //            $tt = "D" . $count;
  1047. //        } elseif ($status == "Commande") {
  1048. //            $tt = "C" . $count;
  1049. //        } elseif ($status == "BL") {
  1050. //            $tt = "BL" . $count;
  1051. //        } elseif ($status == "Facture") {
  1052. //            $tt = "F" . $count;
  1053. //        }
  1054. //
  1055. //        $test = $devisRepository->findOneBy(['num' => $tt]);
  1056. //
  1057. //        if ($test) {
  1058. //            $testexiste = 1;
  1059. //        } else {
  1060. //            $testexiste = 0;
  1061. //        }
  1062. //
  1063. //
  1064. //
  1065. //        return new JsonResponse(['num' => $tt, 'test' => $testexiste]);
  1066. //    }
  1067. //
  1068. //
  1069. //
  1070. //    #[Route('/status_check', name: 'status_check', methods: ['GET', 'POST'])]
  1071. //    public function status_check(ClientRepository $clientRepository, DevisRepository $devisRepository, Request $request, FamillesdarticlesRepository $famillesdarticlesRepository): Response
  1072. //    {
  1073. //        $status = $request->get('status');
  1074. //
  1075. //        $test = $devisRepository->findOneBy(['num' => $status]);
  1076. //
  1077. //        if ($test) {
  1078. //            $testexiste = 1;
  1079. //        } else {
  1080. //            $testexiste = 0;
  1081. //        }
  1082. //
  1083. //        return new JsonResponse([ 'test' => $testexiste]);
  1084. //    }
  1085.     #[Route('/get-tva-client', name: 'get-tva-client', methods: ['GET', 'POST'])]
  1086.     public function getPriceByclient(ClientRepository $clientRepository, Request $request, FamillesdarticlesRepository $famillesdarticlesRepository): Response
  1087.     {
  1088.         $tableauRf = $request->get('tableauRf');
  1089.         $tvas = [];
  1090.         $client = $request->get('client');
  1091.         $clientexo = $clientRepository->findOneBy(['id' => $client]);
  1092.         // Vérifiez si le client existe
  1093.         if (!$clientexo) {
  1094.             return new JsonResponse(['error' => 'Client introuvable'], 404);
  1095.         }
  1096.         // Récupérez la valeur de exoneres du client
  1097.         $exo = $clientexo->getExoneres();
  1098.         if ($exo == false) {
  1099.             $tva = false;
  1100.         } else {
  1101.             $tva = true;
  1102.             for ($i = 0; $i < count($tableauRf); $i++) {
  1103.                 $reference = $tableauRf[$i];
  1104.                 $familleArticle = $famillesdarticlesRepository->findOneBy(['reference' => $reference]);
  1105.                 if ($familleArticle) {
  1106.                     $tva = $familleArticle->getTva();
  1107.                     $tvas[] = $tva;
  1108.                 } else {
  1109.                     $tva = 0;
  1110.                 }
  1111.             }
  1112.             $responseData = [
  1113.                 'tva' => $tvas,
  1114.             ];
  1115.             return new JsonResponse($responseData);
  1116.         }
  1117.         return new JsonResponse(['tva' => $tva]);
  1118.     }
  1119.     #[Route('/facture', name: 'app_devis_liste_facture', methods: ['GET'])]
  1120.     public function listefacture(DevisRepository $devisRepository, ClientRepository $clientRepository): Response
  1121.     {
  1122.         $clients = $clientRepository->findAll();
  1123.         // 1️⃣ Récupérer les devis ayant le statut "Facture" ou "Intervention"
  1124.         $devisTousSaufBl = $devisRepository->createQueryBuilder('d')
  1125.             ->where('d.statut IN (:statuts)')
  1126.             ->andWhere('d.statut NOT IN (:exclus)')
  1127.             ->setParameter('statuts', ['Facture', 'Facture-R', 'Intervention' , 'Facture-A'])
  1128.             ->setParameter('exclus', ['Blf', 'BLP'])
  1129.             ->orderBy('d.num', 'DESC')
  1130.             ->getQuery()
  1131.             ->getResult();
  1132.         // 2️⃣ Autres factures spécifiques
  1133.         $fr = $devisRepository->findBy(['statut' => "Facture-R"]);
  1134.         $fra = $devisRepository->findBy(['statut' => "Facture-A"]);
  1135.         // 3️⃣ BL d'origine des factures issues d'une fusion (complète ou partielle)
  1136.         $blRefsByFacture = $this->buildBlRefsByFacture($devisTousSaufBl, $devisRepository);
  1137.         // 4️⃣ Rendu
  1138.         return $this->render('devis/listefacture.html.twig', [
  1139.             'devis' => $devisTousSaufBl,
  1140.             'frtour' => $fr,
  1141.             'frtouaa' => $fra,
  1142.             'clients' => $clients,
  1143.             'blRefsByFacture' => $blRefsByFacture,
  1144.         ]);
  1145.     }
  1146.     /**
  1147.      * Map factureId => [{id, num}] des BL d'origine, pour les factures
  1148.      * issues d'une fusion de BL (oldtype FactureBLFusion / FactureBLFusionPartielle,
  1149.      * ou anciennes factures partielles identifiables par fav = ID du BLFUS).
  1150.      */
  1151.     private function buildBlRefsByFacture(array $factures, DevisRepository $devisRepository): array
  1152.     {
  1153.         $blRefsByFacture = [];
  1154.         foreach ($factures as $facture) {
  1155.             if (!$this->isFactureFusionBl($facture)) {
  1156.                 continue;
  1157.             }
  1158.             $ids = $this->decodeBlIds($facture->getIddevisold());
  1159.             if ($ids === []) {
  1160.                 continue;
  1161.             }
  1162.             $refs = [];
  1163.             foreach ($devisRepository->findBy(['id' => $ids]) as $bl) {
  1164.                 $refs[] = ['id' => $bl->getId(), 'num' => $bl->getNum()];
  1165.             }
  1166.             if ($refs !== []) {
  1167.                 $blRefsByFacture[$facture->getId()] = $refs;
  1168.             }
  1169.         }
  1170.         return $blRefsByFacture;
  1171.     }
  1172.     /**
  1173.      * Numéros des BL d'origine d'une facture de fusion (ex. "BL1, BL2"), ou null.
  1174.      */
  1175.     private function getBlOriginauxNums(Devis $devi, DevisRepository $devisRepository): ?string
  1176.     {
  1177.         if (!$this->isFactureFusionBl($devi)) {
  1178.             return null;
  1179.         }
  1180.         $ids = $this->decodeBlIds($devi->getIddevisold());
  1181.         if ($ids === []) {
  1182.             return null;
  1183.         }
  1184.         $nums = [];
  1185.         foreach ($devisRepository->findBy(['id' => $ids]) as $bl) {
  1186.             $nums[] = $bl->getNum();
  1187.         }
  1188.         return $nums !== [] ? implode(', ', $nums) : null;
  1189.     }
  1190.     private function decodeBlIds(?string $iddevisold): array
  1191.     {
  1192.         $decoded = json_decode((string) $iddevisold, true);
  1193.         $ids = is_array($decoded) ? $decoded : array_filter(explode(',', (string) $iddevisold));
  1194.         return array_values(array_unique(array_filter(array_map('intval', $ids))));
  1195.     }
  1196.     private function isFactureFusionBl(Devis $devi): bool
  1197.     {
  1198.         if (in_array($devi->getOldtype(), ['FactureBLFusion', 'FactureBLFusionPartielle'], true)) {
  1199.             return true;
  1200.         }
  1201.         return $devi->getFav() !== null && $devi->getFav() !== ''
  1202.             && $devi->getIddevisold() !== null && $devi->getIddevisold() !== '';
  1203.     }
  1204. //    #[Route('/facture', name: 'app_devis_liste_facture', methods: ['GET'])]
  1205. //    public function listefacture(DevisRepository $devisRepository,ClientRepository $clientRepository): Response
  1206. //    {
  1207. //        $devisTousSaufBl = $devisRepository->findBy(['statut'=>'Facture'], ['num' => 'DESC'] );
  1208. //        $clients = $clientRepository->findAll();
  1209. ////        dd($devisTousSaufBl);
  1210. //// Filtrer les devis avec le type "bl"
  1211. ////        $devisTousSaufBl = array_filter($devisTousSaufBl, function ($devis) {
  1212. ////            return $devis->getStatut() !== 'Blf';
  1213. ////        });
  1214. //        $devisTousSaufBl = array_filter($devisTousSaufBl, function ($devis) {
  1215. //            return $devis->getStatut() !== 'Blf' && $devis->getStatut() !== 'BLP' && $devis->getOldtype() !== 'BLP';
  1216. //        });
  1217. //
  1218. //
  1219. //        $fr =  $devisRepository->findBy(['statut'=>"Facture-R"]);
  1220. //        $fra =  $devisRepository->findBy(['statut'=>"Facture-A"]);
  1221. //
  1222. //        return $this->render('devis/listefacture.html.twig', [
  1223. //            'devis' => $devisTousSaufBl,
  1224. //            'frtour' => $fr,
  1225. //            'frtouaa' => $fra,
  1226. //            'clients'=>$clients
  1227. //        ]);
  1228. //    }
  1229.     #[Route('/liste_demande_devis', name: 'app_devis_iste_demande_devis', methods: ['GET'])]
  1230.     public function listedemandedevis(DevisRepository $devisRepository): Response
  1231.     {
  1232.         $devisTousSaufBl = $devisRepository->findBy(['statut'=>'Demande devis'], ['num' => 'DESC'] );
  1233. // Filtrer les devis avec le type "bl"
  1234. //        $devisTousSaufBl = array_filter($devisTousSaufBl, function ($devis) {
  1235. //            return $devis->getStatut() !== 'Blf';
  1236. //        });
  1237.         $devisTousSaufBl = array_filter($devisTousSaufBl, function ($devis) {
  1238.             return $devis->getStatut() !== 'Blf' && $devis->getStatut() !== 'BLP' && $devis->getOldtype() !== 'BLP';
  1239.         });
  1240.         $fr =  $devisRepository->findBy(['statut'=>"Facture-R"]);
  1241.         $fra =  $devisRepository->findBy(['statut'=>"Facture-A"]);
  1242.         return $this->render('devis/listedemandedevis.html.twig', [
  1243.             'devis' => $devisTousSaufBl,
  1244.             'frtour' => $fr,
  1245.             'frtouaa' => $fra,
  1246.         ]);
  1247.     }
  1248.     #[Route('/liste_devis', name: 'app_devis_liste_devis', methods: ['GET'])]
  1249.     public function listedevis(DevisRepository $devisRepository): Response
  1250.     {
  1251.         // 1) Récupérer tous les devis avec statut "Devis" (sans order BY num ici)
  1252.         $devisTousSaufBl = $devisRepository->findBy([
  1253.             'statut' => 'Devis',
  1254.         ]);
  1255.         // 2) Filtrer ceux qu'on ne veut pas (Blf, BLP, oldtype = BLP)
  1256.         $devisTousSaufBl = array_filter($devisTousSaufBl, function (Devis $devis) {
  1257.             return $devis->getStatut() !== 'Blf'
  1258.                 && $devis->getStatut() !== 'BLP'
  1259.                 && $devis->getOldtype() !== 'BLP';
  1260.         });
  1261.         // 3) Trier par numéro numérique : D12, D11, D10, D9, ..., D1
  1262.         usort($devisTousSaufBl, function (Devis $a, Devis $b) {
  1263.             // On enlève les lettres et on garde que les chiffres
  1264.             $numA = (int) preg_replace('/\D/', '', $a->getNum()); // "D12" -> 12
  1265.             $numB = (int) preg_replace('/\D/', '', $b->getNum()); // "D9"  -> 9
  1266.             // Tri DESC : le plus grand en premier
  1267.             return $numB <=> $numA;
  1268.         });
  1269. //        dd($devisTousSaufBl);
  1270.         // 4) Récupérer les factures-R et factures-A
  1271.         $fr  = $devisRepository->findBy(['statut' => 'Facture-R']);
  1272.         $fra = $devisRepository->findBy(['statut' => 'Facture-A']);
  1273.         // 5) Envoyer à Twig
  1274.         return $this->render('devis/listedevis.html.twig', [
  1275.             'devis'   => $devisTousSaufBl,
  1276.             'frtour'  => $fr,
  1277.             'frtouaa' => $fra,
  1278.         ]);
  1279.     }
  1280. //    #[Route('/liste_devis', name: 'app_devis_liste_devis', methods: ['GET'])]
  1281. //    public function listedevis(DevisRepository $devisRepository): Response
  1282. //    {
  1283. //        $devisTousSaufBl = $devisRepository->findBy(['statut'=>'Devis'], ['num' => 'DESC'] );
  1284. //        dd($devisTousSaufBl);
  1285. //// Filtrer les devis avec le type "bl"
  1286. ////        $devisTousSaufBl = array_filter($devisTousSaufBl, function ($devis) {
  1287. ////            return $devis->getStatut() !== 'Blf';
  1288. ////        });
  1289. //        $devisTousSaufBl = array_filter($devisTousSaufBl, function ($devis) {
  1290. //            return $devis->getStatut() !== 'Blf' && $devis->getStatut() !== 'BLP' && $devis->getOldtype() !== 'BLP';
  1291. //        });
  1292. //
  1293. //
  1294. //        $fr =  $devisRepository->findBy(['statut'=>"Facture-R"]);
  1295. //        $fra =  $devisRepository->findBy(['statut'=>"Facture-A"]);
  1296. //
  1297. //        return $this->render('devis/listedevis.html.twig', [
  1298. //            'devis' => $devisTousSaufBl,
  1299. //            'frtour' => $fr,
  1300. //            'frtouaa' => $fra,
  1301. //        ]);
  1302. //    }
  1303.     #[Route('/liste_BL', name: 'app_devis_liste_bl', methods: ['GET'])]
  1304.     public function listebl(DevisRepository $devisRepository): Response
  1305.     {
  1306.         $devisTousSaufBl = $devisRepository->findBy(['statut'=>'BL'], ['num' => 'DESC'] );
  1307. // Filtrer les devis avec le type "bl"
  1308. //        $devisTousSaufBl = array_filter($devisTousSaufBl, function ($devis) {
  1309. //            return $devis->getStatut() !== 'Blf';
  1310. //        });
  1311.         $devisTousSaufBl = array_filter($devisTousSaufBl, function ($devis) {
  1312.             return $devis->getStatut() !== 'Blf' && $devis->getStatut() !== 'BLP' && $devis->getOldtype() !== 'BLP';
  1313.         });
  1314.         $fr =  $devisRepository->findBy(['statut'=>"Facture-R"]);
  1315.         $fra =  $devisRepository->findBy(['statut'=>"Facture-A"]);
  1316.         return $this->render('devis/listebl.html.twig', [
  1317.             'devis' => $devisTousSaufBl,
  1318.             'frtour' => $fr,
  1319.             'frtouaa' => $fra,
  1320.         ]);
  1321.     }
  1322.     #[Route('/liste_commandes', name: 'app_devis_liste_commandes', methods: ['GET'])]
  1323.     public function listecommandes(DevisRepository $devisRepository): Response
  1324.     {
  1325.         $devisTousSaufBl = $devisRepository->findBy(['statut'=>'Commande'], ['num' => 'DESC'] );
  1326. // Filtrer les devis avec le type "bl"
  1327. //        $devisTousSaufBl = array_filter($devisTousSaufBl, function ($devis) {
  1328. //            return $devis->getStatut() !== 'Blf';
  1329. //        });
  1330.         $devisTousSaufBl = array_filter($devisTousSaufBl, function ($devis) {
  1331.             return $devis->getStatut() !== 'Blf' && $devis->getStatut() !== 'BLP' && $devis->getOldtype() !== 'BLP';
  1332.         });
  1333.         $fr =  $devisRepository->findBy(['statut'=>"Facture-R"]);
  1334.         $fra =  $devisRepository->findBy(['statut'=>"Facture-A"]);
  1335.         return $this->render('devis/listecommandes.html.twig', [
  1336.             'devis' => $devisTousSaufBl,
  1337.             'frtour' => $fr,
  1338.             'frtouaa' => $fra,
  1339.         ]);
  1340.     }
  1341.     #[Route('/', name: 'app_devis_index', methods: ['GET'])]
  1342.     public function index(DevisRepository $devisRepository): Response
  1343.     {
  1344.         $devisTousSaufBl = $devisRepository->findAll();
  1345. // Filtrer les devis avec le type "bl"
  1346. //        $devisTousSaufBl = array_filter($devisTousSaufBl, function ($devis) {
  1347. //            return $devis->getStatut() !== 'Blf';
  1348. //        });
  1349.         $devisTousSaufBl = array_filter($devisTousSaufBl, function ($devis) {
  1350.             return $devis->getStatut() !== 'Blf' && $devis->getStatut() !== 'BLP' && $devis->getOldtype() !== 'BLP';
  1351.         });
  1352.         $fr =  $devisRepository->findBy(['statut'=>"Facture-R"]);
  1353.         $fra =  $devisRepository->findBy(['statut'=>"Facture-A"]);
  1354.         return $this->render('devis/index.html.twig', [
  1355.             'devis' => $devisTousSaufBl,
  1356.             'frtour' => $fr,
  1357.             'frtouaa' => $fra,
  1358.         ]);
  1359.     }
  1360.     #[Route('/Demande_Devis', name: 'app_devis_demande', methods: ['GET'])]
  1361.     public function demandedevislistes(DevisRepository $devisRepository): Response
  1362.     {
  1363. //        $devisTousSaufBl = $devisRepository->findAll();
  1364. //
  1365. //// Filtrer les devis avec le type "bl"
  1366. //        $demandedevis = array_filter($devisTousSaufBl, function ($devis) {
  1367. //            return $devis->getStatut() == 'Demande devis';
  1368. //        });
  1369.         $demandedevis = $devisRepository->findDevisByTechnicianRoleAndStatut('Demande devis');
  1370. //        dd($devisTousSaufBl);
  1371.         $fr =  $devisRepository->findBy(['statut'=>"Facture-R"]);
  1372.         $fra =  $devisRepository->findBy(['statut'=>"Facture-A"]);
  1373.         return $this->render('devis/demande_devis.html.twig', [
  1374.             'devis' => $demandedevis,
  1375.             'frtour' => $fr,
  1376.             'frtouaa' => $fra,
  1377.         ]);
  1378.     }
  1379.     #[Route('/liste_Demande_Devis', name: 'liste_Demande_Devis', methods: ['GET'])]
  1380.     public function listedemandedevislistes(DevisRepository $devisRepository): Response
  1381.     {
  1382.         $devisTousSaufBl = $devisRepository->findBy(['user'=>$this->getUser()]);
  1383. // Filtrer les devis avec le type "bl"
  1384.         $demandedevis = array_filter($devisTousSaufBl, function ($devis) {
  1385.             return $devis->getStatut() == 'Demande devis';
  1386.         });
  1387. //        dd($demandedevis,$this->getUser());
  1388.         $fr =  $devisRepository->findBy(['statut'=>"Facture-R"]);
  1389.         $fra =  $devisRepository->findBy(['statut'=>"Facture-A"]);
  1390.         return $this->render('devis/demande_devis.html.twig', [
  1391.             'devis' => $demandedevis,
  1392.             'frtour' => $fr,
  1393.             'frtouaa' => $fra,
  1394.         ]);
  1395.     }
  1396.     #[Route('/archives', name: 'app_devis_archives', methods: ['GET'])]
  1397.     public function indexarchives(DevisRepository $devisRepository): Response
  1398.     {
  1399.         $archives = $devisRepository->findBy([
  1400.             'statut'  => 'Blf',
  1401.             'oldtype' => 'BL',
  1402.         ]);
  1403.         // BL archivés après fusion : leur idfacture contient le numéro du BLFUS lié
  1404.         $fusionnes = $devisRepository->findBy(['statut' => 'BL_FUSIONNE']);
  1405.         // Archives classiques : leur idfacture contient le numéro de la facture liée
  1406.         $blfusNums = [];
  1407.         foreach ($fusionnes as $bl) {
  1408.             if ($bl->getIdfacture()) {
  1409.                 $blfusNums[] = $bl->getIdfacture();
  1410.             }
  1411.         }
  1412.         $factureNums = [];
  1413.         foreach ($archives as $bl) {
  1414.             if ($bl->getIdfacture()) {
  1415.                 $factureNums[] = $bl->getIdfacture();
  1416.             }
  1417.         }
  1418.         $blfusIdsByNum = [];
  1419.         if (!empty($blfusNums)) {
  1420.             foreach ($devisRepository->findBy(['statut' => 'BLFUS', 'num' => array_unique($blfusNums)]) as $blfus) {
  1421.                 $blfusIdsByNum[$blfus->getNum()] = $blfus->getId();
  1422.             }
  1423.         }
  1424.         $factureIdsByNum = [];
  1425.         if (!empty($factureNums)) {
  1426.             foreach ($devisRepository->findBy(['statut' => 'Facture', 'num' => array_unique($factureNums)]) as $facture) {
  1427.                 $factureIdsByNum[$facture->getNum()] = $facture->getId();
  1428.             }
  1429.         }
  1430.         return $this->render('devis/archive.html.twig', [
  1431.             'devis' => array_merge($archives, $fusionnes),
  1432.             'blfusIdsByNum' => $blfusIdsByNum,
  1433.             'factureIdsByNum' => $factureIdsByNum,
  1434.         ]);
  1435.     }
  1436.     #[Route('/retour/{id}', name: 'app_devis_retour', methods: ['GET'])]
  1437.     public function indexretour(DevisRepository $devisRepository, Devis $devis): Response
  1438.     {
  1439.         $idd = $devis->getIdfacture();
  1440.         $totlebl = $devisRepository->findBy(["idfacture" => $idd]);
  1441.         $facture = $devisRepository->findOneBy(["id" => $idd]);
  1442.         $devisRepository->remove($facture);
  1443.         foreach ($totlebl as $item) {
  1444.             $item->setStatut("BL");
  1445.             $item->setIdfacture("");
  1446.             $devisRepository->save($item, true);
  1447.         }
  1448.         return $this->redirectToRoute('app_devis_archives', [], Response::HTTP_SEE_OTHER);
  1449.     }
  1450.     #[Route('/facture', name: 'app_facturer', methods: ['POST'])]
  1451.     public function facturer(Request $request, ProduitRepository $produitRepository, DevisRepository $devisRepository): Response
  1452.     {
  1453.         // Récupérer les produits sélectionnés
  1454.         $checkedProducts = $request->request->get('checked'); // Articles sélectionnés
  1455.         $quantitesFacturees = $request->request->get('qtef'); // Quantités à facturer
  1456.         $quantitesRestantes = $request->request->get('qterest'); // Quantités restantes
  1457.         $facture = new Devis(); // Créez une nouvelle facture (ou trouvez-en une existante)
  1458.         $facture->setStatut('Facture'); // Définir le statut comme "Facture" ou autre en fonction du besoin
  1459.         // Boucle sur les produits sélectionnés
  1460.         foreach ($checkedProducts as $idProduit => $isChecked) {
  1461.             if ($isChecked) {
  1462.                 // Récupérer le produit correspondant
  1463.                 $produit = $produitRepository->find($idProduit);
  1464.                 if ($produit) {
  1465.                     $qteFacturee = (int) $quantitesFacturees[$idProduit]; // Quantité facturée
  1466.                     $qteRestante = (int) $quantitesRestantes[$idProduit]; // Quantité restante
  1467.                     // Vérifier si la quantité facturée est valide
  1468.                     if ($qteFacturee > $produit->getQte()) {
  1469.                         // La quantité facturée ne peut pas être supérieure à la quantité disponible
  1470.                         throw new \Exception("La quantité facturée ne peut pas être supérieure à la quantité disponible.");
  1471.                     }
  1472.                     // Mettre à jour la quantité restante dans le produit
  1473.                     $produit->setQte($produit->getQte() - $qteFacturee);
  1474.                     $produitRepository->save($produit, true);
  1475.                     // Ajouter une ligne de facture
  1476.                     $factureProduit = new Produit();
  1477.                     $factureProduit->setProduit($produit);
  1478.                     $factureProduit->setQte($qteFacturee);
  1479.                     $factureProduit->setPrix($produit->getPrix());
  1480.                     $factureProduit->setRemise($produit->getRemise());
  1481.                     $factureProduit->setMontantht($qteFacturee * $produit->getPrix()); // Calcul du montant H.T
  1482.                     $factureProduit->setTva($produit->getTva());
  1483.                     // Ajouter ce produit à la facture
  1484.                     $facture->addProduit($factureProduit);
  1485.                 }
  1486.             }
  1487.         }
  1488.         // Sauvegarder la facture
  1489.         $devisRepository->save($facture, true);
  1490.         // Rediriger vers la page des factures ou afficher un message de succès
  1491.         return $this->redirectToRoute('app_devis_liste_facture', [], Response::HTTP_SEE_OTHER);
  1492.     }
  1493. //************  ancien 16-02-2026**************
  1494. //    #[Route('/check', name: 'app_devis_select', methods: ['GET', 'POST'])]
  1495. //    public function index3(FournisseurRepository $fournisseurRepository, ClientRepository $clientRepository, FamillesRepository $famillesRepository, FamillesdarticlesRepository $famillesdarticlesRepository, ProduitRepository $produitRepository, CourroieRepository $courroieRepository, PlatinesRepository $platinesRepository, AiguillesRepository $aiguillesRepository, Request $request, DevisRepository $devisRepository): Response
  1496. //    {
  1497. //
  1498. //        $res = $request->request->all('chk_child');
  1499. //
  1500. //        $devifus = $devisRepository->findBy(['id' => $res]);
  1501. ////        dd($res,$devifus);
  1502. //        $fournisseurs = $fournisseurRepository->findAll();
  1503. //
  1504. //        $tabfournisseurs[] = [
  1505. //            'nom' => "Cosa",
  1506. //            'prenom' => "Tunisie",
  1507. //            'numeroTelephone' => "",
  1508. //        ];
  1509. //        foreach ($fournisseurs as $fournisseur) {
  1510. //            $tabfournisseurs[] = [
  1511. //                "Cosa Tunisie",
  1512. //                'nom' => $fournisseur->getNom(),
  1513. //                'prenom' => $fournisseur->getPrenom(),
  1514. //                'numeroTelephone' => $fournisseur->getTel(),
  1515. //            ];
  1516. //        }
  1517. ////        dd($tabfournisseurs);
  1518. //
  1519. //        $familleall = $famillesRepository->findAll();
  1520. //        $familles = $famillesdarticlesRepository->findAll();
  1521. //        $nbr = $request->request->get('nbrc_a');
  1522. //
  1523. //        $courroi = $courroieRepository->findAll();
  1524. //        $platines = $platinesRepository->findAll();
  1525. //        $aiguilles = $aiguillesRepository->findAll();
  1526. //        $devi = new Devis();
  1527. //        $form = $this->createForm(DevisfffType::class, $devi);
  1528. //        $form->handleRequest($request);
  1529. //
  1530. //
  1531. //
  1532. //        $status = 'Facture';
  1533. //
  1534. //        // Récupérer le dernier numéro de facture existant
  1535. //        $lastDevis = $devisRepository->findOneBy(['statut' => $status], ['id' => 'DESC']);
  1536. //
  1537. //        if ($lastDevis && $lastDevis->getNum()) {
  1538. //            // Extraire le numéro du dernier document
  1539. //            $lastNum = $lastDevis->getNum();
  1540. //
  1541. //            // Vérifier le format et extraire le nombre
  1542. //            if (preg_match('/^F(\d+)$/', $lastNum, $matches)) {
  1543. //                $count = (int)$matches[1] + 1;
  1544. //            }
  1545. //            else {
  1546. //                // Si le format n'est pas reconnu, chercher le plus grand numéro numérique
  1547. //                $allDevis = $devisRepository->findBy(['statut' => $status]);
  1548. //                $maxNum = 0;
  1549. //
  1550. //                foreach ($allDevis as $devisItem) {
  1551. //                    $currentNum = $devisItem->getNum();
  1552. //                    if (preg_match('/^F(\d+)$/', $currentNum, $matches)) {
  1553. //                        $numValue = (int)$matches[1];
  1554. //                        if ($numValue > $maxNum) {
  1555. //                            $maxNum = $numValue;
  1556. //                        }
  1557. //                    }
  1558. //                }
  1559. //
  1560. //                $count = $maxNum > 0 ? $maxNum + 1 : 1;
  1561. //            }
  1562. //        }
  1563. //        else {
  1564. //            // Aucune facture existante
  1565. //            $count = 1;
  1566. //        }
  1567. //
  1568. //        // Génération du numéro
  1569. //        $tt = "F" . $count;
  1570. //
  1571. //        // Vérification de l'existence du numéro et incrémentation si nécessaire
  1572. //        while ($devisRepository->findOneBy(['num' => $tt])) {
  1573. //            $count++;
  1574. //            $tt = "F" . $count;
  1575. //        }
  1576. //
  1577. //        if ($form->isSubmitted() && $form->isValid()) {
  1578. //            $blold = $request->request->all('devisfu');
  1579. //
  1580. //            $fournisseur = $request->request->get('fournisseurs');
  1581. //            $fournisseurrepo = $fournisseurRepository->find($fournisseur);
  1582. //            $clienttt = $request->request->get('clienttt');
  1583. //            $clientf = $clientRepository->findOneBy(['id' => $clienttt]);
  1584. //
  1585. //            if ($request->request->get('codenew') !=0 or $request->request->get('base') !=0 or $request->request->get('total'))
  1586. //            {
  1587. //                //Calcule partiel
  1588. //                $codenew = $request->request->get('codenew');
  1589. //                $basenew = $request->request->get('base');
  1590. //                $tauxnew = $request->request->get('taux');
  1591. //                $totalnew = $request->request->get('total');
  1592. //                $montantnew = $request->request->get('montant');
  1593. //                $totalhtnew = $request->request->get('totalht');
  1594. //                $totalttcnew = $request->request->get('totalttc');
  1595. ////            $acompte=  $request->request->get('acompte');
  1596. //                $qtetotalnew = $request->request->get('qttotal');
  1597. //                $netapayernew = $request->request->get('netapayer');
  1598. //
  1599. //                $devi->setVendeur($fournisseur);
  1600. //                $devi->setCode($codenew);
  1601. //                $devi->setQttotal($qtetotalnew);
  1602. //                $devi->setBase($basenew);
  1603. //                $devi->setTaux($tauxnew);
  1604. //                $devi->setTotal($totalnew);
  1605. //                $devi->setMontant($montantnew);
  1606. //                $devi->setTotalht($totalhtnew);
  1607. //                $devi->setTotalttc($totalttcnew);
  1608. //                $devi->setClient($clientf);
  1609. //                $devi->setStatut("Facture");
  1610. //                $devi->setFournisseur($fournisseurrepo);
  1611. //                // Convertir le tableau d'IDs en chaîne JSON
  1612. //                $devi->setIddevisold(json_encode($blold));
  1613. ////            $devi->setAcompte($acompte);
  1614. ////            $devi->setNetapayer($netapayer);
  1615. //                $devisRepository->save($devi, true);
  1616. //            }
  1617. //            else{
  1618. //                //calcule total
  1619. //                $code = $request->request->get('code');
  1620. //                $base = $request->request->get('base');
  1621. //                $taux = $request->request->get('taux');
  1622. //                $total = $request->request->get('total');
  1623. //                $montant = $request->request->get('montant');
  1624. //                $totalht = $request->request->get('totalht');
  1625. //                $totalttc = $request->request->get('totalttc');
  1626. ////            $acompte=  $request->request->get('acompte');
  1627. //                $qtetotal = $request->request->get('qttotal');
  1628. //                $netapayer = $request->request->get('netapayer');
  1629. //
  1630. //                $devi->setVendeur($fournisseur);
  1631. //                $devi->setCode($code);
  1632. //                $devi->setQttotal($qtetotal);
  1633. //                $devi->setBase($base);
  1634. //                $devi->setTaux($taux);
  1635. //                $devi->setTotal($total);
  1636. //                $devi->setMontant($montant);
  1637. //                $devi->setTotalht($totalht);
  1638. //                $devi->setTotalttc($totalttc);
  1639. //                $devi->setClient($clientf);
  1640. //                $devi->setStatut("Facture");
  1641. //                $devi->setFournisseur($fournisseurrepo);
  1642. //                // Convertir le tableau d'IDs en chaîne JSON
  1643. //                $devi->setIddevisold(json_encode($blold));
  1644. ////            $devi->setAcompte($acompte);
  1645. ////            $devi->setNetapayer($netapayer);
  1646. //                $devisRepository->save($devi, true);
  1647. //            }
  1648. //
  1649. //
  1650. //
  1651. //
  1652. //            // Logique pour la mise à jour du statut de la BL et gestion des produits facturés
  1653. //            // Logique pour la mise à jour du statut de la BL et gestion des produits facturés
  1654. //            $factureIds = []; // Tableau pour stocker les IDs des produits facturés
  1655. //
  1656. //            foreach ($blold as $blss) {
  1657. //                $a = $devisRepository->findOneBy(['id' => $blss]);
  1658. //
  1659. //                // Initialiser $existingIds à un tableau vide si `Idsfacts` est vide
  1660. //                $existingIds = [];
  1661. //                if ($a->getIdsfacts()) {
  1662. //                    // Si `Idsfacts` contient des données, on le décode en tableau
  1663. //                    $existingIds = json_decode($a->getIdsfacts(), true);
  1664. //                }
  1665. //
  1666. //                if ($a->getIdsfacts()) {
  1667. //                    // Si `IsFact` est coché, vérifier `qterest == 0` pour chaque produit
  1668. //                    foreach ($a->getProduit() as $produit) {
  1669. //                        if ($produit->getQterest() == 0) {
  1670. //                            // Si `qterest == 0`, on ne permet pas de refacturer ce produit
  1671. //                            $factureIds[] = $produit->getId(); // On ajoute l'ID du produit facturé
  1672. //
  1673. //                            // On met à jour les quantités
  1674. //                            $produit->setQte($produit->getQte() + $produit->getQtef());
  1675. //                            $produit->setQterest($produit->getQterest() - $produit->getQtef());
  1676. //                        }
  1677. //                    }
  1678. //                    // Mise à jour du statut de la BL à "Facture"
  1679. //                    $a->setStatut("Facture");
  1680. //                } else {
  1681. //                    // Si `IsFact` n'est pas coché, on change directement le statut à "BLF"
  1682. //                    $a->setStatut("BLF");
  1683. //                }
  1684. //
  1685. //                // Fusionner les `IDs` existants avec ceux des nouveaux produits facturés
  1686. //                $factureIds = array_merge($existingIds, $factureIds);
  1687. //
  1688. //                // Convertir le tableau des `IDs` en JSON avant de le stocker dans `Idsfacts`
  1689. //                $a->setIdsfacts(json_encode($factureIds));
  1690. //
  1691. //                // Sauvegarder les modifications dans la base de données
  1692. //                $devisRepository->save($a, true);
  1693. //            }
  1694. //
  1695. //
  1696. //            foreach ($blold as $blss) {
  1697. //                $a = $devisRepository->findOneBy(['id' => $blss]);
  1698. //                $a->setStatut("Blf");
  1699. //                $a->setIdfacture($devi->getNum());
  1700. //                $devisRepository->save($a, true);
  1701. //            }
  1702. //
  1703. //
  1704. //            if ($nbr == 1) {
  1705. //                $pr = new Produit();
  1706. //                $type = $request->request->get('type_1');
  1707. //                $quantity = $request->request->get('qte_1');
  1708. //                $tva = $request->request->get('tva_1');
  1709. //
  1710. //                $qte = $famillesdarticlesRepository->findBy(['reference' => $type]);
  1711. //               /* if ($devi->getStatut() == "Facture") {
  1712. //                    if (!empty($qte)) {
  1713. //                        $famillesdarticles = $qte[0];
  1714. //                        $quantitee = $famillesdarticles->getQunatity() - $quantity;
  1715. //                        $famillesdarticles->setQunatity($quantitee);
  1716. //                        $famillesdarticlesRepository->save($famillesdarticles, true);
  1717. //
  1718. //                    }
  1719. //                }*/
  1720. //
  1721. //
  1722. //                $prix = $request->request->get('prix_1');
  1723. //                $remise = $request->request->get('remise_1');
  1724. //                $montant = $request->request->get('montantht_1');
  1725. //                $desinagtion = $request->request->get('designation_1');
  1726. //                $deviss = $request->request->get('devis_1');
  1727. //                $coursdejours = $request->request->get('coursdejours_1');
  1728. //                $prixdt = $request->request->get('prixdt_1');
  1729. //
  1730. ////                if( $typeValue === "Aiguilles"){
  1731. ////                    $pr->setType($a->getNom());}
  1732. ////                else{
  1733. ////                    $pr->setType($a->getReference());
  1734. ////                }
  1735. //                $pr->setDeviss($deviss);
  1736. //                $pr->setCoursdejours($coursdejours);
  1737. //                $pr->setPrixunitdt($prixdt);
  1738. //
  1739. //                $pr->setType($type);
  1740. //                $pr->setQte($quantity);
  1741. //                $pr->setTva($tva);
  1742. //                $pr->setPrix($prix);
  1743. //                $pr->setRemise($remise);
  1744. //                $pr->setMontantht($montant);
  1745. //                $pr->setDesignation($desinagtion);
  1746. //                $pr->setDevis($devi);
  1747. //                $produitRepository->save($pr, true);
  1748. //            }
  1749. //            elseif ($nbr > 1) {
  1750. //                for ($i = 1; $i <= $nbr; $i++) {
  1751. //
  1752. //                    if ($request->request->get('type_' . $i)) {
  1753. //
  1754. ////                        dd($request->request->get('type'.$i));
  1755. //                        $pr = new Produit();
  1756. //                        $type = $request->request->get('type_' . $i);
  1757. //                        $quantity = $request->request->get('qte_' . $i);
  1758. //                        $tva = $request->request->get('tva_' . $i);
  1759. //                        $qte = $famillesdarticlesRepository->findBy(['reference' => $type]);
  1760. //                        /*if ($devi->getStatut() == "Facture") {
  1761. //                            if (!empty($qte)) {
  1762. //                                $famillesdarticles = $qte[0];
  1763. //                                $quantitee = $famillesdarticles->getQunatity() - $quantity;
  1764. //                                $famillesdarticles->setQunatity($quantitee);
  1765. //                                $famillesdarticlesRepository->save($famillesdarticles, true);
  1766. //
  1767. //                            }
  1768. //                        }*/
  1769. //
  1770. ////                        $typePosition = strpos($type, "-type:");
  1771. ////                        if ($typePosition !== false) {
  1772. ////                            // Extraire la valeur après "-type:"
  1773. ////                            $typeValue = substr($type, $typePosition + strlen("-type:"));
  1774. ////
  1775. ////                            // Supprimer les espaces avant et après la valeur
  1776. ////                            $typeValue = trim($typeValue);
  1777. ////
  1778. ////
  1779. ////                        }
  1780. ////                        if ($typePosition !== false) {
  1781. ////                            // Extraire la valeur avant "-type:"
  1782. ////                            $valueBeforeType = substr($type, 0, $typePosition);
  1783. ////
  1784. ////                            // Supprimer les espaces avant et après la valeur
  1785. ////                            $valueBeforeType = trim($valueBeforeType);
  1786. ////
  1787. ////                            // Affiche "VO 65 41 S007"
  1788. ////                        }
  1789. ////                        //dd($typeValue);
  1790. ////                        if( $typeValue === "Aiguilles"){
  1791. ////                            $a=$aiguillesRepository->find(['id'=>$valueBeforeType]);
  1792. ////                            if ($devi->getStatut() === "Facture") {
  1793. ////                                $a->setQuantty($a->getQuantty() - $quantity);
  1794. ////                            }
  1795. ////                            $aiguillesRepository->save($a,true);
  1796. ////                        }
  1797. ////                        elseif ( $typeValue === "Platines"){
  1798. ////                            $a=$platinesRepository->find(['id'=>$valueBeforeType]);
  1799. ////                            if ($devi->getStatut() === "Facture") {
  1800. ////                                $a->setQuantity($a->getQuantity() - $quantity);
  1801. ////                            }
  1802. ////                            $platinesRepository->save($a,true);
  1803. ////
  1804. ////                        }
  1805. ////                        else{
  1806. ////                            $a=$courroieRepository->find(['id'=>$valueBeforeType]);
  1807. ////                            if ($devi->getStatut() === "Facture") {
  1808. ////                            $a->setQuantity($a->getQuantity() - $quantity);
  1809. ////                            }
  1810. ////                            $courroieRepository->save($a,true);
  1811. ////                        }
  1812. //                        $prix = $request->request->get('prix_' . $i);
  1813. //                        $montant = $request->request->get('montantht_' . $i);
  1814. //                        $desinagtion = $request->request->get('designation_' . $i);
  1815. //                        $remise = $request->request->get('remise_' . $i);
  1816. //                        $deviss = $request->request->get('devis_' . $i);
  1817. //                        $coursdejours = $request->request->get('coursdejours_' . $i);
  1818. //                        $prixdt = $request->request->get('prixdt_' . $i);
  1819. //
  1820. //
  1821. ////                        if( $typeValue === "Aiguilles"){
  1822. ////                            $pr->setType($a->getNom());}
  1823. ////                        else{
  1824. ////                            $pr->setType($a->getReference());}
  1825. //                        $pr->setDeviss($deviss);
  1826. //                        $pr->setCoursdejours($coursdejours);
  1827. //                        $pr->setPrixunitdt($prixdt);
  1828. //                        $pr->setType($type);
  1829. //                        $pr->setQte($quantity);
  1830. //                        $pr->setTva($tva);
  1831. //                        $pr->setPrix($prix);
  1832. //                        $pr->setRemise($remise);
  1833. //                        $pr->setDesignation($desinagtion);
  1834. //                        $pr->setMontantht($montant);
  1835. //                        $pr->setDevis($devi);
  1836. //                        $produitRepository->save($pr, true);
  1837. //                    }
  1838. //
  1839. //                }
  1840. //            }
  1841. //
  1842. //
  1843. //
  1844. //            return $this->redirectToRoute('app_devis_liste_facture', [], Response::HTTP_SEE_OTHER);
  1845. //        }
  1846. //
  1847. //        return $this->renderForm('devis/fusionner.html.twig', [
  1848. //            'devi' => $devi,
  1849. //            'tt'=>$tt,
  1850. //            'devifus' => $devifus,
  1851. //            'form' => $form,
  1852. //            'aiguilles' => $aiguilles,
  1853. //            'platines' => $platines,
  1854. //            'courroi' => $courroi,
  1855. //            'familles' => $familles,
  1856. //            'familleall' => $familleall,
  1857. //            'tabfournisseurs' => $tabfournisseurs
  1858. //        ]);
  1859. //    }
  1860.     //************ fin ancien 16-02-2026**************
  1861.     //
  1862. //        $totstatinter = $devisRepository->findBy(['statut' => "Intervention"]);
  1863. //        $totstatu = $devisRepository->findBy(['statut' => "Facture"]);
  1864. //        $totstatur= $devisRepository->findBy(['statut' => "Facture-R"]);
  1865. //        $totstatua= $devisRepository->findBy(['statut' => "Facture-A"]);
  1866. //        if ($totstatu)
  1867. //        {
  1868. //            $fac= count($totstatu);
  1869. //        }
  1870. //        else
  1871. //        {
  1872. //            $fac=0;
  1873. //
  1874. //        }
  1875. //
  1876. //        if ($totstatur)
  1877. //        {
  1878. //            $facr= count($totstatur);
  1879. //        }
  1880. //        else
  1881. //        {
  1882. //            $facr=0;
  1883. //
  1884. //        }
  1885. //
  1886. //        if ($totstatinter)
  1887. //        {
  1888. //            $facinter= count($totstatinter);
  1889. //        }
  1890. //        else
  1891. //        {
  1892. //            $facinter=0;
  1893. //
  1894. //        }
  1895. //
  1896. //        if ($totstatua)
  1897. //        {
  1898. //            $faca= count($totstatua);
  1899. //        }
  1900. //        else
  1901. //        {
  1902. //            $faca=0;
  1903. //
  1904. //        }
  1905. //
  1906. //        $count = $fac +$faca+ $facr +$facinter;
  1907. //        if ($count == 0) {
  1908. //            $count = 1;
  1909. //        } else {
  1910. //            $count = $count + 1;
  1911. //        }
  1912. //
  1913. //
  1914. //
  1915. //        $tt = "F" . $count;
  1916. //
  1917. //
  1918. //
  1919. //
  1920. //
  1921. //
  1922. //        $test = $devisRepository->findOneBy(['num' => $tt]);
  1923. //
  1924. //
  1925. //
  1926.     #[Route('/Bl', name: 'app_devis_fbl', methods: ['GET'])]
  1927.     public function indexj(DevisRepository $devisRepository, ClientRepository $clientRepository): Response
  1928.     {
  1929.         return $this->render('devis/blf.html.twig', [
  1930.             'devis' => $devisRepository->findBy(['statut' => "Bl"]),
  1931.             'clients' => $clientRepository->findAll()
  1932.         ]);
  1933.     }
  1934.     #[Route('/Bl/bl', name: 'app_devis_getbl', methods: ['GET', 'POST'])]
  1935.     public function indexjb(Request $request, DevisRepository $devisRepository, ClientRepository $clientRepository): Response
  1936.     {
  1937.         $cl = $request->request->get('client');
  1938.         $clien = $clientRepository->findOneBy(['id' => $cl]);
  1939.         return $this->render('devis/blajax.html.twig', [
  1940.             'devis' => $devisRepository->findBy(['statut' => "Bl", 'client' => $clien]),
  1941.         ]);
  1942.     }
  1943.     #[Route('/pdfclient/{id}', name: 'app_devis_pdf_client', methods: ['GET'])]
  1944.     public function pdfclient(HistoriquedemandedevisRepository $historiquedemandedevisRepository,$id, DevisRepository $devisRepository): Response
  1945.     {
  1946.         $devi = $devisRepository->find($id);
  1947.         // Vérifiez si l'objet $devi a été trouvé
  1948.         if (!$devi) {
  1949.             $devi = $historiquedemandedevisRepository->find($id);
  1950.             if (!$devi) {
  1951.                 throw $this->createNotFoundException('No devis found for id ' . $id);
  1952.             }
  1953.         }
  1954.         // Créer une instance de Dompdf
  1955.         $pdfOptions = new Options();
  1956.         $pdfOptions->set('isHtml5ParserEnabled', true);
  1957.         $pdfOptions->set('isRemoteEnabled', true);
  1958.         $dompdf = new Dompdf($pdfOptions);
  1959.         $fmt = new NumberFormatter('fr', NumberFormatter::SPELLOUT);
  1960. //        $tot = $fmt->format($devi->getTotalttc());
  1961.         $totalTtc = $devi->getTotalttc();
  1962. // Assurez-vous que $totalTtc est un nombre
  1963.         $totalTtc = floatval($totalTtc);
  1964.         $tot = $fmt->format($totalTtc);
  1965.         // Générer le HTML à partir de la twig
  1966. //        dd($devi, $devi->getClient());
  1967. //        dd($devi->getFournisseur(),$devi);
  1968.         // Convertir le total TTC en nombre à virgule
  1969.         $totalTtc = $devi->getTotalttc();
  1970.         $totalTtc = floatval($totalTtc);
  1971.         // Séparer les dinars des millimes
  1972.         $dinars = floor($totalTtc);
  1973.         $millimes = round(($totalTtc - $dinars) * 1000);
  1974.         // Formatage des dinars et millimes
  1975.         $fmt = new NumberFormatter('fr', NumberFormatter::SPELLOUT);
  1976.         $dinarsInWords = $fmt->format($dinars);
  1977.         $millimesInWords = $fmt->format($millimes);
  1978.         // Combine the result in the format: "mille trois cent six dinars, quatre cent millimes"
  1979.         $totalInWords = $dinarsInWords . ' dinars, ' . $millimesInWords . ' millimes';
  1980.         $html = $this->renderView('devis/pdfclient.html.twig', [
  1981.             'devi' => $devi,
  1982.             'tott' => $tot,
  1983.             'totalInWords'=>$totalInWords
  1984.         ]);
  1985.         // Charger le contenu HTML dans Dompdf
  1986.         $dompdf->loadHtml($html);
  1987. //        // Optionnel : définir les options de configuration de Dompdf si nécessaire
  1988. //        $dompdf->setPaper('A4', 'portrait');
  1989.         $dompdf->setPaper('A4', 'portrait');
  1990.         $customPaper = array(0, 0, 750, 900);
  1991.         $dompdf->setPaper($customPaper);
  1992.         $contxt = stream_context_create([
  1993.             'ssl' => [
  1994.                 'verify_peer' => FALSE,
  1995.                 'verify_peer_name' => FALSE,
  1996.                 'allow_self_signed'=> TRUE
  1997.             ]
  1998.         ]);
  1999.         $dompdf->setHttpContext($contxt);
  2000.         // Rendre le HTML en PDF
  2001.         $dompdf->render();
  2002.         // Générer la réponse HTTP avec le PDF en tant que contenu
  2003.         $response = new Response($dompdf->output());
  2004.         $response->headers->set('Content-Type', 'application/pdf');
  2005.         // Optionnel : définir le nom du fichier de téléchargement
  2006.         $response->headers->set('Content-Disposition', 'attachment; filename="Facture' . $devi->getId() . '.pdf"');
  2007.         return $response;
  2008.     }
  2009.     #[Route('/pdf-devise/{id}', name: 'app_devis_pdf_devise', methods: ['GET'])]
  2010.     public function pdfdevise(HistoriquedemandedevisRepository $historiquedemandedevisRepository,$id, DevisRepository $devisRepository): Response
  2011.     {
  2012.         $devi = $devisRepository->find($id);
  2013.         // Vérifiez si l'objet $devi a été trouvé
  2014.         if (!$devi) {
  2015.             $devi = $historiquedemandedevisRepository->find($id);
  2016.             if (!$devi) {
  2017.                 throw $this->createNotFoundException('No devis found for id ' . $id);
  2018.             }
  2019.         }
  2020.         // Créer une instance de Dompdf
  2021.         $pdfOptions = new Options();
  2022.         $pdfOptions->set('isHtml5ParserEnabled', true);
  2023.         $pdfOptions->set('isRemoteEnabled', true);
  2024.         $dompdf = new Dompdf($pdfOptions);
  2025.         $fmt = new NumberFormatter('fr', NumberFormatter::SPELLOUT);
  2026. //        $tot = $fmt->format($devi->getTotalttc());
  2027.         $totalTtc = $devi->getTotalttc();
  2028. // Assurez-vous que $totalTtc est un nombre
  2029.         $totalTtc = floatval($totalTtc);
  2030.         $tot = $fmt->format($totalTtc);
  2031.         // Générer le HTML à partir de la twig
  2032. //        dd($devi, $devi->getClient());
  2033. //        dd($devi->getFournisseur(),$devi);
  2034.         // Convertir le total TTC en nombre à virgule
  2035.         $totalTtc = $devi->getTotalttc();
  2036.         $totalTtc = floatval($totalTtc);
  2037.         // Séparer les dinars des millimes
  2038.         $dinars = floor($totalTtc);
  2039.         $millimes = round(($totalTtc - $dinars) * 1000);
  2040.         // Formatage des dinars et millimes
  2041.         $fmt = new NumberFormatter('fr', NumberFormatter::SPELLOUT);
  2042.         $dinarsInWords = $fmt->format($dinars);
  2043.         $millimesInWords = $fmt->format($millimes);
  2044.         // Combine the result in the format: "mille trois cent six dinars, quatre cent millimes"
  2045. //        $totalInWords = $dinarsInWords . ' dinars, ' . $millimesInWords . ' millimes';
  2046.         $totalInWords = $dinarsInWords . ' , ' . $millimesInWords . ' (Devise)';
  2047.         $html = $this->renderView('devis/pdfdevise.html.twig', [
  2048.             'devi' => $devi,
  2049.             'tott' => $tot,
  2050.             'totalInWords'=>$totalInWords
  2051.         ]);
  2052.         // Charger le contenu HTML dans Dompdf
  2053.         $dompdf->loadHtml($html);
  2054. //        // Optionnel : définir les options de configuration de Dompdf si nécessaire
  2055. //        $dompdf->setPaper('A4', 'portrait');
  2056.         $dompdf->setPaper('A4', 'portrait');
  2057.         $customPaper = array(0, 0, 750, 900);
  2058.         $dompdf->setPaper($customPaper);
  2059.         $contxt = stream_context_create([
  2060.             'ssl' => [
  2061.                 'verify_peer' => FALSE,
  2062.                 'verify_peer_name' => FALSE,
  2063.                 'allow_self_signed'=> TRUE
  2064.             ]
  2065.         ]);
  2066.         $dompdf->setHttpContext($contxt);
  2067.         // Rendre le HTML en PDF
  2068.         $dompdf->render();
  2069.         // Générer la réponse HTTP avec le PDF en tant que contenu
  2070.         $response = new Response($dompdf->output());
  2071.         $response->headers->set('Content-Type', 'application/pdf');
  2072.         // Optionnel : définir le nom du fichier de téléchargement
  2073.         $response->headers->set('Content-Disposition', 'attachment; filename="Facture' . $devi->getId() . '.pdf"');
  2074.         return $response;
  2075.     }
  2076.     #[Route('/pdf/{id}', name: 'app_devis_pdf', methods: ['GET'])]
  2077.     public function pdf(HistoriquedemandedevisRepository $historiquedemandedevisRepository,$id, DevisRepository $devisRepository): Response
  2078.     {
  2079.         $devi = $devisRepository->find($id);
  2080.         // Vérifiez si l'objet $devi a été trouvé
  2081.         if (!$devi) {
  2082.             $devi = $historiquedemandedevisRepository->find($id);
  2083.             if (!$devi) {
  2084.                 throw $this->createNotFoundException('No devis found for id ' . $id);
  2085.             }
  2086.         }
  2087.         // Créer une instance de Dompdf
  2088.         $pdfOptions = new Options();
  2089.         $pdfOptions->set('isHtml5ParserEnabled', true);
  2090.         $pdfOptions->set('isRemoteEnabled', true);
  2091.         $dompdf = new Dompdf($pdfOptions);
  2092.         $fmt = new NumberFormatter('fr', NumberFormatter::SPELLOUT);
  2093. //        $tot = $fmt->format($devi->getTotalttc());
  2094.         $totalTtc = $devi->getTotalttc();
  2095. // Assurez-vous que $totalTtc est un nombre
  2096.         $totalTtc = floatval($totalTtc);
  2097.         $tot = $fmt->format($totalTtc);
  2098.         // Générer le HTML à partir de la twig
  2099. //        dd($devi, $devi->getClient());
  2100. //        dd($devi->getFournisseur(),$devi);
  2101.         // Convertir le total TTC en nombre à virgule
  2102.         $totalTtc = $devi->getTotalttc();
  2103.         $totalTtc = floatval($totalTtc);
  2104.         // Séparer les dinars des millimes
  2105.         $dinars = floor($totalTtc);
  2106.         $millimes = round(($totalTtc - $dinars) * 1000);
  2107.         // Formatage des dinars et millimes
  2108.         $fmt = new NumberFormatter('fr', NumberFormatter::SPELLOUT);
  2109.         $dinarsInWords = $fmt->format($dinars);
  2110.         $millimesInWords = $fmt->format($millimes);
  2111.         // Combine the result in the format: "mille trois cent six dinars, quatre cent millimes"
  2112.         $totalInWords = $dinarsInWords . ' dinars, ' . $millimesInWords . ' millimes';
  2113.         $html = $this->renderView('devis/pdf.html.twig', [
  2114.             'devi' => $devi,
  2115.             'tott' => $tot,
  2116.             'totalInWords'=>$totalInWords,
  2117.             'blOriginaux' => $devi instanceof Devis ? $this->getBlOriginauxNums($devi, $devisRepository) : null,
  2118.         ]);
  2119.         // Charger le contenu HTML dans Dompdf
  2120.         $dompdf->loadHtml($html);
  2121. //        // Optionnel : définir les options de configuration de Dompdf si nécessaire
  2122. //        $dompdf->setPaper('A4', 'portrait');
  2123.         $dompdf->setPaper('A4', 'portrait');
  2124.         $customPaper = array(0, 0, 750, 900);
  2125.         $dompdf->setPaper($customPaper);
  2126.         $contxt = stream_context_create([
  2127.             'ssl' => [
  2128.                 'verify_peer' => FALSE,
  2129.                 'verify_peer_name' => FALSE,
  2130.                 'allow_self_signed'=> TRUE
  2131.             ]
  2132.         ]);
  2133.         $dompdf->setHttpContext($contxt);
  2134.         // Rendre le HTML en PDF
  2135.         $dompdf->render();
  2136.         // Générer la réponse HTTP avec le PDF en tant que contenu
  2137.         $response = new Response($dompdf->output());
  2138.         $response->headers->set('Content-Type', 'application/pdf');
  2139.         // Optionnel : définir le nom du fichier de téléchargement
  2140.         $response->headers->set('Content-Disposition', 'attachment; filename="Facture' . $devi->getId() . '.pdf"');
  2141.         return $response;
  2142.     }
  2143.     #[Route('/histo_pdf/{id}', name: 'app_histo_demandedevis_pdf', methods: ['GET'])]
  2144.     public function histopdf(HistoriquedemandedevisRepository $historiquedemandedevisRepository,$id, DevisRepository $devisRepository): Response
  2145.     {
  2146.         $devi = $historiquedemandedevisRepository->find($id);
  2147.         // Vérifiez si l'objet $devi a été trouvé
  2148.             if (!$devi) {
  2149.                 throw $this->createNotFoundException('No devis found for id ' . $id);
  2150.             }
  2151.         // Créer une instance de Dompdf
  2152.         $pdfOptions = new Options();
  2153.         $pdfOptions->set('isHtml5ParserEnabled', true);
  2154.         $pdfOptions->set('isRemoteEnabled', true);
  2155.         $dompdf = new Dompdf($pdfOptions);
  2156.         $fmt = new NumberFormatter('fr', NumberFormatter::SPELLOUT);
  2157.         $tot = $fmt->format($devi->getTotalttc());
  2158.         // Générer le HTML à partir de la twig
  2159.         $html = $this->renderView('devis/histopdf.html.twig', [
  2160.             'devi' => $devi,
  2161.             'tott' => $tot,
  2162.         ]);
  2163.         // Charger le contenu HTML dans Dompdf
  2164.         $dompdf->loadHtml($html);
  2165. //        // Optionnel : définir les options de configuration de Dompdf si nécessaire
  2166. //        $dompdf->setPaper('A4', 'portrait');
  2167.         $dompdf->setPaper('A4', 'portrait');
  2168.         $customPaper = array(0, 0, 750, 900);
  2169.         $dompdf->setPaper($customPaper);
  2170.         $contxt = stream_context_create([
  2171.             'ssl' => [
  2172.                 'verify_peer' => FALSE,
  2173.                 'verify_peer_name' => FALSE,
  2174.                 'allow_self_signed'=> TRUE
  2175.             ]
  2176.         ]);
  2177.         $dompdf->setHttpContext($contxt);
  2178.         // Rendre le HTML en PDF
  2179.         $dompdf->render();
  2180.         // Générer la réponse HTTP avec le PDF en tant que contenu
  2181.         $response = new Response($dompdf->output());
  2182.         $response->headers->set('Content-Type', 'application/pdf');
  2183.         // Optionnel : définir le nom du fichier de téléchargement
  2184.         $response->headers->set('Content-Disposition', 'attachment; filename="Facture' . $devi->getId() . '.pdf"');
  2185.         return $response;
  2186.     }
  2187.     function nombre_en_toutes_lettres(int $nombre): string
  2188.     {
  2189.         if ($nombre === 0) {
  2190.             return 'zéro';
  2191.         }
  2192.         // Découpage en millions, milliers, unités
  2193.         $millions = (int) ($nombre / 1000000);
  2194.         $reste = $nombre % 1000000;
  2195.         $milliers = (int) ($reste / 1000);
  2196.         $unites = $reste % 1000;
  2197.         $chunks = [];
  2198.         if ($millions > 0) {
  2199.             $chunks[] = $this->_convertir_trois_chiffres($millions) . ' million' . ($millions > 1 ? 's' : '');
  2200.         }
  2201.         if ($milliers > 0) {
  2202.             $chunks[] = $this->_convertir_trois_chiffres($milliers) . ' mille';
  2203.         }
  2204.         if ($unites > 0) {
  2205.             $chunks[] = $this->_convertir_trois_chiffres($unites);
  2206.         }
  2207.         return implode(' ', $chunks);
  2208.     }
  2209.     /**
  2210.      * Convertit un nombre de 0 à 999 en lettres.
  2211.      */
  2212.     function _convertir_trois_chiffres(int $nombre): string
  2213.     {
  2214.         static $unités = [
  2215.             1 => 'un', 2 => 'deux', 3 => 'trois', 4 => 'quatre', 5 => 'cinq',
  2216.             6 => 'six', 7 => 'sept', 8 => 'huit', 9 => 'neuf', 10 => 'dix',
  2217.             11 => 'onze', 12 => 'douze', 13 => 'treize', 14 => 'quatorze',
  2218.             15 => 'quinze', 16 => 'seize', 17 => 'dix-sept',
  2219.             18 => 'dix-huit', 19 => 'dix-neuf'
  2220.         ];
  2221.         static $dizaines = [
  2222.             1 => 'dix', 2 => 'vingt', 3 => 'trente', 4 => 'quarante',
  2223.             5 => 'cinquante', 6 => 'soixante', 7 => 'soixante-dix',
  2224.             8 => 'quatre-vingt', 9 => 'quatre-vingt-dix'
  2225.         ];
  2226.         if ($nombre === 0) {
  2227.             return '';
  2228.         }
  2229.         $centaines = (int) ($nombre / 100);
  2230.         $reste = $nombre % 100;
  2231.         $chunks = [];
  2232.         // Gestion des centaines
  2233.         if ($centaines > 0) {
  2234.             if ($centaines === 1) {
  2235.                 $chunks[] = 'cent';
  2236.             } else {
  2237.                 $chunks[] = $unités[$centaines] . ' cent';
  2238.             }
  2239.         }
  2240.         // Gestion des dizaines/unités
  2241.         if ($reste === 0) {
  2242.             // rien de plus
  2243.         } elseif ($reste < 17) {
  2244.             $chunks[] = $unités[$reste];
  2245.         } else {
  2246.             $dizaine = (int) ($reste / 10);
  2247.             $unite = $reste % 10;
  2248.             // Cas particuliers
  2249.             if ($dizaine === 7) { // soixante-dix
  2250.                 if ($unite === 1) {
  2251.                     $chunks[] = 'soixante et onze';
  2252.                 } else {
  2253.                     $chunks[] = 'soixante-' . $unités[10 + $unite];
  2254.                 }
  2255.             } elseif ($dizaine === 8) { // quatre-vingt(s)
  2256.                 $mot = 'quatre-vingt' . ($unite === 0 ? 's' : '');
  2257.                 if ($unite > 0) {
  2258.                     $mot .= '-' . ($unite === 1 ? 'un' : $unités[$unite]);
  2259.                 }
  2260.                 $chunks[] = $mot;
  2261.             } elseif ($dizaine === 9) { // quatre-vingt-dix
  2262.                 if ($unite === 1) {
  2263.                     $chunks[] = 'quatre-vingt-onze';
  2264.                 } else {
  2265.                     $chunks[] = 'quatre-vingt-' . $unités[10 + $unite];
  2266.                 }
  2267.             } else {
  2268.                 // dizaines normales (20,30,40,50,60)
  2269.                 $mot = $dizaines[$dizaine];
  2270.                 if ($unite === 1) {
  2271.                     $mot .= ' et un';
  2272.                 } elseif ($unite > 1) {
  2273.                     $mot .= '-' . $unités[$unite];
  2274.                 }
  2275.                 $chunks[] = $mot;
  2276.             }
  2277.         }
  2278.         // Gestion de l'accord de "cent" au pluriel sauf si suivi de dizaines/unités
  2279.         // On va simplifier en ne mettant pas de 's' si le nombre n'est pas exactement une centaine ronde.
  2280.         // Déjà fait implicitement car on a ajouté "cent" ou "X cent" sans 's' ici, on ajustera après coup.
  2281.         // Pour les centaines pures (ex: 200) on veut "deux cents".
  2282.         if ($centaines > 1 && $reste === 0) {
  2283.             // On remplace "X cent" par "X cents"
  2284.             $last = array_pop($chunks);
  2285.             $chunks[] = $last . 's';
  2286.         } elseif ($centaines === 1 && $reste === 0) {
  2287.             // "cent" reste "cent" (pas de 's')
  2288.             // déjà correct
  2289.         }
  2290.         return implode(' ', $chunks);
  2291.     }
  2292.     #[Route('/pdfimp/{id}', name: 'app_devis_pdfimp', methods: ['GET'])]
  2293.     public function pdfimp($id, DevisRepository $devisRepository): Response
  2294.     {
  2295.         $devi = $devisRepository->find($id);
  2296.         if (!$devi) {
  2297.             throw $this->createNotFoundException('Devis non trouvé.');
  2298.         }
  2299.         $montant = (string) $devi->getTotalttc(); // ex: "2.177"
  2300.         // Conversion de la partie entière et décimale en lettres
  2301.         if (strpos($montant, '.') !== false) {
  2302.             [$partieEntiere, $partieDecimale] = explode('.', $montant);
  2303.             $entierTexte = $this->nombre_en_toutes_lettres((int)$partieEntiere);
  2304.             $decimaleTexte = $this->nombre_en_toutes_lettres((int)$partieDecimale);
  2305.             $texte = ucfirst($entierTexte) . ' virgule ' . $decimaleTexte;
  2306.         } else {
  2307.             $texte = ucfirst($this->nombre_en_toutes_lettres((int)$montant));
  2308.         }
  2309.         // --- Configuration Dompdf (inchangée) ---
  2310.         $pdfOptions = new Options();
  2311.         $pdfOptions->set('isHtml5ParserEnabled', true);
  2312.         $pdfOptions->set('isRemoteEnabled', true);
  2313.         $dompdf = new Dompdf($pdfOptions);
  2314.         // Conversion du total TTC pour les dinars / millimes
  2315.         $totalTtc = (float) $devi->getTotalttc();
  2316.         $dinars   = (int) floor($totalTtc);
  2317.         $millimes = (int) round(($totalTtc - $dinars) * 1000);
  2318.         // Passage en lettres
  2319.         $dinarsInWords   = $this->nombre_en_toutes_lettres($dinars);
  2320.         $millimesInWords = $this->nombre_en_toutes_lettres($millimes);
  2321.         $totalInWords    = $dinarsInWords . ' dinars, ' . $millimesInWords . ' millimes';
  2322.         // Rendu HTML
  2323.         $html = $this->renderView('devis/pdfimp.html.twig', [
  2324.             'devi' => $devi,
  2325.             'tott' => $texte,
  2326.             'totalInWords' => $totalInWords,
  2327.             'blOriginaux' => $this->getBlOriginauxNums($devi, $devisRepository),
  2328.         ]);
  2329.         // ... suite identique (Dompdf, en-têtes, etc.)
  2330.         $dompdf->loadHtml($html);
  2331.         $dompdf->setPaper([0, 0, 750, 900]);
  2332.         $contxt = stream_context_create(['ssl' => ['verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true]]);
  2333.         $dompdf->setHttpContext($contxt);
  2334.         $dompdf->render();
  2335.         return new Response($dompdf->output(), 200, [
  2336.             'Content-Type' => 'application/pdf',
  2337.             'Content-Disposition' => 'attachment; filename="Facture_' . $devi->getId() . '.pdf"',
  2338.         ]);
  2339.     }
  2340. //    #[Route('/pdfimp/{id}', name: 'app_devis_pdfimp', methods: ['GET'])]
  2341. //    public function pdfimp($id, DevisRepository $devisRepository): Response
  2342. //    {
  2343. //        $devi = $devisRepository->find($id);
  2344. //
  2345. //        if (!$devi) {
  2346. //            throw $this->createNotFoundException('Devis non trouvé.');
  2347. //        }
  2348. //
  2349. //        $montant = (string) $devi->getTotalttc(); // ex: "2.177"
  2350. ////        $montant = (string) 1833.500;
  2351. //        $fmt = new NumberFormatter('fr', NumberFormatter::SPELLOUT);
  2352. //
  2353. //        if (strpos($montant, '.') !== false) {
  2354. //            [$partieEntiere, $partieDecimale] = explode('.', $montant);
  2355. //            $entierTexte = $fmt->format((int)$partieEntiere);
  2356. //            $decimaleTexte = $fmt->format((int)$partieDecimale);
  2357. //            $texte = ucfirst($entierTexte) . ' virgule ' . $decimaleTexte;
  2358. //        } else {
  2359. //            $texte = ucfirst($fmt->format((int)$montant));
  2360. //        }
  2361. //
  2362. ////        dd($montant, $texte); // pour vérifier
  2363. //
  2364. //        // --- Configuration Dompdf ---
  2365. //        $pdfOptions = new Options();
  2366. //        $pdfOptions->set('isHtml5ParserEnabled', true);
  2367. //        $pdfOptions->set('isRemoteEnabled', true);
  2368. //
  2369. //        $dompdf = new Dompdf($pdfOptions);
  2370. //
  2371. //        // Convertir le total TTC en nombre à virgule
  2372. //        $totalTtc = $devi->getTotalttc();
  2373. //        $totalTtc = floatval($totalTtc);
  2374. //
  2375. //        // Séparer les dinars des millimes
  2376. //        $dinars   = (int) floor($totalTtc);
  2377. //        $millimes = (int) round(($totalTtc - $dinars) * 1000);
  2378. //
  2379. //
  2380. //        // Formatage des dinars et millimes
  2381. //        $fmt = new NumberFormatter('fr', NumberFormatter::SPELLOUT);
  2382. //        $dinarsInWords = $fmt->format($dinars);
  2383. //        $millimesInWords = $fmt->format($millimes);
  2384. //
  2385. //        // Combine the result in the format: "mille trois cent six dinars, quatre cent millimes"
  2386. //        $totalInWords = $dinarsInWords . ' dinars, ' . $millimesInWords . ' millimes';
  2387. ////        dd($dinarsInWords,$millimesInWords,$totalInWords);
  2388. //        // --- HTML pour le PDF ---
  2389. //        $html = $this->renderView('devis/pdfimp.html.twig', [
  2390. //            'devi' => $devi,
  2391. //            'tott' => $texte,
  2392. //            'totalInWords'=>$totalInWords
  2393. //        ]);
  2394. //
  2395. //        $dompdf->loadHtml($html);
  2396. //        $dompdf->setPaper('A4', 'portrait');
  2397. //
  2398. //        // Taille personnalisée (optionnelle)
  2399. //        $customPaper = [0, 0, 750, 900];
  2400. //        $dompdf->setPaper($customPaper);
  2401. //
  2402. //        // Pour les images ou liens externes non sécurisés
  2403. //        $contxt = stream_context_create([
  2404. //            'ssl' => [
  2405. //                'verify_peer' => false,
  2406. //                'verify_peer_name' => false,
  2407. //                'allow_self_signed' => true,
  2408. //            ]
  2409. //        ]);
  2410. //        $dompdf->setHttpContext($contxt);
  2411. //
  2412. //        $dompdf->render();
  2413. //
  2414. //        return new Response($dompdf->output(), 200, [
  2415. //            'Content-Type' => 'application/pdf',
  2416. //            'Content-Disposition' => 'attachment; filename="Facture_' . $devi->getId() . '.pdf"',
  2417. //        ]);
  2418. //    }
  2419. //    #[Route('/pdfimp/{id}', name: 'app_devis_pdfimp', methods: ['GET'])]
  2420. //    public function pdfimp($id, DevisRepository $devisRepository): Response
  2421. //    {
  2422. //        $devi = $devisRepository->find($id);
  2423. //
  2424. //        $montant = $devi->getTotalttc();
  2425. //        $dinars = floor($montant);
  2426. //        $centimes = round(($montant - $dinars) * 100);
  2427. //
  2428. //        $fmt = new NumberFormatter('fr', NumberFormatter::SPELLOUT);
  2429. //        $dinarsEnLettres = $fmt->format($dinars);
  2430. //        $centimesEnLettres = $fmt->format($centimes);
  2431. //
  2432. //        $montantEnLettres = ucfirst("$dinarsEnLettres dinars");
  2433. //        if ($centimes > 0) {
  2434. //            $montantEnLettres .= " et $centimesEnLettres centimes";
  2435. //        }
  2436. //
  2437. //        // Créer une instance de Dompdf
  2438. //        $pdfOptions = new Options();
  2439. //        $pdfOptions->set('isHtml5ParserEnabled', true);
  2440. //        $pdfOptions->set('isRemoteEnabled', true);
  2441. //        $dompdf = new Dompdf($pdfOptions);
  2442. //        $fmt = new NumberFormatter('fr', NumberFormatter::SPELLOUT);
  2443. //        $tot = $fmt->format($devi->getTotalttc());
  2444. //        dd($tot,$devi->getTotalttc(),$montantEnLettres);
  2445. //        // Générer le HTML à partir de la twig
  2446. //
  2447. //        $html = $this->renderView('devis/pdfimp.html.twig', [
  2448. //            'devi' => $devi,
  2449. //            'tott' => $montantEnLettres,
  2450. //        ]);
  2451. //
  2452. //        // Charger le contenu HTML dans Dompdf
  2453. //        $dompdf->loadHtml($html);
  2454. //
  2455. ////        // Optionnel : définir les options de configuration de Dompdf si nécessaire
  2456. ////        $dompdf->setPaper('A4', 'portrait');
  2457. //        $dompdf->setPaper('A4', 'portrait');
  2458. //        $customPaper = array(0, 0, 750, 900);
  2459. //        $dompdf->setPaper($customPaper);
  2460. //
  2461. //        $contxt = stream_context_create([
  2462. //            'ssl' => [
  2463. //                'verify_peer' => FALSE,
  2464. //                'verify_peer_name' => FALSE,
  2465. //                'allow_self_signed'=> TRUE
  2466. //            ]
  2467. //        ]);
  2468. //        $dompdf->setHttpContext($contxt);
  2469. //        // Rendre le HTML en PDF
  2470. //        $dompdf->render();
  2471. //
  2472. //        // Générer la réponse HTTP avec le PDF en tant que contenu
  2473. //        $response = new Response($dompdf->output());
  2474. //        $response->headers->set('Content-Type', 'application/pdf');
  2475. //
  2476. //        // Optionnel : définir le nom du fichier de téléchargement
  2477. //        $response->headers->set('Content-Disposition', 'attachment; filename="Facture' . $devi->getId() . '.pdf"');
  2478. //
  2479. //
  2480. //        return $response;
  2481. //    }
  2482.     #[Route('/new', name: 'app_devis_new', methods: ['GET', 'POST'])]
  2483.     public function new(DevisStockArchiveSynchronizer $stockArchiveSynchronizer, ArchivearticleRepository $archivearticleRepository,FournisseurRepository $fournisseurRepository, FamillesRepository $famillesRepository, FamillesdarticlesRepository $famillesdarticlesRepository, ProduitRepository $produitRepository, CourroieRepository $courroieRepository, PlatinesRepository $platinesRepository, AiguillesRepository $aiguillesRepository, Request $request, DevisRepository $devisRepository): Response
  2484.     {
  2485. //        $fournisseurs = $fournisseurRepository->findAll();
  2486. //
  2487. //        $tabfournisseurs[] = [
  2488. //            'nom' => "Cosa",
  2489. //            'prenom' => "Tunisie",
  2490. //            'numeroTelephone' => "",
  2491. //        ];
  2492. //        foreach ($fournisseurs as $fournisseur) {
  2493. //            $tabfournisseurs[] = [
  2494. //                "Cosa Tunisie",
  2495. //                'nom' => $fournisseur->getNom(),
  2496. //                'prenom' => $fournisseur->getPrenom(),
  2497. //                'numeroTelephone' => $fournisseur->getTel(),
  2498. //            ];
  2499. //        }
  2500.         $fournisseurs = $fournisseurRepository->findAll();
  2501. //        $tabfournisseurs[] = [
  2502. //            'nom' => "Cosa",
  2503. //            'prenom' => "Tunisie",
  2504. //            'numeroTelephone' => "",
  2505. //        ];
  2506.         $tabfournisseurs = []; // Initialiser vide
  2507.         foreach ($fournisseurs as $fournisseur) {
  2508.             $tabfournisseurs[] = [
  2509. //                "Cosa Tunisie",
  2510.                 'id' => $fournisseur->getId(),
  2511.                 'nom' => $fournisseur->getNom(),
  2512.                 'prenom' => $fournisseur->getPrenom(),
  2513.                 'numeroTelephone' => $fournisseur->getTel(),
  2514.             ];
  2515.         }
  2516.         $familleall = $famillesRepository->findAll();
  2517.         $familles = $famillesdarticlesRepository->findAll();
  2518.         $nbr = $request->request->get('nbrc_a');
  2519.         $courroi = $courroieRepository->findAll();
  2520.         $platines = $platinesRepository->findAll();
  2521.         $aiguilles = $aiguillesRepository->findAll();
  2522.         $devi = new Devis();
  2523.         $form = $this->createForm(DevisType::class, $devi);
  2524.         $form->handleRequest($request);
  2525.         if ($form->isSubmitted() && $form->isValid()) {
  2526.             $devi->setDatecreation(new DateTime('now', new DateTimeZone('Africa/Tunis')));
  2527.             $fournisseur = $request->request->get('fournisseur');
  2528. //            dd($request->request->all());
  2529.             $code = $request->request->get('code');
  2530.             $base = $request->request->get('base');
  2531.             $taux = $request->request->get('taux');
  2532.             $total = $request->request->get('total');
  2533.             $montant = $request->request->get('montant');
  2534.             $totalht = $request->request->get('totalht');
  2535.             $totalttc = $request->request->get('totalttc');
  2536. //            $acompte=  $request->request->get('acompte');
  2537.             $qtetotal = $request->request->get('qttotal');
  2538.             $netapayer = $request->request->get('netapayer');
  2539.             $fournisseur = $request->request->get('fournisseur');
  2540.             $four = $fournisseurRepository->findOneBy(['id'=>$fournisseur]);
  2541.             $devi->setFournisseur($four);
  2542.             $devi->setVendeur($fournisseur);
  2543.             $devi->setCode($code);
  2544.             $devi->setQttotal($qtetotal);
  2545.             $devi->setBase($base);
  2546.             $devi->setTaux($taux);
  2547.             $devi->setTotal($total);
  2548.             $devi->setMontant($montant);
  2549.             $devi->setTotalht($totalht);
  2550.             $devi->setTotalttc($totalttc);
  2551.             $devi->setOldtype($devi->getStatut());
  2552. //            $devi->setAcompte($acompte);
  2553. //            $devi->setNetapayer($netapayer);
  2554.             $devisRepository->save($devi, true);
  2555.             if ($nbr == 1) {
  2556. //                dd($nbr,$request->request->all());
  2557.                 $pr = new Produit();
  2558.                 $type = $request->request->get('type_1');
  2559.                 $quantity = $request->request->get('qte_1');
  2560.                 $tva = $request->request->get('tva_1');
  2561.                 $prix = $request->request->get('prix_1');
  2562.                 $remise = $request->request->get('remise_1');
  2563.                 $montant = $request->request->get('montantht_1');
  2564.                 $desinagtion = $request->request->get('designation_1');
  2565.                 $deviss = $request->request->get('devis_1');
  2566.                 $coursdejours = $request->request->get('coursdejours_1');
  2567.                 $prixdt = $request->request->get('prixdt_1');
  2568.                 $qte = $famillesdarticlesRepository->findBy(['reference' => $type]);
  2569.                 $article = $famillesdarticlesRepository->findOneBy(['reference' => $type]);
  2570.                 if ($devi->getStatut() == "Facture" or $devi->getStatut() == "BL") {
  2571.                     if (!empty($qte)) {
  2572.                         $famillesdarticles = $qte[0];
  2573.                         $quantitee = (float)$famillesdarticles->getQunatity() - (float)$quantity;
  2574.                         $famillesdarticles->setQunatity((string)max(0, $quantitee));
  2575.                         // Soustraction dans qtetotal (comme bon de sortie)
  2576.                         $qtetotalActuel = $famillesdarticles->getQtetotal();
  2577.                         $newqtetotal = $qtetotalActuel !== null ? (float)$qtetotalActuel : 0;
  2578.                         $newqtetotal -= (float)$quantity;
  2579.                         $famillesdarticles->setQtetotal((string)max(0, $newqtetotal));
  2580.                         $famillesdarticlesRepository->save($famillesdarticles, true);
  2581.                         // 🔥 Archivage
  2582.                         $archiveArticle = new Archivearticle();
  2583.                         $lastArchive = $archivearticleRepository->findOneBy(
  2584.                             ['reference' => $type],
  2585.                             ['datearchive' => 'DESC', 'id' => 'DESC']
  2586.                         );
  2587. // Calcul du stock actuel
  2588.                         $currentStock = 0;
  2589.                         if ($lastArchive && $lastArchive->getStock() !== null) {
  2590.                             $currentStock = (float)$lastArchive->getStock();
  2591.                         }
  2592. // Nouvelle logique : Si le stock archivé est 0, on prend le stock direct de l'article
  2593.                         if ($currentStock == 0) {
  2594.                             $articleStock = (float)$article->getQunatity() + $quantity; // Supposons que getQte() donne le stock actuel
  2595.                             $newStock = $articleStock - $quantity;
  2596.                         } else {
  2597.                             $newStock = $currentStock - $quantity;
  2598.                         }
  2599.                         $archiveArticle->setStock((string)($famillesdarticles->getQtetotal() ?? 0));
  2600.                         if ($devi->getStatut() == "Facture") {
  2601.                             $archiveArticle->setTypearchive('Facture');
  2602.                         } elseif ($devi->getStatut() == "BL") {
  2603.                             $archiveArticle->setTypearchive('BL');
  2604.                         }
  2605.                         $archiveArticle->setDesignation($desinagtion);
  2606.                         $archiveArticle->setTva($tva);
  2607.                         $archiveArticle->setReference($type);
  2608.                         $archiveArticle->setPrixvente($prix ?? $article->getPrixvente());
  2609.                         $archiveArticle->setQuantity($quantity);
  2610.                         $archiveArticle->setQtemvt("-".$quantity);
  2611.                         $archiveArticle->setFournisseur($article->getFournisseur());
  2612.                         $archiveArticle->setCoefficient($article->getCoefficient());
  2613.                         $archiveArticle->setOperateur($article->getOperateur());
  2614.                         $archiveArticle->setFamilles($article->getFamilles());
  2615.                         $archiveArticle->setPrixachat($article->getPrixachat());
  2616.                         $archiveArticle->setUnite($article->getUnite());
  2617.                         $archiveArticle->setFamillesdarticles($article);
  2618.                         $archiveArticle->setFichevente($devi);
  2619.                         $archiveArticle->setFourclient($devi->getClient()->getRaisonsocial());
  2620.                         $archiveArticle->setNumfiche($devi->getNum());
  2621.                         $archiveArticle->setDatearchive(new \DateTime('now', new \DateTimeZone('Africa/Tunis')));
  2622.                         $archivearticleRepository->save($archiveArticle, true);
  2623.                     }
  2624.                 }
  2625. //                $typePosition = strpos($type, "-type:");
  2626. //                if ($typePosition !== false) {
  2627. //                    // Extraire la valeur après "-type:"
  2628. //                    $typeValue = substr($type, $typePosition + strlen("-type:"));
  2629. //
  2630. //                    // Supprimer les espaces avant et après la valeur
  2631. //                    $typeValue = trim($typeValue);
  2632. //
  2633. //
  2634. //                }
  2635. //                if ($typePosition !== false) {
  2636. //                    // Extraire la valeur avant "-type:"
  2637. //                    $valueBeforeType = substr($type, 0, $typePosition);
  2638. //
  2639. //                    // Supprimer les espaces avant et après la valeur
  2640. //                    $valueBeforeType = trim($valueBeforeType);
  2641. //
  2642. //                    // Affiche "VO 65 41 S007"
  2643. //                }
  2644. //                //dd($typeValue);
  2645. //                if( $typeValue === "Aiguilles"){
  2646. //                    $a=$aiguillesRepository->find(['id'=>$valueBeforeType]);
  2647. //                    if ($devi->getStatut() === "Facture") {
  2648. //                        $a->setQuantty($a->getQuantty() - $quantity);
  2649. //                    }
  2650. //
  2651. //                    $aiguillesRepository->save($a,true);
  2652. //
  2653. //                }
  2654. //                elseif ( $typeValue === "Platines"){
  2655. //                    $a=$platinesRepository->find(['id'=>$valueBeforeType]);
  2656. //                    if ($devi->getStatut() === "Facture") {
  2657. //                        $a->setQuantity($a->getQuantity() - $quantity);
  2658. //                    }
  2659. //                    $platinesRepository->save($a,true);
  2660. //                }
  2661. //                else{
  2662. //                    $a=$courroieRepository->find(['id'=>$valueBeforeType]);
  2663. //                    if ($devi->getStatut() === "Facture") {
  2664. //                        $a->setQuantity($a->getQuantity() - $quantity);
  2665. //                    }
  2666. //                    $courroieRepository->save($a,true);
  2667. //
  2668. //                }
  2669. //                if( $typeValue === "Aiguilles"){
  2670. //                    $pr->setType($a->getNom());}
  2671. //                else{
  2672. //                    $pr->setType($a->getReference());
  2673. //                }
  2674.                 $pr->setDeviss($deviss);
  2675.                 $pr->setCoursdejours($coursdejours);
  2676.                 $pr->setPrixunitdt($prixdt);
  2677.                 $pr->setType($type);
  2678.                 $pr->setQte($quantity);
  2679.                 $pr->setTva($tva);
  2680.                 $pr->setPrix($prix);
  2681.                 $pr->setRemise($remise);
  2682.                 $pr->setMontantht($montant);
  2683.                 $pr->setDesignation($desinagtion);
  2684.                 $pr->setDevis($devi);
  2685.                 $produitRepository->save($pr, true);
  2686.             }
  2687.             elseif ($nbr > 1) {
  2688. //                dd($nbr,$request->request->all());
  2689.                 for ($i = 1; $i <= $nbr; $i++) {
  2690.                     if ($request->request->get('type_' . $i)) {
  2691. //                        dd($request->request->get('type'.$i));
  2692.                         $pr = new Produit();
  2693.                         $type = $request->request->get('type_' . $i);
  2694.                         $quantity = $request->request->get('qte_' . $i);
  2695.                         $tva = $request->request->get('tva_' . $i);
  2696.                         $prix = $request->request->get('prix_' . $i);
  2697.                         $montant = $request->request->get('montantht_' . $i);
  2698.                         $desinagtion = $request->request->get('designation_' . $i);
  2699.                         $remise = $request->request->get('remise_' . $i);
  2700.                         $deviss = $request->request->get('devis_' . $i);
  2701.                         $coursdejours = $request->request->get('coursdejours_' . $i);
  2702.                         $prixdt = $request->request->get('prixdt_' . $i);
  2703.                         $qte = $famillesdarticlesRepository->findBy(['reference' => $type]);
  2704.                         $article = $famillesdarticlesRepository->findOneBy(['reference' => $type]);
  2705.                         if ($devi->getStatut() == "Facture" or $devi->getStatut() == "BL") {
  2706.                             if (!empty($qte)) {
  2707.                                 $famillesdarticles = $qte[0];
  2708.                                 $quantitee = (float)$famillesdarticles->getQunatity() - (float)$quantity;
  2709.                                 $famillesdarticles->setQunatity((string)max(0, $quantitee));
  2710.                                 // Soustraction dans qtetotal (comme bon de sortie)
  2711.                                 $qtetotalActuel = $famillesdarticles->getQtetotal();
  2712.                                 $newqtetotal = $qtetotalActuel !== null ? (float)$qtetotalActuel : 0;
  2713.                                 $newqtetotal -= (float)$quantity;
  2714.                                 $famillesdarticles->setQtetotal((string)max(0, $newqtetotal));
  2715.                                 $famillesdarticlesRepository->save($famillesdarticles, true);
  2716.                                 // 🔥 Archivage
  2717.                                 $archiveArticle = new Archivearticle();
  2718.                                 $lastArchive = $archivearticleRepository->findOneBy(
  2719.                                     ['reference' => $type],
  2720.                                     ['datearchive' => 'DESC', 'id' => 'DESC']
  2721.                                 );
  2722. // Calcul du stock actuel
  2723.                                 $currentStock = 0;
  2724.                                 if ($lastArchive && $lastArchive->getStock() !== null) {
  2725.                                     $currentStock = (float)$lastArchive->getStock();
  2726.                                 }
  2727. // Nouvelle logique : Si le stock archivé est 0, on prend le stock direct de l'article
  2728.                                 if ($currentStock == 0) {
  2729.                                     $articleStock = (float)$article->getQunatity() + $quantity; // Supposons que getQte() donne le stock actuel
  2730.                                     $newStock = $articleStock - $quantity;
  2731.                                 } else {
  2732.                                     $newStock = $currentStock - $quantity;
  2733.                                 }
  2734.                                 $archiveArticle->setStock((string)($famillesdarticles->getQtetotal() ?? 0));
  2735.                                 if ($devi->getStatut() == "Facture") {
  2736.                                     $archiveArticle->setTypearchive('Facture');
  2737.                                 } elseif ($devi->getStatut() == "BL") {
  2738.                                     $archiveArticle->setTypearchive('BL');
  2739.                                 }
  2740.                                 $archiveArticle->setDesignation($desinagtion);
  2741.                                 $archiveArticle->setTva($tva);
  2742.                                 $archiveArticle->setReference($type);
  2743.                                 $archiveArticle->setPrixvente($prix ?? $article->getPrixvente());
  2744.                                 $archiveArticle->setQuantity($quantity);
  2745.                                 $archiveArticle->setQtemvt("-".$quantity);
  2746.                                 $archiveArticle->setFournisseur($article->getFournisseur());
  2747.                                 $archiveArticle->setCoefficient($article->getCoefficient());
  2748.                                 $archiveArticle->setOperateur($article->getOperateur());
  2749.                                 $archiveArticle->setFamilles($article->getFamilles());
  2750.                                 $archiveArticle->setPrixachat($article->getPrixachat());
  2751.                                 $archiveArticle->setUnite($article->getUnite());
  2752.                                 $archiveArticle->setFamillesdarticles($article);
  2753.                                 $archiveArticle->setFichevente($devi);
  2754.                                 $archiveArticle->setFourclient($devi->getClient()->getRaisonsocial());
  2755.                                 $archiveArticle->setNumfiche($devi->getNum());
  2756.                                 $archiveArticle->setDatearchive(new \DateTime('now', new \DateTimeZone('Africa/Tunis')));
  2757.                                 $archivearticleRepository->save($archiveArticle, true);
  2758.                             }
  2759.                         }
  2760. //                        $typePosition = strpos($type, "-type:");
  2761. //                        if ($typePosition !== false) {
  2762. //                            // Extraire la valeur après "-type:"
  2763. //                            $typeValue = substr($type, $typePosition + strlen("-type:"));
  2764. //
  2765. //                            // Supprimer les espaces avant et après la valeur
  2766. //                            $typeValue = trim($typeValue);
  2767. //
  2768. //
  2769. //                        }
  2770. //                        if ($typePosition !== false) {
  2771. //                            // Extraire la valeur avant "-type:"
  2772. //                            $valueBeforeType = substr($type, 0, $typePosition);
  2773. //
  2774. //                            // Supprimer les espaces avant et après la valeur
  2775. //                            $valueBeforeType = trim($valueBeforeType);
  2776. //
  2777. //                            // Affiche "VO 65 41 S007"
  2778. //                        }
  2779. //                        //dd($typeValue);
  2780. //                        if( $typeValue === "Aiguilles"){
  2781. //                            $a=$aiguillesRepository->find(['id'=>$valueBeforeType]);
  2782. //                            if ($devi->getStatut() === "Facture") {
  2783. //                                $a->setQuantty($a->getQuantty() - $quantity);
  2784. //                            }
  2785. //                            $aiguillesRepository->save($a,true);
  2786. //                        }
  2787. //                        elseif ( $typeValue === "Platines"){
  2788. //                            $a=$platinesRepository->find(['id'=>$valueBeforeType]);
  2789. //                            if ($devi->getStatut() === "Facture") {
  2790. //                                $a->setQuantity($a->getQuantity() - $quantity);
  2791. //                            }
  2792. //                            $platinesRepository->save($a,true);
  2793. //
  2794. //                        }
  2795. //                        else{
  2796. //                            $a=$courroieRepository->find(['id'=>$valueBeforeType]);
  2797. //                            if ($devi->getStatut() === "Facture") {
  2798. //                            $a->setQuantity($a->getQuantity() - $quantity);
  2799. //                            }
  2800. //                            $courroieRepository->save($a,true);
  2801. //                        }
  2802.                         $pr->setDeviss($deviss);
  2803.                         $pr->setCoursdejours($coursdejours);
  2804.                         $pr->setPrixunitdt($prixdt);
  2805.                         $pr->setType($type);
  2806.                         $pr->setQte($quantity);
  2807.                         $pr->setTva($tva);
  2808.                         $pr->setPrix($prix);
  2809.                         $pr->setRemise($remise);
  2810.                         $pr->setDesignation($desinagtion);
  2811.                         $pr->setMontantht($montant);
  2812.                         $pr->setDevis($devi);
  2813.                         $produitRepository->save($pr, true);
  2814.                     }
  2815.                 }
  2816.             }
  2817.             $stockArchiveSynchronizer->synchronize($devi);
  2818.             // Redirection en fonction du statut
  2819.             switch ($devi->getStatut()) {
  2820.                 case 'Facture':
  2821.                     return $this->redirectToRoute('app_devis_liste_facture', [], Response::HTTP_SEE_OTHER);
  2822.                 case 'Devis':
  2823.                     return $this->redirectToRoute('app_devis_liste_devis', [], Response::HTTP_SEE_OTHER);
  2824.                 case 'Demande devis':
  2825.                     return $this->redirectToRoute('app_devis_iste_demande_devis', [], Response::HTTP_SEE_OTHER);
  2826.                 case 'BLP':
  2827.                     return $this->redirectToRoute('app_devis_particulier_index', [], Response::HTTP_SEE_OTHER);
  2828.                 case 'BL':
  2829.                     return $this->redirectToRoute('app_devis_liste_bl', [], Response::HTTP_SEE_OTHER);
  2830.                 case 'Commande':
  2831.                     return $this->redirectToRoute('app_devis_liste_commandes', [], Response::HTTP_SEE_OTHER);
  2832.                 default:
  2833.                     // Fallback si le statut est inconnu
  2834.                     return $this->redirectToRoute('app_devis_index', [], Response::HTTP_SEE_OTHER);
  2835.             }
  2836. //            return $this->redirectToRoute('app_devis_index', [], Response::HTTP_SEE_OTHER);
  2837.         }
  2838.         return $this->renderForm('devis/new.html.twig', [
  2839.             'devi' => $devi,
  2840.             'form' => $form,
  2841.             'aiguilles' => $aiguilles,
  2842.             'platines' => $platines,
  2843.             'courroi' => $courroi,
  2844.             'familles' => $familles,
  2845.             'familleall' => $familleall,
  2846.             'tabfournisseurs' => $tabfournisseurs
  2847.         ]);
  2848.     }
  2849.     #[Route('/new_demande_devis', name: 'new_demande_devis', methods: ['GET', 'POST'])]
  2850.     public function newdemandedevis(EntityManagerInterface $entityManager,HistoriquedemandedevisRepository $historiquedemandedevisRepository,FournisseurRepository $fournisseurRepository, FamillesRepository $famillesRepository, FamillesdarticlesRepository $famillesdarticlesRepository, ProduitRepository $produitRepository, CourroieRepository $courroieRepository, PlatinesRepository $platinesRepository, AiguillesRepository $aiguillesRepository, Request $request, DevisRepository $devisRepository): Response
  2851.     {
  2852.         $user = $this->getUser();
  2853.         if (!$user) {
  2854.             // Gérer le cas où l'utilisateur n'est pas connecté
  2855.             throw $this->createAccessDeniedException('Vous devez être connecté pour accéder à cette page.');
  2856.         }
  2857.         // Obtenir l'ID de l'utilisateur connecté
  2858.         $userId = $user->getId();
  2859. //        dd($userId);
  2860.         $fournisseurs = $fournisseurRepository->findAll();
  2861.         $tabfournisseurs[] = [
  2862.             'nom' => "Cosa",
  2863.             'prenom' => "Tunisie",
  2864.             'numeroTelephone' => "",
  2865.         ];
  2866.         foreach ($fournisseurs as $fournisseur) {
  2867.             $tabfournisseurs[] = [
  2868.                 "Cosa Tunisie",
  2869.                 'nom' => $fournisseur->getNom(),
  2870.                 'prenom' => $fournisseur->getPrenom(),
  2871.                 'numeroTelephone' => $fournisseur->getTel(),
  2872.             ];
  2873.         }
  2874.         $familleall = $famillesRepository->findAll();
  2875.         $familles = $famillesdarticlesRepository->findAll();
  2876.         $nbr = $request->request->get('nbrc_a');
  2877.         $courroi = $courroieRepository->findAll();
  2878.         $platines = $platinesRepository->findAll();
  2879.         $aiguilles = $aiguillesRepository->findAll();
  2880.         $devi = new Devis();
  2881.         $form = $this->createForm(DevisTechType::class, $devi);
  2882.         $form->handleRequest($request);
  2883.         if ($form->isSubmitted() && $form->isValid()) {
  2884.             $devi->setDatecreation(new DateTime('now', new DateTimeZone('Africa/Tunis')));
  2885.             $fournisseur = $request->request->get('fournisseur');
  2886.             $code = $request->request->get('code');
  2887.             $base = $request->request->get('base');
  2888.             $taux = $request->request->get('taux');
  2889.             $total = $request->request->get('total');
  2890.             $montant = $request->request->get('montant');
  2891.             $totalht = $request->request->get('totalht');
  2892.             $totalttc = $request->request->get('totalttc');
  2893. //            $acompte=  $request->request->get('acompte');
  2894.             $qtetotal = $request->request->get('qttotal');
  2895.             $netapayer = $request->request->get('netapayer');
  2896.             //get les information de formulaire demande devis
  2897.             $client = $form->get('client')->getData();
  2898.             $num = $form->get('num')->getData();
  2899.             $date = $form->get('date')->getData();
  2900.             $reference= $form->get('reference')->getData();
  2901.             $devi->setLu(false);
  2902.             $devi->setStatut('Demande devis');
  2903.             $devi->setUser($this->getUser());
  2904.             $devi->setVendeur($fournisseur);
  2905.             $devi->setCode(0);
  2906.             $devi->setQttotal(0);
  2907.             $devi->setBase($base);
  2908.             $devi->setTaux($taux);
  2909.             $devi->setTotal($total);
  2910.             $devi->setMontant($montant);
  2911.             $devi->setTotalht($totalht);
  2912.             $devi->setTotalttc($totalttc);
  2913.             $devi->setOldtype($devi->getStatut());
  2914.             $devi->setIduerold($userId);
  2915. //            $devi->setAcompte($acompte);
  2916. //            $devi->setNetapayer($netapayer);
  2917.             $devisRepository->save($devi, true);
  2918.             $historiquedemandedevis = new Historiquedemandedevis();
  2919.             $historiquedemandedevis->setDatecreation(new DateTime('now', new DateTimeZone('Africa/Tunis')));
  2920.             $historiquedemandedevis->setStatut('Demande devis');
  2921.             $historiquedemandedevis->setUser($this->getUser());
  2922.             $historiquedemandedevis->setVendeur($fournisseur);
  2923.             $historiquedemandedevis->setCode($code);
  2924.             $historiquedemandedevis->setQttotal($qtetotal);
  2925.             $historiquedemandedevis->setBase($base);
  2926.             $historiquedemandedevis->setTaux($taux);
  2927.             $historiquedemandedevis->setTotal($total);
  2928.             $historiquedemandedevis->setMontant($montant);
  2929.             $historiquedemandedevis->setTotalht($totalht);
  2930.             $historiquedemandedevis->setTotalttc($totalttc);
  2931.             $historiquedemandedevis->setOldtype($devi->getStatut());
  2932.             $historiquedemandedevis->setClient($client);
  2933.             $historiquedemandedevis->setNum($num);
  2934.             $historiquedemandedevis->setDate($date);
  2935.             $historiquedemandedevis->setReference($reference);
  2936.             $historiquedemandedevis->setIddevisold($devi->getId());
  2937.             $historiquedemandedevis->setTypearchive('Archive demande');
  2938.             $entityManager->persist($historiquedemandedevis);
  2939.             $entityManager->flush();
  2940.             if ($nbr == 1) {
  2941. //                dd($nbr,$request->request->all());
  2942.                 $pr = new Produit();
  2943.                 $hpr = new Historiqueproduit();
  2944.                 $type = $request->request->get('type_1');
  2945.                 $quantity = $request->request->get('qte_1');
  2946.                 $tva = $request->request->get('tva_1');
  2947.                 $cosa = $request->request->get('cosa_1');
  2948.                 $qtestock = $request->request->get('qtestock_1');
  2949.                 $qte = $famillesdarticlesRepository->findBy(['reference' => $type]);
  2950.                 if ($devi->getStatut() == "Facture" or $devi->getStatut() == "BL") {
  2951.                     if (!empty($qte)) {
  2952.                         $famillesdarticles = $qte[0];
  2953.                         $quantitee = $famillesdarticles->getQunatity() - $quantity;
  2954.                         $famillesdarticles->setQunatity($quantitee);
  2955.                         $famillesdarticlesRepository->save($famillesdarticles, true);
  2956.                     }
  2957.                 }
  2958.                 $prix = $request->request->get('prix_1');
  2959.                 $remise = $request->request->get('remise_1');
  2960.                 $montant = $request->request->get('montantht_1');
  2961.                 $desinagtion = $request->request->get('designation_1');
  2962.                 $deviss = $request->request->get('devis_1');
  2963.                 $coursdejours = $request->request->get('coursdejours_1');
  2964.                 $prixdt = $request->request->get('prixdt_1');
  2965. //                dd($nbr, $request->request->all());
  2966.                 $pr->setQtestock($qtestock);
  2967.                 $pr->setConfermation(false);
  2968.                 $pr->setDemande($cosa);
  2969.                 $pr->setDeviss($deviss);
  2970.                 $pr->setCoursdejours($coursdejours);
  2971.                 $pr->setPrixunitdt($prixdt);
  2972.                 $pr->setType($type);
  2973.                 $pr->setQte($quantity);
  2974.                 $pr->setTva($tva);
  2975.                 $pr->setPrix($prix);
  2976.                 $pr->setRemise($remise);
  2977.                 $pr->setMontantht($montant);
  2978.                 $pr->setDesignation($desinagtion);
  2979.                 $pr->setDevis($devi);
  2980.                 $produitRepository->save($pr, true);
  2981.                 $hpr->setQtestock($qtestock);
  2982.                 $hpr->setConfermation(false);
  2983.                 $hpr->setDemande($cosa);
  2984.                 $hpr->setDeviss($deviss);
  2985.                 $hpr->setCoursdejours($coursdejours);
  2986.                 $hpr->setPrixunitdt($prixdt);
  2987.                 $hpr->setType($type);
  2988.                 $hpr->setQte($quantity);
  2989.                 $hpr->setTva($tva);
  2990.                 $hpr->setPrix($prix);
  2991.                 $hpr->setRemise($remise);
  2992.                 $hpr->setMontantht($montant);
  2993.                 $hpr->setDesignation($desinagtion);
  2994.                 $hpr->setHistoriquedemandedevis($historiquedemandedevis);
  2995.                 $entityManager->persist($hpr);
  2996.                 $entityManager->flush();
  2997.             }
  2998.             elseif ($nbr > 1) {
  2999. //                dd($nbr,$request->request->all());
  3000.                 for ($i = 1; $i <= $nbr; $i++) {
  3001.                     if ($request->request->get('type_' . $i)) {
  3002. //                        dd($request->request->get('type'.$i));
  3003.                         $pr = new Produit();
  3004.                         $hpr = new Historiqueproduit();
  3005.                         $type = $request->request->get('type_' . $i);
  3006.                         $quantity = $request->request->get('qte_' . $i);
  3007.                         $tva = $request->request->get('tva_' . $i);
  3008.                         $qte = $famillesdarticlesRepository->findBy(['reference' => $type]);
  3009.                         if ($devi->getStatut() == "Facture" or $devi->getStatut() == "BL" ) {
  3010.                             if (!empty($qte)) {
  3011.                                 $famillesdarticles = $qte[0];
  3012.                                 $quantitee = $famillesdarticles->getQunatity() - $quantity;
  3013.                                 $famillesdarticles->setQunatity($quantitee);
  3014.                                 $famillesdarticlesRepository->save($famillesdarticles, true);
  3015.                             }
  3016.                         }
  3017.                         $prix = $request->request->get('prix_' . $i);
  3018.                         $montant = $request->request->get('montantht_' . $i);
  3019.                         $desinagtion = $request->request->get('designation_' . $i);
  3020.                         $remise = $request->request->get('remise_' . $i);
  3021.                         $deviss = $request->request->get('devis_' . $i);
  3022.                         $coursdejours = $request->request->get('coursdejours_' . $i);
  3023.                         $prixdt = $request->request->get('prixdt_' . $i);
  3024.                         $cosa = $request->request->get('cosa_' . $i);
  3025.                         $qtestock = $request->request->get('qtestock_' . $i);
  3026. //                        dd($nbr, $request->request->all());
  3027.                         $pr->setQtestock($qtestock);
  3028.                         $pr->setConfermation(false);
  3029.                         $pr->setDemande($cosa);
  3030.                         $pr->setDeviss($deviss);
  3031.                         $pr->setCoursdejours($coursdejours);
  3032.                         $pr->setPrixunitdt($prixdt);
  3033.                         $pr->setType($type);
  3034.                         $pr->setQte($quantity);
  3035.                         $pr->setTva($tva);
  3036.                         $pr->setPrix($prix);
  3037.                         $pr->setRemise($remise);
  3038.                         $pr->setDesignation($desinagtion);
  3039.                         $pr->setMontantht($montant);
  3040.                         $pr->setDevis($devi);
  3041.                         $produitRepository->save($pr, true);
  3042.                         $hpr->setQtestock($qtestock);
  3043.                         $hpr->setConfermation(false);
  3044.                         $hpr->setDemande($cosa);
  3045.                         $hpr->setDeviss($deviss);
  3046.                         $hpr->setCoursdejours($coursdejours);
  3047.                         $hpr->setPrixunitdt($prixdt);
  3048.                         $hpr->setType($type);
  3049.                         $hpr->setQte($quantity);
  3050.                         $hpr->setTva($tva);
  3051.                         $hpr->setPrix($prix);
  3052.                         $hpr->setRemise($remise);
  3053.                         $hpr->setMontantht($montant);
  3054.                         $hpr->setDesignation($desinagtion);
  3055.                         $hpr->setHistoriquedemandedevis($historiquedemandedevis);
  3056.                         $entityManager->persist($hpr);
  3057.                         $entityManager->flush();
  3058.                     }
  3059.                 }
  3060.             }
  3061.             return $this->redirectToRoute('liste_Demande_Devis', [], Response::HTTP_SEE_OTHER);
  3062.         }
  3063.         return $this->renderForm('devis/new_demande_devis.html.twig', [
  3064.             'devi' => $devi,
  3065.             'form' => $form,
  3066.             'aiguilles' => $aiguilles,
  3067.             'platines' => $platines,
  3068.             'courroi' => $courroi,
  3069.             'familles' => $familles,
  3070.             'familleall' => $familleall,
  3071.             'tabfournisseurs' => $tabfournisseurs
  3072.         ]);
  3073.     }
  3074.     #[Route('/{id}/Voir', name: 'app_devis_show', methods: ['GET'])]
  3075.     public function show(Devis $devi, DevisRepository $devisRepository): Response
  3076.     {
  3077.         $devisOriginal = null;
  3078.         $devisRetour = null;
  3079.         $blfusLie = null;
  3080.         if ($devi->getFrtour()) {
  3081.             $devisOriginal = $devisRepository->find((int) $devi->getFrtour());
  3082.         }
  3083.         if ($devi->getStatut() === 'Facture') {
  3084.             $devisRetour = $devisRepository->findOneBy(['frtour' => (string) $devi->getId(), 'statut' => 'Facture-R']);
  3085.         }
  3086.         if ($devi->getStatut() === 'BL_FUSIONNE' && $devi->getIdfacture()) {
  3087.             $blfusLie = $devisRepository->findOneBy(['num' => $devi->getIdfacture(), 'statut' => 'BLFUS']);
  3088.         }
  3089.         return $this->render('devis/show.html.twig', [
  3090.             'devi' => $devi,
  3091.             'devisOriginal' => $devisOriginal,
  3092.             'devisRetour' => $devisRetour,
  3093.             'blfusLie' => $blfusLie,
  3094.         ]);
  3095.     }
  3096.     #[Route('/demande_devis/{id}', name: 'app_demande_devis_show', methods: ['GET'])]
  3097.     public function demandedevisshow(Devis $devi): Response
  3098.     {
  3099.         return $this->render('devis/demandedevisshow.html.twig', [
  3100.             'devi' => $devi,
  3101.         ]);
  3102.     }
  3103.     #[Route('/{id}/edit', name: 'app_devis_edit', methods: ['GET', 'POST'])]
  3104.     public function edit(DevisStockArchiveSynchronizer $stockArchiveSynchronizer,FournisseurRepository $fournisseurRepository, FamillesRepository $famillesRepository, FamillesdarticlesRepository $famillesdarticlesRepository, EntityManagerInterface $entityManager, ProduitRepository $produitRepository, CourroieRepository $courroieRepository, PlatinesRepository $platinesRepository, AiguillesRepository $aiguillesRepository, Request $request, Devis $devi, DevisRepository $devisRepository): Response
  3105.     {
  3106. //        $fournisseurs = $fournisseurRepository->findAll();
  3107. //
  3108. //        $tabfournisseurs[] = [
  3109. //            'nom' => "Cosa",
  3110. //            'prenom' => "Tunisie",
  3111. //            'numeroTelephone' => "",
  3112. //        ];
  3113. //        foreach ($fournisseurs as $fournisseur) {
  3114. //            $tabfournisseurs[] = [
  3115. //                "Cosa Tunisie",
  3116. //                'nom' => $fournisseur->getNom(),
  3117. //                'prenom' => $fournisseur->getPrenom(),
  3118. //                'numeroTelephone' => $fournisseur->getTel(),
  3119. //            ];
  3120. //        }
  3121.         $fournisseurs = $fournisseurRepository->findAll();
  3122. //        $tabfournisseurs[] = [
  3123. //            'nom' => "Cosa",
  3124. //            'prenom' => "Tunisie",
  3125. //            'numeroTelephone' => "",
  3126. //        ];
  3127.         $tabfournisseurs = []; // Initialiser vide
  3128.         foreach ($fournisseurs as $fournisseur) {
  3129.             $tabfournisseurs[] = [
  3130. //                "Cosa Tunisie",
  3131.                 'id' => $fournisseur->getId(),
  3132.                 'nom' => $fournisseur->getNom(),
  3133.                 'prenom' => $fournisseur->getPrenom(),
  3134.                 'numeroTelephone' => $fournisseur->getTel(),
  3135.             ];
  3136.         }
  3137. //        dd($devi);
  3138.         $familleall = $famillesRepository->findAll();
  3139.         $familles = $famillesdarticlesRepository->findAll();
  3140.         $courroi = $courroieRepository->findAll();
  3141.         $platines = $platinesRepository->findAll();
  3142.         $aiguilles = $aiguillesRepository->findAll();
  3143.         $nbr = $request->request->get('nbrc_a');
  3144.         $fournisseurselect = $devi->getFournisseur();
  3145. //        dd($fournisseurselect ,$devi);
  3146.         $form = $this->createForm(DevisType::class, $devi);
  3147.         $form->handleRequest($request);
  3148.         if ($form->isSubmitted() && $form->isValid()) {
  3149.             $code = $request->request->get('code');
  3150.             $base = $request->request->get('base');
  3151.             $taux = $request->request->get('taux');
  3152.             $total = $request->request->get('total');
  3153.             $montant = $request->request->get('montant');
  3154.             $totalht = $request->request->get('totalht');
  3155.             $totalttc = $request->request->get('totalttc');
  3156. //            $acompte=  $request->request->get('acompte');
  3157.             $qtetotal = $request->request->get('qttotal');
  3158.             $netapayer = $request->request->get('netapayer');
  3159.             $fournisseur = $request->request->get('fournisseur');
  3160.             $four = $fournisseurRepository->findOneBy(['id'=>$fournisseur]);
  3161. //            dd($form->get('statut')->getData(),$fournisseur);
  3162. //            dd($form->getData()); // équivalent à dd($devi)
  3163. //            dd($fournisseur,$four);
  3164.             $devi->setFournisseur($four);
  3165.             $devi->setCode($code);
  3166.             $devi->setQttotal($qtetotal);
  3167.             $devi->setBase($base);
  3168.             $devi->setTaux($taux);
  3169.             $devi->setTotal($total);
  3170.             $devi->setMontant($montant);
  3171.             $devi->setTotalht($totalht);
  3172.             $devi->setTotalttc($totalttc);
  3173.             $devi->setTotalttc($totalttc);
  3174. //            $devi->setAcompte($acompte);
  3175. //            $devi->setNetapayer($netapayer);
  3176.             $devisRepository->save($devi, true);
  3177.             if ($devi->getProduit()) {
  3178.                 foreach ($devi->getProduit() as $item) {
  3179.                     $produitRepository->remove($item, true);
  3180.                 }
  3181.             }
  3182.             if ($nbr == 1) {
  3183.                 $pr = new Produit();
  3184.                 $type = $request->request->get('type_1');
  3185.                 $quantity = $request->request->get('qte_1');
  3186.                 $tva = $request->request->get('tva_1');
  3187.                 $qte = $famillesdarticlesRepository->findOneBy(['reference' => $type]);
  3188.                 $qteold = $request->request->get('qteold_1');
  3189.                 if (($devi->getStatut() == "Facture" or $devi->getStatut() == "BL") and ($devi->getOldtype() == "Facture" or $devi->getOldtype() == "BL"))
  3190.                 {
  3191.                     if (!empty($qte)) {
  3192.                         $qqtoldnew = (float)$qte->getQunatity() + (float)$qteold;
  3193.                         $quantitee = $qqtoldnew - (float)$quantity;
  3194.                         $qte->setQunatity((string)max(0, $quantitee));
  3195.                         // Mise à jour qtetotal: restore ancienne qté, soustraire nouvelle
  3196.                         $newQtetotal = (float)$qte->getQtetotal() + (float)$qteold - (float)$quantity;
  3197.                         $qte->setQtetotal((string)max(0, $newQtetotal));
  3198.                         $famillesdarticlesRepository->save($qte, true);
  3199.                     }
  3200.                 }
  3201.                 elseif (($devi->getStatut() == "Facture" or $devi->getStatut() == "BL") and ($devi->getOldtype() !== "Facture" or $devi->getOldtype() !== "BL"))
  3202.                 {
  3203.                     $qqtoldnew = (float)$qte->getQunatity();
  3204.                     $quantitee = $qqtoldnew - (float)$quantity;
  3205.                     $qte->setQunatity((string)max(0, $quantitee));
  3206.                     // Mise à jour qtetotal: juste soustraire la nouvelle qté
  3207.                     $newQtetotal = (float)$qte->getQtetotal() - (float)$quantity;
  3208.                     $qte->setQtetotal((string)max(0, $newQtetotal));
  3209.                     $famillesdarticlesRepository->save($qte, true);
  3210.                 }
  3211. //                $typePosition = strpos($type, "-type:");
  3212. //
  3213. //                if ($typePosition !== false) {
  3214. //                    // Extraire la valeur après "-type:"
  3215. //                    $typeValue = substr($type, $typePosition + strlen("-type:"));
  3216. //
  3217. //                    // Supprimer les espaces avant et après la valeur
  3218. //                    $typeValue = trim($typeValue);
  3219. //
  3220. //
  3221. //                }
  3222. //                if ($typePosition !== false) {
  3223. //                    // Extraire la valeur avant "-type:"
  3224. //                    $valueBeforeType = substr($type, 0, $typePosition);
  3225. //
  3226. //                    // Supprimer les espaces avant et après la valeur
  3227. //                    $valueBeforeType = trim($valueBeforeType);
  3228. //
  3229. //                    // Affiche "VO 65 41 S007"
  3230. //                }
  3231. //                //dd($typeValue);
  3232. //                if ($typeValue === "Aiguilles") {
  3233. //                    $a = $aiguillesRepository->find(['id' => $valueBeforeType]);
  3234. //
  3235. //                    if ($devi->getStatut() === "Facture") {
  3236. //                        $a->setQuantty($a->getQuantty() - $quantity);
  3237. //                    }
  3238. //                    $aiguillesRepository->save($a, true);
  3239. //                }
  3240. //                elseif ($typeValue === "Platines") {
  3241. //                    $a = $platinesRepository->find(['id' => $valueBeforeType]);
  3242. //                    if ($devi->getStatut() === "Facture") {
  3243. //                        $a->setQuantity($a->getQuantity() - $quantity);
  3244. //                    }
  3245. //                    $platinesRepository->save($a, true);
  3246. //                }
  3247. //                else {
  3248. //                    $a = $courroieRepository->find(['id' => $valueBeforeType]);
  3249. //                    if ($devi->getStatut() === "Facture") {
  3250. //                        $a->setQuantity($a->getQuantity() - $quantity);
  3251. //                    }
  3252. //                    $courroieRepository->save($a, true);
  3253. //
  3254. //                }
  3255.                 $prix = $request->request->get('prix_1');
  3256.                 $remise = $request->request->get('remise_1');
  3257.                 $montant = $request->request->get('montantht_1');
  3258.                 $desinagtion = $request->request->get('designation_1');
  3259.                 $deviss = $request->request->get('devis_1');
  3260.                 $coursdejours = $request->request->get('coursdejours_1');
  3261.                 $prixdt = $request->request->get('prixdt_1');
  3262. //                if ($typeValue === "Aiguilles") {
  3263. //                    $pr->setType($a->getNom());
  3264. //                } else {
  3265. //                    $pr->setType($a->getReference());
  3266. //                }
  3267.                 $pr->setDeviss($deviss);
  3268.                 $pr->setCoursdejours($coursdejours);
  3269.                 $pr->setPrixunitdt($prixdt);
  3270.                 $pr->setType($type);
  3271.                 $pr->setQte($quantity);
  3272.                 $pr->setTva($tva);
  3273.                 $pr->setPrix($prix);
  3274.                 $pr->setRemise($remise);
  3275.                 $pr->setDesignation($desinagtion);
  3276.                 $pr->setMontantht($montant);
  3277.                 $pr->setDevis($devi);
  3278.                 $produitRepository->save($pr, true);
  3279.             } //plus
  3280.             elseif ($nbr > 1) {
  3281.                 for ($i = 1; $i <= $nbr; $i++) {
  3282.                     if ($request->request->get('type_' . $i)) {
  3283. //                        dd($request->request->get('type'.$i));
  3284.                         $pr = new Produit();
  3285.                         $type = $request->request->get('type_' . $i);
  3286.                         $quantity = $request->request->get('qte_' . $i);
  3287.                         $tva = $request->request->get('tva_' . $i);
  3288.                         $qte = $famillesdarticlesRepository->findOneBy(['reference' => $type]);
  3289.                         $qteold = $request->request->get('qteold_' . $i);
  3290.                         if (($devi->getStatut() == "Facture" or $devi->getStatut() == "BL") and ($devi->getOldtype() == "Facture" or $devi->getOldtype() == "BL")) {
  3291.                             if (!empty($qte)) {
  3292.                                 $qqtoldnew = (float)$qte->getQunatity() + (float)$qteold;
  3293.                                 $quantitee = $qqtoldnew - (float)$quantity;
  3294.                                 $qte->setQunatity((string)max(0, $quantitee));
  3295.                                 // qtetotal: restore ancienne qte, soustraire nouvelle
  3296.                                 $newQtetotal = (float)$qte->getQtetotal() + (float)$qteold - (float)$quantity;
  3297.                                 $qte->setQtetotal((string)max(0, $newQtetotal));
  3298.                                 $famillesdarticlesRepository->save($qte, true);
  3299.                             }
  3300.                         }
  3301.                         elseif (($devi->getStatut() == "Facture" or $devi->getStatut() == "BL") and ($devi->getOldtype() !== "Facture" or $devi->getOldtype() !== "BL"))
  3302.                         {
  3303.                             if (!empty($qte)) {
  3304.                                 $qqtoldnew = (float)$qte->getQunatity();
  3305.                                 $quantitee = $qqtoldnew - (float)$quantity;
  3306.                                 $qte->setQunatity((string)max(0, $quantitee));
  3307.                                 // qtetotal: juste soustraire la nouvelle qte
  3308.                                 $newQtetotal2 = (float)$qte->getQtetotal() - (float)$quantity;
  3309.                                 $qte->setQtetotal((string)max(0, $newQtetotal2));
  3310.                                 $famillesdarticlesRepository->save($qte, true);
  3311.                             }
  3312.                         }
  3313. //                        $typePosition = strpos($type, "-type:");
  3314. //                        if ($typePosition !== false) {
  3315. //                            // Extraire la valeur après "-type:"
  3316. //                            $typeValue = substr($type, $typePosition + strlen("-type:"));
  3317. //
  3318. //                            // Supprimer les espaces avant et après la valeur
  3319. //                            $typeValue = trim($typeValue);
  3320. //
  3321. //
  3322. //                        }
  3323. //                        if ($typePosition !== false) {
  3324. //                            // Extraire la valeur avant "-type:"
  3325. //                            $valueBeforeType = substr($type, 0, $typePosition);
  3326. //
  3327. //                            // Supprimer les espaces avant et après la valeur
  3328. //                            $valueBeforeType = trim($valueBeforeType);
  3329. //
  3330. //                            // Affiche "VO 65 41 S007"
  3331. //                        }
  3332. //                        //dd($typeValue);
  3333. //                        if ($typeValue === "Aiguilles") {
  3334. //                            $a = $aiguillesRepository->find(['id' => $valueBeforeType]);
  3335. //                            $a->setQuantty($a->getQuantty() + $quantity);
  3336. //                            $aiguillesRepository->save($a, true);
  3337. //                        }
  3338. //                        elseif ($typeValue === "Platines") {
  3339. //                            $a = $platinesRepository->find(['id' => $valueBeforeType]);
  3340. //                            $a->setQuantity($a->getQuantity() + $quantity);
  3341. //                            $platinesRepository->save($a, true);
  3342. //
  3343. //                        }
  3344. //                        else {
  3345. //                            $a = $courroieRepository->find(['id' => $valueBeforeType]);
  3346. //                            $a->setQuantity($a->getQuantity() + $quantity);
  3347. //                            $courroieRepository->save($a, true);
  3348. //                        }
  3349.                         $prix = $request->request->get('prix_' . $i);
  3350.                         $montant = $request->request->get('montantht_' . $i);
  3351.                         $desinagtion = $request->request->get('designation_' . $i);
  3352.                         $remise = $request->request->get('remise_' . $i);
  3353.                         $deviss = $request->request->get('devis_' . $i);
  3354.                         $coursdejours = $request->request->get('coursdejours_' . $i);
  3355.                         $prixdt = $request->request->get('prixdt_' . $i);
  3356. //                        if ($typeValue === "Aiguilles") {
  3357. //                            $pr->setType($a->getNom());
  3358. //                        } else {
  3359. //                            $pr->setType($a->getReference());
  3360. //                        }
  3361.                         $pr->setDeviss($deviss);
  3362.                         $pr->setCoursdejours($coursdejours);
  3363.                         $pr->setPrixunitdt($prixdt);
  3364.                         $pr->setType($type);
  3365.                         $pr->setQte($quantity);
  3366.                         $pr->setTva($tva);
  3367.                         $pr->setPrix($prix);
  3368.                         $pr->setRemise($remise);
  3369.                         $pr->setDesignation($desinagtion);
  3370.                         $pr->setMontantht($montant);
  3371.                         $pr->setDevis($devi);
  3372.                         $produitRepository->save($pr, true);
  3373.                     }
  3374.                 }
  3375.                 $entityManager->persist($devi);
  3376.                 $entityManager->flush();
  3377.             }
  3378.             $devi->setOldtype($devi->getStatut());
  3379.             $devisRepository->save($devi,true);
  3380.             $stockArchiveSynchronizer->synchronize($devi);
  3381.             // Redirection en fonction du statut
  3382.             switch ($devi->getStatut()) {
  3383.                 case 'Facture':
  3384.                     return $this->redirectToRoute('app_devis_liste_facture', [], Response::HTTP_SEE_OTHER);
  3385.                 case 'Devis':
  3386.                     return $this->redirectToRoute('app_devis_liste_devis', [], Response::HTTP_SEE_OTHER);
  3387.                 case 'Demande devis':
  3388.                     return $this->redirectToRoute('app_devis_iste_demande_devis', [], Response::HTTP_SEE_OTHER);
  3389.                 case 'BLP':
  3390.                     return $this->redirectToRoute('app_devis_particulier_index', [], Response::HTTP_SEE_OTHER);
  3391.                 case 'BL':
  3392.                     return $this->redirectToRoute('app_devis_liste_bl', [], Response::HTTP_SEE_OTHER);
  3393.                 case 'Commande':
  3394.                     return $this->redirectToRoute('app_devis_liste_commandes', [], Response::HTTP_SEE_OTHER);
  3395.                 default:
  3396.                     // Fallback si le statut est inconnu
  3397.                     return $this->redirectToRoute('app_devis_index', [], Response::HTTP_SEE_OTHER);
  3398.             }
  3399. //            return $this->redirectToRoute('app_devis_index', [], Response::HTTP_SEE_OTHER);
  3400.         }
  3401.         return $this->renderForm('devis/edit.html.twig', [
  3402.             'devi' => $devi,
  3403.             'form' => $form,
  3404.             'aiguilles' => $aiguilles,
  3405.             'platines' => $platines,
  3406.             'courroi' => $courroi,
  3407.             'familles' => $familles,
  3408.             'familleall' => $familleall,
  3409.             'tabfournisseurs' => $tabfournisseurs,
  3410.             'fournisseurselect'=>$fournisseurselect
  3411.         ]);
  3412.     }
  3413.     #[Route('/{id}/edit_demande_devis', name: 'app_demande_devis_edit', methods: ['GET', 'POST'])]
  3414.     public function editdemandedevis(HistoriqueproduitRepository $historiqueproduitRepository,HistoriquedemandedevisRepository $historiquedemandedevisRepository,FournisseurRepository $fournisseurRepository, FamillesRepository $famillesRepository, FamillesdarticlesRepository $famillesdarticlesRepository, EntityManagerInterface $entityManager, ProduitRepository $produitRepository, CourroieRepository $courroieRepository, PlatinesRepository $platinesRepository, AiguillesRepository $aiguillesRepository, Request $request, Devis $devi, DevisRepository $devisRepository): Response
  3415.     {
  3416.         $historiquedemandedevis = $historiquedemandedevisRepository->findOneBy(['iddevisold'=>$devi->getId()]);
  3417.         $fournisseurs = $fournisseurRepository->findAll();
  3418.         $tabfournisseurs[] = [
  3419.             'nom' => "Cosa",
  3420.             'prenom' => "Tunisie",
  3421.             'numeroTelephone' => "",
  3422.         ];
  3423.         foreach ($fournisseurs as $fournisseur) {
  3424.             $tabfournisseurs[] = [
  3425.                 "Cosa Tunisie",
  3426.                 'nom' => $fournisseur->getNom(),
  3427.                 'prenom' => $fournisseur->getPrenom(),
  3428.                 'numeroTelephone' => $fournisseur->getTel(),
  3429.             ];
  3430.         }
  3431. //        dd($devi);
  3432.         $familleall = $famillesRepository->findAll();
  3433.         $familles = $famillesdarticlesRepository->findAll();
  3434.         $courroi = $courroieRepository->findAll();
  3435.         $platines = $platinesRepository->findAll();
  3436.         $aiguilles = $aiguillesRepository->findAll();
  3437.         $nbr = $request->request->get('nbrc_a');
  3438.         $form = $this->createForm(DevisTechType::class, $devi);
  3439.         $form->handleRequest($request);
  3440.         if ($form->isSubmitted() && $form->isValid()) {
  3441.             $devisRepository->save($devi, true);
  3442.             $code = $request->request->get('code');
  3443.             $base = $request->request->get('base');
  3444.             $taux = $request->request->get('taux');
  3445.             $total = $request->request->get('total');
  3446.             $montant = $request->request->get('montant');
  3447.             $totalht = $request->request->get('totalht');
  3448.             $totalttc = $request->request->get('totalttc');
  3449. //            $acompte=  $request->request->get('acompte');
  3450.             $qtetotal = $request->request->get('qttotal');
  3451.             $netapayer = $request->request->get('netapayer');
  3452.             $devi->setLu(false);
  3453.             $devi->setStatut('Demande devis');
  3454.             $devi->setUser($this->getUser());
  3455.             $devi->setCode($code);
  3456.             $devi->setQttotal($qtetotal);
  3457.             $devi->setBase($base);
  3458.             $devi->setTaux($taux);
  3459.             $devi->setTotal($total);
  3460.             $devi->setMontant($montant);
  3461.             $devi->setTotalht($totalht);
  3462.             $devi->setTotalttc($totalttc);
  3463.             $devi->setTotalttc($totalttc);
  3464. //            $devi->setAcompte($acompte);
  3465. //            $devi->setNetapayer($netapayer);
  3466.             $devisRepository->save($devi, true);
  3467.            $client = $form->get('client')->getData();
  3468.             $num = $form->get('num')->getData();
  3469.             $date = $form->get('date')->getData();
  3470.             $reference= $form->get('reference')->getData();
  3471.             $historiquedemandedevis->setStatut('Demande devis');
  3472.             $historiquedemandedevis->setUser($this->getUser());
  3473.             $historiquedemandedevis->setCode($code);
  3474.             $historiquedemandedevis->setQttotal($qtetotal);
  3475.             $historiquedemandedevis->setBase($base);
  3476.             $historiquedemandedevis->setTaux($taux);
  3477.             $historiquedemandedevis->setTotal($total);
  3478.             $historiquedemandedevis->setMontant($montant);
  3479.             $historiquedemandedevis->setTotalht($totalht);
  3480.             $historiquedemandedevis->setTotalttc($totalttc);
  3481.             $historiquedemandedevis->setClient($client);
  3482.             $historiquedemandedevis->setNum($num);
  3483.             $historiquedemandedevis->setDate($date);
  3484.             $historiquedemandedevis->setReference($reference);
  3485.             $historiquedemandedevis->setIddevisold($devi->getId());
  3486.             $entityManager->persist($historiquedemandedevis);
  3487.             $entityManager->flush();
  3488.             if ($devi->getProduit()) {
  3489.                 foreach ($devi->getProduit() as $item) {
  3490.                     $produitRepository->remove($item, true);
  3491.                 }
  3492.             }
  3493.             if ($historiquedemandedevis->getHistoriqueproduits()) {
  3494.                 foreach ($historiquedemandedevis->getHistoriqueproduits() as $item) {
  3495. //                    $historiqueproduitRepository->remove($item, true);
  3496.                     $entityManager->remove($item);
  3497.                     $entityManager->flush();
  3498.                 }
  3499.             }
  3500.             if ($nbr == 1) {
  3501.                 $pr = new Produit();
  3502.                 $hpr = new Historiqueproduit();
  3503.                 $type = $request->request->get('type_1');
  3504.                 $quantity = $request->request->get('qte_1');
  3505.                 $tva = $request->request->get('tva_1');
  3506.                 $qte = $famillesdarticlesRepository->findOneBy(['reference' => $type]);
  3507.                 $qteold = $request->request->get('qteold_1');
  3508.                 $cosa = $request->request->get('cosa_1');
  3509.                 if (($devi->getStatut() == "Facture" or $devi->getStatut() == "BL") and ($devi->getOldtype() == "Facture" or $devi->getOldtype() == "BL"))
  3510.                 {
  3511.                     if (!empty($qte)) {
  3512.                         $qqtoldnew = (float)$qte->getQunatity() + (float)$qteold;
  3513.                         $quantitee = $qqtoldnew - (float)$quantity;
  3514.                         $qte->setQunatity((string)max(0, $quantitee));
  3515.                         // Mise à jour qtetotal: restore ancienne qté, soustraire nouvelle
  3516.                         $newQtetotal = (float)$qte->getQtetotal() + (float)$qteold - (float)$quantity;
  3517.                         $qte->setQtetotal((string)max(0, $newQtetotal));
  3518.                         $famillesdarticlesRepository->save($qte, true);
  3519.                     }
  3520.                 }
  3521.                 elseif (($devi->getStatut() == "Facture" or $devi->getStatut() == "BL") and ($devi->getOldtype() !== "Facture" or $devi->getOldtype() !== "BL"))
  3522.                 {
  3523.                     $qqtoldnew = (float)$qte->getQunatity();
  3524.                     $quantitee = $qqtoldnew - (float)$quantity;
  3525.                     $qte->setQunatity((string)max(0, $quantitee));
  3526.                     // Mise à jour qtetotal: juste soustraire la nouvelle qté
  3527.                     $newQtetotal = (float)$qte->getQtetotal() - (float)$quantity;
  3528.                     $qte->setQtetotal((string)max(0, $newQtetotal));
  3529.                     $famillesdarticlesRepository->save($qte, true);
  3530.                 }
  3531.                 $prix = $request->request->get('prix_1');
  3532.                 $remise = $request->request->get('remise_1');
  3533.                 $montant = $request->request->get('montantht_1');
  3534.                 $desinagtion = $request->request->get('designation_1');
  3535.                 $deviss = $request->request->get('devis_1');
  3536.                 $coursdejours = $request->request->get('coursdejours_1');
  3537.                 $prixdt = $request->request->get('prixdt_1');
  3538.                 $qtestock = $request->request->get('qtestock_1');
  3539.                 $pr->setQtestock($qtestock);
  3540.                 $pr->setDemande($cosa);
  3541.                 $pr->setDeviss($deviss);
  3542.                 $pr->setCoursdejours($coursdejours);
  3543.                 $pr->setPrixunitdt($prixdt);
  3544.                 $pr->setType($type);
  3545.                 $pr->setQte($quantity);
  3546.                 $pr->setTva($tva);
  3547.                 $pr->setPrix($prix);
  3548.                 $pr->setRemise($remise);
  3549.                 $pr->setDesignation($desinagtion);
  3550.                 $pr->setMontantht($montant);
  3551.                 $pr->setDevis($devi);
  3552.                 $produitRepository->save($pr, true);
  3553.                 $hpr->setQtestock($qtestock);
  3554.                 $hpr->setConfermation(false);
  3555.                 $hpr->setDemande($cosa);
  3556.                 $hpr->setDeviss($deviss);
  3557.                 $hpr->setCoursdejours($coursdejours);
  3558.                 $hpr->setPrixunitdt($prixdt);
  3559.                 $hpr->setType($type);
  3560.                 $hpr->setQte($quantity);
  3561.                 $hpr->setTva($tva);
  3562.                 $hpr->setPrix($prix);
  3563.                 $hpr->setRemise($remise);
  3564.                 $hpr->setMontantht($montant);
  3565.                 $hpr->setDesignation($desinagtion);
  3566.                 $hpr->setHistoriquedemandedevis($historiquedemandedevis);
  3567.                 $entityManager->persist($hpr);
  3568.                 $entityManager->flush();
  3569.             } //plus
  3570.             elseif ($nbr > 1) {
  3571.                 for ($i = 1; $i <= $nbr; $i++) {
  3572.                     if ($request->request->get('type_' . $i)) {
  3573. //                        dd($request->request->get('type'.$i));
  3574.                         $pr = new Produit();
  3575.                         $hpr = new Historiqueproduit();
  3576.                         $type = $request->request->get('type_' . $i);
  3577.                         $quantity = $request->request->get('qte_' . $i);
  3578.                         $tva = $request->request->get('tva_' . $i);
  3579.                         $qte = $famillesdarticlesRepository->findOneBy(['reference' => $type]);
  3580.                         $qteold = $request->request->get('qteold_' . $i);
  3581.                         if (($devi->getStatut() == "Facture" or $devi->getStatut() == "BL") and ($devi->getOldtype() == "Facture" or $devi->getOldtype() == "BL")) {
  3582.                             if (!empty($qte)) {
  3583.                                 $qqtoldnew = (float)$qte->getQunatity() + (float)$qteold;
  3584.                                 $quantitee = $qqtoldnew - (float)$quantity;
  3585.                                 $qte->setQunatity((string)max(0, $quantitee));
  3586.                                 // qtetotal: restore ancienne qte, soustraire nouvelle
  3587.                                 $newQtetotal = (float)$qte->getQtetotal() + (float)$qteold - (float)$quantity;
  3588.                                 $qte->setQtetotal((string)max(0, $newQtetotal));
  3589.                                 $famillesdarticlesRepository->save($qte, true);
  3590.                             }
  3591.                         }
  3592.                         elseif (($devi->getStatut() == "Facture" or $devi->getStatut() == "BL") and ($devi->getOldtype() !== "Facture" or $devi->getOldtype() !== "BL"))
  3593.                         {
  3594.                             if (!empty($qte)) {
  3595.                                 $qqtoldnew = (float)$qte->getQunatity();
  3596.                                 $quantitee = $qqtoldnew - (float)$quantity;
  3597.                                 $qte->setQunatity((string)max(0, $quantitee));
  3598.                                 // qtetotal: juste soustraire la nouvelle qte
  3599.                                 $newQtetotal2 = (float)$qte->getQtetotal() - (float)$quantity;
  3600.                                 $qte->setQtetotal((string)max(0, $newQtetotal2));
  3601.                                 $famillesdarticlesRepository->save($qte, true);
  3602.                             }
  3603.                         }
  3604.                         $prix = $request->request->get('prix_' . $i);
  3605.                         $montant = $request->request->get('montantht_' . $i);
  3606.                         $desinagtion = $request->request->get('designation_' . $i);
  3607.                         $remise = $request->request->get('remise_' . $i);
  3608.                         $deviss = $request->request->get('devis_' . $i);
  3609.                         $coursdejours = $request->request->get('coursdejours_' . $i);
  3610.                         $prixdt = $request->request->get('prixdt_' . $i);
  3611.                         $cosa = $request->request->get('cosa_' . $i);
  3612.                         $qtestock = $request->request->get('qtestock_' . $i);
  3613.                         $pr->setQtestock($qtestock);
  3614.                         $pr->setDemande($cosa);
  3615.                         $pr->setDeviss($deviss);
  3616.                         $pr->setCoursdejours($coursdejours);
  3617.                         $pr->setPrixunitdt($prixdt);
  3618.                         $pr->setType($type);
  3619.                         $pr->setQte($quantity);
  3620.                         $pr->setTva($tva);
  3621.                         $pr->setPrix($prix);
  3622.                         $pr->setRemise($remise);
  3623.                         $pr->setDesignation($desinagtion);
  3624.                         $pr->setMontantht($montant);
  3625.                         $pr->setDevis($devi);
  3626.                         $produitRepository->save($pr, true);
  3627.                         $hpr->setQtestock($qtestock);
  3628.                         $hpr->setConfermation(false);
  3629.                         $hpr->setDemande($cosa);
  3630.                         $hpr->setDeviss($deviss);
  3631.                         $hpr->setCoursdejours($coursdejours);
  3632.                         $hpr->setPrixunitdt($prixdt);
  3633.                         $hpr->setType($type);
  3634.                         $hpr->setQte($quantity);
  3635.                         $hpr->setTva($tva);
  3636.                         $hpr->setPrix($prix);
  3637.                         $hpr->setRemise($remise);
  3638.                         $hpr->setMontantht($montant);
  3639.                         $hpr->setDesignation($desinagtion);
  3640.                         $hpr->setHistoriquedemandedevis($historiquedemandedevis);
  3641.                         $entityManager->persist($hpr);
  3642.                         $entityManager->flush();
  3643.                     }
  3644.                 }
  3645.                 $entityManager->persist($devi);
  3646.                 $entityManager->flush();
  3647.             }
  3648.             $devi->setOldtype($devi->getStatut());
  3649.             $devisRepository->save($devi,true);
  3650.             return $this->redirectToRoute('liste_Demande_Devis', [], Response::HTTP_SEE_OTHER);
  3651.         }
  3652.         return $this->renderForm('devis/editdemandedevis.html.twig', [
  3653.             'devi' => $devi,
  3654.             'form' => $form,
  3655.             'aiguilles' => $aiguilles,
  3656.             'platines' => $platines,
  3657.             'courroi' => $courroi,
  3658.             'familles' => $familles,
  3659.             'familleall' => $familleall,
  3660.             'tabfournisseurs' => $tabfournisseurs
  3661.         ]);
  3662.     }
  3663.     #[Route('/{id}/confirmation_demande_devis', name: 'app_confirmation_demande_devis', methods: ['GET', 'POST'])]
  3664.     public function confirmationdemandedevis(UserRepository $userRepository,ArticleimportdirectRepository $articleimportdirectRepository, ImportdirectRepository $importdirectRepository, FournisseurRepository $fournisseurRepository, FamillesRepository $famillesRepository, FamillesdarticlesRepository $famillesdarticlesRepository, EntityManagerInterface $entityManager, ProduitRepository $produitRepository, CourroieRepository $courroieRepository, PlatinesRepository $platinesRepository, AiguillesRepository $aiguillesRepository, Request $request, Devis $devi, DevisRepository $devisRepository): Response {
  3665.         $fournisseurs = $fournisseurRepository->findAll();
  3666.         $tabfournisseurs[] = [
  3667.             'nom' => "Cosa",
  3668.             'prenom' => "Tunisie",
  3669.             'numeroTelephone' => "",
  3670.         ];
  3671.         foreach ($fournisseurs as $fournisseur) {
  3672.             $tabfournisseurs[] = [
  3673.                 "Cosa Tunisie",
  3674.                 'nom' => $fournisseur->getNom(),
  3675.                 'prenom' => $fournisseur->getPrenom(),
  3676.                 'numeroTelephone' => $fournisseur->getTel(),
  3677.             ];
  3678.         }
  3679.         $familleall = $famillesRepository->findAll();
  3680.         $familles = $famillesdarticlesRepository->findAll();
  3681.         $courroi = $courroieRepository->findAll();
  3682.         $platines = $platinesRepository->findAll();
  3683.         $aiguilles = $aiguillesRepository->findAll();
  3684.         $nbr = $request->request->get('nbrc_a');
  3685.         $form = $this->createForm(DevisTechType::class, $devi);
  3686.         $form->handleRequest($request);
  3687.         if ($form->isSubmitted() && $form->isValid()) {
  3688.             $devis = null;
  3689.             $code = $request->request->get('code');
  3690.             $base = $request->request->get('base');
  3691.             $taux = $request->request->get('taux');
  3692.             $total = $request->request->get('total');
  3693.             $montant = $request->request->get('montant');
  3694.             $totalht = $request->request->get('totalht');
  3695.             $totalttc = $request->request->get('totalttc');
  3696.             $qtetotal = $request->request->get('qttotal');
  3697.             $netapayer = $request->request->get('netapayer');
  3698.             $res = $request->request->all('chk_child');
  3699.             $vendeurFullName = $request->request->get('fournisseur');
  3700.             $parts = explode(' ', $vendeurFullName);
  3701.             $vendeurNom = trim($parts[0]);
  3702.             $deviexiste = $devisRepository->findOneBy(['iddevisold' => $devi->getId()]);
  3703.             $importexiste = $importdirectRepository->findOneBy(['idimportdirectold' => $devi->getId()]);
  3704. //            dd($importexiste);
  3705.             $product_info = array_map(function($item) {
  3706.                 $parts = explode('-', $item);
  3707.                 return ['id' => $parts[0], 'index' => $parts[1]];
  3708.             }, $res);
  3709.             $needsNewDevis = false;
  3710.             $needsNewImportDirect = false;
  3711.             foreach ($product_info as $info) {
  3712.                 $cosa = $request->request->get('cosa_' . $info['index']);
  3713.                 if ($cosa == 'Locale') {
  3714.                     $needsNewDevis = true;
  3715.                 } elseif ($cosa == 'Direct') {
  3716.                     $needsNewImportDirect = true;
  3717.                 }
  3718.             }
  3719. // Afficher les résultats après la boucle
  3720. //            dd($needsNewDevis, $needsNewImportDirect, $product_info);
  3721. // Create new Devis if needed
  3722.             if ($needsNewDevis && empty($deviexiste))
  3723.             {
  3724.                     $devis = new Devis();
  3725.                     $devis->setStatut('Devis');
  3726.                     $devis->setDate(new DateTime());
  3727. //                    dd($devi->getUser()->getId());.
  3728.                     $devi->setIduerold($devi->getIduerold());
  3729.                     $user = $userRepository->findOneBy(['id'=>$devi->getIduerold()]);
  3730.                     if (!$user)
  3731.                     {
  3732.                         $user = $userRepository->findOneBy(['id'=>$devi->getUser()]);
  3733.                     }
  3734.                     $devis->setUser($user);
  3735.                     $devis->setIduerold($devi->getIduerold());
  3736.                     $clientDetails = $form->get('client')->getData();
  3737.                     foreach ($product_info as $info) {
  3738.                         $product_id = $info['id'];
  3739.                         $idrub = $info['index'];
  3740.                         $produit = $produitRepository->find($product_id);
  3741.                         if ($produit) {
  3742.                             $type = $request->request->get('type_' . $idrub);
  3743.                             $designation = $request->request->get('designation_' . $idrub);
  3744.                             $quantity = $request->request->get('qte_' . $idrub);
  3745.                             $devisProduit = $request->request->get('devis_' . $idrub);
  3746.                             $prix = $request->request->get('prix_' . $idrub);
  3747.                             $coursdejours = $request->request->get('coursdejours_' . $idrub);
  3748.                             $prixdt = $request->request->get('prixdt_' . $idrub);
  3749.                             $remise = $request->request->get('remise_' . $idrub);
  3750.                             $montantht = $request->request->get('montantht_' . $idrub);
  3751.                             $tva = $request->request->get('tva_' . $idrub);
  3752.                             $cosa = $request->request->get('cosa_' . $idrub);
  3753.                             if($cosa == 'Locale'){
  3754.                                 $produit->setType($type);
  3755.                                 $produit->setDesignation($designation);
  3756.                                 $produit->setQte($quantity);
  3757.                                 $produit->setDeviss($devisProduit);
  3758.                                 $produit->setPrix($prix);
  3759.                                 $produit->setCoursdejours($coursdejours);
  3760.                                 $produit->setPrixunitdt($prixdt);
  3761.                                 $produit->setRemise($remise);
  3762.                                 $produit->setMontantht($montantht);
  3763.                                 $produit->setTva($tva);
  3764.                                 $produit->setDemande($cosa);
  3765.                                 $produit->setDevis($devis);
  3766.                                 $devis->addProduit($produit);
  3767. //                               $produitRepository->save($produit);
  3768.                                 $entityManager->persist($devis);
  3769.                                 $entityManager->flush();
  3770.                             }
  3771.                             $devi->removeProduit($produit);
  3772.                         }
  3773.                     }
  3774. //                    dd($product_info, $devis ,$produit);
  3775.                 $status = 'Demande devis';
  3776.                 // Recherchez la FamilleArticle en fonction de la référence
  3777.                 $totstatu = $devisRepository->findBy(['statut' => $status]);
  3778.                 $count = count($totstatu);
  3779.                 if ($count == 0) {
  3780.                     $count = 1;
  3781.                 }
  3782.                 else {
  3783.                     $count = $count + 1;
  3784.                 }
  3785.                 // Génération du numéro de base
  3786.                 if ($status == "Demande devis") {
  3787.                     $tt = "Dd" . $count;
  3788.                 }
  3789.                 // Vérification de l'existence du numéro et génération d'un nouveau si nécessaire
  3790.                 while ($devisRepository->findOneBy(['num' => $tt])) {
  3791.                     $count++;
  3792.                     $tt = "Dd" . $count;
  3793.                 }
  3794. //                        dd($testexiste,$tt);
  3795.                 $devis->setNum($tt);
  3796.                     $devis->setClient($clientDetails);
  3797.                     $devis->setIddevisold($devi->getId());
  3798.                     $devis->setLu(true);
  3799.                     $devis->setStatut('Devis');
  3800.                     $devis->setCode($code);
  3801.                     $devis->setQttotal($qtetotal);
  3802.                     $devis->setBase($base);
  3803.                     $devis->setTaux($taux);
  3804.                     $devis->setTotal($total);
  3805.                     $devis->setMontant($montant);
  3806.                     $devis->setTotalht($totalht);
  3807.                     $devis->setTotalttc($totalttc);
  3808.                     $devis->setVendeur($vendeurFullName);
  3809.                     $devis->setOldtype($devi->getStatut());
  3810. //                    dd($devis, $devis->getProduit(), $produit);
  3811.                          $entityManager->persist($devis);
  3812.                     $entityManager->flush();
  3813. //                    $devisRepository->save($devis, true);
  3814.                 }
  3815.             if($deviexiste) {
  3816. //                dd('honi devis existe',$needsNewDevis,$deviexiste);
  3817.                 foreach ($product_info as $info) {
  3818.                     $product_id = $info['id'];
  3819.                     $idrub = $info['index'];
  3820.                     $produit = $produitRepository->find($product_id);
  3821.                     if ($produit) {
  3822.                         $type = $request->request->get('type_' . $idrub);
  3823.                         $designation = $request->request->get('designation_' . $idrub);
  3824.                         $quantity = $request->request->get('qte_' . $idrub);
  3825.                         $prix = $request->request->get('prix_' . $idrub);
  3826.                         $coursdejours = $request->request->get('coursdejours_' . $idrub);
  3827.                         $prixdt = $request->request->get('prixdt_' . $idrub);
  3828.                         $remise = $request->request->get('remise_' . $idrub);
  3829.                         $montantht = $request->request->get('montantht_' . $idrub);
  3830.                         $tva = $request->request->get('tva_' . $idrub);
  3831.                         $cosa = $request->request->get('cosa_' . $idrub);
  3832.                         if($cosa == 'Locale'){
  3833.                             $produit->setType($type);
  3834.                             $produit->setDesignation($designation);
  3835.                             $produit->setQte($quantity);
  3836.                             $produit->setPrix($prix);
  3837.                             $produit->setCoursdejours($coursdejours);
  3838.                             $produit->setPrixunitdt($prixdt);
  3839.                             $produit->setRemise($remise);
  3840.                             $produit->setMontantht($montantht);
  3841.                             $produit->setTva($tva);
  3842.                             $produit->setDemande($cosa);
  3843.                             $produit->setDevis($deviexiste);
  3844.                             $deviexiste->addProduit($produit);
  3845. //                            $produitRepository->save($produit);
  3846.                             $entityManager->persist($produit);
  3847.                             $entityManager->flush();
  3848.                         }
  3849.                         $devi->removeProduit($produit);
  3850.                     }
  3851.                 }
  3852.                 $clientDetails = $form->get('client')->getData();
  3853.                 $deviexiste->setClient($clientDetails);
  3854. //                $user = $userRepository->find(['id'=>$devi->getUser()->getId()]);
  3855. //                dd($devi->getUser()->getId(),$user);
  3856. //                $devis->setUser($user);
  3857.                 $newcode = floatval($deviexiste->getCode()) + floatval($code);
  3858.                 $newbase = floatval($deviexiste->getBase()) + floatval($base);
  3859.                 $newtaux = floatval($deviexiste->getTaux()) + floatval($taux);
  3860.                 $newtotale = floatval($deviexiste->getTotal()) + floatval($total);
  3861.                 $newmontant = floatval($deviexiste->getMontant()) + floatval($montant);
  3862.                 $newtotalht = floatval($deviexiste->getTotalht()) + floatval($totalht);
  3863.                 $newtotalttc = floatval($deviexiste->getTotalttc()) + floatval($totalttc);
  3864.                 $newqtetotal = floatval($deviexiste->getQttotal()) + floatval($qtetotal);
  3865.                 $deviexiste->setIddevisold($devi->getId());
  3866.                 $deviexiste->setLu(true);
  3867.                 $deviexiste->setStatut('Devis');
  3868.                 $deviexiste->setCode($newcode);
  3869.                 $deviexiste->setQttotal($newqtetotal);
  3870.                 $deviexiste->setBase($newbase);
  3871.                 $deviexiste->setTaux($newtaux);
  3872.                 $deviexiste->setTotal($newtotale);
  3873.                 $deviexiste->setMontant($newmontant);
  3874.                 $deviexiste->setTotalht($newtotalht);
  3875.                 $deviexiste->setTotalttc($newtotalttc);
  3876.                 $deviexiste->setVendeur($vendeurFullName);
  3877.                 $deviexiste->setOldtype($devi->getStatut());
  3878.                 $entityManager->flush();
  3879.                 $devisRepository->save($deviexiste, true);
  3880.             }
  3881. // Create new ImportDirect if needed
  3882.             if ($needsNewImportDirect && empty($importexiste)) {
  3883.                     $importdirect = new Importdirect();
  3884.                     $importdirect->setType('Non confirmée');
  3885.                     $importdirect->setDate(new DateTime());
  3886.                     $importdirect->setReference($devi->getReference());
  3887.                     $importdirect->setVendeur($devi->getVendeur());
  3888.                     $importdirect->setIdclient($devi->getClient()->getId());
  3889.                     $importdirect->setIduserold($devi->getUser()->getId());
  3890.                     $clientDetails = $form->get('client')->getData();
  3891.                     foreach ($product_info as $info) {
  3892.                         $product_id = $info['id'];
  3893.                         $idrub = $info['index'];
  3894.                         $produit = $produitRepository->find($product_id);
  3895.                         if ($produit) {
  3896.                             $type = $request->request->get('type_' . $idrub);
  3897.                             $designation = $request->request->get('designation_' . $idrub);
  3898.                             $quantity = $request->request->get('qte_' . $idrub);
  3899.                             $prix = $request->request->get('prix_' . $idrub);
  3900.                             $prixdt = $request->request->get('prixdt_' . $idrub);
  3901.                             $deviss = $request->request->get('devis_' . $idrub);
  3902.                             $pr = new Articleimportdirect();
  3903. //                                    dump($cosa,$produit);
  3904. //                                    if ($cosa == 'Direct'){
  3905.                             if ($request->request->get('cosa_' . $idrub) == 'Direct') {
  3906.                                 $pr->setArticle($type);
  3907.                                 $pr->setDevise($deviss);
  3908.                                 $pr->setDesignation($designation);
  3909.                                 $pr->setQte($quantity);
  3910.                                 $pr->setPrixachat($prix);
  3911.                                 $pr->setPrixvente($prixdt);
  3912.                                 $pr->setTotal($total);
  3913.                                 $pr->setImportdirect($importdirect);
  3914. //                                    dd($cosa,$produit,$pr);
  3915.                                 $articleimportdirectRepository->save($pr, true);
  3916.                             }
  3917.                             $devi->removeProduit($produit);
  3918.                         }
  3919.                     }
  3920.                     $importdirect->setClient($clientDetails);
  3921.                     $importdirect->setIdimportdirectold($devi->getId());
  3922.                     $entityManager->flush();
  3923.                     $importdirectRepository->save($importdirect, true);
  3924.                 }
  3925.             if ($importexiste) {
  3926. //                dd('honi ImportDirect existe',$needsNewImportDirect,$importexiste);
  3927.                 foreach ($product_info as $info) {
  3928.                     $product_id = $info['id'];
  3929.                     $idrub = $info['index'];
  3930.                     $produit = $produitRepository->find($product_id);
  3931.                     if ($produit) {
  3932.                         $type = $request->request->get('type_' . $idrub);
  3933.                         $designation = $request->request->get('designation_' . $idrub);
  3934.                         $quantity = $request->request->get('qte_' . $idrub);
  3935.                         $prix = $request->request->get('prix_' . $idrub);
  3936.                         $prixdt = $request->request->get('prixdt_' . $idrub);
  3937.                         $deviss = $request->request->get('devis_' . $idrub);
  3938.                         $pr = new Articleimportdirect();
  3939. //                                    if($cosa == 'Direct'){
  3940.                         if ($request->request->get('cosa_' . $idrub) == 'Direct') {
  3941.                             $pr->setArticle($type);
  3942.                             $pr->setDevise($deviss);
  3943.                             $pr->setDesignation($designation);
  3944.                             $pr->setQte($quantity);
  3945.                             $pr->setPrixachat($prix);
  3946.                             $pr->setPrixvente($prixdt);
  3947.                             $pr->setTotal($total);
  3948.                             $pr->setImportdirect($importexiste);
  3949.                             $articleimportdirectRepository->save($pr, true);
  3950.                         }
  3951.                         $devi->removeProduit($produit);
  3952.                     }
  3953.                 }
  3954.                 $clientDetails = $form->get('client')->getData();
  3955.                 $importexiste->setClient($clientDetails);
  3956.                 $importexiste->setIdimportdirectold($devi->getId());
  3957.                 $importexiste->setReference($devi->getReference());
  3958.                 $importexiste->setVendeur($devi->getVendeur());
  3959.                 $importexiste->setIdclient($devi->getClient()->getId());
  3960.                 $importexiste->setIduserold($devi->getUser()->getId());
  3961.                 $entityManager->flush();
  3962.                 $importdirectRepository->save($importexiste, true);
  3963.             }
  3964. //            dd($needsNewImportDirect, $importexiste,$needsNewDevis,$deviexiste);
  3965.             $entityManager->flush();
  3966.             $devi->setLu(false);
  3967.             $devi->setStatut('Demande devis');
  3968.             $devi->setCode(0);
  3969.             $devi->setQttotal(0);
  3970.             $devi->setBase($base);
  3971.             $devi->setTaux($taux);
  3972.             $devi->setTotal($total);
  3973.             $devi->setMontant($montant);
  3974.             $devi->setTotalht($totalht);
  3975.             $devi->setTotalttc($totalttc);
  3976.             $devi->setTotalttc($totalttc);
  3977.             $devi->setVendeur($vendeurFullName);
  3978.             if ($devi->getProduit()->isEmpty()) {
  3979.                 $entityManager->remove($devi);
  3980.                 $entityManager->flush();
  3981.                 return $this->redirectToRoute('app_devis_demande');
  3982.             }
  3983.             else {
  3984.                 $devi->setOldtype($devi->getStatut());
  3985.                 $devisRepository->save($devi, true);
  3986.                 return $this->redirectToRoute('app_devis_demande', [], Response::HTTP_SEE_OTHER);
  3987.             }
  3988.         }
  3989.         return $this->renderForm('devis/confirmationdemandedevis.html.twig', [
  3990.             'devi' => $devi,
  3991.             'form' => $form,
  3992.             'aiguilles' => $aiguilles,
  3993.             'platines' => $platines,
  3994.             'courroi' => $courroi,
  3995.             'familles' => $familles,
  3996.             'familleall' => $familleall,
  3997.             'tabfournisseurs' => $tabfournisseurs
  3998.         ]);
  3999.     }
  4000.     #[Route('/{id}/retour', name: 'app_devis_retoura', methods: ['GET', 'POST'])]
  4001.     public function retour(FournisseurRepository $fournisseurRepository, FamillesRepository $famillesRepository, FamillesdarticlesRepository $famillesdarticlesRepository, EntityManagerInterface $entityManager, ProduitRepository $produitRepository, CourroieRepository $courroieRepository, PlatinesRepository $platinesRepository, AiguillesRepository $aiguillesRepository, Request $request, Devis $devi, DevisRepository $devisRepository, PaymentdeviRepository $paymentdeviRepository): Response
  4002.     {
  4003.         $fournisseurs = $fournisseurRepository->findAll();
  4004.         $tabfournisseurs[] = [
  4005.             'nom' => "Cosa",
  4006.             'prenom' => "Tunisie",
  4007.             'numeroTelephone' => "",
  4008.         ];
  4009.         foreach ($fournisseurs as $fournisseur) {
  4010.             $tabfournisseurs[] = [
  4011.                 "Cosa Tunisie",
  4012.                 'nom' => $fournisseur->getNom(),
  4013.                 'prenom' => $fournisseur->getPrenom(),
  4014.                 'numeroTelephone' => $fournisseur->getTel(),
  4015.             ];
  4016.         }
  4017.         $vendeur = $devi->getVendeur();
  4018.         $vendeurs = $fournisseurRepository->find($vendeur);
  4019. //        dd($vendeur, $vendeurs);
  4020.         $familleall = $famillesRepository->findAll();
  4021.         $familles = $famillesdarticlesRepository->findAll();
  4022.         $courroi = $courroieRepository->findAll();
  4023.         $platines = $platinesRepository->findAll();
  4024.         $aiguilles = $aiguillesRepository->findAll();
  4025.         $nbr = $request->request->get('nbrc_a');
  4026.         $sourceDate = $devi->getDate() ? clone $devi->getDate() : null;
  4027.         $form = $this->createForm(DevisType::class, $devi);
  4028.         $form->handleRequest($request);
  4029.         $factures = $devisRepository->findBy(['statut' => ["Facture", "Facture-R", "Facture-A"]]);
  4030.         $maxNum = 0;
  4031.         foreach ($factures as $facture) {
  4032.             $num = (string) $facture->getNum();
  4033.             if (preg_match('/^F(\d+)$/', $num, $matches)) {
  4034.                 $val = (int) $matches[1];
  4035.                 if ($val > $maxNum) {
  4036.                     $maxNum = $val;
  4037.                 }
  4038.             }
  4039.         }
  4040.         $tt = "F" . ($maxNum + 1);
  4041.         $test = $devisRepository->findOneBy(['num' => $tt]);
  4042.         if ($form->isSubmitted() && $form->isValid()) {
  4043.             $res = $request->request->all('chk_child');
  4044.             $numrr = $request->request->get('numr');
  4045.             $dateRetour = $form->get('date')->getData() ?: new DateTime('now', new DateTimeZone('Africa/Tunis'));
  4046.             $devi->setDate($sourceDate);
  4047.             $devisr=new Devis();
  4048.             $devisr->setVendeur($devi->getVendeur());
  4049.             $devisr->setClient($devi->getClient());
  4050.             $devisr->setDate($dateRetour);
  4051.             $devisr->setFrtour($devi->getId());
  4052.             $devisr->setStatut("Facture-R");
  4053.             $devisr->setReference($devi->getNum());
  4054. //            $devi->setAcompte($acompte);
  4055. //            $devi->setNetapayer($netapayer);
  4056.             $devisRepository->save($devisr, true);
  4057.             $qtetotal=0;
  4058.             $base=0;
  4059.             $taux=0;
  4060.             $total=0;
  4061.             $montant=0;
  4062.             $totalht=0;
  4063.             $totalttc=0;
  4064.             $code =0;
  4065.             $rett=[];
  4066.             $hasSelectedRows = false;
  4067.             $isTotalReturn = true;
  4068.             $selectedRows = [];
  4069.             foreach ($res as $re)
  4070.             {
  4071.                 $parts = explode("-", $re);
  4072.                 if (isset($parts[1])) {
  4073.                     $selectedRows[] = (int) $parts[1];
  4074.                 }
  4075.                $prr= $produitRepository->findOneBy(['id'=>$parts[0]]);
  4076.                 $rett[]=$parts[0];
  4077.                 $quatsource= $request->request->get('qte_source_' . $parts[1]);
  4078.                 $quattttt= $request->request->get('qte_' . $parts[1]);
  4079.                 $qterestttt = $request->request->get('qterest_' . $parts[1]);
  4080.                 $montanhtttt= $request->request->get('montantht_' . $parts[1]);
  4081.                 $farticele =  $famillesdarticlesRepository->findOneBy(['reference' => $prr->getType()]);
  4082.                $prod = new Produit();
  4083.                 $prod->setDeviss($prr->getDeviss());
  4084.                 $prod->setCoursdejours($prr->getCoursdejours());
  4085.                 $prod->setPrixunitdt($prr->getPrixunitdt());
  4086.                 $prod->setType($prr->getType());
  4087.                 $prod->setQte($quatsource);
  4088.                 $prod->setQtef($quattttt);
  4089.                 $prod->setQterest($qterestttt);
  4090.                 $prod->setTva($prr->getTva());
  4091.                 $prod->setPrix($prr->getPrix());
  4092.                 $prod->setRemise($prr->getRemise());
  4093.                 $prod->setDesignation($prr->getDesignation());
  4094.                 $prod->setMontantht($montanhtttt);
  4095.                 $prod->setDevis($devisr);
  4096.                 $produitRepository->save($prod, true);
  4097.                 $code = $code + (($prr->getTva() * intval($montanhtttt))/100);
  4098.                 $qtetotal=$qtetotal+ intval($quattttt)  ;
  4099.                 $base=$base+ intval($montanhtttt);
  4100.                 $hasSelectedRows = true;
  4101.                 $qteSourceInt = (int) $quatsource;
  4102.                 $qteRetourInt = (int) $quattttt;
  4103.                 $qteRestInt = (int) $qterestttt;
  4104.                 if ($qteRetourInt < $qteSourceInt || $qteRestInt > 0) {
  4105.                     $isTotalReturn = false;
  4106.                 }
  4107.                 $qteRetour = (int) $quattttt;
  4108.                 $qteStockActuel = (int) ($farticele->getQunatity() ?? 0);
  4109.                 $qteTotalActuel = (int) ($farticele->getQtetotal() ?? 0);
  4110.                 $farticele->setQunatity((string) ($qteStockActuel + $qteRetour));
  4111.                 $farticele->setQtetotal((string) ($qteTotalActuel + $qteRetour));
  4112.                 $famillesdarticlesRepository->save($farticele,true);
  4113.             }
  4114.             for ($i = 1; $i <= (int) $nbr; $i++) {
  4115.                 $qteRest = (float) ($request->request->get('qterest_' . $i) ?? 0);
  4116.                 if ($qteRest > 0 || !in_array($i, $selectedRows, true)) {
  4117.                     $isTotalReturn = false;
  4118.                     break;
  4119.                 }
  4120.             }
  4121.             $timbre = ($hasSelectedRows && $isTotalReturn) ? 1 : 0;
  4122.             $totalttc =$base+$code+$timbre;
  4123.             $devisr->setFournisseur($vendeurs);
  4124.             $devisr->setCode($code);
  4125.             $devisr->setQttotal($qtetotal);
  4126.             $devisr->setnum($numrr);
  4127.             $devi->setReference($numrr);
  4128.             $devisr->setBase($base);
  4129.             $devisr->setTaux(null);
  4130.             $devisr->setRc($devi->getId());
  4131.             $devisr->setRetour($rett);
  4132.             $devisr->setTotal($base);
  4133.             $devisr->setMontant(null);
  4134.             $devisr->setTotalht($base);
  4135.             $devisr->setTotalttc($totalttc);
  4136.             $devisr->setTimbre($timbre);
  4137.             $devisRepository->save($devisr, true);
  4138.             $this->recalculerMontantNetFacture($devi, $devisRepository, $paymentdeviRepository);
  4139.             return $this->redirectToRoute('app_devis_liste_facture', [], Response::HTTP_SEE_OTHER);
  4140.         }
  4141.         return $this->renderForm('devis/retour.html.twig', [
  4142.             'devi' => $devi,
  4143.             'form' => $form,
  4144.             'aiguilles' => $aiguilles,
  4145.             'platines' => $platines,
  4146.             'courroi' => $courroi,
  4147.             'familles' => $familles,
  4148.             'familleall' => $familleall,
  4149.             'tabfournisseurs' => $tabfournisseurs,
  4150.              'tt' => $tt,
  4151.             'vendeurs'=>$vendeurs
  4152.         ]);
  4153.     }
  4154.     #[Route('/{id}/avoir', name: 'app_devis_avoir', methods: ['GET', 'POST'])]
  4155.     public function avoir(FournisseurRepository $fournisseurRepository, FamillesRepository $famillesRepository, FamillesdarticlesRepository $famillesdarticlesRepository, EntityManagerInterface $entityManager, ProduitRepository $produitRepository, CourroieRepository $courroieRepository, PlatinesRepository $platinesRepository, AiguillesRepository $aiguillesRepository, Request $request, Devis $devi, DevisRepository $devisRepository, PaymentdeviRepository $paymentdeviRepository): Response
  4156.     {
  4157.         $fournisseurs = $fournisseurRepository->findAll();
  4158.         $tabfournisseurs[] = [
  4159.             'nom' => "Cosa",
  4160.             'prenom' => "Tunisie",
  4161.             'numeroTelephone' => "",
  4162.         ];
  4163.         foreach ($fournisseurs as $fournisseur) {
  4164.             $tabfournisseurs[] = [
  4165.                 "Cosa Tunisie",
  4166.                 'nom' => $fournisseur->getNom(),
  4167.                 'prenom' => $fournisseur->getPrenom(),
  4168.                 'numeroTelephone' => $fournisseur->getTel(),
  4169.             ];
  4170.         }
  4171.         $vendeur = $devi->getVendeur();
  4172.         $vendeurs = $fournisseurRepository->find($vendeur);
  4173.         $familleall = $famillesRepository->findAll();
  4174.         $familles = $famillesdarticlesRepository->findAll();
  4175.         $courroi = $courroieRepository->findAll();
  4176.         $platines = $platinesRepository->findAll();
  4177.         $aiguilles = $aiguillesRepository->findAll();
  4178.         $nbr = $request->request->get('nbrc_a');
  4179.         $sourceDate = $devi->getDate() ? clone $devi->getDate() : null;
  4180.         $form = $this->createForm(DevisType::class, $devi);
  4181.         $form->handleRequest($request);
  4182.         $factures = $devisRepository->findBy(['statut' => ["Facture", "Facture-R", "Facture-A"]]);
  4183.         $maxNum = 0;
  4184.         foreach ($factures as $facture) {
  4185.             $num = (string) $facture->getNum();
  4186.             if (preg_match('/^F(\d+)$/', $num, $matches)) {
  4187.                 $val = (int) $matches[1];
  4188.                 if ($val > $maxNum) {
  4189.                     $maxNum = $val;
  4190.                 }
  4191.             }
  4192.         }
  4193.         $tt = "F" . ($maxNum + 1);
  4194.         $test = $devisRepository->findOneBy(['num' => $tt]);
  4195.         $code = $request->request->get('code');
  4196.         $base = $request->request->get('base');
  4197.         $taux = $request->request->get('taux');
  4198.         $total = $request->request->get('total');
  4199.         $montant = $request->request->get('montant');
  4200.         $totalht = $request->request->get('totalht');
  4201.         $totalttc = $request->request->get('totalttc');
  4202. //            $acompte=  $request->request->get('acompte');
  4203.         $qtetotal = $request->request->get('qttotal');
  4204.         $netapayer = $request->request->get('netapayer');
  4205.         if ($form->isSubmitted() && $form->isValid()) {
  4206.             $res = $request->request->all('chk_child');
  4207.             $numrr = $request->request->get('numr');
  4208.             $selectedRows = [];
  4209.             $hasSelectedRows = false;
  4210.             $isTotalReturn = true;
  4211.             foreach ($res as $selectedValue) {
  4212.                 $parts = explode('-', (string) $selectedValue);
  4213.                 if (isset($parts[1])) {
  4214.                     $selectedRows[] = (int) $parts[1];
  4215.                 }
  4216.             }
  4217.             $dateAvoir = $form->get('date')->getData() ?: new DateTime('now', new DateTimeZone('Africa/Tunis'));
  4218.             $devi->setDate($sourceDate);
  4219.             $devisr=new Devis();
  4220.             $devisr->setVendeur($devi->getVendeur());
  4221.             $devisr->setClient($devi->getClient());
  4222.             $devisr->setDate($dateAvoir);
  4223.             $devisr->setFrtour($devi->getId());
  4224.             $devisr->setStatut("Facture-A");
  4225.             $devisr->setReference($devi->getNum());
  4226.             $devisRepository->save($devisr, true);
  4227.             if ($nbr > 1) {
  4228.                 for ($i = 1; $i <= $nbr; $i++) {
  4229.                     $restePrixUaFloat = (float) ($request->request->get('resteprixua_' . $i) ?? 0);
  4230.                     if ($restePrixUaFloat > 0 || !in_array($i, $selectedRows, true)) {
  4231.                         $isTotalReturn = false;
  4232.                     }
  4233.                     if (!in_array($i, $selectedRows, true)) {
  4234.                         continue;
  4235.                     }
  4236.                     if ($request->request->get('type_' . $i)) {
  4237. //                        dd($request->request->get('type'.$i));
  4238.                         $pr = new Produit();
  4239.                         $type = $request->request->get('type_' . $i);
  4240.                         $quantity = $request->request->get('qte_' . $i);
  4241.                         $tva = $request->request->get('tva_' . $i);
  4242.                         $qte = $famillesdarticlesRepository->findOneBy(['reference' => $type]);
  4243.                         $qteold = $request->request->get('qteold_' . $i);
  4244.                         $prix = $request->request->get('prix_' . $i);
  4245.                         $montant = $request->request->get('montantht_' . $i);
  4246.                         $desinagtion = $request->request->get('designation_' . $i);
  4247.                         $remise = $request->request->get('remise_' . $i);
  4248.                         $deviss = $request->request->get('devis_' . $i);
  4249.                         $coursdejours = $request->request->get('coursdejours_' . $i);
  4250.                         $prixdt = $request->request->get('prixdt_' . $i);
  4251.                         $prixua = $request->request->get('prixua_' . $i);
  4252.                         $restePrixUa = $request->request->get('resteprixua_' . $i);
  4253.                         $pr->setDeviss($deviss);
  4254.                         $pr->setCoursdejours($coursdejours);
  4255.                         $pr->setPrixunitdt($prixua ?: $prixdt);
  4256.                         $pr->setQtestock($restePrixUa);
  4257.                         $pr->setType($type);
  4258.                         $pr->setQte($quantity);
  4259.                         $pr->setTva($tva);
  4260.                         $pr->setPrix($prix);
  4261.                         $pr->setRemise($remise);
  4262.                         $pr->setDesignation($desinagtion);
  4263.                         $pr->setMontantht($montant);
  4264.                         $pr->setDevis($devisr);
  4265.                         $produitRepository->save($pr, true);
  4266.                         $hasSelectedRows = true;
  4267.                         $qteInt = (int) $quantity;
  4268.                         $qteOldInt = (int) $qteold;
  4269.                         if ($qteInt < $qteOldInt || $restePrixUaFloat > 0) {
  4270.                             $isTotalReturn = false;
  4271.                         }
  4272.                     }
  4273.                 }
  4274.                 $entityManager->persist($devisr);
  4275.                 $entityManager->flush();
  4276.             }
  4277.             $devisr->setFournisseur($vendeurs);
  4278.             $devisr->setCode($code);
  4279.             $devisr->setQttotal($qtetotal);
  4280.             $devisr->setnum($numrr);
  4281.             $devi->setReference($numrr);
  4282.             $devisr->setBase($base);
  4283.             $devisr->setTaux(null);
  4284.             $devisr->setfav($devi->getId());
  4285.             $devisr->setRetour($res);
  4286.             $devisr->setTotal($base);
  4287.             $devisr->setMontant(null);
  4288.             $devisr->setTotalht($base);
  4289.             $timbre = ($hasSelectedRows && $isTotalReturn) ? 1 : 0;
  4290.             $totalttcValue = (float) $base + (float) $code + $timbre;
  4291.             $devisr->setTotalttc((string) $totalttcValue);
  4292.             $devisr->setTimbre((string) $timbre);
  4293.             $devisRepository->save($devisr, true);
  4294.             $this->recalculerMontantNetFacture($devi, $devisRepository, $paymentdeviRepository);
  4295.             return $this->redirectToRoute('app_devis_liste_facture', [], Response::HTTP_SEE_OTHER);
  4296.         }
  4297.         return $this->renderForm('devis/avoir.html.twig', [
  4298.             'devi' => $devi,
  4299.             'form' => $form,
  4300.             'aiguilles' => $aiguilles,
  4301.             'platines' => $platines,
  4302.             'courroi' => $courroi,
  4303.             'familles' => $familles,
  4304.             'familleall' => $familleall,
  4305.             'tabfournisseurs' => $tabfournisseurs,
  4306.             'tt' => $tt,
  4307.             'vendeurs'=>$vendeurs
  4308.         ]);
  4309.     }
  4310.      #[Route('/delete/{id}', name: 'app_devis_delete')]
  4311.      public function delete(EntityManagerInterface $entityManager,ArchivearticleRepository $archivearticleRepository,UserRepository $userRepository,EntityManagerInterface $em,Security $security,Request $request, Devis $devi,FamillesdarticlesRepository $famillesdarticlesRepository ,ProduitRepository $produitRepository, DevisRepository $devisRepository,PaymentdeviRepository $paymentdeviRepository, BlStockMovementFusionService $stockMovementFusionService): Response
  4312.         {
  4313.             if ($devi->getStatut() === 'Facture' && $devi->getOldtype() === 'FactureBLFusion') {
  4314.                 $originalBls = $stockMovementFusionService->findOriginalBls($devi);
  4315.                 $stockMovementFusionService->restoreCompleteFusion($originalBls, $devi);
  4316.                 foreach ($originalBls as $originalBl) {
  4317.                     $originalBl->setStatut('BL');
  4318.                     $originalBl->setIdfacture(null);
  4319.                     $entityManager->persist($originalBl);
  4320.                 }
  4321.                 foreach ($devi->getPaymentdevis() as $payment) {
  4322.                     $entityManager->remove($payment);
  4323.                 }
  4324.                 foreach ($produitRepository->findBy(['devis' => $devi]) as $invoiceProduct) {
  4325.                     $entityManager->remove($invoiceProduct);
  4326.                 }
  4327.                 $entityManager->remove($devi);
  4328.                 $entityManager->flush();
  4329.                 return $this->redirectToRoute('app_devis_liste_facture', [], Response::HTTP_SEE_OTHER);
  4330.             }
  4331.             if ($devi->getStatut() === 'Facture' && $devi->getFav()) {
  4332.                 $blfus = $devisRepository->find((int) $devi->getFav());
  4333.                 if ($blfus && $blfus->getStatut() === 'BLFUS') {
  4334.                     foreach ($devi->getProduit() as $factureProduit) {
  4335.                         foreach ($blfus->getProduit() as $blfusProduit) {
  4336.                             if (
  4337.                                 $blfusProduit->getType() === $factureProduit->getType()
  4338.                                 && $blfusProduit->getDesignation() === $factureProduit->getDesignation()
  4339.                             ) {
  4340.                                 $ancienneQteFacturee = (float) ($blfusProduit->getQtef() ?? 0);
  4341.                                 $qteFactureASupprimer = (float) ($factureProduit->getQte() ?? 0);
  4342.                                 $nouvelleQteFacturee = max(0, $ancienneQteFacturee - $qteFactureASupprimer);
  4343.                                 $qteOriginale = (float) ($blfusProduit->getQte() ?? 0);
  4344.                                 $blfusProduit->setQtef((string) $nouvelleQteFacturee);
  4345.                                 $blfusProduit->setQterest((string) ($qteOriginale - $nouvelleQteFacturee));
  4346.                                 $produitRepository->save($blfusProduit, true);
  4347.                                 break;
  4348.                             }
  4349.                         }
  4350.                     }
  4351.                     $idsFactures = $blfus->getIdsfacts() ? json_decode($blfus->getIdsfacts(), true) : [];
  4352.                     if (!is_array($idsFactures)) {
  4353.                         $idsFactures = [];
  4354.                     }
  4355.                     $idsFactures = array_values(array_filter($idsFactures, static fn ($id) => (int) $id !== $devi->getId()));
  4356.                     $blfus->setIdsfacts($idsFactures !== [] ? json_encode($idsFactures) : null);
  4357.                     if ($idsFactures !== []) {
  4358.                         $lastFactureId = (int) end($idsFactures);
  4359.                         $lastFacture = $devisRepository->find($lastFactureId);
  4360.                         $blfus->setIdfacture($lastFacture?->getNum());
  4361.                     } else {
  4362.                         $blfus->setIdfacture(null);
  4363.                     }
  4364.                     $devisRepository->save($blfus, true);
  4365.                     $toutRevientAZero = true;
  4366.                     foreach ($blfus->getProduit() as $blfusProduit) {
  4367.                         if ((float) ($blfusProduit->getQtef() ?? 0) > 0) {
  4368.                             $toutRevientAZero = false;
  4369.                             break;
  4370.                         }
  4371.                     }
  4372.                     if ($toutRevientAZero) {
  4373.                         $stockMovementFusionService->restorePartialFusion($blfus);
  4374.                         $entityManager->flush();
  4375.                         $idsBlOrigine = $blfus->getIddevisold() ? json_decode($blfus->getIddevisold(), true) : [];
  4376.                         if (!is_array($idsBlOrigine) || $idsBlOrigine === []) {
  4377.                             $idsBlOrigine = array_map(
  4378.                                 static fn (Devis $originalBl): int => $originalBl->getId(),
  4379.                                 $stockMovementFusionService->findOriginalBls($blfus)
  4380.                             );
  4381.                         }
  4382.                         if (is_array($idsBlOrigine)) {
  4383.                             foreach ($idsBlOrigine as $idBlOrigine) {
  4384.                                 $blOriginal = $devisRepository->find((int) $idBlOrigine);
  4385.                                 if ($blOriginal) {
  4386.                                     $blOriginal->setStatut('BL');
  4387.                                     $blOriginal->setIdfacture(null);
  4388.                                     $devisRepository->save($blOriginal, true);
  4389.                                 }
  4390.                             }
  4391.                         }
  4392.                         $devisRepository->remove($blfus, true);
  4393.                     } else {
  4394.                         $stockMovementFusionService->synchronizePartialFusion($blfus);
  4395.                     }
  4396.                 }
  4397.                 foreach ($devi->getPaymentdevis() as $payment) {
  4398.                     $paymentdeviRepository->remove($payment, true);
  4399.                 }
  4400.                 foreach ($devi->getProduit() as $produitFacture) {
  4401.                     $produitRepository->remove($produitFacture, true);
  4402.                 }
  4403.                 $archiveArticles = $archivearticleRepository->findBy(['fichevente' => $devi]);
  4404.                 foreach ($archiveArticles as $archiveArticle) {
  4405.                     $entityManager->remove($archiveArticle);
  4406.                 }
  4407.                 $devisRepository->remove($devi, true);
  4408.                 return $this->redirectToRoute('app_devis_liste_facture', [], Response::HTTP_SEE_OTHER);
  4409.             }
  4410.             // Vérification de l'existence du champ iddevisold et de son contenu pour sup facture et retourner les bl a leur liste et supprimer de l'archive bl
  4411.             // Vérifier si le champ iddevisold n'est pas null et est une chaîne JSON
  4412.             if ($devi->getIddevisold() != null) {
  4413.                 // Décoder la chaîne JSON pour obtenir les IDs des devis associés
  4414.                 $idsDevisOld = json_decode($devi->getIddevisold(), true);
  4415.                 if (is_array($idsDevisOld)) {
  4416.                     // Récupérer les devis associés par leurs IDs
  4417.                     foreach ($idsDevisOld as $idDevis) {
  4418.                         $associatedDevi = $devisRepository->findOneBy(['id' => $idDevis]);
  4419.                         // Vérifier si le devis associé existe et changer son statut en "BL"
  4420.                         if ($associatedDevi) {
  4421.                             $associatedDevi->setStatut("BL");
  4422.                             $associatedDevi->setIdfacture($devi->getId());  // Associer la facture
  4423.                             $devisRepository->save($associatedDevi, true); // Sauvegarder la modification
  4424.                         }
  4425.                     }
  4426.                 }
  4427.             }
  4428.             // Vérification et transfert des produits si un devis existant est trouvé
  4429.             if ($devi->getStatut() == 'Devis' && $devi->getOldtype() == 'Demande devis' && $devi->getIddevisold() != null) {
  4430.                 $deviexiste = $devisRepository->findOneBy(['id' => $devi->getIddevisold(), 'statut' => 'Demande devis']);
  4431. //                dd('devis existe',$deviexiste, $devi->getProduit());
  4432.                 if (!$deviexiste) {
  4433.                     $deviexiste = $devisRepository->findOneBy(['iddevisold' => $devi->getIddevisold(), 'statut' => 'Demande devis']);
  4434.                 }
  4435.                 if ($deviexiste) {
  4436.                     $produitsToTransfer = $devi->getProduit();
  4437. //                    dd('honi chfama',$produitsToTransfer);
  4438.                     foreach ($produitsToTransfer as $produit) {
  4439.                         if ($produit !== null) {
  4440.                             $produitExistant = new Produit();
  4441.                             $produitExistant->setPrix($produit->getPrix());
  4442.                             $produitExistant->setTva($produit->getTva());
  4443.                             $produitExistant->setType($produit->getType());
  4444.                             $produitExistant->setCode($produit->getCode());
  4445.                             $produitExistant->setDesignation($produit->getDesignation());
  4446.                             $produitExistant->setMontantht($produit->getMontantht());
  4447.                             $produitExistant->setQte($produit->getQte());
  4448.                             $produitExistant->setPrixunitdt($produit->getPrixunitdt());
  4449.                             $produitExistant->setCoursdejours($produit->getCoursdejours());
  4450.                             $produitExistant->setRemise($produit->getRemise());
  4451.                             $produitExistant->setQtestock($produit->getQtestock());
  4452.                             $produitExistant->setDeviss($produit->getDeviss());
  4453.                             $produitExistant->setDemande('Locale');
  4454.                             $produitExistant->setDevis($deviexiste);
  4455.                             $deviexiste->addProduit($produitExistant);
  4456.                             // Utilisez EntityManager pour persister les nouvelles entités
  4457.                             $em->persist($produitExistant);
  4458.                             $em->flush();
  4459. //                            dump($produitExistant,$deviexiste, $produit);
  4460.                         }
  4461.                     }
  4462. //                    dd($produitsToTransfer,$deviexiste);
  4463.                     // Flush une seule fois après toutes les insertions
  4464.                     $em->flush();
  4465.                     // Sauvegarde finale du devis existant après toutes les modifications
  4466.                     $em->persist($deviexiste);
  4467.                     $em->flush();
  4468.                 }
  4469.                 else{
  4470.                     $newdevis = new Devis();
  4471.                     $newdevis->setIddevisold($devi->getIddevisold());
  4472.                     $newdevis->setClient($devi->getClient());
  4473.                     $newdevis->setVendeur($devi->getVendeur());
  4474.                     //numéro de devis
  4475.                     $newdevis->setDate(new DateTime('now', new DateTimeZone('Africa/Tunis')));
  4476.                     $newdevis->setReference($devi->getReference());
  4477.                     $newdevis->setBase($devi->getBase());
  4478.                     $newdevis->setTotal($devi->getTotal());
  4479.                     $newdevis->setTotalht($devi->getTotalht());
  4480.                     $newdevis->setCode($devi->getCode());
  4481.                     $newdevis->setQttotal($devi->getQttotal());
  4482.                     $newdevis->setTimbre($devi->getTimbre());
  4483.                     $newdevis->setTotalttc($devi->getTotalttc());
  4484.                     $newdevis->setStatut('Demande devis');
  4485. //                    $newdevis->setUser('Demande devis');
  4486. //                    dd($devi->getIduerold(),$userRepository->find(['id'=>$devi->getIduerold()]));
  4487.                     $userold = $userRepository->findOneBy(['id'=>$devi->getIduerold()]);
  4488.                     if (!$userold){
  4489.                         $userold = $userRepository->findOneBy(['id'=>$devi->getUser()]);
  4490.                     }
  4491.                     $newdevis->setUser($userold);
  4492.                     //Partie géner num pour devis
  4493.                     $status = 'Demande devis';
  4494.                     // Recherchez la FamilleArticle en fonction de la référence
  4495.                     $totstatu = $devisRepository->findBy(['statut' => $status]);
  4496.                     $count = count($totstatu);
  4497.                     if ($count == 0) {
  4498.                         $count = 1;
  4499.                     }
  4500.                     else {
  4501.                         $count = $count + 1;
  4502.                     }
  4503.                     // Génération du numéro de base
  4504.                     if ($status == "Demande devis") {
  4505.                         $tt = "Dd" . $count;
  4506.                     }
  4507.                     // Vérification de l'existence du numéro et génération d'un nouveau si nécessaire
  4508.                     while ($devisRepository->findOneBy(['num' => $tt])) {
  4509.                         $count++;
  4510.                         $tt = "Dd" . $count;
  4511.                     }
  4512.                     $newdevis->setNum($tt);
  4513.                     $produitsToTransfer = $devi->getProduit();
  4514.                     foreach ($produitsToTransfer as $produit) {
  4515.                         if ($produit !== null) {
  4516.                             $produitExistant = new Produit();
  4517.                             $produitExistant->setPrix($produit->getPrix());
  4518.                             $produitExistant->setTva($produit->getTva());
  4519.                             $produitExistant->setType($produit->getType());
  4520.                             $produitExistant->setCode($produit->getCode());
  4521.                             $produitExistant->setDesignation($produit->getDesignation());
  4522.                             $produitExistant->setMontantht($produit->getMontantht());
  4523.                             $produitExistant->setQte($produit->getQte());
  4524.                             $produitExistant->setPrixunitdt($produit->getPrixunitdt());
  4525.                             $produitExistant->setCoursdejours($produit->getCoursdejours());
  4526.                             $produitExistant->setRemise($produit->getRemise());
  4527.                             $produitExistant->setQtestock($produit->getQtestock());
  4528.                             $produitExistant->setDeviss($produit->getDeviss());
  4529.                             $produitExistant->setDemande('Locale');
  4530.                             // Répétez pour chaque propriété...
  4531.                             $produitExistant->setDevis($newdevis);
  4532.                             $newdevis->addProduit($produitExistant);
  4533.                             // Utilisez EntityManager pour persister les nouvelles entités
  4534.                             $em->persist($produitExistant);
  4535.                             $em->flush();
  4536.                         }
  4537.                     }
  4538.                     // Flush une seule fois après toutes les insertions
  4539.                     $em->flush();
  4540.                     // Sauvegarde finale du devis existant après toutes les modifications
  4541.                     $em->persist($newdevis);
  4542.                     $em->flush();
  4543.                 }
  4544.             }
  4545.             $test = $devisRepository->findBy(['idfacture'=>$devi->getId()]);
  4546.             $test2 = $devisRepository->findBy(['fav'=>$devi->getId(),'frtour'=>$devi->getId()]);
  4547.             if ($test)
  4548.             {
  4549.                 foreach ($test as $blss) {
  4550.                     $a = $devisRepository->findOneBy(['id' => $blss]);
  4551.                     $a->setStatut("BL");
  4552.                     $a->setIdfacture($devi->getId());
  4553.                     $devisRepository->save($a, true);
  4554.                 }
  4555.                 $pay= $devi->getPaymentdevis();
  4556.                 foreach ($pay as $blss) {
  4557.                     $paymentdeviRepository->remove($blss, true);
  4558.                 }
  4559.             }
  4560.              elseif ($test2)
  4561.             {
  4562.                 foreach ($test2 as $pro2) {
  4563.                     $pro3= $pro2->getProduit();
  4564.                     foreach ($pro3 as $pro) {
  4565.                         $produitRepository->remove($pro, true);
  4566.                     }
  4567.                     $devisRepository->remove($pro2,true);
  4568.                 }
  4569.             }
  4570.             else {
  4571.                 $statut = $devi->getStatut();
  4572.                 // On fait le retour de Qte seulement pour ces statuts :
  4573.                 // - Demande devis (statut actuel)
  4574.                 // - oldtype = Demande devis
  4575.                 // - BL
  4576.                 // - Facture
  4577.                 // - BLP
  4578.                 if (
  4579. //                    $statut === 'Demande devis'
  4580. //                    || $devi->getOldtype() === 'Demande devis'
  4581.                      $statut === 'BL'
  4582.                     || $statut === 'Facture'
  4583.                     || $statut === 'BLP'
  4584.                 ) {
  4585.                     $produit = $devi->getProduit();
  4586.                     foreach ($produit as $pro) {
  4587.                         $famille = $famillesdarticlesRepository->findOneBy(['reference' => $pro->getType()]);
  4588.                         if ($famille) {
  4589.                             $qteRetour = (float) ($pro->getQte() ?? 0);
  4590.                             $currentQunatity = (float) ($famille->getQunatity() ?? 0);
  4591.                             $famille->setQunatity((string) ($currentQunatity + $qteRetour));
  4592.                             $qtetotalActuel = $famille->getQtetotal();
  4593.                             $newqtetotal = $qtetotalActuel !== null ? (float) $qtetotalActuel : 0;
  4594.                             $newqtetotal = $newqtetotal + $qteRetour;
  4595.                             $famille->setQtetotal((string) $newqtetotal);
  4596.                             $famillesdarticlesRepository->save($famille, true);
  4597.                         }
  4598.                         $produitRepository->remove($pro, true);
  4599.                     }
  4600.                 }
  4601.                 else {
  4602.                     // Si tu veux, pour les autres statuts on supprime seulement les produits sans toucher au stock
  4603.                     $produit = $devi->getProduit();
  4604.                     foreach ($produit as $pro) {
  4605.                         $produitRepository->remove($pro, true);
  4606.                     }
  4607.                 }
  4608.             }
  4609. //            else{
  4610. //                $produit= $devi->getProduit();
  4611. //
  4612. //             foreach ($produit as $pro) {
  4613. //
  4614. //            $famille= $famillesdarticlesRepository->findOneBy(['reference'=>$pro->getType()]);
  4615. //            $famille->setQunatity($famille->getQunatity() + intval($pro->getQte()) );
  4616. //            $famillesdarticlesRepository->save($famille,true);
  4617. //
  4618. //            $produitRepository->remove($pro, true);
  4619. //        }
  4620. //              }
  4621.             //code jdid
  4622.             $archiveArticles = $archivearticleRepository->findBy(['fichevente' => $devi]);
  4623.             foreach ($archiveArticles as $a) {
  4624.                 $entityManager->remove($a);
  4625.             }
  4626.             $devisRepository->remove($devi, true);
  4627.             if ($security->isGranted('ROLE_TECHNICIEN')) {
  4628.                 return $this->redirectToRoute('liste_Demande_Devis', [], Response::HTTP_SEE_OTHER);
  4629.             }
  4630.             else{
  4631.                 // Redirection en fonction du statut
  4632.                 switch ($devi->getStatut()) {
  4633.                     case 'Facture':
  4634.                         return $this->redirectToRoute('app_devis_liste_facture', [], Response::HTTP_SEE_OTHER);
  4635.                     case 'Devis':
  4636.                         return $this->redirectToRoute('app_devis_liste_devis', [], Response::HTTP_SEE_OTHER);
  4637.                     case 'Demande devis':
  4638.                         return $this->redirectToRoute('app_devis_iste_demande_devis', [], Response::HTTP_SEE_OTHER);
  4639.                     case 'BLP':
  4640.                         return $this->redirectToRoute('app_devis_particulier_index', [], Response::HTTP_SEE_OTHER);
  4641.                     case 'BL':
  4642.                         return $this->redirectToRoute('app_devis_liste_bl', [], Response::HTTP_SEE_OTHER);
  4643.                     case 'Commande':
  4644.                         return $this->redirectToRoute('app_devis_liste_commandes', [], Response::HTTP_SEE_OTHER);
  4645.                     default:
  4646.                         // Fallback si le statut est inconnu
  4647.                         return $this->redirectToRoute('app_devis_index', [], Response::HTTP_SEE_OTHER);
  4648.                 }
  4649. //                return $this->redirectToRoute('app_devis_index', [], Response::HTTP_SEE_OTHER);
  4650.             }
  4651.         }
  4652.     #[Route('/delete/retour/{id}', name: 'app_devis_dretour')]
  4653.     public function deleteretour(Request $request, Devis $devi,ProduitRepository $produitRepository,FamillesdarticlesRepository $famillesdarticlesRepository, DevisRepository $devisRepository,PaymentdeviRepository $paymentdeviRepository): Response
  4654.     {
  4655.         $factureOriginale = $devi->getFrtour()
  4656.             ? $devisRepository->find((int) $devi->getFrtour())
  4657.             : null;
  4658.         $produit= $devi->getProduit();
  4659.         if ( $devi->getStatut() == "Facture-R")
  4660. {
  4661.     foreach ($produit as $pro) {
  4662.         $famille= $famillesdarticlesRepository->findOneBy(['reference'=>$pro->getType()]);
  4663.         $famille->setQunatity($famille->getQunatity() - intval($pro->getQtef()) );
  4664.         $famille->setQtetotal($famille->getQtetotal() - intval($pro->getQtef()) );
  4665.         $famillesdarticlesRepository->save($famille,true);
  4666.         $produitRepository->remove($pro, true);
  4667.     }
  4668. }
  4669.         else
  4670. {
  4671.     foreach ($produit as $pro) {
  4672.         $produitRepository->remove($pro, true);
  4673.     }
  4674. }
  4675.         $devisRepository->remove($devi, true);
  4676.         if ($factureOriginale) {
  4677.             $this->recalculerMontantNetFacture($factureOriginale, $devisRepository, $paymentdeviRepository);
  4678.         }
  4679.         // Redirection en fonction du statut
  4680.         switch ($devi->getStatut()) {
  4681.             case 'Facture':
  4682.                 return $this->redirectToRoute('app_devis_liste_facture', [], Response::HTTP_SEE_OTHER);
  4683.             case 'Devis':
  4684.                 return $this->redirectToRoute('app_devis_liste_devis', [], Response::HTTP_SEE_OTHER);
  4685.             case 'Demande devis':
  4686.                 return $this->redirectToRoute('app_devis_iste_demande_devis', [], Response::HTTP_SEE_OTHER);
  4687.             case 'BLP':
  4688.                 return $this->redirectToRoute('app_devis_particulier_index', [], Response::HTTP_SEE_OTHER);
  4689.             case 'BL':
  4690.                 return $this->redirectToRoute('app_devis_liste_bl', [], Response::HTTP_SEE_OTHER);
  4691.             case 'Commande':
  4692.                 return $this->redirectToRoute('app_devis_liste_commandes', [], Response::HTTP_SEE_OTHER);
  4693.             case 'Facture-R':
  4694.                 return $this->redirectToRoute('app_devis_liste_facture', [], Response::HTTP_SEE_OTHER);
  4695.             case 'Facture-A':
  4696.                 return $this->redirectToRoute('app_devis_liste_facture', [], Response::HTTP_SEE_OTHER);
  4697.             default:
  4698.                 // Fallback si le statut est inconnu
  4699.                 return $this->redirectToRoute('app_devis_index', [], Response::HTTP_SEE_OTHER);
  4700.         }
  4701. //        return $this->redirectToRoute('app_devis_index', [], Response::HTTP_SEE_OTHER);
  4702.     }
  4703.     #[Route('/delete/avoir/{id}', name: 'app_devis_davoir')]
  4704.     public function deleteavoir(Request $request, Devis $devi,ProduitRepository $produitRepository, DevisRepository $devisRepository,PaymentdeviRepository $paymentdeviRepository): Response
  4705.     {
  4706.         $factureOriginale = $devi->getFav()
  4707.             ? $devisRepository->find((int) $devi->getFav())
  4708.             : null;
  4709.         $produit= $devi->getProduit();
  4710.         foreach ($produit as $pro) {
  4711.             $produitRepository->remove($pro, true);
  4712.         }
  4713.         $devisRepository->remove($devi, true);
  4714.         if ($factureOriginale) {
  4715.             $this->recalculerMontantNetFacture($factureOriginale, $devisRepository, $paymentdeviRepository);
  4716.         }
  4717.         // Redirection en fonction du statut
  4718.         switch ($devi->getStatut()) {
  4719.             case 'Facture':
  4720.                 return $this->redirectToRoute('app_devis_liste_facture', [], Response::HTTP_SEE_OTHER);
  4721.             case 'Devis':
  4722.                 return $this->redirectToRoute('app_devis_liste_devis', [], Response::HTTP_SEE_OTHER);
  4723.             case 'Demande devis':
  4724.                 return $this->redirectToRoute('app_devis_iste_demande_devis', [], Response::HTTP_SEE_OTHER);
  4725.             case 'BLP':
  4726.                 return $this->redirectToRoute('app_devis_particulier_index', [], Response::HTTP_SEE_OTHER);
  4727.             case 'BL':
  4728.                 return $this->redirectToRoute('app_devis_liste_bl', [], Response::HTTP_SEE_OTHER);
  4729.             case 'Commande':
  4730.                 return $this->redirectToRoute('app_devis_liste_commandes', [], Response::HTTP_SEE_OTHER);
  4731.             default:
  4732.                 // Fallback si le statut est inconnu
  4733.                 return $this->redirectToRoute('app_devis_index', [], Response::HTTP_SEE_OTHER);
  4734.         }
  4735. //        return $this->redirectToRoute('app_devis_index', [], Response::HTTP_SEE_OTHER);
  4736.     }
  4737.     #[Route('/delete_devis_intervention/{id}', name: 'delete_devis_intervention')]
  4738.     public function deletedevisintervention(DevisRepository $devisRepository, EntityManagerInterface $entityManager, InterventionRepository $interventionRepository, Request $request, Devis $devi): Response {
  4739.         // 1. Récupérer la liste des IDs d'interventions liés au devis
  4740.         $idsIntervention = $devi->getIdintervold();
  4741.         // 2. Convertir la chaîne d'IDs en tableau d'entiers
  4742.         $idsIntervention = array_map('intval', explode(',', trim($idsIntervention, '[]')));
  4743.         // 3. Si des IDs d'interventions existent
  4744.         if ($idsIntervention) {
  4745.             // 4. Récupérer toutes les interventions correspondantes
  4746.             $interventions = $interventionRepository->findBy(['id' => $idsIntervention]);
  4747.             // 5. Mettre leur statut à NULL (ou à "archivé" si vous préférez)
  4748.             foreach ($interventions as $intervention) {
  4749.                 $intervention->setStatut(null); // Ou utilisez une autre valeur comme 'archivé'
  4750.                 $entityManager->persist($intervention);
  4751.             }
  4752.         }
  4753.         // 6. Dissocier les interventions du devis (si besoin)
  4754.         foreach ($devi->getIntervention() as $intervention) {
  4755.             $intervention->setDevis(null); // Dissocier l'intervention du devis
  4756.             $entityManager->persist($intervention);
  4757.         }
  4758.         // 7. Supprimer le devis
  4759.         $entityManager->remove($devi);
  4760.         $entityManager->flush(); // Appliquer les changements dans la base de données
  4761.         // 8. Rediriger vers la liste des factures (ou autre page)
  4762.         return $this->redirectToRoute('app_devis_liste_facture', [], Response::HTTP_SEE_OTHER);
  4763.     }
  4764. //    #[Route('/delete/{id}', name: 'app_devis_delete')]
  4765. //    public function delete(EntityManagerInterface $entityManager,ArchivearticleRepository $archivearticleRepository,UserRepository $userRepository,EntityManagerInterface $em,Security $security,Request $request, Devis $devi,FamillesdarticlesRepository $famillesdarticlesRepository ,ProduitRepository $produitRepository, DevisRepository $devisRepository,PaymentdeviRepository $paymentdeviRepository): Response
  4766. //    {
  4767. //        if ($devi->getStatut() === 'Facture' && $devi->getFav()) {
  4768. //            $blfus = $devisRepository->find((int) $devi->getFav());
  4769. //
  4770. //            if ($blfus && $blfus->getStatut() === 'BLFUS') {
  4771. //                foreach ($devi->getProduit() as $factureProduit) {
  4772. //                    foreach ($blfus->getProduit() as $blfusProduit) {
  4773. //                        if (
  4774. //                            $blfusProduit->getType() === $factureProduit->getType()
  4775. //                            && $blfusProduit->getDesignation() === $factureProduit->getDesignation()
  4776. //                        ) {
  4777. //                            $ancienneQteFacturee = (float) ($blfusProduit->getQtef() ?? 0);
  4778. //                            $qteFactureASupprimer = (float) ($factureProduit->getQte() ?? 0);
  4779. //                            $nouvelleQteFacturee = max(0, $ancienneQteFacturee - $qteFactureASupprimer);
  4780. //                            $qteOriginale = (float) ($blfusProduit->getQte() ?? 0);
  4781. //
  4782. //                            $blfusProduit->setQtef((string) $nouvelleQteFacturee);
  4783. //                            $blfusProduit->setQterest((string) ($qteOriginale - $nouvelleQteFacturee));
  4784. //                            $produitRepository->save($blfusProduit, true);
  4785. //                            break;
  4786. //                        }
  4787. //                    }
  4788. //                }
  4789. //
  4790. //                $idsFactures = $blfus->getIdsfacts() ? json_decode($blfus->getIdsfacts(), true) : [];
  4791. //                if (!is_array($idsFactures)) {
  4792. //                    $idsFactures = [];
  4793. //                }
  4794. //
  4795. //                $idsFactures = array_values(array_filter($idsFactures, static fn ($id) => (int) $id !== $devi->getId()));
  4796. //                $blfus->setIdsfacts($idsFactures !== [] ? json_encode($idsFactures) : null);
  4797. //
  4798. //                if ($idsFactures !== []) {
  4799. //                    $lastFactureId = (int) end($idsFactures);
  4800. //                    $lastFacture = $devisRepository->find($lastFactureId);
  4801. //                    $blfus->setIdfacture($lastFacture?->getNum());
  4802. //                } else {
  4803. //                    $blfus->setIdfacture(null);
  4804. //                }
  4805. //
  4806. //                $devisRepository->save($blfus, true);
  4807. //
  4808. //                $toutRevientAZero = true;
  4809. //                foreach ($blfus->getProduit() as $blfusProduit) {
  4810. //                    if ((float) ($blfusProduit->getQtef() ?? 0) > 0) {
  4811. //                        $toutRevientAZero = false;
  4812. //                        break;
  4813. //                    }
  4814. //                }
  4815. //
  4816. //                if ($toutRevientAZero) {
  4817. //                    $idsBlOrigine = $blfus->getIddevisold() ? json_decode($blfus->getIddevisold(), true) : [];
  4818. //                    if (is_array($idsBlOrigine)) {
  4819. //                        foreach ($idsBlOrigine as $idBlOrigine) {
  4820. //                            $blOriginal = $devisRepository->find((int) $idBlOrigine);
  4821. //                            if ($blOriginal) {
  4822. //                                $blOriginal->setStatut('BL');
  4823. //                                $blOriginal->setIdfacture(null);
  4824. //                                $devisRepository->save($blOriginal, true);
  4825. //                            }
  4826. //                        }
  4827. //                    }
  4828. //
  4829. //                    $devisRepository->remove($blfus, true);
  4830. //                }
  4831. //            }
  4832. //
  4833. //            foreach ($devi->getPaymentdevis() as $payment) {
  4834. //                $paymentdeviRepository->remove($payment, true);
  4835. //            }
  4836. //
  4837. //            foreach ($devi->getProduit() as $produitFacture) {
  4838. //                $produitRepository->remove($produitFacture, true);
  4839. //            }
  4840. //
  4841. //            $archiveArticles = $archivearticleRepository->findBy(['fichevente' => $devi]);
  4842. //            foreach ($archiveArticles as $archiveArticle) {
  4843. //                $entityManager->remove($archiveArticle);
  4844. //            }
  4845. //
  4846. //            $devisRepository->remove($devi, true);
  4847. //
  4848. //            return $this->redirectToRoute('app_devis_liste_facture', [], Response::HTTP_SEE_OTHER);
  4849. //        }
  4850. //
  4851. //
  4852. //        // Vérification de l'existence du champ iddevisold et de son contenu pour sup facture et retourner les bl a leur liste et supprimer de l'archive bl
  4853. //
  4854. //        // Vérifier si le champ iddevisold n'est pas null et est une chaîne JSON
  4855. //        if ($devi->getIddevisold() != null) {
  4856. //            // Décoder la chaîne JSON pour obtenir les IDs des devis associés
  4857. //            $idsDevisOld = json_decode($devi->getIddevisold(), true);
  4858. //
  4859. //            if (is_array($idsDevisOld)) {
  4860. //                // Récupérer les devis associés par leurs IDs
  4861. //                foreach ($idsDevisOld as $idDevis) {
  4862. //                    $associatedDevi = $devisRepository->findOneBy(['id' => $idDevis]);
  4863. //
  4864. //                    // Vérifier si le devis associé existe et changer son statut en "BL"
  4865. //                    if ($associatedDevi) {
  4866. //                        $associatedDevi->setStatut("BL");
  4867. //                        $associatedDevi->setIdfacture($devi->getId());  // Associer la facture
  4868. //                        $devisRepository->save($associatedDevi, true); // Sauvegarder la modification
  4869. //                    }
  4870. //                }
  4871. //            }
  4872. //        }
  4873. //        // Vérification et transfert des produits si un devis existant est trouvé
  4874. //        if ($devi->getStatut() == 'Devis' && $devi->getOldtype() == 'Demande devis' && $devi->getIddevisold() != null) {
  4875. //            $deviexiste = $devisRepository->findOneBy(['id' => $devi->getIddevisold(), 'statut' => 'Demande devis']);
  4876. ////                dd('devis existe',$deviexiste, $devi->getProduit());
  4877. //            if (!$deviexiste) {
  4878. //                $deviexiste = $devisRepository->findOneBy(['iddevisold' => $devi->getIddevisold(), 'statut' => 'Demande devis']);
  4879. //            }
  4880. //
  4881. //            if ($deviexiste) {
  4882. //                $produitsToTransfer = $devi->getProduit();
  4883. //
  4884. ////                    dd('honi chfama',$produitsToTransfer);
  4885. //                foreach ($produitsToTransfer as $produit) {
  4886. //                    if ($produit !== null) {
  4887. //                        $produitExistant = new Produit();
  4888. //
  4889. //                        $produitExistant->setPrix($produit->getPrix());
  4890. //                        $produitExistant->setTva($produit->getTva());
  4891. //                        $produitExistant->setType($produit->getType());
  4892. //                        $produitExistant->setCode($produit->getCode());
  4893. //                        $produitExistant->setDesignation($produit->getDesignation());
  4894. //                        $produitExistant->setMontantht($produit->getMontantht());
  4895. //                        $produitExistant->setQte($produit->getQte());
  4896. //                        $produitExistant->setPrixunitdt($produit->getPrixunitdt());
  4897. //                        $produitExistant->setCoursdejours($produit->getCoursdejours());
  4898. //                        $produitExistant->setRemise($produit->getRemise());
  4899. //                        $produitExistant->setQtestock($produit->getQtestock());
  4900. //                        $produitExistant->setDeviss($produit->getDeviss());
  4901. //                        $produitExistant->setDemande('Locale');
  4902. //                        $produitExistant->setDevis($deviexiste);
  4903. //                        $deviexiste->addProduit($produitExistant);
  4904. //
  4905. //                        // Utilisez EntityManager pour persister les nouvelles entités
  4906. //                        $em->persist($produitExistant);
  4907. //                        $em->flush();
  4908. ////                            dump($produitExistant,$deviexiste, $produit);
  4909. //                    }
  4910. //                }
  4911. ////                    dd($produitsToTransfer,$deviexiste);
  4912. //                // Flush une seule fois après toutes les insertions
  4913. //                $em->flush();
  4914. //
  4915. //                // Sauvegarde finale du devis existant après toutes les modifications
  4916. //                $em->persist($deviexiste);
  4917. //                $em->flush();
  4918. //            }
  4919. //            else{
  4920. //                $newdevis = new Devis();
  4921. //
  4922. //                $newdevis->setIddevisold($devi->getIddevisold());
  4923. //                $newdevis->setClient($devi->getClient());
  4924. //                $newdevis->setVendeur($devi->getVendeur());
  4925. //                //numéro de devis
  4926. //                $newdevis->setDate(new DateTime('now', new DateTimeZone('Africa/Tunis')));
  4927. //                $newdevis->setReference($devi->getReference());
  4928. //                $newdevis->setBase($devi->getBase());
  4929. //                $newdevis->setTotal($devi->getTotal());
  4930. //                $newdevis->setTotalht($devi->getTotalht());
  4931. //                $newdevis->setCode($devi->getCode());
  4932. //                $newdevis->setQttotal($devi->getQttotal());
  4933. //                $newdevis->setTimbre($devi->getTimbre());
  4934. //                $newdevis->setTotalttc($devi->getTotalttc());
  4935. //                $newdevis->setStatut('Demande devis');
  4936. ////                    $newdevis->setUser('Demande devis');
  4937. ////                    dd($devi->getIduerold(),$userRepository->find(['id'=>$devi->getIduerold()]));
  4938. //                $userold = $userRepository->findOneBy(['id'=>$devi->getIduerold()]);
  4939. //                if (!$userold){
  4940. //                    $userold = $userRepository->findOneBy(['id'=>$devi->getUser()]);
  4941. //
  4942. //                }
  4943. //                $newdevis->setUser($userold);
  4944. //
  4945. //                //Partie géner num pour devis
  4946. //                $status = 'Demande devis';
  4947. //                // Recherchez la FamilleArticle en fonction de la référence
  4948. //                $totstatu = $devisRepository->findBy(['statut' => $status]);
  4949. //
  4950. //                $count = count($totstatu);
  4951. //                if ($count == 0) {
  4952. //                    $count = 1;
  4953. //                }
  4954. //                else {
  4955. //                    $count = $count + 1;
  4956. //                }
  4957. //
  4958. //
  4959. //                // Génération du numéro de base
  4960. //                if ($status == "Demande devis") {
  4961. //                    $tt = "Dd" . $count;
  4962. //                }
  4963. //
  4964. //                // Vérification de l'existence du numéro et génération d'un nouveau si nécessaire
  4965. //                while ($devisRepository->findOneBy(['num' => $tt])) {
  4966. //                    $count++;
  4967. //                    $tt = "Dd" . $count;
  4968. //                }
  4969. //                $newdevis->setNum($tt);
  4970. //                $produitsToTransfer = $devi->getProduit();
  4971. //                foreach ($produitsToTransfer as $produit) {
  4972. //                    if ($produit !== null) {
  4973. //                        $produitExistant = new Produit();
  4974. //
  4975. //                        $produitExistant->setPrix($produit->getPrix());
  4976. //                        $produitExistant->setTva($produit->getTva());
  4977. //                        $produitExistant->setType($produit->getType());
  4978. //                        $produitExistant->setCode($produit->getCode());
  4979. //                        $produitExistant->setDesignation($produit->getDesignation());
  4980. //                        $produitExistant->setMontantht($produit->getMontantht());
  4981. //                        $produitExistant->setQte($produit->getQte());
  4982. //                        $produitExistant->setPrixunitdt($produit->getPrixunitdt());
  4983. //                        $produitExistant->setCoursdejours($produit->getCoursdejours());
  4984. //                        $produitExistant->setRemise($produit->getRemise());
  4985. //                        $produitExistant->setQtestock($produit->getQtestock());
  4986. //                        $produitExistant->setDeviss($produit->getDeviss());
  4987. //                        $produitExistant->setDemande('Locale');
  4988. //                        // Répétez pour chaque propriété...
  4989. //                        $produitExistant->setDevis($newdevis);
  4990. //                        $newdevis->addProduit($produitExistant);
  4991. //                        // Utilisez EntityManager pour persister les nouvelles entités
  4992. //                        $em->persist($produitExistant);
  4993. //                        $em->flush();
  4994. //                    }
  4995. //                }
  4996. //
  4997. //                // Flush une seule fois après toutes les insertions
  4998. //                $em->flush();
  4999. //
  5000. //                // Sauvegarde finale du devis existant après toutes les modifications
  5001. //                $em->persist($newdevis);
  5002. //                $em->flush();
  5003. //
  5004. //
  5005. //            }
  5006. //        }
  5007. //
  5008. //        $test = $devisRepository->findBy(['idfacture'=>$devi->getId()]);
  5009. //        $test2 = $devisRepository->findBy(['fav'=>$devi->getId(),'frtour'=>$devi->getId()]);
  5010. //        if ($test)
  5011. //        {
  5012. //            foreach ($test as $blss) {
  5013. //                $a = $devisRepository->findOneBy(['id' => $blss]);
  5014. //                $a->setStatut("BL");
  5015. //                $a->setIdfacture($devi->getId());
  5016. //                $devisRepository->save($a, true);
  5017. //            }
  5018. //            $pay= $devi->getPaymentdevis();
  5019. //            foreach ($pay as $blss) {
  5020. //
  5021. //                $paymentdeviRepository->remove($blss, true);
  5022. //            }
  5023. //        }
  5024. //        elseif ($test2)
  5025. //        {
  5026. //            foreach ($test2 as $pro2) {
  5027. //                $pro3= $pro2->getProduit();
  5028. //                foreach ($pro3 as $pro) {
  5029. //
  5030. //                    $produitRepository->remove($pro, true);
  5031. //                }
  5032. //
  5033. //                $devisRepository->remove($pro2,true);
  5034. //
  5035. //            }
  5036. //        }
  5037. //        else {
  5038. //
  5039. //            $statut = $devi->getStatut();
  5040. //
  5041. //            // On fait le retour de Qte seulement pour ces statuts :
  5042. //            // - Demande devis (statut actuel)
  5043. //            // - oldtype = Demande devis
  5044. //            // - BL
  5045. //            // - Facture
  5046. //            // - BLP
  5047. //            if (
  5048. ////                    $statut === 'Demande devis'
  5049. ////                    || $devi->getOldtype() === 'Demande devis'
  5050. //                $statut === 'BL'
  5051. //                || $statut === 'Facture'
  5052. //                || $statut === 'BLP'
  5053. //            ) {
  5054. //
  5055. //                $produit = $devi->getProduit();
  5056. //
  5057. //                foreach ($produit as $pro) {
  5058. //
  5059. //                    $famille = $famillesdarticlesRepository->findOneBy(['reference' => $pro->getType()]);
  5060. //
  5061. //                    if ($famille) {
  5062. //                        $famille->setQunatity($famille->getQunatity() + (int) $pro->getQte());
  5063. //                        $famillesdarticlesRepository->save($famille, true);
  5064. //                    }
  5065. //
  5066. //                    $produitRepository->remove($pro, true);
  5067. //                }
  5068. //            }
  5069. //            else {
  5070. //                // Si tu veux, pour les autres statuts on supprime seulement les produits sans toucher au stock
  5071. //                $produit = $devi->getProduit();
  5072. //                foreach ($produit as $pro) {
  5073. //                    $produitRepository->remove($pro, true);
  5074. //                }
  5075. //            }
  5076. //        }
  5077. //
  5078. ////            else{
  5079. ////                $produit= $devi->getProduit();
  5080. ////
  5081. ////             foreach ($produit as $pro) {
  5082. ////
  5083. ////            $famille= $famillesdarticlesRepository->findOneBy(['reference'=>$pro->getType()]);
  5084. ////            $famille->setQunatity($famille->getQunatity() + intval($pro->getQte()) );
  5085. ////            $famillesdarticlesRepository->save($famille,true);
  5086. ////
  5087. ////            $produitRepository->remove($pro, true);
  5088. ////        }
  5089. ////              }
  5090. //
  5091. //        //code jdid
  5092. //        $archiveArticles = $archivearticleRepository->findBy(['fichevente' => $devi]);
  5093. //        foreach ($archiveArticles as $a) {
  5094. //            $entityManager->remove($a);
  5095. //        }
  5096. //
  5097. //        $devisRepository->remove($devi, true);
  5098. //
  5099. //
  5100. //        if ($security->isGranted('ROLE_TECHNICIEN')) {
  5101. //            return $this->redirectToRoute('liste_Demande_Devis', [], Response::HTTP_SEE_OTHER);
  5102. //
  5103. //        }
  5104. //        else{
  5105. //            // Redirection en fonction du statut
  5106. //            switch ($devi->getStatut()) {
  5107. //                case 'Facture':
  5108. //                    return $this->redirectToRoute('app_devis_liste_facture', [], Response::HTTP_SEE_OTHER);
  5109. //
  5110. //                case 'Devis':
  5111. //                    return $this->redirectToRoute('app_devis_liste_devis', [], Response::HTTP_SEE_OTHER);
  5112. //
  5113. //                case 'Demande devis':
  5114. //                    return $this->redirectToRoute('app_devis_iste_demande_devis', [], Response::HTTP_SEE_OTHER);
  5115. //
  5116. //                case 'BLP':
  5117. //                    return $this->redirectToRoute('app_devis_particulier_index', [], Response::HTTP_SEE_OTHER);
  5118. //                case 'BL':
  5119. //                    return $this->redirectToRoute('app_devis_liste_bl', [], Response::HTTP_SEE_OTHER);
  5120. //                case 'Commande':
  5121. //                    return $this->redirectToRoute('app_devis_liste_commandes', [], Response::HTTP_SEE_OTHER);
  5122. //
  5123. //                default:
  5124. //                    // Fallback si le statut est inconnu
  5125. //                    return $this->redirectToRoute('app_devis_index', [], Response::HTTP_SEE_OTHER);
  5126. //            }
  5127. ////                return $this->redirectToRoute('app_devis_index', [], Response::HTTP_SEE_OTHER);
  5128. //
  5129. //        }
  5130. //    }
  5131. }