src/Controller/Rangements/ListePreparationController.php line 457

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Rangements;
  3. use App\Entity\Articles\Article;
  4. use App\Entity\FO\Cron;
  5. use App\Entity\FO\Societe;
  6. use App\Entity\GestionComerciale\Commande;
  7. use App\Entity\GestionComerciale\CommandeNumeroSuivi;
  8. use App\Entity\GestionComerciale\StatutCommande;
  9. use App\Entity\Rangements\Caisse;
  10. use App\Entity\Rangements\CommandeCaisse;
  11. use App\Entity\Rangements\HistoriqueListePreparation;
  12. use App\Entity\Rangements\ListePreparation;
  13. use App\Entity\Rangements\ListePreparationCommande;
  14. use App\Entity\Rangements\StatutListePreparation;
  15. use App\Entity\Transporteurs\Transporteur;
  16. use App\Form\Rangements\CaisseType;
  17. use App\Form\Rangements\GenererListePreparationType;
  18. use App\Form\Rangements\ListePreparationCsvType;
  19. use App\Form\Rangements\SupprimerCaisseType;
  20. use App\Library\Datatable\Util\Datatable;
  21. use App\Library\Uploader\Services\FileUploader;
  22. use App\Model\GestionCommerciale\TypeDocumentCommercial;
  23. use App\Security\Voter\EntityVoter;
  24. use App\Service\GestionComerciale\CommandeService;
  25. use Doctrine\ORM\EntityManagerInterface;
  26. use Knp\Snappy\Pdf;
  27. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  28. use Symfony\Component\HttpFoundation\JsonResponse;
  29. use Symfony\Component\HttpFoundation\Request;
  30. use Symfony\Component\HttpFoundation\Response;
  31. use Symfony\Component\Routing\Annotation\Route;
  32. use Symfony\Component\Validator\Validator\ValidatorInterface;
  33. use Symfony\Contracts\Translation\TranslatorInterface;
  34. class ListePreparationController extends AbstractController
  35. {
  36.     /**
  37.      * Grid action
  38.      * @return Response
  39.      */
  40.     /**
  41.      * @Route("/liste-preparation/grid", name="dtc_liste_preparation_liste_grid")
  42.      */
  43.     public function gridAction(Request $requestDatatable $datatableTranslatorInterface $translator)
  44.     {
  45.         return $this->datatable($datatable$translator)->execute();
  46.     }
  47.     /**
  48.      * @Route("/liste-preparation/modifier/{id}", name="dtc_liste_preparation_modifier")
  49.      */
  50.     public function modifierAction(Request $requestCaisse $caisseEntityManagerInterface $emTranslatorInterface $translatorValidatorInterface $validator)
  51.     {
  52.         $user $this->getUser();
  53.         $caisse->setUtilisateur($user);
  54.         $form   $this->createForm(CaisseType::class, $caisse);
  55.         $errors "";
  56.         $form->handleRequest($request);
  57.         if ($form->isSubmitted()) {
  58.             $droit $this->isGranted(EntityVoter::UPDATECaisse::class);
  59.             if ( ! $droit) {
  60.                 return $this->redirectToRoute('dtc_caisse_modifier', ["id" => $caisse->getId()]);
  61.             }
  62.             if ($form->isValid()) {
  63.                 $em->persist($caisse);
  64.                 $em->flush();
  65.                 $this->addFlash('notice'$translator->trans('Chariot modifiée avec succès !'));
  66.                 return $this->redirectToRoute('dtc_caisse_modifier', ["id" => $caisse->getId()]);
  67.             } else {
  68.                 $errors $validator->validate($caisse);
  69.             }
  70.         }
  71.         return $this->render('Rangements/Caisse/ajouter.html.twig', ['form' => $form->createView(), 'errors' => $errors'caisse' => $caisse]);
  72.     }
  73.     /**
  74.      * @Route("/liste-preparation/nouveau", name="dtc_liste_preparation_ajouter")
  75.      */
  76.     public function ajouterAction(Request $requestEntityManagerInterface $emTranslatorInterface $translatorValidatorInterface $validator)
  77.     {
  78.         $titre_modal            $translator->trans("Nouvelle liste de préparation");
  79.         $repo_objet             $em->getRepository(Caisse::class);
  80.         $repo_liste_preparation $em->getRepository(ListePreparation::class);
  81.         $repo_commande          $em->getRepository(Commande::class);
  82.         $get                    $request->query->all();
  83.         $lp                     = new ListePreparation;
  84.         $user                   $this->getUser();
  85.         $form                   $this->createForm(GenererListePreparationType::class, $lp);
  86.         $errors                 "";
  87.         $form->handleRequest($request);
  88.         $nonSupprimable "";
  89.         $dernierCron    $em->getRepository(Cron::class)->findOneBy(["tacheCron" => 79], ["id" => "DESC"]);
  90.         if (is_object($dernierCron) && ! $dernierCron->getEchec() && $dernierCron->getDateFin() == "") {
  91.             $nonSupprimable 1;
  92.         }
  93.         $tab_transporteurs  = [];
  94.         $transporteurs_list $em->getRepository(Transporteur::class)->findBy([], ["libelle" => "ASC"]);
  95.         if (count($transporteurs_list) > 0) {
  96.             foreach ($transporteurs_list as $transporteur_obj) {
  97.                 //if(in_array($transporteur_obj->getId(), array(13))) continue;
  98.                 $nb_cmdes $repo_commande->getNbCommandesDisponiblesPourLpPourTransporteur($transporteur_obj);
  99.                 if ($nb_cmdes 0) {
  100.                     $disponible_pour_lp true;
  101.                     $lp_attente_obj $repo_liste_preparation->lpEncoursDeCreation($transporteur_obj);
  102.                     if ($lp_attente_obj["total"] > 0) {
  103.                         $disponible_pour_lp false;
  104.                     }
  105.                     $tab_transporteurs[] = [
  106.                         "disponible_pour_lp" => $disponible_pour_lp,
  107.                         "transporteur"       => $transporteur_obj,
  108.                         "nb_commandes"       => $nb_cmdes,
  109.                         "transporteur_id"    => $transporteur_obj->getId(),
  110.                     ];
  111.                 }
  112.             }
  113.         }
  114.         if ($form->isSubmitted()) {
  115.             if ($form->isValid()) {
  116.                 $post $request->request->all();
  117.                 $statut_lp_creation $em->getRepository(StatutListePreparation::class)->find(9);
  118.                 $transporteur_obj   $em->getRepository(Transporteur::class)->find($post["transporteur"]);
  119.                 $lp->setTransporteur($transporteur_obj);
  120.                 $lp->setStatutListePreparation($statut_lp_creation);
  121.                 $lp->setForcer(true);
  122.                 $em->persist($lp);
  123.                 $em->flush();
  124.                 /*
  125.                 $builder = new ProcessBuilder();
  126.                 $builder->setArguments(array('php', '../app/console', 'cron:creerListePreparation'));
  127.                 sleep(1);
  128.                 $builder->getProcess()->start();
  129.                 sleep(3);
  130.                 */
  131.                 $url $this->generateUrl('dtc_liste_preparation_liste', []);
  132.                 $this->addFlash('notice'$translator->trans('Création des listes de préparation en cours !'));
  133.                 return new JsonResponse(['rendu' => '''valide' => '1''url' => $url]);
  134.             } else {
  135.                 $errors $validator->validate($lp);
  136.                 $rendu  $this->renderView(
  137.                     'Rangements/ListePreparation/ajouter_modal.html.twig',
  138.                     [
  139.                         'tab_transporteurs' => $tab_transporteurs,
  140.                         'form'              => $form->createView(),
  141.                         'errors'            => $errors,
  142.                         'lp'                => $lp,
  143.                         'nonSupprimable'    => $nonSupprimable,
  144.                         'dernierCron'       => $dernierCron,
  145.                     ]
  146.                 );
  147.                 return new JsonResponse(['rendu' => $rendu'valide' => '0''url' => '''titre' => $titre_modal]);
  148.             }
  149.         }
  150.         $rendu $this->renderView(
  151.             'Rangements/ListePreparation/ajouter_modal.html.twig',
  152.             [
  153.                 'tab_transporteurs' => $tab_transporteurs,
  154.                 'form'              => $form->createView(),
  155.                 'errors'            => $errors,
  156.                 'lp'                => $lp,
  157.                 'nonSupprimable'    => $nonSupprimable,
  158.                 'dernierCron'       => $dernierCron,
  159.             ]
  160.         );
  161.         return new JsonResponse(['rendu' => $rendu'valide' => '0''url' => '''titre' => $titre_modal]);
  162.         //return $this->render('Rangements/Caisse/ajouter.html.twig', array('form' => $form->createView(),'errors'=>$errors,'id'=>$id,'type'=>$type));
  163.     }
  164.     /**
  165.      * @Route("", name="")
  166.      */
  167.     public function __ajouterAction(Request $requestEntityManagerInterface $emTranslatorInterface $translatorValidatorInterface $validator)
  168.     {
  169.         $caisse = new Caisse;
  170.         $user   $this->getUser();
  171.         $form   $this->createForm(CaisseType::class, $caisse);
  172.         $errors "";
  173.         $form->handleRequest($request);
  174.         if ($form->isSubmitted()) {
  175.             $tokenP $request->request->get('tokenPicture');
  176.             if ($form->isValid()) {
  177.                 $em->persist($caisse);
  178.                 $em->flush();
  179.                 $em->refresh($caisse);
  180.                 $this->addFlash('notice'$translator->trans('Chariot ajouté avec succès !'));
  181.                 return $this->redirectToRoute('dtc_caisse_liste');
  182.             } else {
  183.                 $errors $validator->validate($caisse);
  184.             }
  185.         }
  186.         return $this->render('Rangements/Caisse/ajouter.html.twig', ['form' => $form->createView(), 'errors' => $errors]);
  187.     }
  188.     /**
  189.      * @Route("/liste-preparation/{page}", name="dtc_liste_preparation_liste", defaults={"page": 1})
  190.      */
  191.     public function listerAction(Request $request$pageEntityManagerInterface $emDatatable $datatableTranslatorInterface $translator)
  192.     {
  193.         //$tableau_class_cellule[]=array("className"=>"visible_export colonne_id","targets"=>array(1),"visible"=>$serviceColonneTableau->getColonneUtilisateur(Caisse::class,"id"));
  194.         $tableau_class_cellule   = [];
  195.         $tableau_class_cellule[] = ["className" => "colonne_id""targets" => [0], "visible" => false"orderable" => true];
  196.         $tableau_class_cellule[] = ["className" => "colonne_id""targets" => [1], "visible" => false"orderable" => false];
  197.         $tableau_class_cellule[] = ["className" => "colonne_id""targets" => [2], "visible" => true"orderable" => true];
  198.         $tableau_class_cellule[] = ["className" => "colonne_id text-center""targets" => [3], "visible" => true"orderable" => true];
  199.         $tableau_class_cellule[] = ["className" => "colonne_id text-center""targets" => [4], "visible" => true"orderable" => true];
  200.         $tableau_class_cellule[] = ["className" => "colonne_id text-center""targets" => [5], "visible" => true"orderable" => true];
  201.         $tableau_class_cellule[] = ["className" => "colonne_id""targets" => [6], "visible" => true"orderable" => true];
  202.         $tableau_class_cellule[] = ["className" => "colonne_id""targets" => [7], "visible" => true"orderable" => false];
  203.         $tableau_class_cellule   = [];
  204.         $tableau_class_cellule[] = ["className" => "colonne_id""targets" => [0], "visible" => false"orderable" => true];
  205.         $tableau_class_cellule[] = ["className" => "colonne_id""targets" => [1], "visible" => true"orderable" => true];
  206.         $tableau_class_cellule[] = ["className" => "colonne_id text-center""targets" => [2], "visible" => true"orderable" => true];
  207.         $tableau_class_cellule[] = ["className" => "colonne_id text-center""targets" => [7], "visible" => true"orderable" => false];
  208.         $dernierCron $em->getRepository(Cron::class)->findOneBy(["tacheCron" => 79], ["id" => "DESC"]);
  209.         $this->datatable($datatable$translator);
  210.         $datatables = [['id' => 'dta-liste-preparation''frequence' => 5000]];
  211.         return $this->render(
  212.             'Rangements/ListePreparation/lister.html.twig',
  213.             ['datatables' => $datatables'name' => 'caisse''tableauClassColonne' => $tableau_class_cellule"dernierCron" => $dernierCron]
  214.         );
  215.     }
  216.     /**
  217.      * set datatable configs
  218.      *
  219.      * @return \App\Library\Datatable\Util\Datatable
  220.      */
  221.     private function datatable(Datatable $datatableTranslatorInterface $translator)
  222.     {
  223.         $datatable->setDatatableId('dta-caisse')
  224.                   ->setEntity(ListePreparation::class, "x")
  225.                   ->setFields(
  226.                       [
  227.                           $translator->trans("ID")           => 'x.id',
  228.                           $translator->trans("Date")         => 'x.date',
  229.                           $translator->trans("Référence")    => 'x.reference',
  230.                           $translator->trans("Transporteur") => 't.libelle',
  231.                           $translator->trans("Chariot")      => 'c.libelle',
  232.                           $translator->trans("Statut")       => 's.libelle',
  233.                           $translator->trans("Nb commandes") => 'x.id',
  234.                           $translator->trans("Forcer")       => 'x.forcer',
  235.                           $translator->trans("Actions")      => 'x.id',
  236.                           "_identifier_"                     => 'x.id',
  237.                       ]
  238.                   )
  239.                   ->addJoin('x.transporteur''t'\Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
  240.                   ->addJoin('x.caisse''c'\Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
  241.                   ->addJoin('x.statutListePreparation''s'\Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
  242.                   ->setRenderers(
  243.                       [
  244.                           /*
  245. 0 => array(
  246. 'view' => 'FO/DataTable/lien_modifier.html.twig',
  247. 'params' => array(
  248.         'edit_route'  => 'dtc_caisse_modifier',
  249.         'supprimer_route'  => 'dtc_caisse_supprimer',
  250.         'type'=>"",
  251.         'entite'    => 'caisse',
  252.          'table'=>'dta-caisse',
  253.         'objet' => Caisse::class,
  254.          'width_modal'=>800
  255.     ),
  256. ),
  257. */
  258.                           => [
  259.                               'view'   => 'FO/DataTable/heure.html.twig',
  260.                               'params' => [],
  261.                           ],
  262.                           => [
  263.                               'view'   => 'FO/DataTable/nb_commandes_lp.html.twig',
  264.                               'params' => [],
  265.                           ],
  266.                           => [
  267.                               'view'   => 'FO/DataTable/booleen.html.twig',
  268.                               'params' => [],
  269.                           ],
  270.                           => [
  271.                               'view'   => 'FO/DataTable/actions.html.twig',
  272.                               'params' => [
  273.                                   //'edit_route'  => 'dtc_caisse_modifier',
  274.                                   'pdf_route'        => 'dtc_liste_preparation_pdf',
  275.                                   'historique_route' => 'dtc_liste_preparation_historique',
  276.                                   //'supprimer_route'  => 'dtc_caisse_supprimer',
  277.                                   'type'             => "",
  278.                                   'entite'           => 'caisse',
  279.                                   'table'            => 'dta-caisse',
  280.                                   'objet'            => Caisse::class,
  281.                                   'width_modal'      => 800,
  282.                               ],
  283.                           ],
  284.                       ]
  285.                   )
  286.                   ->setMultiple(
  287.                       [
  288.                           'delete' => [
  289.                               'title' => 'Non disponible',
  290.                               'route' => 'dtc_caisse_liste',
  291.                           ],
  292.                       ]
  293.                   )
  294.                   ->setOrder("x.id""desc")
  295.                   ->setSearch(true)
  296.                   ->setSearchFields([]);
  297.         //$datatable->setSearchFields(array(0,2));
  298.         return $datatable;
  299.     }
  300.     /**
  301.      * @Route("/liste-preparation/supprimer/{id}", name="dtc_liste_preparation_supprimer")
  302.      */
  303.     public function supprimerAction(Request $requestCaisse $objetEntityManagerInterface $emTranslatorInterface $translatorValidatorInterface $validator)
  304.     {
  305.         $caisse      $objet;
  306.         $titre_modal $translator->trans("Demande de confirmation");
  307.         $user        $this->getUser();
  308.         $get         $request->query->all();
  309.         /*
  310.         if(is_object($caisse->getBp())) {
  311.             $erreur =$translator->trans("Cette caisse ne peut pas être supprimée, car elle est liée à un BP.");
  312.             $rendu = $this->renderView('FO/Supprimer/supprimer_impossible.html.twig', array('errors'=>$erreur));
  313.             return new Response(json_encode(array('rendu'=>$rendu,'valide'=>'0','url'=>'','titre'=>$titre_modal)), 200, array('Content-Type'=>'application/json'));
  314.         }
  315.         */
  316.         $form   $this->createForm(SupprimerCaisseType::class, $caisse);
  317.         $errors "";
  318.         $form->handleRequest($request);
  319.         if ($form->isSubmitted()) {
  320.             if ($form->isValid()) {
  321.                 $em->remove($caisse);
  322.                 $em->flush();
  323.                 $url "";
  324.                 if (array_key_exists('table'$get) && $get["table"] != "") {
  325.                     return new JsonResponse(
  326.                         ['rendu' => '''valide' => '1''url' => $url'type' => 'recharger_datatable''id_datatable' => $get["table"]]
  327.                     );
  328.                 } else {
  329.                     $this->addFlash('notice'$translator->trans('Modèle de colis supprimé avec succès !'));
  330.                     return new JsonResponse(['rendu' => '''valide' => '1''url' => $url]);
  331.                 }
  332.             } else {
  333.                 $errors $validator->validate($caisse);
  334.                 $rendu  $this->renderView('FO/Supprimer/supprimer.html.twig', ['form' => $form->createView(), 'errors' => $errors]);
  335.                 return new JsonResponse(['rendu' => $rendu'valide' => '0''url' => '''titre' => $titre_modal]);
  336.             }
  337.         }
  338.         $rendu $this->renderView('FO/Supprimer/supprimer.html.twig', ['form' => $form->createView(), 'errors' => $errors]);
  339.         return new JsonResponse(['rendu' => $rendu'valide' => '0''url' => '''titre' => $titre_modal]);
  340.     }
  341.     /**
  342.      * @Route("/liste-preparation/scanner", name="dtc_liste_preparation_scanner")
  343.      */
  344.     public function scannerAction(Request $requestEntityManagerInterface $emTranslatorInterface $translator)
  345.     {
  346.         $caisse     '';
  347.         $rendu      '';
  348.         $errors     '';
  349.         $id         '';
  350.         $titreModal '';
  351.         $ean        trim($request->request->get('scan'));
  352.         if ( ! empty($ean)) {
  353.             $caisse $em->getRepository(Caisse::class)->findOneBy(['ean' => $ean]);
  354.         }
  355.         if (is_object($caisse)) {
  356.             $id $caisse->getId();
  357.             //verifier si la caisse est libre
  358.             $commandeCaisses $em->getRepository(CommandeCaisse::class)->getEnPreparation($caisse->getId());
  359.             if (count($commandeCaisses)) {
  360.                 $rendu      $this->renderView(
  361.                     'Rangements/CommandeCaisse/retour-scan-caisse.html.twig',
  362.                     ['commandeCaisses' => $commandeCaisses'caisse' => $caisse'errors' => $errors'ean' => $ean]
  363.                 );
  364.                 $titreModal $translator->trans('Attention');
  365.             } else {
  366.                 $rendu $this->renderView('Rangements/Caisse/retour-scan-caisse.html.twig', ['caisse' => $caisse]);
  367.             }
  368.         } else {
  369.             $this->addFlash('warning''Caisse introuvable !'.$ean);
  370.             $errors $this->renderView('layout-errors.html.twig');
  371.         }
  372.         return new JsonResponse(['id' => $id'rendu' => $rendu'errors' => $errors'titreModal' => $titreModal]);
  373.     }
  374.     /**
  375.      * @Route("/liste-preparations/pdf/{id}", name="dtc_liste_preparation_pdf")
  376.      */
  377.     public function pdfAction(Request $requestListePreparation $listePreparation$retour trueEntityManagerInterface $emPdf $snappy)
  378.     {
  379.         $societe $em->getRepository(Societe::class)->find(1);
  380.         $date_Y  date("Y");
  381.         $date_M  date("m");
  382.         $date_D  date("d");
  383.         $date    $date_Y.'/'.$date_M.'/'.$date_D;
  384.         $chemin_pdf 'PDF/LP/'.$date.'/LP-'.$listePreparation->getReference().'.pdf';
  385.         if (file_exists($chemin_pdf)) {
  386.             unlink($chemin_pdf);
  387.         }
  388.         //return $this->render('GestionComerciale/BonPreparation/template_pdf.html.twig',array('commande'  => $bonPreparation,'societe'  => $societe));
  389.         //$footer = $this->renderView('FO/PDF/footer_bp_pagination_pdf.html.twig', array('societe'  => $societe,'commande'  => $bonPreparation));
  390.         //$header = $this->renderView('FO/PDF/header_bp_pdf.html.twig', array('societe'  => $societe,'commande'  => $bonPreparation));
  391.         //$snappy->setOption('page-size', 'A4');
  392.         //$snappy->setOption('header-html',$header);
  393.         //$snappy->setOption('footer-html',$footer);
  394.         //$snappy->setOption('header-html',$footer);
  395.         $snappy->setOption('orientation'"landscape");
  396.         $snappy->setOption('header-spacing'"4");
  397.         $snappy->setOption('footer-spacing'"3");
  398.         $snappy->setOption('disable-smart-shrinking'true);
  399.         //$snappy->setOption('print-media-type', false );
  400.         $snappy->setOption('page-height'"297");
  401.         $snappy->setOption('page-width'"210");
  402.         $tab_articles_a_preparer = [];
  403.         $bpLp                    $em->getRepository(ListePreparationCommande::class)->findBy(['listePreparation' => $listePreparation]);
  404.         if (count($bpLp) > 0) {
  405.             foreach ($bpLp as $bp) {
  406.                 if (count($bp->getBp()->getArticleCommande()) > 0) {
  407.                     foreach ($bp->getBp()->getArticleCommande() as $ac) {
  408.                         $position_emplacement 10000000000;
  409.                         if (is_object($ac->getArticle()) && count($ac->getArticle()->getEmplacements()) > 0) {
  410.                             foreach ($ac->getArticle()->getEmplacements() as $ae) {
  411.                                 if (is_object($ae->getNiveauUn())) {
  412.                                     $position_emplacement $ae->getNiveauUn()->getPriorite();
  413.                                 }
  414.                                 if (is_object($ae->getNiveauDeux())) {
  415.                                     $position_emplacement += $ae->getNiveauDeux()->getPriorite();
  416.                                 }
  417.                                 if (is_object($ae->getNiveauTrois())) {
  418.                                     $position_emplacement += $ae->getNiveauTrois()->getPriorite();
  419.                                 }
  420.                                 break;
  421.                             }
  422.                         }
  423.                         $tab_articles_a_preparer[] = [
  424.                             "reference2"  => $ac->getArticle()->getReference(),
  425.                             "emplacement" => $position_emplacement,
  426.                             "ac"          => $ac,
  427.                             "reference"   => $ac->getArticle()->getId(),
  428.                         ];
  429.                     }
  430.                 }
  431.             }
  432.         }
  433.         // On trie une premiere fois par emplacement
  434.         $qte = [];
  435.         foreach ($tab_articles_a_preparer as $key => $row) {
  436.             $qte[$key] = floatVal($row['emplacement']);
  437.         }
  438.         array_multisort($qteSORT_ASC$tab_articles_a_preparer);
  439.         //echo "<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>";
  440.         $tab_articles_a_preparer_2 = [];
  441.         foreach ($tab_articles_a_preparer as $key => $row) {
  442.             if ( ! array_key_exists($row['emplacement'], $tab_articles_a_preparer_2)) {
  443.                 $tab_articles_a_preparer_2[$row['emplacement']] = [];
  444.             }
  445.             $tab_articles_a_preparer_2[$row['emplacement']][] = $tab_articles_a_preparer[$key];
  446.             //echo "<div>REMP : ".$row['emplacement']."</div>";
  447.         }
  448.         //echo "<br/>************************<br/>";
  449.         //echo "<div>COUNT TAB ".count($tab_articles_a_preparer)."</div>";
  450.         //echo "<br/><br/>";
  451.         // On trie une seconde fois par reference
  452.         foreach ($tab_articles_a_preparer_2 as $key => $row) {
  453.             $qte = [];
  454.             foreach ($row as $key2 => $row2) {
  455.                 $qte[$key2] = floatVal($row2['reference2']);
  456.             }
  457.             array_multisort($qteSORT_ASC$tab_articles_a_preparer_2[$key]);
  458.             //echo "<div>V2 KEY : ".$key."</div>";
  459.         }
  460.         //On remplace le tab du début par le tableau trier par emplacement et référence
  461.         $tab_articles_a_preparer = [];
  462.         foreach ($tab_articles_a_preparer_2 as $key3 => $value3) {
  463.             //echo "<div>TUTU:".$key3."</div>";
  464.             foreach ($value3 as $key4 => $value4) {
  465.                 //echo "<div>TITI:".$value4["reference"]."</div>";
  466.                 $tab_articles_a_preparer[] = $value4;
  467.             }
  468.         }
  469.         $snappy->generateFromHtml(
  470.             $this->renderView(
  471.                 'Rangements/ListePreparation/template_pdf.html.twig',
  472.                 [
  473.                     'lp'                   => $listePreparation,
  474.                     'tabArticlesAPreparer' => $tab_articles_a_preparer,
  475.                     'societe'              => $societe,
  476.                 ]
  477.             ),
  478.             $chemin_pdf
  479.         );
  480.         if ($retour == true) {
  481.             return $this->render('FO/PDF/conteneur_pdf.html.twig', [
  482.                 'objet'      => $listePreparation,
  483.                 'chemin_pdf' => '/'.$chemin_pdf,
  484.                 'visualiser' => $request->query->get('visualiser'),
  485.             ]);
  486.             //return new RedirectResponse("/".$chemin_pdf);
  487.         }
  488.     }
  489.     /**
  490.      * @Route("/liste-preparations/{id}/pourcentage-traitement", name="dtc_calcul_pourcentage_traitement_liste_preparation")
  491.      */
  492.     public function pourcentageTraitementAction(Request $requestCron $cron)
  493.     {
  494.         $pourcentageTraitement $cron->getProgression();
  495.         $response = new JsonResponse();
  496.         $response->setData([
  497.                                'pourcentageTraitement' => $pourcentageTraitement,
  498.                                //'total' => 0,
  499.                                //'traite' => $traite
  500.                            ]);
  501.         return $response;
  502.     }
  503.     /**
  504.      * @Route("/liste-preparations/historique/{id}", name="dtc_liste_preparation_historique")
  505.      */
  506.     public function historiqueAction(Request $requestListePreparation $listeEntityManagerInterface $emTranslatorInterface $translator)
  507.     {
  508.         $titre_modal $translator->trans("Historique du document");
  509.         //dump($commandes);
  510.         $historiques $em->getRepository(HistoriqueListePreparation::class)->findBy([
  511.                                                                                          'listePreparation' => $liste,
  512.                                                                                      ], ['date' => 'DESC']);
  513.         $rendu $this->renderView('Rangements/ListePreparation/historique.html.twig', [
  514.             'historiques' => $historiques,
  515.         ]);
  516.         return new JsonResponse(['rendu' => $rendu'valide' => '0''url' => '''titre' => $titre_modal'width' => 900]);
  517.     }
  518.     /**
  519.      * @Route("/export/xls/liste-preparations/{id}", name="dtc_liste_preparation_xls")
  520.      */
  521.     public function csvAction(Request $requestListePreparation $listeEntityManagerInterface $em)
  522.     {
  523.         $dir 'Export/lp/'.date("Y/m/d/");
  524.         if ( ! is_dir($dir)) {
  525.             mkdir($dir755true);
  526.         }
  527.         $filename 'lp-'.$liste->getDate()->format("d-m-Y").'.csv';
  528.         $filename str_replace(' ''-'$filename);
  529.         $filename str_replace('/''-'$filename);
  530.         $filename strtolower($filename);
  531.         $file     $dir.$filename;
  532.         if (is_file($file)) {
  533.             unlink($file);
  534.         }
  535.         $delimiter ";";
  536.         $handle    fopen($file'w+');
  537.         $result    = ["NumCommande""Destinataire""Rue""Rue2""Ville""CodePostal""Pays""Poids""BpId""NumeroSuvi"];
  538.         fputcsv($handle$result$delimiter);
  539.         //listePreparationCommande
  540.         //$listePreparationCommandes = $liste->getListePreparationCommande();
  541.         $listePreparationCommandes $em->getRepository(ListePreparationCommande::class)->getLPCommandBpsEmballe($liste);
  542.         if (count($listePreparationCommandes) > 0) {
  543.             foreach ($listePreparationCommandes as $cmde) {
  544.                 if (is_object($cmde->getBp())) {
  545.                     $numCommande $cmde->getBp()->getReference();
  546.                     if (is_object($cmde->getCommande())) {
  547.                         $numCommande $cmde->getCommande()->getReference();
  548.                         if ($cmde->getCommande()->getReferenceMarketPlace()) {
  549.                             $numCommande $cmde->getCommande()->getReferenceMarketPlace();
  550.                         }
  551.                     }
  552.                     $destinataire $cmde->getBp()->getLibelleLivraison();
  553.                     $rue_complet  trim(
  554.                         $cmde->getBp()->getNumeroLivraison()." ".$cmde->getBp()->getRueLivraison()." ".$cmde->getBp()->getComplementLivraison()." ".$cmde->getBp()->getComplementLivraison2()
  555.                     );
  556.                     $rue_complet  $this->remove_accent($rue_complet);
  557.                     $rue          substr($rue_complet030);
  558.                     $rue2         substr($rue_complet3030);
  559.                     $codePostal        $cmde->getBp()->getCodePostalLivraisonTxt();
  560.                     $villeLivraisonTxt $cmde->getBp()->getVilleLivraisonTxt();
  561.                     $pays              $cmde->getBp()->getCodeIsoLivraison();
  562.                     $poids             0;
  563.                     if (is_object($cmde->getBp()->getCommande())) {
  564.                         $poids $cmde->getBp()->getCommande()->getTotalPoids();
  565.                     }//*1000;
  566.                     $result = [$numCommande$destinataire$rue$rue2$villeLivraisonTxt$codePostal$pays$poids$cmde->getBp()->getId(), ""];
  567.                     foreach ($result as $key => $res) {
  568.                         $result[$key] = $this->remove_accent($res);
  569.                     }
  570.                     fputcsv($handle$result$delimiter);
  571.                 }
  572.             }
  573.         }
  574.         rewind($handle);
  575.         $content stream_get_contents($handle);
  576.         fclose($handle);
  577.         return new Response($content200, [
  578.             'Content-Type'        => 'application/force-download; charset=ISO-8859-1',
  579.             'Content-Disposition' => 'attachment; filename="'.$filename.'"',
  580.         ]);
  581.     }
  582.     /**
  583.      * @Route("/import/csv/liste-preparations/{id}", name="dtc_liste_preparation_import_csv")
  584.      */
  585.     public function ImportcsvAction(Request $requestListePreparation $lpEntityManagerInterface $emTranslatorInterface $translatorValidatorInterface $validatorFileUploader $fileUploader)
  586.     {
  587.         $type        "";
  588.         $titre_modal $translator->trans("Importation des numéros de suivi de la LP");
  589.         $repo_objet  $em->getRepository(Article::class);
  590.         $get         $request->query->all();
  591.         $errors      = [];
  592.         $documents $fileUploader->getFiles(['folder' => 'lp/tmp/'.$lp->getId()]);
  593.         if (count($documents) > 0) {
  594.             foreach ($documents as $document) {
  595.                 $url 'uploads/lp/tmp/'.$lp->getId().'/originals/'.$document;
  596.                 @unlink($url);
  597.             }
  598.         }
  599.         $user   $this->getUser();
  600.         $form   $this->createForm(ListePreparationCsvType::class, $lp);
  601.         $errors "";
  602.         $form->handleRequest($request);
  603.         if ($form->isSubmitted()) {
  604.             $post $request->request->all();
  605.             //    print_r($post);
  606.             if ($form->isValid() and != 1) {
  607.                 $documents $fileUploader->getFiles(['folder' => 'lp/tmp/'.$lp->getId()]);
  608.                 foreach ($documents as $document) {
  609.                     $url 'uploads/lp/tmp/'.$lp->getId().'/originals/'.$document;
  610.                     $ext pathinfo($urlPATHINFO_EXTENSION);
  611.                     //echo $url."\n";
  612.                     //$errors .= ' / document : '.$url;
  613.                     //if(strtolower($ext) != "jpg" and strtolower($ext) != "png" and strtolower($ext) != "gif" and strtolower($ext) != "jpeg") $message->attach(\Swift_Attachment::fromPath($url));
  614.                     //echo "<div>URL:".$url."</div>";
  615.                 }
  616.                 if (array_key_exists('table'$get) && $get["table"] != "") {
  617.                     return new JsonResponse(
  618.                         ['rendu' => '''valide' => '1''url' => $url'type' => 'recharger_datatable''id_datatable' => $get["table"]]
  619.                     );
  620.                 } else {
  621.                     $this->addFlash('notice'$translator->trans('Ficier CSV importé avec succès !'));
  622.                     return new JsonResponse(['rendu' => '''valide' => '1''url' => $url]);
  623.                 }
  624.             } else {
  625.                 $errors $validator->validate($lp);
  626.                 $rendu  $this->renderView(
  627.                     'Rangements/ListePreparation/ajouter.html.twig',
  628.                     ['form' => $form->createView(), 'errors' => $errors'id' => $id'type' => $type'conditionVente' => $conditionVente]
  629.                 );
  630.                 return new JsonResponse(['rendu' => $rendu'valide' => '0''url' => '''titre' => $titre_modal]);
  631.             }
  632.         }
  633.         $rendu $this->renderView('Rangements/ListePreparation/import_csv.html.twig', ['form' => $form->createView(), 'errors' => $errors'type' => $type'lp' => $lp]);
  634.         return new JsonResponse(['rendu' => $rendu'valide' => '0''url' => '''titre' => $titre_modal]);
  635.     }
  636.     /**
  637.      * @Route("/lp/uploads/document/{id}/{type}", name="dtc_liste_preparation_document_upload")
  638.      */
  639.     public function uploadDocumentAction(Request $request$id$typeFileUploader $fileUploader)
  640.     {
  641.         if ($type == "edit") {
  642.             $file    $request->request->get('file');
  643.             $fichier $request->query->get('file');
  644.             $fileUploader->handleFileUpload([
  645.                                                                        'max_number_of_files' => 10,
  646.                                                                        'allowed_extensions'  => ["csv"],
  647.                                                                        'folder'              => 'lp/tmp/'.$id,
  648.                                             ]);
  649.         } else {
  650.             $user $this->getUser();
  651.             $fileUploader->handleFileUpload([
  652.                                                                        'max_number_of_files' => 10,
  653.                                                                        'folder'              => 'tmp/documents/user/'.$user->getId().'/documents/'.$id,
  654.                                             ]);
  655.         }
  656.     }
  657.     /**
  658.      * @Route("/lp/uploads/csv/lire", name="dtc_liste_preparation_lire_csv")
  659.      */
  660.     public function lireCsvAction(Request $request)
  661.     {
  662.         $url "";
  663.         $get $request->query->all();
  664.         //print_r($get);
  665.         $tabLignes = [];
  666.         $dir       "";
  667.         //print_r($get);
  668.         $url trim($get["url"], "/");
  669.         //$url = "uploads/lp/tmp/13/originals/lp-28-06-2021-3.csv";
  670.         $o              fopen($dir.$url"r");
  671.         $l              fgets($o);
  672.         $explode_entete explode(";"$l);
  673.         $explode_entete array_slice($explode_entete0150);
  674.         //echo $l;
  675.         $contenu_fichier file_get_contents($dir.$url);
  676.         $nbLignes        substr_count($contenu_fichier"\n");
  677.         //$tabLignes[] = fgets($o);
  678.         //$tabLignes[] = fgets($o);
  679.         //$tabLignes[] = fgets($o);
  680.         while (($buffer fgets($o4096)) !== false) {
  681.             $tabLignes[] = $buffer;
  682.         }
  683.         $rendu $this->renderView('Rangements/ListePreparation/lire-csv.html.twig', ['url' => $url'explode_entete' => $explode_entete"tabLignes" => $tabLignes]);
  684.         return new JsonResponse(['rendu' => $rendu'valide' => '0''url' => '']);
  685.     }
  686.     /**
  687.      * @Route("/lp/uploads/csv/enregistrer", name="dtc_liste_preparation_enregistrer_numero_csv")
  688.      */
  689.     public function enregistrerNumeroCsvAction(Request $requestEntityManagerInterface $emCommandeService $commandeService)
  690.     {
  691.         $url           "";
  692.         $get           $request->query->all();
  693.         $repo_commande $em->getRepository(Commande::class);
  694.         //print_r($get);
  695.         $tabLignes = [];
  696.         $dir       "";
  697.         //print_r($get);
  698.         $url trim($get["url"], "/");
  699.         $o              fopen($dir.$url"r");
  700.         $l              fgets($o);
  701.         $explode_entete explode(";"$l);
  702.         $explode_entete array_slice($explode_entete0150);
  703.         //echo $l;
  704.         $contenu_fichier file_get_contents($dir.$url);
  705.         $nbLignes        substr_count($contenu_fichier"\n");
  706.         $rendu         "";
  707.         $rendu_ok      = [];
  708.         $rendu_erreurs = [];
  709.         while (($buffer fgets($o4096)) !== false) {
  710.             $explode_ligne explode(";"$buffer);
  711.             if ( ! empty($explode_ligne["0"])) {
  712.                 $cmde_obj $repo_commande->findOneBy(['typeDocumentCommercial' => TypeDocumentCommercial::COMMANDE"referenceMarketPlace" => $explode_ligne["0"]]);
  713.                 $bpIndice count($explode_ligne) - 2;
  714.                 $bp_obj   $repo_commande->findOneById(["id" => $explode_ligne[$bpIndice]]);
  715.                 //echo "<div>bpIndice:".$explode_ligne[$bpIndice]."</div>";
  716.                 $indice count($explode_ligne) - 1;
  717.                 //print_r($explode_ligne);
  718.                 //echo "<div>NUM SUIVI:".$explode_ligne[$indice]."</div>";
  719.                 if (is_object($cmde_obj)) {
  720.                     if (trim($explode_ligne[$indice]) != "") {
  721.                         $this->addFlash('notice'"Enregistrement du numéro de suivi : ".$explode_ligne[$indice]." pour la commande ".$explode_ligne["0"]." : réalisé avec succès !");
  722.                         $CommandeNumeroSuivi = new CommandeNumeroSuivi();
  723.                         $CommandeNumeroSuivi->setNumeroSuivi(trim($explode_ligne[$indice]));
  724.                         $CommandeNumeroSuivi->setCommande($cmde_obj);
  725.                         if (is_object($bp_obj)) {
  726.                             $CommandeNumeroSuivi->setBp($bp_obj);
  727.                         }
  728.                         $em->persist($CommandeNumeroSuivi);
  729.                         $commandeService->creerHistorique($cmde_obj30, ["message" => " : ".$explode_ligne[$indice]]);
  730.                         if (is_object($cmde_obj->getCompteMarketPlace()) && is_object($cmde_obj->getStatutCommande()) && $cmde_obj->getStatutCommande()->getId() == 37) {
  731.                             $statut         36;
  732.                             $tableau_donnee = ['statut_commande_id' => $statut];
  733.                             $conn           $em->getConnection();
  734.                             $conn->update('commerciale__commande'$tableau_donnee, ['id' => $cmde_obj->getId()]);
  735.                             $ancienStatutCommande "";
  736.                             if (is_object($cmde_obj->getStatutCommande())) {
  737.                                 $ancienStatutCommande $cmde_obj->getStatutCommande()->getLibelle();
  738.                             }
  739.                             $repoStatut            $em->getRepository(StatutCommande::class);
  740.                             $nouveauStatutCommande $repoStatut->find(36);
  741.                             $commandeService->creerHistorique(
  742.                                 $cmde_obj,
  743.                                 12,
  744.                                 $donnees = [
  745.                                     "message"               => "<br/>Mise à jour depuis : import de fichier csv",
  746.                                     "ancienStatutCommande"  => $ancienStatutCommande,
  747.                                     "nouveauStatutCommande" => $nouveauStatutCommande->getLibelle(),
  748.                                 ]
  749.                             );
  750.                         }
  751.                     } else {
  752.                         $this->addFlash('warning'"Numéro de suivi vide pour la commande ".$explode_ligne["0"]."");
  753.                     }
  754.                 } else {
  755.                     $this->addFlash('warning'"Commande ".$explode_ligne["0"]." introuvable");
  756.                 }
  757.             }
  758.         }
  759.         $em->flush();
  760.         $errors $this->renderView('layout-errors.html.twig', []);
  761.         return new JsonResponse(['rendu' => $errors'valide' => '0''url' => '']);
  762.     }
  763.     private function remove_accent($str)
  764.     {
  765.         $a = [
  766.             'À',
  767.             'Á',
  768.             'Â',
  769.             'Ã',
  770.             'Ä',
  771.             'Å',
  772.             'Æ',
  773.             'Ç',
  774.             'È',
  775.             'É',
  776.             'Ê',
  777.             'Ë',
  778.             'Ì',
  779.             'Í',
  780.             'Î',
  781.             'Ï',
  782.             'Ð',
  783.             'Ñ',
  784.             'Ò',
  785.             'Ó',
  786.             'Ô',
  787.             'Õ',
  788.             'Ö',
  789.             'Ø',
  790.             'Ù',
  791.             'Ú',
  792.             'Û',
  793.             'Ü',
  794.             'Ý',
  795.             'ß',
  796.             'à',
  797.             'á',
  798.             'â',
  799.             'ã',
  800.             'ä',
  801.             'å',
  802.             'æ',
  803.             'ç',
  804.             'è',
  805.             'é',
  806.             'ê',
  807.             'ë',
  808.             'ì',
  809.             'í',
  810.             'î',
  811.             'ï',
  812.             'ñ',
  813.             'ò',
  814.             'ó',
  815.             'ô',
  816.             'õ',
  817.             'ö',
  818.             'ø',
  819.             'ù',
  820.             'ú',
  821.             'û',
  822.             'ü',
  823.             'ý',
  824.             'ÿ',
  825.             'Ā',
  826.             'ā',
  827.             'Ă',
  828.             'ă',
  829.             'Ą',
  830.             'ą',
  831.             'Ć',
  832.             'ć',
  833.             'Ĉ',
  834.             'ĉ',
  835.             'Ċ',
  836.             'ċ',
  837.             'Č',
  838.             'č',
  839.             'Ď',
  840.             'ď',
  841.             'Đ',
  842.             'đ',
  843.             'Ē',
  844.             'ē',
  845.             'Ĕ',
  846.             'ĕ',
  847.             'Ė',
  848.             'ė',
  849.             'Ę',
  850.             'ę',
  851.             'Ě',
  852.             'ě',
  853.             'Ĝ',
  854.             'ĝ',
  855.             'Ğ',
  856.             'ğ',
  857.             'Ġ',
  858.             'ġ',
  859.             'Ģ',
  860.             'ģ',
  861.             'Ĥ',
  862.             'ĥ',
  863.             'Ħ',
  864.             'ħ',
  865.             'Ĩ',
  866.             'ĩ',
  867.             'Ī',
  868.             'ī',
  869.             'Ĭ',
  870.             'ĭ',
  871.             'Į',
  872.             'į',
  873.             'İ',
  874.             'ı',
  875.             'IJ',
  876.             'ij',
  877.             'Ĵ',
  878.             'ĵ',
  879.             'Ķ',
  880.             'ķ',
  881.             'Ĺ',
  882.             'ĺ',
  883.             'Ļ',
  884.             'ļ',
  885.             'Ľ',
  886.             'ľ',
  887.             'Ŀ',
  888.             'ŀ',
  889.             'Ł',
  890.             'ł',
  891.             'Ń',
  892.             'ń',
  893.             'Ņ',
  894.             'ņ',
  895.             'Ň',
  896.             'ň',
  897.             'ʼn',
  898.             'Ō',
  899.             'ō',
  900.             'Ŏ',
  901.             'ŏ',
  902.             'Ő',
  903.             'ő',
  904.             'Œ',
  905.             'œ',
  906.             'Ŕ',
  907.             'ŕ',
  908.             'Ŗ',
  909.             'ŗ',
  910.             'Ř',
  911.             'ř',
  912.             'Ś',
  913.             'ś',
  914.             'Ŝ',
  915.             'ŝ',
  916.             'Ş',
  917.             'ş',
  918.             'Š',
  919.             'š',
  920.             'Ţ',
  921.             'ţ',
  922.             'Ť',
  923.             'ť',
  924.             'Ŧ',
  925.             'ŧ',
  926.             'Ũ',
  927.             'ũ',
  928.             'Ū',
  929.             'ū',
  930.             'Ŭ',
  931.             'ŭ',
  932.             'Ů',
  933.             'ů',
  934.             'Ű',
  935.             'ű',
  936.             'Ų',
  937.             'ų',
  938.             'Ŵ',
  939.             'ŵ',
  940.             'Ŷ',
  941.             'ŷ',
  942.             'Ÿ',
  943.             'Ź',
  944.             'ź',
  945.             'Ż',
  946.             'ż',
  947.             'Ž',
  948.             'ž',
  949.             'ſ',
  950.             'ƒ',
  951.             'Ơ',
  952.             'ơ',
  953.             'Ư',
  954.             'ư',
  955.             'Ǎ',
  956.             'ǎ',
  957.             'Ǐ',
  958.             'ǐ',
  959.             'Ǒ',
  960.             'ǒ',
  961.             'Ǔ',
  962.             'ǔ',
  963.             'Ǖ',
  964.             'ǖ',
  965.             'Ǘ',
  966.             'ǘ',
  967.             'Ǚ',
  968.             'ǚ',
  969.             'Ǜ',
  970.             'ǜ',
  971.             'Ǻ',
  972.             'ǻ',
  973.             'Ǽ',
  974.             'ǽ',
  975.             'Ǿ',
  976.             'ǿ',
  977.         ];
  978.         $b = [
  979.             'A',
  980.             'A',
  981.             'A',
  982.             'A',
  983.             'A',
  984.             'A',
  985.             'AE',
  986.             'C',
  987.             'E',
  988.             'E',
  989.             'E',
  990.             'E',
  991.             'I',
  992.             'I',
  993.             'I',
  994.             'I',
  995.             'D',
  996.             'N',
  997.             'O',
  998.             'O',
  999.             'O',
  1000.             'O',
  1001.             'O',
  1002.             'O',
  1003.             'U',
  1004.             'U',
  1005.             'U',
  1006.             'U',
  1007.             'Y',
  1008.             's',
  1009.             'a',
  1010.             'a',
  1011.             'a',
  1012.             'a',
  1013.             'a',
  1014.             'a',
  1015.             'ae',
  1016.             'c',
  1017.             'e',
  1018.             'e',
  1019.             'e',
  1020.             'e',
  1021.             'i',
  1022.             'i',
  1023.             'i',
  1024.             'i',
  1025.             'n',
  1026.             'o',
  1027.             'o',
  1028.             'o',
  1029.             'o',
  1030.             'o',
  1031.             'o',
  1032.             'u',
  1033.             'u',
  1034.             'u',
  1035.             'u',
  1036.             'y',
  1037.             'y',
  1038.             'A',
  1039.             'a',
  1040.             'A',
  1041.             'a',
  1042.             'A',
  1043.             'a',
  1044.             'C',
  1045.             'c',
  1046.             'C',
  1047.             'c',
  1048.             'C',
  1049.             'c',
  1050.             'C',
  1051.             'c',
  1052.             'D',
  1053.             'd',
  1054.             'D',
  1055.             'd',
  1056.             'E',
  1057.             'e',
  1058.             'E',
  1059.             'e',
  1060.             'E',
  1061.             'e',
  1062.             'E',
  1063.             'e',
  1064.             'E',
  1065.             'e',
  1066.             'G',
  1067.             'g',
  1068.             'G',
  1069.             'g',
  1070.             'G',
  1071.             'g',
  1072.             'G',
  1073.             'g',
  1074.             'H',
  1075.             'h',
  1076.             'H',
  1077.             'h',
  1078.             'I',
  1079.             'i',
  1080.             'I',
  1081.             'i',
  1082.             'I',
  1083.             'i',
  1084.             'I',
  1085.             'i',
  1086.             'I',
  1087.             'i',
  1088.             'IJ',
  1089.             'ij',
  1090.             'J',
  1091.             'j',
  1092.             'K',
  1093.             'k',
  1094.             'L',
  1095.             'l',
  1096.             'L',
  1097.             'l',
  1098.             'L',
  1099.             'l',
  1100.             'L',
  1101.             'l',
  1102.             'L',
  1103.             'l',
  1104.             'N',
  1105.             'n',
  1106.             'N',
  1107.             'n',
  1108.             'N',
  1109.             'n',
  1110.             'n',
  1111.             'O',
  1112.             'o',
  1113.             'O',
  1114.             'o',
  1115.             'O',
  1116.             'o',
  1117.             'OE',
  1118.             'oe',
  1119.             'R',
  1120.             'r',
  1121.             'R',
  1122.             'r',
  1123.             'R',
  1124.             'r',
  1125.             'S',
  1126.             's',
  1127.             'S',
  1128.             's',
  1129.             'S',
  1130.             's',
  1131.             'S',
  1132.             's',
  1133.             'T',
  1134.             't',
  1135.             'T',
  1136.             't',
  1137.             'T',
  1138.             't',
  1139.             'U',
  1140.             'u',
  1141.             'U',
  1142.             'u',
  1143.             'U',
  1144.             'u',
  1145.             'U',
  1146.             'u',
  1147.             'U',
  1148.             'u',
  1149.             'U',
  1150.             'u',
  1151.             'W',
  1152.             'w',
  1153.             'Y',
  1154.             'y',
  1155.             'Y',
  1156.             'Z',
  1157.             'z',
  1158.             'Z',
  1159.             'z',
  1160.             'Z',
  1161.             'z',
  1162.             's',
  1163.             'f',
  1164.             'O',
  1165.             'o',
  1166.             'U',
  1167.             'u',
  1168.             'A',
  1169.             'a',
  1170.             'I',
  1171.             'i',
  1172.             'O',
  1173.             'o',
  1174.             'U',
  1175.             'u',
  1176.             'U',
  1177.             'u',
  1178.             'U',
  1179.             'u',
  1180.             'U',
  1181.             'u',
  1182.             'U',
  1183.             'u',
  1184.             'A',
  1185.             'a',
  1186.             'AE',
  1187.             'ae',
  1188.             'O',
  1189.             'o',
  1190.         ];
  1191.         return str_replace($a$b$str);
  1192.     }
  1193. }