src/Controller/Ajax/Privado/Administracion/PropuestaAjaxController.php line 962

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Ajax\Privado\Administracion;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  5. use Symfony\Component\HttpFoundation\Response;
  6. use Symfony\Component\Routing\Annotation\Route;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use WhiteOctober\BreadcrumbsBundle\Model\Breadcrumbs;
  10. use Knp\Component\Pager\PaginatorInterface;
  11. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  12. use Symfony\Component\HttpFoundation\RedirectResponse;
  13. use Symfony\Contracts\Translation\TranslatorInterface;
  14. use App\Entity\Administracion\Cliente;
  15. use App\Entity\Administracion\Propuesta;
  16. use App\Entity\Administracion\PropuestaLinea;
  17. use App\Entity\Almacen\Serie;
  18. use App\Repository\Administracion\PropuestaRepository;
  19. use App\Repository\Almacen\ModeloRepository;
  20. use App\Repository\Almacen\AccesorioModeloLineaRepository;
  21. use App\Repository\Almacen\AccesorioRepository;
  22. use App\Repository\Almacen\SerieRepository;
  23. use App\Repository\Administracion\DocumentosRepository;
  24. use App\Repository\Ajustes\ConfigGlobalRepository;
  25. use App\Form\Privado\Filtros\Administracion\PropuestaFilterType;
  26. use App\Form\Privado\Filtros\Administracion\Modal\PropuestaModalFilterType;
  27. use App\Form\Privado\Filtros\Administracion\PropuestaFilterMaquinaType;
  28. use App\Form\Privado\Administracion\PropuestaEstadoType;
  29. use App\Form\Privado\Administracion\PropuestaType;
  30. use Symfony\Component\Filesystem\Filesystem;
  31. use Xthiago\PDFVersionConverter\Converter\GhostscriptConverterCommand;
  32. use Xthiago\PDFVersionConverter\Converter\GhostscriptConverter;
  33. use App\Utils\HelperUtil;
  34. use App\Utils\CustomFilter;
  35. use Knp\Snappy\Pdf;
  36. /** SERIALIZER AJAX */
  37. use Symfony\Component\Serializer\Encoder\JsonEncoder;
  38. use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory;
  39. use Symfony\Component\Serializer\Mapping\Loader\AnnotationLoader;
  40. use Symfony\Component\Serializer\NameConverter\MetadataAwareNameConverter;
  41. use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer;
  42. use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
  43. use Symfony\Component\Serializer\Serializer;
  44. use Doctrine\Common\Annotations\AnnotationReader;
  45. use Symfony\Component\Security\Core\Security;
  46. use Symfony\Component\HttpKernel\KernelInterface;
  47. use Tomsgu\PdfMerger\PdfCollection;
  48. use Tomsgu\PdfMerger\PdfFile;
  49. use Tomsgu\PdfMerger\PdfMerger;
  50. use App\Helper\ObjectUtils;
  51. use App\Repository\Administracion\PropuestaLineaRepository;
  52. use Knp\Bundle\SnappyBundle\Snappy\Response\PdfResponse;
  53. /** 
  54.  * @Route("/propuesta", name="propuesta_") 
  55.  * 
  56.  */
  57. class PropuestaAjaxController extends AbstractController
  58. {
  59.     const BaseDir Propuesta::BaseDir;
  60.     protected $em;
  61.     protected $bd;
  62.     protected $repo;
  63.     protected $paginator;
  64.     protected $helper;
  65.     protected $trans;
  66.     private $serializer;
  67.     private $SerieRepo;
  68.     protected $objectUtils;
  69.     protected $snappy;
  70.     protected $kernel;
  71.     private $params;
  72.     protected $ConfGlobRepo;
  73.     public function __construct(EntityManagerInterface $emBreadcrumbs $bdPaginatorInterface $pgPropuestaRepository $repoSerieRepository $SerieRepoHelperUtil $hlpParameterBagInterface $pbTranslatorInterface $trModeloRepository $ModRepoAccesorioModeloLineaRepository $AccModLineaAccesorioRepository $AccesorioRepoDocumentosRepository $DocRepoObjectUtils $objectUtilsPdfMerger $mergerKernelInterface $kernelPdf $snappyParameterBagInterface $paramsConfigGlobalRepository $ConfGlobRepoPropuestaLineaRepository $PropLineaRepoSecurity $sec)
  74.     {
  75.         $this->em               $em;
  76.         $this->bread            $bd;
  77.         $this->param            $pb;
  78.         $this->paginator        $pg;
  79.         $this->repo             $repo;
  80.         $this->helper           $hlp;
  81.         $this->trans            $tr;
  82.         $this->SerieRepo        $SerieRepo;
  83.         $this->DocRepo          $DocRepo;
  84.         $this->ModRepo          $ModRepo;
  85.         $this->AccModLinea      $AccModLinea;
  86.         $this->AccesorioRepo    $AccesorioRepo;
  87.         $this->objectUtils      $objectUtils;
  88.         $this->merger           $merger;
  89.         $this->snappy           $snappy;
  90.         $this->kernel           $kernel;
  91.         $this->params           $params;
  92.         $this->ConfGlobRepo     $ConfGlobRepo;
  93.         $this->PropLineaRepo    $PropLineaRepo;
  94.         $this->security         $sec;
  95.         $classMetadataFactory   = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader()));
  96.         $metadataAwareNameConverter = new MetadataAwareNameConverter($classMetadataFactory);
  97.         $this->serializer       = new Serializer(
  98.             [
  99.                 new DateTimeNormalizer(['datetime_format' => 'd-m-Y H:i']),
  100.                 new ObjectNormalizer($classMetadataFactory$metadataAwareNameConverter),
  101.             ],
  102.             [new JsonEncoder()]
  103.         );
  104.     }
  105.     /**
  106.      * @Route("/{id}", name="index", methods={"GET", "POST"}, options={"expose"=true})
  107.      * @IsGranted("ROLE_PRO_LIST")
  108.      */
  109.     public function indexAction(Request $requestCliente $cliente): Response
  110.     {
  111.         $semafor false;
  112.         $mensaje $html '';
  113.         //MassActions retrieve and apply
  114.         $massOptions $this->massAction($request);
  115.         if($massOptions instanceof RedirectResponse){
  116.             return $massOptions;
  117.         }
  118.         //Filter data
  119.         $default_values = [ 'sort'  => 'pro.ProCreatedDate' 'order' => 'desc' 'page'  => 1'limit' => ];
  120.         $filtro         = new CustomFilter($request$default_values'propuesta_filter'$this->param);
  121.         if($request->query->get('clear'false) == 1){
  122.             return $this->redirectToRoute('pro_index');
  123.         }
  124.         
  125.         $data_Sesio     $filtro->checkFiltroForm();
  126.         $form_filtro    $this->createForm(PropuestaFilterType::class, $data_Sesio);
  127.         $data           $form_filtro->handleRequest($request)->getData();
  128.         if ($form_filtro->isSubmitted() && $form_filtro->isValid()) {
  129.             $filtro->añadirFiltrosForm($data);
  130.         }
  131.        
  132.         try{
  133.             $resultBD $this->repo->filter($data''true);
  134.             //Pagination values
  135.             $pagination $this->paginator->paginate(
  136.                 $resultBD/*query NOT result*/
  137.                 $filtro->getPage() /*page number*/
  138.                 $filtro->getLimit(),
  139.                 $filtro->getSortKnp()
  140.             );
  141.         }catch(\Exception $e){
  142.             $this->helper->error($e);
  143.             $this->addFlash('danger'$this->trans->trans('error.sort_or_filter'));
  144.             return $this->redirectToRoute('pro_index', ['clear' => 1]);
  145.         }
  146.         //Breadcrumbs
  147.         $this->bread->addRouteItem($this->trans->trans('propuesta.subbar', [], 'propuesta'), "pro_index");
  148.         $html $this->renderView(self::BaseDir '/ajax/propuesta_index.html.twig', [
  149.             'cliente'       => $cliente,
  150.             'BaseDir'       => self::BaseDir,
  151.             'pagination'    => $pagination,
  152.             'mass_options'  => $massOptions,
  153.             'form_filtro'   => $form_filtro->createView(),
  154.             'p_filter'      => $filtro->getData(),
  155.         ]);
  156.         $semafor true;
  157.         $object = [
  158.             'valid' => $semafor,
  159.             'html' => $html,
  160.             'message' => $mensaje,
  161.         ];
  162.     
  163.         return new Response($this->serializer->serialize($object'json'));
  164.     }
  165.     /**
  166.      * @Route("/modal_add/", name="modal", methods={"GET", "POST"}, options={"expose"=true})
  167.      * @IsGranted("ROLE_PRO_LIST")
  168.      */
  169.     public function indexModal(Request $request): Response
  170.     {
  171.         $semafor false;
  172.         $mensaje $html '';
  173.         $tipo_acc $request->query->get('datos');
  174.         $divisa $request->query->get('divisa');
  175.         $valor_divisa $request->query->get('valor_divisa');
  176.         //MassActions retrieve and apply
  177.         $massOptions $this->massAction($request);
  178.         if($massOptions instanceof RedirectResponse){
  179.             return $massOptions;
  180.         }
  181.        
  182.         //Filter data
  183.         $default_values = [ 'sort'  => 'acc.id' 'order' => 'desc' 'page'  => 1'limit' => 999999999 ];
  184.         $filtro         = new CustomFilter($request$default_values'accesorio_filter'$this->param);
  185.         if($request->query->get('clear'false) == 1){
  186.             return $this->redirectToRoute('pro_index');
  187.         }
  188.         
  189.         $data_Sesio     $filtro->checkFiltroForm();
  190.         $form_filtro    $this->createForm(PropuestaModalFilterType::class, $data_Sesio);
  191.         $data           $form_filtro->handleRequest($request)->getData();
  192.         if ($form_filtro->isSubmitted() && $form_filtro->isValid()) {
  193.             $filtro->añadirFiltrosForm($data);
  194.         }
  195.        
  196.         try{
  197.             $resultBD $this->AccesorioRepo->filter_modal($data''true$tipo_acc);
  198.             //Pagination values
  199.             $pagination $this->paginator->paginate(
  200.                 $resultBD/*query NOT result*/
  201.                 $filtro->getPage() /*page number*/
  202.                 $filtro->getLimit(),
  203.                 $filtro->getSortKnp()
  204.             );
  205.         }catch(\Exception $e){
  206.             $this->helper->error($e);
  207.             $this->addFlash('danger'$this->trans->trans('error.sort_or_filter'));
  208.             return $this->redirectToRoute('pro_index', ['clear' => 1]);
  209.         }
  210.         
  211.         $html $this->renderView(self::BaseDir '/ajax/propuesta_search_modal.html.twig', [
  212.             'BaseDir'       => self::BaseDir,
  213.             'pagination'    => $pagination,
  214.             'mass_options'  => $massOptions,
  215.             'form_filtro'   => $form_filtro->createView(),
  216.             'divisa'        => $divisa,
  217.             'valor_divisa'  => $valor_divisa,
  218.             'p_filter'      => $filtro->getData(),
  219.         ]);
  220.         $semafor true;
  221.         $object = [
  222.             'valid' => $semafor,
  223.             'html' => $html,
  224.             'message' => $mensaje,
  225.         ];
  226.     
  227.         return new Response($this->serializer->serialize($object'json'));
  228.     }
  229.     /**
  230.      * @Route("/{id}/crear/prev", name = "new_prev", methods = {"GET", "POST"}, requirements = {"id" = "\d+"})
  231.      * @IsGranted("ROLE_PRO_CREATE")
  232.      */
  233.     public function createPrevAction(Cliente $cliente nullRequest $request): Response
  234.     {
  235.         $semafor false;
  236.         $mensaje $html '';
  237.        
  238.         if($cliente === null || $cliente === false){
  239.             $this->addFlash('danger'$this->trans->trans('propuesta.cliente.noexiste', [], 'propuesta'));
  240.             return $this->redirectToRoute('pro_index');
  241.         }
  242.         //Filter data
  243.         $default_values = [ 'sort'  => 'serie.SerName' 'order' => 'ASC' 'page'  => 1'limit' => 300 ];
  244.         $filtro         = new CustomFilter($request$default_values'propuesta_filter_maquina'$this->param);
  245.         if($request->query->get('clear'false) == 1){
  246.             return $this->redirectToRoute('serie_index');
  247.         }
  248.         
  249.         $data_Sesio     $filtro->checkFiltroForm();
  250.         $form_filtro    $this->createForm(PropuestaFilterMaquinaType::class, $data_Sesio);
  251.         $data           $form_filtro->handleRequest($request)->getData();
  252.         if ($form_filtro->isSubmitted() && $form_filtro->isValid()) {
  253.             $filtro->añadirFiltrosForm($data);
  254.         }
  255.         try{
  256.             $resultBD $this->SerieRepo->filter_propuestas($data''true);
  257.             //Pagination values
  258.             $pagination $this->paginator->paginate(
  259.                 $resultBD/*query NOT result*/
  260.                 $filtro->getPage() /*page number*/
  261.                 $filtro->getLimit(),
  262.                 $filtro->getSortKnp()
  263.             );
  264.         }catch(\Exception $e){
  265.             $this->helper->error($e);
  266.             $this->addFlash('danger'$this->trans->trans('error.sort_or_filter'));
  267.             return $this->redirectToRoute('pro_index', ['clear' => 1]);
  268.         }
  269.         //Breadcrumbs
  270.         $this->bread->addRouteItem($this->trans->trans('propuesta.subbar', [], 'propuesta'), 'pro_index');
  271.         //$this->bread->addRouteItem("Nueva", 'pro_new', ['id' => $cliente->getId()]);
  272.         $html $this->renderView(self::BaseDir '/ajax/propuesta_new_prev.html.twig', [
  273.             'cliente'       => $cliente,
  274.             'BaseDir'       => self::BaseDir,
  275.             'pagination'    => $pagination,
  276.             'form_filtro'   => $form_filtro->createView(),
  277.             'p_filter'      => $filtro->getData(),
  278.         ]);
  279.         $semafor true;
  280.         $object = [
  281.             'valid' => $semafor,
  282.             'html' => $html,
  283.             'message' => $mensaje,
  284.         ];
  285.     
  286.         return new Response($this->serializer->serialize($object'json'));
  287.     }
  288.     
  289.     /**
  290.      * @Route("/{id}/crear/{serie}", name = "new", methods = {"GET", "POST"}, requirements = {"id" = "\d+"})
  291.      * @IsGranted("ROLE_PRO_EDIT")
  292.      */
  293.     public function createPropuesta(Cliente $cliente nullRequest $requestSerie $serie): Response
  294.     {
  295.         // Esto mostrará XML de divisas
  296.         $xml file_get_contents('https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml');
  297.         $object simplexml_load_string($xml);
  298.         $json json_encode($object);
  299.         $cube json_decode($json,TRUE);
  300.         $divisas = [];
  301.         $divisa_fecha $cube['Cube']['Cube']['@attributes']['time'];
  302.         foreach($cube['Cube']['Cube']['Cube'] as $item){
  303.             $divisas[] = $item['@attributes'];
  304.         }
  305.         foreach($cube['Cube']['Cube']['Cube'] as $item){
  306.             $divisas[] = $item['@attributes'];
  307.         }
  308.         $semafor false;
  309.         $mensaje $html '';
  310.         $accesorios_new = ($request->request->get('accesorios') ? $request->request->get('accesorios') : []);
  311.         $modelo = (isset($request->request->get('propuesta')['ProModelo'])? $this->ModRepo->findOneById($request->request->get('propuesta')['ProModelo']) : null );
  312.         if($cliente === null || $cliente === false){
  313.             $this->addFlash('danger'$this->trans->trans('propuesta.cliente.noexiste', [], 'propuesta'));
  314.             return $this->redirectToRoute('pro_index');
  315.         }
  316.         $AccModLinea = (isset($request->request->get('propuesta')['ProModelo']) ? $this->AccModLinea->findByAccesorioModelo('956'$request->request->get('propuesta')['ProModelo']) : [] );
  317.         $AccModLinea_incluid = (isset($request->request->get('propuesta')['ProModelo']) ? $this->AccModLinea->findByAccesorioModelo('955'$request->request->get('propuesta')['ProModelo']) : [] );
  318.         $entity = new Propuesta();
  319.         $prefijo $this->ConfGlobRepo->getValueOrCreateEntity('PREFIJO_PROPUESTA');
  320.         if($prefijo->getConfigUpdated()){
  321.             $div_pref explode('-'$prefijo->getConfigValue());
  322.             $int_plush intval($div_pref[1]);
  323.             $entity->setProReferencia($div_pref[0].'-'.$int_plush);
  324.             $prefijo->setConfigUpdated(false);
  325.         }else{
  326.             $lastProp $this->repo->LastProp();
  327.             $div_pref explode('-'$lastProp->getProReferencia());
  328.             $int_plush $div_pref[1] + 1;
  329.             $entity->setProReferencia($div_pref[0].'-'.$int_plush);
  330.         }
  331.         if($modelo != null){
  332.             $entity->setProModelo($modelo);
  333.         }
  334.         /** Se gestiona el formulario la primera vez para cuando se envie el formulario */
  335.         $form $this->createForm(PropuestaType::class, $entity,
  336.             [
  337.                 'action' => $request->getRequestUri(),
  338.                 'serie' => $serie->getId()
  339.             ],
  340.         );
  341.         
  342.         $form->handleRequest($request);
  343.         if ($form->isSubmitted()) {
  344.             if($form->isValid()){
  345.                 try{
  346.                     foreach($AccModLinea_incluid as $acc){
  347.                         $accesorios $acc->getAmlAccesorio();
  348.                         if($accesorios != null){
  349.                             $PropuestaLinea = new PropuestaLinea();
  350.                             $PropuestaLinea
  351.                                 ->setPropLineaCantidad(1)
  352.                                 ->setReferenciaAccesorio($accesorios->getAccReferencia())
  353.                                 ->setPropLineaPrecio($accesorios->getAccPrecio())
  354.                                 ->setPropLineaPrecioBase($accesorios->getAccPrecio())
  355.                                 ->setPropLineaAccTipo($accesorios)
  356.                                 ->setPropLineaDescripcion($accesorios->translate()->getAccName())
  357.                                 ->setPropLTipoAccesorio(strtoupper($accesorios->getAccTipo()->getLvalValue()))
  358.                                 ->setPropLineaReferencia(null)
  359.                                 ->setPropuestaLineaListadoValor($accesorios->getAccTipo())
  360.                                 ->setPropLineaTipo(2)
  361.                                 ->setPropLineaPropuesta($entity)
  362.                             ;
  363.                             $trans strtolower($this->security->getUser()->getUsuIdioma());
  364.                             $PropuestaLinea->translate($trans)->setNombreAccesorio($accesorios->translate($trans)->getAccName());
  365.                             $entity->addPropuestaLineas($PropuestaLinea);
  366.                             $PropuestaLinea->mergeNewTranslations();
  367.                         }
  368.                     }
  369.                     foreach($entity->getPropuestaLineas() as $opcion){
  370.                         $opcion->setPropLineaPropuesta($entity);
  371.                         
  372.                         $accesorio $opcion->getPropLineaAccTipo();
  373.                         $trans strtolower($this->security->getUser()->getUsuIdioma());
  374.                         if($accesorio != null){
  375.                             $opcion->translate($trans)->setNombreAccesorio($accesorio->translate($trans)->getAccName());
  376.                             $opcion->setReferenciaAccesorio($opcion->getPropLineaReferencia());
  377.                             $opcion->setPropLTipoAccesorio(strtoupper($accesorio->getAccTipo()->getLvalValue()));
  378.                             $opcion->mergeNewTranslations();
  379.                         }else{
  380.                             $opcion->translate($trans)->setNombreAccesorio($opcion->getPropLineaDescripcion());
  381.                             $opcion->setReferenciaAccesorio($opcion->getPropLineaReferencia());
  382.                             $opcion->setPropLTipoAccesorio(strtoupper($opcion->getPropLTipoAccesorio()));
  383.                             $opcion->mergeNewTranslations();
  384.                         }
  385.                         
  386.                     }
  387.                     $entity->setProDivision($serie->getSerDivision());
  388.                     $entity->setProSerie($serie);
  389.                     $entity->setProCliente($cliente);
  390.                     $this->em->persist($entity);
  391.                     $this->em->flush();
  392.                     $this->addFlash('success'$this->trans->trans('propuesta.crear.success', [], 'propuesta'). $entity);
  393.                     if ($form->getClickedButton() && 'guardarvolver' === $form->getClickedButton()->getName()) {
  394.                         return $this->redirectToRoute('cliente_view', ['id' => $cliente->getId()]);
  395.                     }elseif($form->getClickedButton() && 'guardar' === $form->getClickedButton()->getName()){
  396.                         return $this->redirectToRoute('cliente_view', ['id' => $cliente->getId()]);
  397.                     }else{
  398.                         return $this->redirectToRoute('pro_edit', ['id' => $entity->getId()]);
  399.                     }
  400.                 }catch(\Exception $e){
  401.                     $this->helper->error($e);
  402.                     $this->addFlash('danger'$this->trans->trans('propuesta.crear.error', [], 'propuesta'));
  403.                 }
  404.             }
  405.         }
  406.         if(isset($request->request->get('propuesta')['ProModelo'])){
  407.             $entity->setProPrecio(null);
  408.             $entity->setProPrecioBase(null);
  409.             $entity->LineasACC_RESET();
  410.         }
  411.         foreach($AccModLinea as $acc){
  412.             $accesorios $acc->getAmlAccesorio();
  413.             if($accesorios != null){
  414.                 $PropuestaLinea = new PropuestaLinea();
  415.                 $PropuestaLinea
  416.                     ->setPropLineaCantidad(1)
  417.                     ->setPropLineaPrecio($accesorios->getAccPrecio())
  418.                     ->setPropLineaPrecioBase($accesorios->getAccPrecio())
  419.                     ->setPropLineaDescripcion($accesorios->translate()->getAccName())
  420.                     ->setPropLineaAccTipo($accesorios)
  421.                     ->setPropLTipoAccesorio(strtoupper($accesorios->getAccTipo()->getLvalValue()))
  422.                     ->setPropLineaReferencia($accesorios->getAccReferencia())
  423.                     ->setPropuestaLineaListadoValor($accesorios->getAccTipo())
  424.                     ->setReferenciaAccesorio($accesorios->getAccReferencia())
  425.                     ->setPropLineaTipo(3)
  426.                     ->setPropLineaPropuesta($entity)
  427.                 ;
  428.                 $entity->addPropuestaLineas($PropuestaLinea);
  429.                 /** Tipo de accesorio Software ETC... */
  430.             }
  431.         }
  432.         $form $this->createForm(PropuestaType::class, $entity,
  433.             [
  434.                 'action' => $request->getRequestUri(),
  435.                 'serie' => $serie->getId()
  436.             ],
  437.         );
  438.         //Breadcrumbs
  439.         $this->bread->addRouteItem($this->trans->trans('propuesta.subbar', [], 'propuesta'), 'pro_index');
  440.         $this->bread->addRouteItem($this->trans->trans('propuesta.crear.subbar', [], 'propuesta'), 'pro_new', ['id' => $cliente->getId(), 'serie' => $serie->getId()]);
  441.         $html $this->renderView(self::BaseDir '/ajax/propuesta_new_edit.html.twig', [
  442.             'pro'           => $entity,
  443.             'ser'           => $serie,
  444.             'AccModLinea'   => $AccModLinea_incluid,
  445.             'modelo'        => $modelo,
  446.             'cliente'       => $cliente,
  447.             'BaseDir'       => self::BaseDir,
  448.             'form'          => $form->createView(),
  449.             'divisas'       => $divisas,
  450.             'date_divisa'   => $divisa_fecha
  451.         ]);
  452.         $semafor true;
  453.         $object = [
  454.             'valid'     => $semafor,
  455.             'html'      => $html,
  456.             'message'   => $mensaje,
  457.         ];
  458.         return new Response($this->serializer->serialize($object'json'));
  459.     }
  460.     /**
  461.      * @Route("/{id}/clonar", name="clonar", methods={"GET", "POST"}, requirements = {"id" = "\d+"})
  462.      * @IsGranted("ROLE_PRO_DUPLICATE")
  463.      */
  464.     public function clonarPropuesta(Propuesta $propRequest $request): Response
  465.     {
  466.         $cliente $prop->getProCliente();
  467.         $serie $prop->getProSerie();
  468.         // Esto mostrará XML de divisas
  469.         $xml file_get_contents('https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml');
  470.         $object simplexml_load_string($xml);
  471.         $json json_encode($object);
  472.         $cube json_decode($json,TRUE);
  473.         $divisas = [];
  474.         $divisa_fecha $cube['Cube']['Cube']['@attributes']['time'];
  475.         foreach($cube['Cube']['Cube']['Cube'] as $item){
  476.             $divisas[] = $item['@attributes'];
  477.         }
  478.         foreach($cube['Cube']['Cube']['Cube'] as $item){
  479.             $divisas[] = $item['@attributes'];
  480.         }
  481.         $semafor false;
  482.         $mensaje $html '';
  483.         $accesorios_new = ($request->request->get('accesorios') ? $request->request->get('accesorios') : []);
  484.         $modelo = (isset($request->request->get('propuesta')['ProModelo'])? $this->ModRepo->findOneById($request->request->get('propuesta')['ProModelo']) : $prop->getProModelo() );
  485.         if($cliente === null || $cliente === false){
  486.             $this->addFlash('danger'$this->trans->trans('propuesta.cliente.noexiste', [], 'propuesta'));
  487.             return $this->redirectToRoute('pro_index');
  488.         }
  489.         $AccModLinea = (isset($request->request->get('propuesta')['ProModelo']) ? $this->AccModLinea->findByAccesorioModelo('956'$request->request->get('propuesta')['ProModelo']) : $this->AccModLinea->findByAccesorioModelo('956'$prop->getProModelo()->getId()));
  490.         $AccModLinea_incluid = (isset($request->request->get('propuesta')['ProModelo']) ? $this->AccModLinea->findByAccesorioModelo('955'$request->request->get('propuesta')['ProModelo']) : $this->AccModLinea->findByAccesorioModelo('955'$prop->getProModelo()->getId()) );
  491.         
  492.         $entity = new Propuesta();
  493.         $ref $prop->getProReferencia();
  494.         $div_pref explode('/'$ref);
  495.         /** Contar iguales */
  496.         $PropCount $this->repo->PropCountCopy($div_pref[0]);
  497.         $entity->setProReferencia($div_pref[0].'/'.$PropCount[1] + 1);
  498.         if($modelo != null){
  499.             $entity->setProModelo($modelo);
  500.         }
  501.         /** Se gestiona el formulario la primera vez para cuando se envie el formulario */
  502.         $form $this->createForm(PropuestaType::class, $entity,
  503.             [
  504.                 'action' => $request->getRequestUri(),
  505.                 'serie' => $serie->getId()
  506.             ],
  507.         );
  508.         
  509.         $form->handleRequest($request);
  510.         if ($form->isSubmitted()) {
  511.             if($form->isValid()){
  512.                 try{
  513.                     foreach($AccModLinea_incluid as $acc){
  514.                         $accesorios $acc->getAmlAccesorio();
  515.                         if($accesorios != null){
  516.                             $PropuestaLinea = new PropuestaLinea();
  517.                             $PropuestaLinea
  518.                                 ->setPropLineaCantidad(1)
  519.                                 ->setReferenciaAccesorio($accesorios->getAccReferencia())
  520.                                 ->setPropLineaPrecio($accesorios->getAccPrecio())
  521.                                 ->setPropLineaPrecioBase($accesorios->getAccPrecio())
  522.                                 ->setPropLineaAccTipo($accesorios)
  523.                                 ->setPropLineaDescripcion($accesorios->translate()->getAccName())
  524.                                 ->setPropLTipoAccesorio(strtoupper($accesorios->getAccTipo()->getLvalValue()))
  525.                                 ->setPropLineaReferencia(null)
  526.                                 ->setPropuestaLineaListadoValor($accesorios->getAccTipo())
  527.                                 ->setPropLineaTipo(2)
  528.                                 ->setPropLineaPropuesta($entity)
  529.                             ;
  530.                             $trans strtolower($this->security->getUser()->getUsuIdioma());
  531.                             $PropuestaLinea->translate($trans)->setNombreAccesorio($accesorios->translate($trans)->getAccName());
  532.                             $entity->addPropuestaLineas($PropuestaLinea);
  533.                             $PropuestaLinea->mergeNewTranslations();
  534.                         }
  535.                     }
  536.                     foreach($entity->getPropuestaLineas() as $opcion){
  537.                         $opcion->setPropLineaPropuesta($entity);
  538.                         $accesorio $opcion->getPropLineaAccTipo();
  539.                         $trans strtolower($this->security->getUser()->getUsuIdioma());
  540.                         $opcion->translate($trans)->setNombreAccesorio($accesorio->translate($trans)->getAccName());
  541.                         $opcion->setReferenciaAccesorio($accesorio->getAccReferencia());
  542.                         $opcion->setPropLTipoAccesorio(strtoupper($accesorio->getAccTipo()->getLvalValue()));
  543.                         $opcion->mergeNewTranslations();
  544.                     }
  545.                     $entity->setProDivision($serie->getSerDivision());
  546.                     $entity->setProSerie($serie);
  547.                     $entity->setProCliente($cliente);
  548.                     //dd($entity);
  549.                     $this->em->persist($entity);
  550.                     $this->em->flush();
  551.                     $this->addFlash('success'$this->trans->trans('propuesta.crear.success', [], 'propuesta'). $entity);
  552.                     if ($form->getClickedButton() && 'guardarvolver' === $form->getClickedButton()->getName()) {
  553.                         return $this->redirectToRoute('cliente_view', ['id' => $cliente->getId()]);
  554.                     }elseif($form->getClickedButton() && 'guardar' === $form->getClickedButton()->getName()){
  555.                         return $this->redirectToRoute('cliente_view', ['id' => $cliente->getId()]);
  556.                     }else{
  557.                         return $this->redirectToRoute('pro_edit', ['id' => $entity->getId()]);
  558.                     }
  559.                 }catch(\Exception $e){
  560.                     $this->helper->error($e);
  561.                     $this->addFlash('danger'$this->trans->trans('propuesta.crear.error', [], 'propuesta'));
  562.                 }
  563.             }
  564.         }
  565.         if(isset($request->request->get('propuesta')['ProModelo'])){
  566.             $entity->setProPrecio(null);
  567.             $entity->setProPrecioBase(null);
  568.             $entity->LineasACC_RESET();
  569.         }
  570.         if($AccModLinea != null){
  571.             foreach($AccModLinea as $acc){
  572.                 $accesorios $acc->getAmlAccesorio();
  573.                 if($accesorios != null){
  574.                     $PropuestaLinea = new PropuestaLinea();
  575.                     $PropuestaLinea
  576.                         ->setPropLineaCantidad(1)
  577.                         ->setPropLineaPrecio($accesorios->getAccPrecio())
  578.                         ->setPropLineaPrecioBase($accesorios->getAccPrecio())
  579.                         ->setPropLineaDescripcion($accesorios->translate()->getAccName())
  580.                         ->setPropLineaAccTipo($accesorios)
  581.                         ->setPropLTipoAccesorio(strtoupper($accesorios->getAccTipo()->getLvalValue()))
  582.                         ->setPropLineaReferencia($accesorios->getAccReferencia())
  583.                         ->setPropuestaLineaListadoValor($accesorios->getAccTipo())
  584.                         ->setReferenciaAccesorio($accesorios->getAccReferencia())
  585.                         ->setPropLineaTipo(3)
  586.                         ->setPropLineaPropuesta($entity)
  587.                     ;
  588.                     $entity->addPropuestaLineas($PropuestaLinea);
  589.                     /** Tipo de accesorio Software ETC... */
  590.                 }
  591.             }
  592.         }
  593.         
  594.         $form $this->createForm(PropuestaType::class, $entity,
  595.             [
  596.                 'action' => $request->getRequestUri(),
  597.                 'serie' => $serie->getId()
  598.             ],
  599.         );
  600.         //Breadcrumbs
  601.         $this->bread->addRouteItem($this->trans->trans('propuesta.subbar', [], 'propuesta'), 'pro_index');
  602.         $this->bread->addRouteItem($this->trans->trans('propuesta.crear.subbar', [], 'propuesta'), 'pro_new', ['id' => $cliente->getId(), 'serie' => $serie->getId()]);
  603.         $html $this->renderView(self::BaseDir '/ajax/propuesta_new_edit.html.twig', [
  604.             'pro'           => $entity,
  605.             'ser'           => $serie,
  606.             'AccModLinea'   => $AccModLinea_incluid,
  607.             'modelo'        => $modelo,
  608.             'cliente'       => $cliente,
  609.             'BaseDir'       => self::BaseDir,
  610.             'form'          => $form->createView(),
  611.             'divisas'       => $divisas,
  612.             'date_divisa'   => $divisa_fecha
  613.         ]);
  614.         $semafor true;
  615.         $object = [
  616.             'valid'     => $semafor,
  617.             'html'      => $html,
  618.             'message'   => $mensaje,
  619.         ];
  620.         return new Response($this->serializer->serialize($object'json'));
  621.     }
  622.     /**
  623.      * @Route("/modal_propuesta/", name = "modal_send", methods = {"GET", "POST"}, requirements = {"id" = "\d+"})
  624.      * @IsGranted("ROLE_PRO_CREATE")
  625.      */
  626.     public function ModalPropuesta(Request $request): Response
  627.     {
  628.         $semafor false;
  629.         $mensaje $html '';
  630.         $accesorios_new = ($request->request->get('accesorios') ? $request->request->get('accesorios') : []);
  631.         $accesorios = [];
  632.         foreach($accesorios_new as $acc){
  633.             $acc $this->AccesorioRepo->findOneById($acc);
  634.             $accesorios [] = [
  635.                 'acc_precios'       => $acc->getAccPrecio(),
  636.                 'acc_precios_base'  => $acc->getAccPrecio(),
  637.                 'acc_name'          => $acc->translate()->getAccName(),
  638.                 'acc_ref'           => $acc->getAccReferencia(),
  639.                 'acc_tipo'          => $acc->getAccTipo()->getId(),
  640.                 'acc_to_order'      => strtoupper($acc->getAccTipo()->getLvalValue()),
  641.                 'acc_tipo_int'      => 3,
  642.             ];
  643.         }
  644.         $semafor true;
  645.         $object = [
  646.             'valid'     => $semafor,
  647.             'accesorio' => $accesorios,
  648.             'message'   => $mensaje,
  649.         ];
  650.         return new Response($this->serializer->serialize($object'json'));
  651.     }
  652.     /**
  653.      * @Route("/{id}/editar", name = "edit", methods = {"GET", "POST"}, requirements = {"id" = "\d+"})
  654.      * @IsGranted("ROLE_PRO_CREATE")
  655.      */
  656.     public function editPropuesta(Propuesta $entity nullRequest $request): Response
  657.     {
  658.         $semafor false;
  659.         $mensaje $html '';
  660.         $accesorios_new = ($request->request->get('accesorios') ? $request->request->get('accesorios') : []);
  661.         
  662.         $modelo = (isset($request->request->get('propuesta')['ProModelo'])? $this->ModRepo->findOneById($request->request->get('propuesta')['ProModelo']) : null );
  663.         if($entity->getProCliente() === null || $entity->getProCliente() === false){
  664.             $this->addFlash('danger'$this->trans->trans('propuesta.cliente.noexiste', [], 'propuesta'));
  665.             return $this->redirectToRoute('pro_index');
  666.         }
  667.         $AccModLinea = (isset($request->request->get('propuesta')['ProModelo']) ? $this->AccModLinea->findByAccesorioModelo('955'$request->request->get('propuesta')['ProModelo']) : [] );
  668.         $AccModLinea_incluid = (isset($request->request->get('propuesta')['ProModelo']) ? $this->AccModLinea->findByAccesorioModelo('955'$request->request->get('propuesta')['ProModelo']) : $this->AccModLinea->findByAccesorioModelo('955'$entity->getProModelo()));
  669.         //$PropuestaModLinea = $entity->getPropuestaLineas();
  670.         if($modelo != null){
  671.             $entity->setProModelo($modelo);
  672.         }
  673.         /** Se gestiona el formulario la primera vez para cuando se envie el formulario */
  674.         $form $this->createForm(PropuestaType::class, $entity,
  675.             [
  676.                 'action' => $request->getRequestUri(),
  677.                 'serie'  => $entity->getProSerie()->getId()
  678.             ],
  679.         );
  680.         $form->handleRequest($request);
  681.         if ($form->isSubmitted()) {
  682.             if($form->isValid()){
  683.                 try{
  684.                     foreach($entity->getPropuestaLineas() as $opcion){
  685.                         $opcion->setPropLineaPropuesta($entity);
  686.                     }
  687.                     $this->em->flush();
  688.                     //dd($entity->getPropuestaLineas());
  689.                     $this->addFlash('success'$this->trans->trans('propuesta.crear.success', [], 'propuesta'). $entity);
  690.                     if ($form->getClickedButton() && 'guardarvolver' === $form->getClickedButton()->getName()) {
  691.                         return $this->redirectToRoute('cliente_view', ['id' => $entity->getProCliente()->getId()]);
  692.                     }elseif($form->getClickedButton() && 'guardar' === $form->getClickedButton()->getName()){
  693.                         return $this->redirectToRoute('pro_edit', ['id' => $entity->getId()]);
  694.                     }else{
  695.                         return $this->redirectToRoute('pro_edit', ['id' => $entity->getId()]);
  696.                     }
  697.                 }catch(\Exception $e){
  698.                     $this->helper->error($e);
  699.                     $this->addFlash('danger'$this->trans->trans('propuesta.crear.error', [], 'propuesta'));
  700.                 }
  701.             }
  702.         }
  703.         /** Se gestiona la segunda vez para añadir las lineas de categoria al formulario */
  704.         if(isset($request->request->get('propuesta')['ProModelo'])){
  705.             $entity->setProPrecio(null);
  706.             $entity->setProPrecioBase(null);
  707.             $entity->LineasACC_RESET();
  708.         }
  709.         foreach ($AccModLinea as $acc) {
  710.             $accesorios $acc->getAmlAccesorio();
  711.             $PropuestaLinea = new PropuestaLinea();
  712.             $PropuestaLinea
  713.                 ->setPropLineaCantidad(1)
  714.                 ->setPropLineaPrecio($accesorios->getAccPrecio())
  715.                 ->setPropLineaPrecioBase($accesorios->getAccPrecio())
  716.                 ->setPropLineaDescripcion($accesorios->translate()->getAccName())
  717.                 ->setPropLineaReferencia(/*$accesorios->getAccReferencia()*/ null)
  718.                 ->setPropuestaLineaListadoValor($accesorios->getAccTipo())
  719.                 ->setPropLineaPropuesta($entity)
  720.                 ->setPropLineaDescuento($accesorios->getAccAdmiteDescuento())
  721.             ;
  722.             $entity->addPropuestaLineas($PropuestaLinea);
  723.         }
  724.         $form $this->createForm(PropuestaType::class, $entity,
  725.             [
  726.                 'action' => $request->getRequestUri(),
  727.                 'serie'  => $entity->getProSerie()->getId()
  728.             ],
  729.         );
  730.         
  731.         //Breadcrumbs
  732.         $this->bread->addRouteItem($this->trans->trans('propuesta.subbar', [], 'propuesta'), 'pro_index');
  733.         $this->bread->addRouteItem($this->trans->trans('propuesta.crear.subbar', [], 'propuesta'), 'pro_new', ['id' => $entity->getProCliente()->getId(), 'serie' => $entity->getProSerie()->getId()]);
  734.         // Esto mostrará XML de divisas
  735.         $xml file_get_contents('https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml');
  736.         $object simplexml_load_string($xml);
  737.         $json json_encode($object);
  738.         $cube json_decode($json,TRUE);
  739.         $divisas = [];
  740.         $divisa_fecha $cube['Cube']['Cube']['@attributes']['time'];
  741.         foreach($cube['Cube']['Cube']['Cube'] as $item){
  742.             $divisas[] = $item['@attributes'];
  743.         }
  744.         foreach($cube['Cube']['Cube']['Cube'] as $item){
  745.             $divisas[] = $item['@attributes'];
  746.         }
  747.         $html $this->renderView(self::BaseDir '/ajax/propuesta_new_edit.html.twig', [
  748.             'pro'           => $entity,
  749.             'ser'           => $entity->getProSerie(),
  750.             'AccModLinea'   => $AccModLinea_incluid,
  751.             'modelo'        => $modelo,
  752.             'cliente'       => $entity->getProCliente(),
  753.             'BaseDir'       => self::BaseDir,
  754.             'form'          => $form->createView(),
  755.             'divisas'       => $divisas,
  756.             'date_divisa'   => $divisa_fecha
  757.         ]);
  758.         $semafor true;
  759.         $object = [
  760.             'valid'     => $semafor,
  761.             'html'      => $html,
  762.             'message'   => $mensaje,
  763.         ];
  764.         return new Response($this->serializer->serialize($object'json'));
  765.     }
  766.     /**
  767.      * @Route("/{id}/ver", name = "view", methods = {"GET", "POST"}, requirements = {"id" = "\d+"})
  768.      * @IsGranted("ROLE_PRO_CREATE")
  769.      */
  770.     public function viewPropuesta(Propuesta $entity nullRequest $request): Response
  771.     {
  772.         $semafor false;
  773.         $mensaje $html '';
  774.         $accesorios_new = ($request->request->get('accesorios') ? $request->request->get('accesorios') : []);
  775.         
  776.         $modelo = (isset($request->request->get('propuesta')['ProModelo'])? $this->ModRepo->findOneById($request->request->get('propuesta')['ProModelo']) : null );
  777.         if($entity->getProCliente() === null || $entity->getProCliente() === false){
  778.             $this->addFlash('danger'$this->trans->trans('propuesta.cliente.noexiste', [], 'propuesta'));
  779.             return $this->redirectToRoute('pro_index');
  780.         }
  781.         $AccModLinea = (isset($request->request->get('propuesta')['ProModelo']) ? $this->AccModLinea->findByAccesorioModelo('955'$request->request->get('propuesta')['ProModelo']) : [] );
  782.         $AccModLinea_incluid = (isset($request->request->get('propuesta')['ProModelo']) ? $this->AccModLinea->findByAccesorioModelo('955'$request->request->get('propuesta')['ProModelo']) : $this->AccModLinea->findByAccesorioModelo('955'$entity->getProModelo()));
  783.         
  784.         if($modelo != null){
  785.             $entity->setProModelo($modelo);
  786.         }
  787.         
  788.         //Breadcrumbs
  789.         $this->bread->addRouteItem($this->trans->trans('propuesta.subbar', [], 'propuesta'), 'pro_index');
  790.         $this->bread->addRouteItem($this->trans->trans('propuesta.crear.subbar', [], 'propuesta'), 'pro_new', ['id' => $entity->getProCliente()->getId(), 'serie' => $entity->getProSerie()->getId()]);
  791.         
  792.         $form $this->createForm(PropuestaEstadoType::class, $entity);
  793.         $propLineas $this->PropLineaRepo->PropToOrderList($entity);
  794.         $html $this->renderView(self::BaseDir '/ajax/propuesta_view.html.twig', [
  795.             'pro'           => $entity,
  796.             'PropLineas'    => $propLineas,
  797.             'ser'           => $entity->getProSerie(),
  798.             'AccModLinea'   => $AccModLinea_incluid,
  799.             'modelo'        => $modelo,
  800.             'cliente'       => $entity->getProCliente(),
  801.             'BaseDir'       => self::BaseDir,
  802.             'form'          => $form->createView(),
  803.         ]);
  804.         $semafor true;
  805.         $object = [
  806.             'valid'     => $semafor,
  807.             'html'      => $html,
  808.             'message'   => $mensaje,
  809.         ];
  810.         return new Response($this->serializer->serialize($object'json'));
  811.     }
  812.     /**
  813.      * @Route("/{id}/status", name = "status", methods = {"GET", "POST"}, requirements = {"id" = "\d+"})
  814.      * @IsGranted("ROLE_PRO_CREATE")
  815.      */
  816.     public function changeStatusPropuesta(Propuesta $entity nullRequest $request): Response
  817.     {
  818.         $semafor false;
  819.         $mensaje $html '';
  820.         $accesorios_new = ($request->request->get('accesorios') ? $request->request->get('accesorios') : []);
  821.         
  822.         $modelo = (isset($request->request->get('propuesta')['ProModelo'])? $this->ModRepo->findOneById($request->request->get('propuesta')['ProModelo']) : null );
  823.         if($entity->getProCliente() === null || $entity->getProCliente() === false){
  824.             $this->addFlash('danger'$this->trans->trans('propuesta.cliente.noexiste', [], 'propuesta'));
  825.             return $this->redirectToRoute('pro_index');
  826.         }
  827.         $AccModLinea = (isset($request->request->get('propuesta')['ProModelo']) ? $this->AccModLinea->findByAccesorioModelo('955'$request->request->get('propuesta')['ProModelo']) : [] );
  828.         $AccModLinea_incluid = (isset($request->request->get('propuesta')['ProModelo']) ? $this->AccModLinea->findByAccesorioModelo('955'$request->request->get('propuesta')['ProModelo']) : $this->AccModLinea->findByAccesorioModelo('955'$entity->getProModelo()));
  829.         
  830.         if($modelo != null){
  831.             $entity->setProModelo($modelo);
  832.         }
  833.         
  834.         //Breadcrumbs
  835.         $this->bread->addRouteItem($this->trans->trans('propuesta.subbar', [], 'propuesta'), 'pro_index');
  836.         $this->bread->addRouteItem($this->trans->trans('propuesta.crear.subbar', [], 'propuesta'), 'pro_new', ['id' => $entity->getProCliente()->getId(), 'serie' => $entity->getProSerie()->getId()]);
  837.         
  838.         $form $this->createForm(PropuestaEstadoType::class, $entity);
  839.         $html $this->renderView(self::BaseDir '/ajax/propuesta_view.html.twig', [
  840.             'pro'           => $entity,
  841.             'ser'           => $entity->getProSerie(),
  842.             'AccModLinea'   => $AccModLinea_incluid,
  843.             'modelo'        => $modelo,
  844.             'cliente'       => $entity->getProCliente(),
  845.             'BaseDir'       => self::BaseDir,
  846.             'form'          => $form->createView(),
  847.         ]);
  848.         $semafor true;
  849.         $object = [
  850.             'valid'     => $semafor,
  851.             'html'      => $html,
  852.             'message'   => $mensaje,
  853.         ];
  854.         return new Response($this->serializer->serialize($object'json'));
  855.     }
  856.     /**
  857.      * @Route("/{id}/pdf", name="pdf", methods = {"GET", "POST"}, requirements = {"id" = "\d+"})
  858.      * @IsGranted("ROLE_PRO_PDF")
  859.      */
  860.     public function PropuestaPDF(Propuesta $prop nullRequest $request)
  861.     {
  862.         $cbox1 $request->query->get('cbox1');
  863.         $cbox2 $request->query->get('cbox2');
  864.         $status $request->query->get('status');
  865.         if($status == 1){
  866.             $url $this->params->get('APP_PROPUESTA').'/documentos'.'/';
  867.             $doc $this->DocRepo->DocumentoPropuesta($prop->getProModelo()->getId(), $request->getLocale());
  868.             return $this->split_pdf($url$doc->getDocNombreArchivo(), $prop$cbox1$cbox2$prop);
  869.         }else{
  870.             return $this->contractPdfAction($prop$cbox1$cbox2);
  871.         }
  872.     }
  873.     /** Crear página PDF de la propuesta */
  874.     public function contractPdfAction(Propuesta $entity$cbox1 true$cbox2 true)
  875.     {
  876.         $propLineas $this->PropLineaRepo->PropToOrderList($entity);
  877.         $content $this->renderView(
  878.             self::BaseDir '/pdf/propuesta_view.html.twig', [
  879.                 'pro'           => $entity,
  880.                 'PropLineas'    => $propLineas,
  881.                 'ser'           => $entity->getProSerie(),
  882.                 'cliente'       => $entity->getProCliente(),
  883.                 'BaseDir'       => self::BaseDir,
  884.                 'BaseURL'       => $this->params->get('BASE_URL'),
  885.                 'cbox1'         => $cbox1,
  886.                 'cbox2'         => $cbox2,
  887.             ]
  888.         );
  889.         return  new PdfResponse($this->snappy->getOutputFromHtml(
  890.             $content,
  891.             [
  892.                 'margin-left' => 0,
  893.                 'margin-right' => 0,
  894.                 'margin-top' => 5,
  895.                 //'margin-bottom' => 20.5,
  896.                 //'header-html' => $header,
  897.                 //'footer-html' => $footer,
  898.                 //'cover' => $cover,
  899.             ]
  900.         ),'PriceSummary.pdf');
  901.     }
  902.     
  903.     /** Recorta PDF y añade a la página indicada */
  904.     public function split_pdf($url2$filename$prop$cbox1 true$cbox2 true$entity) {
  905.         // Parse pdf file and build necessary objects.
  906.         $url $url2.$filename;
  907.        
  908.         $parser = new \Smalot\PdfParser\Parser();
  909.         $pdf    $parser->parseFile($url);
  910.         $pages  $pdf->getPages();
  911.         $fileRoute $this->params->get('APP_PROPUESTA').'/prueba.pdf';
  912.         $propLineas $this->PropLineaRepo->PropToOrderList($entity);
  913.         $content $this->renderView(
  914.             self::BaseDir '/pdf/propuesta_view.html.twig', [
  915.                 'pro'           => $prop,
  916.                 'PropLineas'    => $propLineas,
  917.                 'ser'           => $prop->getProSerie(),
  918.                 'cliente'       => $prop->getProCliente(),
  919.                 'BaseDir'       => self::BaseDir,
  920.                 'BaseURL'       => $this->params->get('BASE_URL'),
  921.                 'cbox1'         => $cbox1,
  922.                 'cbox2'         => $cbox2,
  923.             ]
  924.         );
  925.         
  926.         $this->snappy->generateFromHtml($content$fileRoute,[
  927.             'margin-bottom' => 0,
  928.             'margin-top' => 0,
  929.             'margin-left' => 0,
  930.             'margin-right' => 0,
  931.             'page-size' => 'A4',
  932.             //'disable-smart-shrinking' => true
  933.         ], true);
  934.         $recorte count($pages);
  935.         $rec_def $recorte 4;
  936.         //Primero bajamos la versión del pdf para que no produzca errores de lectura o división
  937.         $command = new GhostscriptConverterCommand();
  938.         $filesystem = new Filesystem();
  939.         
  940.         //Comprobar versión del pdf cuando la versión es distinta a 1.5 no se suben correctamente
  941.         $converter = new GhostscriptConverter($command$filesystem);
  942.         $converter->convert($url'1.4');
  943.         //Finalmente unimos los dos PDF's y los guardamos en la ruta de contrato.
  944.         $pdfCollection = new PdfCollection();
  945.         foreach ($pages as $key => $page) {
  946.             if($key != $rec_def){
  947.                 $pdfCollection->addPdf($url$key+1PdfFile::ORIENTATION_PORTRAIT);
  948.             }else{
  949.                 $pdfCollection->addPdf($fileRoutePdfFile::ALL_PAGESPdfFile::ORIENTATION_PORTRAIT);
  950.             }
  951.         }
  952.         //$pdfCollection->addPdf($fileRoute, PdfFile::ALL_PAGES, PdfFile::ORIENTATION_PORTRAIT);
  953.         $this->merger->merge($pdfCollection'offer.pdf'PdfMerger::MODE_DOWNLOADPdfFile::ORIENTATION_PORTRAIT);
  954.         return true;
  955.     }
  956.     /*MASS ACTIONS*/
  957.     private function massAction(Request $request)
  958.     {
  959.         $massOptions = [];
  960.         if($this->isGranted('ROLE_PRO_DELETE')){
  961.             $massOptions['marcados_eliminar'] = $this->trans->trans('propuesta.massactions.label', [], 'propuesta');
  962.         }
  963.         if($request->query->get('mass_action') && $request->query->get('mass_action') != "" && $request->query->get('mass_check')){
  964.             foreach($request->query->get('mass_check') as $id){
  965.                 $entityBD $this->repo->find($id);
  966.                 if($entityBD){
  967.                     switch($request->query->get('mass_action')){
  968.                         case 'marcados_eliminar':
  969.                             if($this->isGranted('PRO_DELETE'$entityBD)){
  970.                                 $this->deleteAction($request$entityBDtrue );
  971.                             }
  972.                         break;
  973.                     }
  974.                 }
  975.             }
  976.             $this->addFlash('success'$this->trans->trans('propuesta.massactions.success', [], 'propuesta'));
  977.             return $this->redirectToRoute('pro_index');
  978.         }
  979.         return $massOptions;
  980.     }
  981.     /**
  982.      * @Route("/buscar/propuesta", name="search_autocomplete")
  983.      */
  984.     public function searchAutocomplete(Request $request)
  985.     {
  986.         $message    "";
  987.         $semafor    $paginator false;
  988.         $data       = [];
  989.         
  990.         if($request !== null){
  991.             $filters = [
  992.                 'texto' => $request->query->get('q'),
  993.                 'enabled' => true,
  994.             ];
  995.             if ($request->query->get('params'false)) {
  996.                 $filters array_merge($filters$request->query->get('params'));
  997.             }
  998.             
  999.             $resultBD $this->repo->filter($filters/*, $partials*/,"",false$request->query->get('limit'));
  1000.             if($resultBD){
  1001.                 $semafor true;
  1002.                 $data $this->serializer->normalize($resultBDnull, ['groups' => 'Simple']);
  1003.             }
  1004.             $object $data;
  1005.         }
  1006.         return new Response($this->serializer->serialize($object"json"), ($semafor ?  Response::HTTP_OK :  Response::HTTP_BAD_REQUEST));
  1007.     }
  1008. }