src/Controller/OrderController.php line 92

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Company;
  4. use App\Entity\CompanyAddress;
  5. use App\Entity\Order;
  6. use App\Entity\OrderMessage;
  7. use App\Entity\Part;
  8. use App\Entity\Supplier;
  9. use App\Entity\User;
  10. use App\Entity\CompanySupplier;
  11. use App\Form\OrderSearchType;
  12. use App\Form\OrderType;
  13. use App\Form\OrderSupplierType;
  14. use App\Form\OrderBudgetType;
  15. use App\Repository\OrderRepository;
  16. use App\Security\Voter\OrderVoter;
  17. use Doctrine\DBAL\Exception\ForeignKeyConstraintViolationException;
  18. use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
  19. use Knp\Component\Pager\PaginatorInterface;
  20. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  21. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  22. use Symfony\Component\HttpFoundation\Request;
  23. use Symfony\Component\HttpFoundation\Response;
  24. use Symfony\Component\HttpFoundation\JsonResponse;
  25. use Symfony\Component\Mailer\MailerInterface;
  26. use Symfony\Component\Mime\Address;
  27. use Symfony\Component\Routing\Annotation\Route;
  28. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  29. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  30. use Symfony\Component\HttpFoundation\StreamedResponse;
  31. use Symfony\Contracts\Translation\TranslatorInterface;
  32. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  33. use Knp\Snappy\Pdf;
  34. use Knp\Bundle\SnappyBundle\Snappy\Response\PdfResponse;
  35. use App\Service\UtilService;
  36. use App\Service\OrderService;
  37. use App\Service\PartService;
  38. use Symfony\Component\HttpFoundation\File\Exception\FileException;
  39. use Symfony\Component\Filesystem\Exception\IOExceptionInterface;
  40. use Symfony\Component\Filesystem\Filesystem;
  41. use Symfony\Component\String\Slugger\AsciiSlugger;
  42. use Doctrine\Persistence\ManagerRegistry;
  43. use App\Service\EncryptDecryptService;
  44. /**
  45.  * @Route({"en": "/order",
  46.  *          "es": "/orden"})
  47.  */
  48. class OrderController extends AbstractController
  49. {
  50.     private $emailApp;
  51.     public const PAGE_ELEMENTS 25;
  52.     private $translator;
  53.     private $orderRepository;
  54.     private $util;
  55.     private $pdf;
  56.     private $orderService;
  57.     private $partService;    
  58.     private $em;
  59.     private $partDir;
  60.     public function __construct(
  61.         string $emailApp
  62.         TranslatorInterface $translator,
  63.         OrderRepository $orderRepository
  64.         UtilService $utilService
  65.         OrderService $orderService
  66.         PartService $partService
  67.         Pdf $knpSnappyPdf,
  68.         ManagerRegistry $doctrine,
  69.         string $partDir,
  70.         private EncryptDecryptService $encryptDecryptService)
  71.     {
  72.         $this->emailApp $emailApp;
  73.         $this->translator $translator;
  74.         $this->util $utilService;
  75.         $this->pdf $knpSnappyPdf;
  76.         $this->orderRepository $orderRepository;
  77.         $this->orderService $orderService;
  78.         $this->partService $partService;
  79.         $this->em $doctrine->getManager();
  80.         $this->partDir $partDir;
  81.     }
  82.     /**
  83.      * @Route({"en": "/list",
  84.      *         "es": "/listado"}, name="order_index", methods={"GET","POST"})
  85.      */
  86.     public function index(Request $requestOrderRepository $orderRepositoryPaginatorInterface $paginator): Response
  87.     {
  88.         $admin =$this->getUser();
  89.         $ms $this->util->getLicenseField($admin->getCompany(),'multi_select') && $admin->getRole()!='ROLE_CLIENT';
  90.         if($admin == NULL){
  91.             return $this->redirectToRoute('app_login');
  92.         }
  93.         $search = [];
  94.         $form $this->createForm(OrderSearchType::class, $search, ['user_admin' => $admin,'method' => 'GET']);
  95.         $form->handleRequest($request);
  96.         $orderBy null;
  97.         $filters = [
  98.             ['field'=>'company','title'=>'Empresa'],
  99.             ['field'=>'ref','title'=>'Referencia'],
  100.             ['field'=>'part','title'=>'Pieza'],
  101.             ['field'=>'supplier','title'=>'Centro de trabajo'],
  102.             ['field'=>'units','title'=>'Unidades'],
  103.             ['field'=>'updated_at','title'=>'Última modificación'],
  104.             ['field'=>'state','title'=>'Estado']
  105.         ];
  106.         if ($form->isSubmitted() && $form->isValid())
  107.         {        
  108.             $orderBy $request->query->get('order_by');
  109.             $orders $orderRepository->findByName($form->getData(), $admin$orderBy);   
  110.         } else {
  111.             $orders $orderRepository->buscarTodos($admin);
  112.         }       
  113.         if($request->isMethod('POST')){
  114.             if($request->request->get('orders_delete')){
  115.                 $delIds $request->request->get('delIds',null);
  116.                 if($delIds){
  117.                     $orders explode(','$delIds);
  118.                     $successMsg '';
  119.                     $errorMsg ''
  120.                     foreach($orders as $orderId){
  121.                         $order $this->em->getRepository(Order::class)->find($orderId);
  122.                         if($order){
  123.                             $rmOrder $this->rmOrder($order);
  124.                             if($rmOrder['error']){
  125.                                 $errorMsg.= $this->translator->trans('Error orden {ref} : ',['{ref}'=>$order->getRef()]) . $rmOrder['msg'].'<br>';
  126.                             }
  127.                             else{
  128.                                 $successMsg.= $this->translator->trans('Orden {ref} eliminada correctamente',['{ref}'=>$order->getRef()]).'<br>';
  129.                             }
  130.                         }
  131.                     }
  132.                     if($successMsg){
  133.                         $this->addFlash('success'$successMsg);
  134.                     }
  135.                     if($errorMsg){
  136.                         $this->addFlash('danger'$successMsg);
  137.                     }
  138.                     return $this->redirectToRoute('order_index');
  139.                 }
  140.             }
  141.         }
  142.         
  143.         // Creating pagnination
  144.         $pagination $paginator->paginate(
  145.             $orders,
  146.             $request->query->getInt('page'1),
  147.             self::PAGE_ELEMENTS
  148.         );
  149.         return $this->render('order/index.html.twig', [
  150.             'pagination' => $pagination,
  151.             'search_form' => $form->createView(),
  152.             'filters' => $filters,
  153.             'order_by' => $orderBy,
  154.             'ms' => $ms,
  155.             'user' => $this->getUser(),
  156.             'navbarTitle' => $this->translator->trans("Órdenes de trabajo")
  157.         ]); 
  158.     }
  159.     /**
  160.      * @Route({"en": "/new/{part}",
  161.      *         "es": "/nueva/{part}"}, name="order_new", methods={"GET","POST"})
  162.      */
  163.     public function new(Request $requestMailerInterface $mailerPart $partOrderRepository $orderRepository): Response
  164.     
  165.         $em $this->em;
  166.         $admin $this->getUser();
  167.         $order = new Order();
  168.         
  169.         $this->denyAccessUnlessGranted(OrderVoter::CREATE$order);
  170.         $cs $em->getRepository(CompanySupplier::class)->findOneBy(['company'=>$part->getCompany(),'supplier'=>$part->getSupplier()]);
  171.         $form $this->createForm(OrderType::class, $order, ['user_admin' => $admin'part' => $part'cs'=>$cs]);
  172.         $form->handleRequest($request);
  173.         if ($form->isSubmitted() && $form->isValid()) {
  174.             $initMsg $this->translator->trans('Pieza') . ' ' $part->getRef() . ': ';
  175.             $createOrder $this->createOrder($order);
  176.             if($createOrder['error']){
  177.                 $this->addFlash('danger'$initMsg $createOrder['msg']);
  178.             }
  179.             else{
  180.                 $this->addFlash('success'$initMsg $this->translator->trans('Orden creada correctamente'));
  181.             } 
  182.             
  183.             return $this->redirectToRoute('order_index');
  184.         }
  185.         return $this->render('order/new.html.twig', [
  186.             'order' => $order,
  187.             'cs' => $cs,
  188.             'form' => $form->createView(),
  189.             'user' => $this->getUser(),
  190.             'navbarTitle' => $this->translator->trans("Solicitar presupuesto")
  191.         ]);     
  192.     }
  193.     /**
  194.      * @Route({"en": "/new/bulk/{partIds}",
  195.      *         "es": "/nueva/masiva/{partIds}"}, name="order_bulk_new", methods={"GET","POST"})
  196.      */
  197.     public function newBulk(Request $requestOrderRepository $orderRepositorystring $partIds): Response
  198.     {
  199.         $user =$this->getUser();
  200.         $em $this->em;
  201.         $qb $em->createQueryBuilder();
  202.         if($user == NULL){
  203.             return $this->redirectToRoute('app_login');
  204.         }
  205.         $decodedPartIds explode(',',base64_decode($partIds));
  206.         $parts = [];
  207.         foreach($decodedPartIds as $partId){
  208.             $part $this->em->getRepository(Part::class)->find($partId);
  209.             if($part && $part->getSupplier() && $part->getCompany()==$user->getCompany() && !$part->getLocked()){
  210.                 $parts[] = $part;
  211.             }
  212.         }
  213.         if(empty($parts)){
  214.             $this->addFlash('danger'$this->translator->trans('Error inesperado'));
  215.             return $this->redirectToRoute('part_index');
  216.         }        
  217.         if($request->isMethod('POST')){
  218.             $orders = (array) $request->request->get('orders');
  219.             if(!empty($orders) && count($orders)==4){
  220.                 $errorMsg = [];
  221.                 $successMsg = [];
  222.                 for($i=0;$i<count($orders['parts']);$i++){                    
  223.                     $partId $orders['parts'][$i];
  224.                     $part $em->getRepository(Part::class)->find($partId);
  225.                     if(!empty($part)){
  226.                         $shippingAddress null;
  227.                         if(!empty($orders['shipping_address'][$i])){
  228.                             $shippingAddress $em->getRepository(CompanyAddress::class)->find($orders['shipping_address'][$i]);
  229.                         }
  230.                         $order = new Order();
  231.                         $order->setPart($part);
  232.                         $order->setCompany($part->getCompany());
  233.                         $order->setSupplier($part->getSupplier());
  234.                         $order->setUser($user);
  235.                         $order->setShippingAddress($shippingAddress);
  236.                         $order->setUnits($orders['units'][$i]);
  237.                         $order->setObservations($orders['observations'][$i]);
  238.                         $initMsg $this->translator->trans('Pieza') . ' ' $part->getRef() . ': ';
  239.                         $createOrder $this->createOrder($order);
  240.                         if($createOrder['error']){
  241.                             $errorMsg[] = $initMsg $createOrder['msg'];
  242.                         }
  243.                         else{
  244.                             $successMsg[]=$initMsg $this->translator->trans('Orden creada correctamente');
  245.                         }
  246.                     }   
  247.                     else{
  248.                         $errorMsg[] = $this->translator->trans('Pieza') . ' [' $partId ']: ' $this->translator->trans('Error inesperado');
  249.                     } 
  250.                 }
  251.                 if($errorMsg){
  252.                     $this->addFlash('danger'implode('<br>',$errorMsg));    
  253.                 }
  254.                 if($successMsg){
  255.                     $this->addFlash('success'implode('<br>',$successMsg));    
  256.                 }
  257.                 return $this->redirectToRoute('order_index');
  258.             }
  259.             else{
  260.                 $this->addFlash('danger'$this->translator->trans('Error inesperado'));
  261.                 return $this->redirectToRoute('order_bulk_new',['partIds'=>$partIds]);
  262.             }
  263.             
  264.         }
  265.         return $this->render('order/bulk_new.html.twig', [
  266.             'parts' => $parts,
  267.             'user' => $user,
  268.             'navbarTitle' => $this->translator->trans("Nuevas órdenes de trabajo")
  269.         ]); 
  270.     }
  271.     private function createOrder(Order $order){
  272.         $em $this->em;
  273.         $orderRepository $this->orderRepository;
  274.         $part $order->getPart();
  275.         $user $this->getUser();
  276.         $roleClient $user->getRole()=='ROLE_CLIENT';
  277.         $result = ['error'=>false,'msg'=>''];
  278.         $lastRef $orderRepository->findLastRef($part->getCompany());
  279.         $cs $em->getRepository(CompanySupplier::class)->findOneBy(['company'=>$part->getCompany(),'supplier'=>$part->getSupplier()]);
  280.         $budgetRequired $cs $cs->getConfigStepBudget() : true;
  281.         $chiefConfirm $cs $cs->getConfigStepChiefConfirm() : true;            
  282.         
  283.         $order->setRef($lastRef);
  284.         $order->setChiefConfirm($chiefConfirm);
  285.         $order->setBudgetRequired($budgetRequired);
  286.         if($roleClient){
  287.             $order->setState(7);
  288.         }
  289.         try 
  290.         {       
  291.             if(!$order->getId()){
  292.                 $em->persist($order);
  293.             }
  294.             //Bloqueo de pieza
  295.             $part $order->getPart();
  296.             $part->setLocked(true);
  297.             $part->setLockedAt(new \DateTime());
  298.             $part->setLockedUser(null);
  299.             $em->flush();
  300.             $data['message']='Nueva orden creada';
  301.             $data['reference']=$order->getRef();
  302.             $data['path_name']='order_show';
  303.             $data['path_parameters']='id:'.$order->getId();
  304.             //Notificaciones - cliente
  305.             $this->util->notifications($order->getCompany(), 3$data$this->getUser(), $order->getId());
  306.             if(!$roleClient && $order->getCompany()!=$order->getSupplier()->getCompany()){
  307.                 //Notificaciones - proveedor
  308.                 $this->util->notifications($order->getSupplier()->getCompany(), 3$data$this->getUser(), $order->getId());
  309.             }                
  310.         } catch ( UniqueConstraintViolationException $e) {
  311.             $result['error']=true;
  312.             $result['msg'] = $this->translator->trans('Ya existe una orden de trabajo para esta pieza');
  313.         }
  314.         return $result;
  315.     }
  316.     /**
  317.      * @Route({"en": "/show/{id}",
  318.      *         "es": "/mostrar/{id}"}, name="order_show", methods={"GET","POST"})
  319.      */
  320.     public function show(Request $requestOrder $orderOrderRepository $orderRepository): Response
  321.     {
  322.         $this->denyAccessUnlessGranted(OrderVoter::VIEW$order);
  323.         $em $em $this->em;
  324.         $fs = new Filesystem();
  325.         $slugger = new AsciiSlugger();
  326.         $ds DIRECTORY_SEPARATOR;
  327.         $ordersDir $this->getParameter('kernel.project_dir').$ds.'public'.$ds.'orders';
  328.         $user $this->getUser();
  329.         $role $user->getRole();
  330.         $fileMaxsizes $this->util->getCompanyFileMaxsizes($order->getPart()->getCompany());
  331.         //Formulario envío de presupuesto
  332.         $formBudget $this->createForm(OrderBudgetType::class, $order, ['user' => $user'file_maxsizes' => $fileMaxsizes]);
  333.         
  334.         //Formulario observaciones y carga archivos proveedor
  335.         $form $this->createForm(OrderSupplierType::class, $order, ['user' => $user'part' => $order->getPart(), 'file_maxsizes' => $fileMaxsizes]);
  336.         if(in_array($role,['ROLE_SUPPLIER_CHIEF','ROLE_SUPPLIER'])){
  337.             //Formulario envío de presupuesto
  338.             $formBudget->handleRequest($request);
  339.             if($formBudget->isSubmitted()){
  340.                 if($formBudget->isValid()){
  341.                     $files $request->files->get('order_budget')['files_budget'];
  342.                     $payTermsId $form->getData()->getPaymentTermsId();
  343.                     $filenames = !empty($order->getFilesBudget()) ? explode(',',$order->getFilesBudget()) : [];
  344.                     $filesLimit 5;
  345.                     if(count($files)>0){        
  346.                         try {
  347.                             if(!$fs->exists($ordersDir)){
  348.                                 $fs->mkdir($ordersDir);
  349.                             }
  350.                             foreach($files as $file)
  351.                             {
  352.                                 $originalFilename pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
  353.                                 $safeFilename $slugger->slug($originalFilename);
  354.                                 $newFilename $safeFilename.'-budget-'.uniqid().'.'.$file->getClientOriginalExtension();
  355.                                 if(!in_array($newFilename,$filenames)){
  356.                                     $filenames[]=$newFilename;                            
  357.                                     if(count($filenames)>$filesLimit){
  358.                                         $this->addFlash('warning'$this->translator->trans('Se excedió el ḿaximo de archivos que se pueden cargar'));
  359.                                         break;
  360.                                     }
  361.                                     else{
  362.                                         $file->move($ordersDir$newFilename);
  363.                                         $order->setFilesBudget(implode(',',$filenames));
  364.                                     }
  365.                                 } 
  366.                             }
  367.                         }
  368.                         catch (FileException $e) {
  369.                             $this->addFlash('danger'$this->translator->trans('Fallo en la carga de fichero'));
  370.                         }
  371.                         catch (IOExceptionInterface $e) {
  372.                             $this->addFlash('danger'$this->translator->trans('No se ha podido generar el directorio').' : '.$e->getPath());
  373.                         }
  374.                     }
  375.                     $order->setState(1);
  376.                     $order->setBudgetDate(new \DateTime());
  377.                     $order->markAsAproved();
  378.                     $order->setPaymentTerms($orderRepository->getPaymentTermsText($payTermsId));
  379.                     $em->persist($order);
  380.                     $em->flush();
  381.                     $this->addFlash('success'$this->translator->trans('Presupuesto enviado correctamente'));
  382.                     
  383.                     return $this->redirectToRoute('order_index');
  384.                 }
  385.                 else{
  386.                     $this->addFlash('danger'$this->translator->trans('Ha habido un error al procesar el formulario, revise los campos'));
  387.                 }
  388.             }                
  389.             
  390.             //Formulario observaciones y carga archivos proveedor
  391.             $form->handleRequest($request);
  392.             if($form->isSubmitted()){
  393.                 if($form->isValid()){
  394.                     $obs $request->get('order_supplier');
  395.                     $files $request->files->get('order_supplier')['files'];
  396.                     $filenames = !empty($order->getFilesSupplier()) ? explode(',',$order->getFilesSupplier()) : [];
  397.                     $filesLimit 5;
  398.                     if(count($files)>0){        
  399.                         try {
  400.                             if(!$fs->exists($ordersDir)){
  401.                                 $fs->mkdir($ordersDir);
  402.                             }
  403.                             foreach($files as $file)
  404.                             {
  405.                                 $originalFilename pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
  406.                                 $safeFilename $slugger->slug($originalFilename);
  407.                                 $newFilename $safeFilename.'-report-'.uniqid().'.'.$file->getClientOriginalExtension();
  408.                                 if(!in_array($newFilename,$filenames)){
  409.                                     $filenames[]=$newFilename;                            
  410.                                     if(count($filenames)>$filesLimit){
  411.                                         $this->addFlash('warning'$this->translator->trans('Se excedió el ḿaximo de archivos que se pueden cargar'));
  412.                                         break;
  413.                                     }
  414.                                     else{
  415.                                         $file->move($ordersDir$newFilename);
  416.                                         $order->setFilesSupplier(implode(',',$filenames));
  417.                                     }
  418.                                 } 
  419.                             }
  420.                         }
  421.                         catch (FileException $e) {
  422.                             $this->addFlash('danger'$this->translator->trans('Fallo en la carga de fichero'));
  423.                         }
  424.                         catch (IOExceptionInterface $e) {
  425.                             $this->addFlash('danger'$this->translator->trans('No se ha podido generar el directorio').' : '.$e->getPath());
  426.                         }
  427.                     }
  428.                     $em->persist($order);
  429.                     $em->flush();
  430.                     $this->addFlash('success'$this->translator->trans('Orden editada correctamente'));
  431.                     
  432.                     return $this->redirectToRoute('order_show',['id'=>$order->getId()]);
  433.                 }
  434.                 else{
  435.                     $this->addFlash('danger'$this->translator->trans('Ha habido un error al procesar el formulario, revise los campos'));
  436.                 }
  437.             }                
  438.             if($request->query->has('rm')){
  439.                 $type $request->query->has('type') && $request->query->get('type')==2;
  440.                 $filenames =  explode(',',($type==$order->getFilesBudget() : $order->getFilesSupplier()));
  441.                 $index $request->query->get('rm');
  442.                 if(!empty($filenames[$index])){
  443.                     $fileToRemove $filenames[$index];
  444.                     if($fs->exists($ordersDir.$ds.$fileToRemove)){
  445.                         try {
  446.                             $fs->remove($ordersDir.$ds.$fileToRemove);
  447.                             unset($filenames[$index]);
  448.                             if($type==1){
  449.                                 $order->setFilesBudget(implode(',',$filenames));
  450.                             }
  451.                             else{
  452.                                 $order->setFilesSupplier(implode(',',$filenames));
  453.                             }
  454.                             
  455.                             $em->flush();                            
  456.                             $this->addFlash('success'$this->translator->trans('Archivo eliminado correctamente'));
  457.                         } catch (IOExceptionInterface $exception) {
  458.                             $this->addFlash('danger',$this->translator->trans('No se ha podido eliminar el archivo'));
  459.                         }
  460.                     }                
  461.                 }
  462.                 return $this->redirectToRoute('order_show',['id'=>$order->getId()]);
  463.                 
  464.             }
  465.         } 
  466.         if($request->query->get('download')){
  467.             $url $this->generateUrl('order_show',['id'=>$order->getId()], UrlGeneratorInterface::ABSOLUTE_URL);
  468.             $qr $this->util->generateQrCode($url);
  469.             if($request->query->get('download')==1){
  470.                 $options = [
  471.                     'page-size' => 'A6',
  472.                     'orientation'=>'Landscape'
  473.                 ];
  474.     
  475.                 $html =$this->renderView('order/pdf/tag.html.twig', [
  476.                     'order' => $order,
  477.                     'qr' => $qr,
  478.                     'user' => $user
  479.                 ]);
  480.                 return new PdfResponse(
  481.                     $this->pdf->getOutputFromHtml($html$options),
  482.                     $order->getRef().'_'.$this->translator->trans('etiqueta').'.pdf'
  483.                 );
  484.                     
  485.             }
  486.             else{
  487.                 $header $this->renderView'order/pdf/report_header.html.twig',[
  488.                     'order' => $order,
  489.                     'partByCat' => $this->partService->getPartByCat($order->getPart()),
  490.                     'qr' => $qr,
  491.                     'preview' => $order->getPart()->getFilePreview() ? $this->partDir DIRECTORY_SEPARATOR $order->getPart()->getFilePreview() : '',
  492.                     'user' => $user
  493.                 ] );
  494.                 
  495.                 $footer $this->renderView'order/pdf/report_footer.html.twig',[
  496.                     'order' => $order,
  497.                     'partByCat' => $this->partService->getPartByCat($order->getPart()),
  498.                     'qr' => $qr,
  499.                     'user' => $user
  500.                 ] );
  501.     
  502.                 $options = [
  503.                     'header-html' => $header,
  504.                     'footer-html' => $footer,
  505.                     'page-size' => 'A4'
  506.                 ];
  507.     
  508.                 $html =$this->renderView('order/pdf/report.html.twig', [
  509.                     'order' => $order,
  510.                     'sum' => $this->orderService->getOrderSummary($order),
  511.                     'partByCat' => $this->partService->getPartByCat($order->getPart()),
  512.                     'qr' => $qr,
  513.                     'user' => $user
  514.                 ]);
  515.                 return new PdfResponse(
  516.                     $this->pdf->getOutputFromHtml($html$options),
  517.                     $order->getRef().'_'.$this->translator->trans('hoja_produccion').'.pdf'
  518.                 );
  519.             }            
  520.         }
  521.         if ($request->getMethod()=='POST') {
  522.             if ($this->isCsrfTokenValid('initiate'.$order->getId(), $request->request->get('_token'))) {
  523.                 $said $request->request->get('shipping_address');
  524.                 $type $request->request->get('request_order') ? 2;
  525.                 if($type==1){
  526.                     if($said>0){
  527.                         $shipping_address $em->getRepository(CompanyAddress::class)->find($said);
  528.                         $order->setShippingAddress($shipping_address);
  529.                     }
  530.     
  531.                     $order->setState(0);
  532.                 }
  533.                 else{
  534.                     $order->setState(6);
  535.                     $order->setRejectUser($user);
  536.                     $order->setRejectDate(new \DateTime());
  537.                 }
  538.                 
  539.                 $order->markAsAproved(); //updated
  540.                 $em->flush();
  541.                 
  542.                 $data['message']='Orden de cliente solicitada';
  543.                 $data['reference']=$order->getRef();
  544.                 $data['path_name']='order_show';
  545.                 $data['path_parameters']='id:'.$order->getId();
  546.     
  547.                 //Notificaciones - cliente
  548.                 $this->util->notifications($order->getCompany(), 3$data$this->getUser(), $order->getId());
  549.                 if($order->getCompany()!=$order->getSupplier()->getCompany()){
  550.                     //Notificaciones - proveedor
  551.                     $this->util->notifications($order->getSupplier()->getCompany(), 3$data$this->getUser(), $order->getId());
  552.                 }
  553.                     
  554.                 $this->addFlash('success'$this->translator->trans('Orden de cliente solicitada'));
  555.                 
  556.                 return $this->redirectToRoute('order_index');
  557.             }
  558.         }
  559.         $addresses null;
  560.         if($order->getState()==7){
  561.             $addresses $em->createQueryBuilder()
  562.                 ->select('ca')
  563.                 ->from(CompanyAddress::class,'ca')
  564.                 ->where("ca.company = {$order->getPart()->getSupplier()->getCompany()->getId()}")
  565.                 ->orderBy('ca.name''ASC')->getQuery()->getResult();
  566.         }            
  567.         return $this->render('order/show.html.twig', [
  568.             'order' => $order,
  569.             'cs' => $em->getRepository(CompanySupplier::class)->findOneBy(['company'=>$order->getCompany(),'supplier'=>$order->getSupplier()]),
  570.             'user' => $user,
  571.             'fileMaxsizes' => $fileMaxsizes,
  572.             'form' => $form $form->createView() : null,
  573.             'formBudget' => $formBudget->createView(),
  574.             'addresses' => $addresses,
  575.             'navbarTitle' => $this->translator->trans("Orden de trabajo").' - '.$order->getRef()
  576.         ]);
  577.             
  578.     }
  579.     /**
  580.      * @Route({"en": "/edit/{id}/{part}",
  581.      *         "es": "/editar/{id}/{part}"}, name="order_edit", methods={"GET","POST"})
  582.      */
  583.     public function edit(Request $requestOrder $orderPart $part): Response
  584.     {
  585.         $this->denyAccessUnlessGranted(OrderVoter::EDIT$order);
  586.         $admin $this->getUser();
  587.         $form $this->createForm(OrderType::class, $order, ['user_admin' => $admin'part' => $part]);
  588.         $form->handleRequest($request);
  589.         if ($form->isSubmitted() && $form->isValid()) {
  590.             $order->markAsAproved();
  591.             $this->em->flush();
  592.             $this->addFlash('success'$this->translator->trans('Orden editada correctamente'));
  593.             return $this->redirectToRoute('order_index');
  594.         }
  595.         return $this->render('order/edit.html.twig', [
  596.             'order' => $order,
  597.             'form' => $form->createView(),
  598.             'user' => $this->getUser(),
  599.             'navbarTitle' => $this->translator->trans("Editar orden").' - '.$order->getRef()
  600.         ]);
  601.     }
  602.     /**
  603.      * @Route({"en": "/accept/{id}",
  604.      *         "es": "/aceptar/{id}"}, name="order_accept", methods={"POST"})
  605.      */
  606.     public function accept(Request $requestMailerInterface $mailerOrder $orderOrderRepository $orderRepository): Response
  607.     {
  608.         $this->denyAccessUnlessGranted(OrderVoter::ACCEPT$order);
  609.         if ($this->isCsrfTokenValid('accept'.$order->getId(), $request->request->get('_token'))) {
  610.             $entityManager $this->em;
  611.             $user $this->getUser();
  612.             $role $user->getRole();
  613.             $currentState $order->getState();
  614.             if(!in_array($order->getState(),[1,2])){
  615.                 $this->addFlash('danger'$this->translator->trans('El presupuesto ya estaba aceptado'));
  616.                 return $this->redirectToRoute('order_index');
  617.             }
  618.             if($order->getState()==&& $order->getChiefConfirm() && $role=='ROLE_USER'){
  619.                 $this->addFlash('danger'$this->translator->trans('Requiere confirmación del usuario administrador'));
  620.                 return $this->redirectToRoute('order_index'); 
  621.             }
  622.             $state $order->getState() == 3;
  623.             $acceptRef=null;
  624.             if($state==3){
  625.                 $acceptRef $orderRepository->getNewAcceptRef($order->getCompany());
  626.             }
  627.             $order->setState($state);
  628.             $order->setAcceptRef($acceptRef);
  629.             $order->markAsAproved();
  630.             $order->setApproveDate(new \DateTime());
  631.             if($role=='ROLE_USER'){
  632.                 $order->setApproveUserUser($user);
  633.                 $order->setApproveUserDate(new \DateTime());
  634.             }
  635.             else{
  636.                 $order->setApproveChiefUser($user);
  637.                 $order->setApproveChiefDate(new \DateTime());
  638.             }
  639.             $entityManager->persist($order);
  640.             $entityManager->flush();
  641.             if($state==3){
  642.                 try {
  643.                     //Si existen archivos encriptados se les asignan los grants correspondientes
  644.                     $this->encryptDecryptService->encryptPartGrants($order->getPart(), $order->getUnits());
  645.                 } catch (\Exception $e) {   
  646.                     $this->addFlash('warning'$e->getMessage());
  647.                 }
  648.             }
  649.             $adminEmail $this->em->getRepository(User::class)->findOneBy(['role' => 'ROLE_ADMIN'])->getEmail();
  650.             $email = (new TemplatedEmail())
  651.             ->from(new Address($this->emailApp'Addvance3D'))
  652.             ->to($adminEmail)
  653.             ->addTo($order->getUser()->getEmail())
  654.             ->subject('Orden de trabajo aceptada')
  655.             ->htmlTemplate('order/email/acceptedEmail.html.twig')
  656.             ->context([                
  657.                 'order' => $order,
  658.                 'user' => $user
  659.             ]); 
  660.             $mailer->send($email);
  661.             $this->addFlash('success'$this->translator->trans('Presupuesto aceptado'));
  662.                 
  663.             $data['message']='Presupuesto aceptado';
  664.             $data['reference']=$order->getRef();
  665.             $data['path_name']='order_show';
  666.             $data['path_parameters']='id:'.$order->getId();
  667.             //Notificaciones - cliente
  668.             $this->util->notifications($order->getCompany(), 3$data$this->getUser(), $order->getId());
  669.             if($order->getCompany()!=$order->getSupplier()->getCompany() && $state==3){
  670.                 //Notificaciones - proveedor
  671.                 $this->util->notifications($order->getSupplier()->getCompany(), 3$data$this->getUser(), $order->getId());
  672.             }
  673.         }
  674.         return $this->redirectToRoute('order_index');
  675.     }
  676.     /**
  677.      * @Route({"en": "/accept/supplier/{id}",
  678.      *         "es": "/aceptar/proveedor/{id}"}, name="order_accept_supplier", methods={"POST"})
  679.      */
  680.     public function acceptSupplier(Request $requestMailerInterface $mailerOrder $orderOrderRepository $orderRepository): Response
  681.     {
  682.         $this->denyAccessUnlessGranted(OrderVoter::ACCEPT_SUPPLIER$order);
  683.         if ($this->isCsrfTokenValid('accept'.$order->getId(), $request->request->get('_token'))) {
  684.             $entityManager $this->em;
  685.             $user $this->getUser();
  686.             $role $user->getRole();
  687.             $currentState $order->getState();
  688.             if ($currentState==0)
  689.             {
  690.                 $acceptRef $orderRepository->getNewAcceptRef($order->getCompany());
  691.                 $order->setState(3);
  692.                 $order->setAcceptRef($acceptRef);
  693.                 $order->markAsAproved();
  694.                 $order->setApproveSupplierUser($user);
  695.                 $order->setApproveSupplierDate(new \DateTime());
  696.                 $order->setApproveDate(new \DateTime());
  697.                 $entityManager->persist($order);
  698.                 $entityManager->flush();
  699.                 try {
  700.                     //Si existen archivos encriptados se les asignan los grants correspondientes
  701.                     $this->encryptDecryptService->encryptPartGrants($order->getPart(), $order->getUnits());
  702.                 } catch (\Exception $e) {   
  703.                     $this->addFlash('warning'$e->getMessage());
  704.                 }
  705.                 $adminEmail $this->em->getRepository(User::class)->findOneBy(['role' => 'ROLE_ADMIN'])->getEmail();
  706.                 $email = (new TemplatedEmail())
  707.                 ->from(new Address($this->emailApp'Addvance3D'))
  708.                 ->to($adminEmail)
  709.                 ->addTo($order->getUser()->getEmail())
  710.                 ->subject('Orden de trabajo aceptada')
  711.                 ->htmlTemplate('order/email/acceptedEmail.html.twig')
  712.                 ->context([                
  713.                     'order' => $order,
  714.                     'user' => $user
  715.                 ]); 
  716.                 $mailer->send($email);
  717.                 $this->addFlash('success'$this->translator->trans('Orden de trabajo aceptada'));
  718.                 
  719.                 $data['message']='Orden de trabajo aceptada';
  720.                 $data['reference']=$order->getRef();
  721.                 $data['path_name']='order_show';
  722.                 $data['path_parameters']='id:'.$order->getId();
  723.                 //Notificaciones - cliente
  724.                 $this->util->notifications($order->getCompany(), 3$data$this->getUser(), $order->getId());
  725.                 if($order->getCompany()!=$order->getSupplier()->getCompany()){
  726.                     //Notificaciones - proveedor
  727.                     $this->util->notifications($order->getSupplier()->getCompany(), 3$data$this->getUser(), $order->getId());
  728.                 }
  729.             }else{
  730.                 $this->addFlash('danger'$this->translator->trans('La orden de trabajo ya estaba aceptada'));
  731.             }       
  732.         }
  733.         return $this->redirectToRoute('order_index');
  734.     }
  735.     /**
  736.      * @Route({"en": "/reject/{id}",
  737.      *         "es": "/rechazar/{id}"}, name="order_reject", methods={"POST"})
  738.      */
  739.     public function reject(Request $requestMailerInterface $mailerOrder $order): Response
  740.     {
  741.         $this->denyAccessUnlessGranted(OrderVoter::REJECT$order);
  742.         if ($this->isCsrfTokenValid('reject'.$order->getId(), $request->request->get('_token'))) {
  743.             $entityManager $this->em;
  744.             $user $this->getUser();
  745.             $role $user->getRole();
  746.             $currentState $order->getState();
  747.             if ($currentState!=6)
  748.             {
  749.                 $order->setState(6);
  750.                 $order->markAsAproved();
  751.                 $order->setRejectUser($user);
  752.                 $order->setRejectDate(new \DateTime());
  753.                 
  754.                 $entityManager->persist($order);
  755.                 $entityManager->flush();
  756.                 $adminEmail $this->em->getRepository(User::class)->findOneBy(['role' => 'ROLE_ADMIN'])->getEmail();
  757.                 $email = (new TemplatedEmail())
  758.                 ->from(new Address($this->emailApp'Addvance3D'))
  759.                 ->to($adminEmail)
  760.                 ->addTo($order->getUser()->getEmail())
  761.                 ->subject('Orden de trabajo rechazada')
  762.                 ->htmlTemplate('order/email/rejectedEmail.html.twig')
  763.                 ->context([                
  764.                     'order' => $order,
  765.                 ]); 
  766.                 $mailer->send($email);
  767.                 $this->addFlash('success'$this->translator->trans('Presupuesto rechazado'));
  768.                 $data['message']='Presupuesto rechazado';
  769.                 $data['reference']=$order->getRef();
  770.                 $data['path_name']='order_show';
  771.                 $data['path_parameters']='id:'.$order->getId();
  772.                 //Notificaciones - cliente
  773.                 $this->util->notifications($order->getCompany(), 3$data$this->getUser(), $order->getId());
  774.                 if($order->getCompany()!=$order->getSupplier()->getCompany()){
  775.                     //Notificaciones - proveedor
  776.                     $this->util->notifications($order->getSupplier()->getCompany(), 3$data$this->getUser(), $order->getId());
  777.                 }
  778.             }else{
  779.                 $this->addFlash('danger'$this->translator->trans('El presupuesto ya estaba rechazado'));
  780.             }       
  781.         }
  782.         return $this->redirectToRoute('order_index');
  783.     }
  784.     /**
  785.      * @Route("/bulk/accept_reject", name="order_bulk_accept_reject", methods={"POST"})
  786.      */
  787.     public function bulk(Request $requestMailerInterface $mailerOrderRepository $orderRepository): Response
  788.     {
  789.         if ($this->isCsrfTokenValid('bulk_accept_reject'$request->request->get('_token'))) {
  790.             $em $this->em;
  791.             $user $this->getUser();
  792.             $role $user->getRole();
  793.             $state $request->request->get('type') == 6;
  794.             $orders explode(',',$request->request->get('orders'));
  795.             if ($this->isGranted('ROLE_USER') && !empty($state) && !empty($orders))
  796.             {
  797.                 $lastSupplierId=null;
  798.                 $acceptRef=null;
  799.                 $ordersRef=[];
  800.                 foreach($orders as $oid){
  801.                     $order $em->getRepository(Order::class)->find($oid);                    
  802.                     $order->setState($state);
  803.                     $order->markAsAproved();
  804.                     if($state==3){
  805.                         $order->setApproveDate(new \DateTime());
  806.                         if($role=='ROLE_USER'){
  807.                             $order->setApproveUserUser($user);
  808.                             $order->setApproveUserDate(new \DateTime());
  809.                         }
  810.                         else{
  811.                             $order->setApproveChiefUser($user);
  812.                             $order->setApproveChiefDate(new \DateTime());
  813.                         }
  814.                     }
  815.                     else{
  816.                         $order->setRejectUser($user);
  817.                         $order->setRejectDate(new \DateTime());
  818.                     }
  819.                     if($state==&& empty($acceptRef)){
  820.                         $acceptRef $orderRepository->getNewAcceptRef($order->getCompany());
  821.                     }
  822.                     
  823.                     $order->setAcceptRef($acceptRef);
  824.                     if(empty($lastSupplierId)){
  825.                         $lastSupplierId $order->getSupplier()->getId();
  826.                     }
  827.                     elseif($lastSupplierId != $order->getSupplier()->getId()){
  828.                         $lastSupplierId null;
  829.                         break;
  830.                     }
  831.                     $ordersRef[]=$order->getRef();
  832.                 }
  833.                 
  834.                 if(!empty($lastSupplierId)){
  835.                     $em->flush();
  836.                     
  837.                     if($state==3){
  838.                         foreach($orders as $oid){
  839.                             $order $em->getRepository(Order::class)->find($oid);                            
  840.                             try {
  841.                                 //Si existen archivos encriptados se les asignan los grants correspondientes
  842.                                 $this->encryptDecryptService->encryptPartGrants($order->getPart(), $order->getUnits());
  843.                             } catch (\Exception $e) {   
  844.                                 $this->addFlash('warning'$e->getMessage());
  845.                             }                            
  846.                         }
  847.                     }
  848.                     $subject $msgFlash $state=='Presupuestos aceptados' 'Presupuestos rechazados';
  849.                     $msgType $state=='aprobado' 'rechazado';
  850.                     $msg "El usuario {$user->getName()} {$user->getSurname()} ha $msgType los siguientes presupuestos : ";
  851.                     $msg.='<ul>';
  852.                     foreach($ordersRef as $ref){
  853.                         $msg.="<li>$ref</li>";
  854.                     }
  855.                     $msg.='</ul>';
  856.                     $adminEmail $this->em->getRepository(User::class)->findOneBy(['role' => 'ROLE_ADMIN'])->getEmail();
  857.                     $email = (new TemplatedEmail())
  858.                     ->from(new Address($this->emailApp'Addvance3D'))
  859.                     ->to($adminEmail)                    
  860.                     ->subject($this->translator->trans($subject))
  861.                     ->htmlTemplate('order/email/bulkAcceptedRejectedEmail.html.twig')
  862.                     ->context([                
  863.                         'msg' => $msg,
  864.                         'user' => $user
  865.                     ]); 
  866.                     $mailer->send($email);
  867.                     $this->addFlash('success'$this->translator->trans($msgFlash));    
  868.                     $data['message']=$msgFlash;
  869.                     
  870.                     //Notificaciones - cliente
  871.                     $this->util->notifications($order->getCompany(), 3$data$this->getUser(), $order->getId());
  872.                     if($order->getCompany()!=$order->getSupplier()->getCompany()){
  873.                         //Notificaciones - proveedor
  874.                         $this->util->notifications($order->getSupplier()->getCompany(), 3$data$this->getUser(), $order->getId());
  875.                     }
  876.                 }
  877.                 else{
  878.                     $this->addFlash('danger'$this->translator->trans('No se pueden aceptar/rechazar presupuestos de distintos centros de trabajo de forma masiva'));
  879.                 }   
  880.             }else{
  881.                 $this->addFlash('danger'$this->translator->trans('Error inesperado'));
  882.             }       
  883.         }
  884.         return $this->redirectToRoute('order_shopping');
  885.     }
  886.     /**
  887.      * @Route({"en": "/send/{id}",
  888.      *         "es": "/enviar/{id}"}, name="order_send", methods={"POST"})
  889.      */
  890.     public function send(Request $requestMailerInterface $mailerOrder $order): Response
  891.     {
  892.         $this->denyAccessUnlessGranted(OrderVoter::SEND$order);
  893.         if ($this->isCsrfTokenValid('send'.$order->getId(), $request->request->get('_token'))) {
  894.             $entityManager $this->em;
  895.             $user $this->getUser();
  896.             $role $user->getRole();
  897.             $currentState $order->getState();
  898.             if ($currentState!=4)
  899.             {
  900.                 $order->setState(4);
  901.                 $order->markAsAproved();
  902.                 $order->setSendUser($user);
  903.                 $order->setSendDate(new \DateTime());
  904.                 
  905.                 $entityManager->persist($order);
  906.                 $entityManager->flush();
  907.                 $this->addFlash('success'$this->translator->trans('Orden de trabajo enviada'));
  908.                 $data['message']='Orden de trabajo enviada';
  909.                 $data['reference']=$order->getRef();
  910.                 $data['path_name']='order_show';
  911.                 $data['path_parameters']='id:'.$order->getId();
  912.                 //Notificaciones - cliente
  913.                 $this->util->notifications($order->getCompany(), 3$data$this->getUser(), $order->getId());
  914.                 if($order->getCompany()!=$order->getSupplier()->getCompany()){
  915.                     //Notificaciones - proveedor
  916.                     $this->util->notifications($order->getSupplier()->getCompany(), 3$data$this->getUser(), $order->getId());
  917.                 }
  918.             }else{
  919.                 $this->addFlash('danger'$this->translator->trans('La orden de trabajo ya estaba enviada'));
  920.             }       
  921.         }
  922.         return $this->redirectToRoute('order_index');
  923.     }
  924.     /**
  925.      * @Route({"en": "/complete/{id}",
  926.      *         "es": "/completar/{id}"}, name="order_complete", methods={"POST"})
  927.      */
  928.     public function complete(Request $requestMailerInterface $mailerOrder $order): Response
  929.     {
  930.         $this->denyAccessUnlessGranted(OrderVoter::COMPLETE$order);
  931.         if ($this->isCsrfTokenValid('complete'.$order->getId(), $request->request->get('_token'))) {
  932.             $em $this->em;
  933.             $user $this->getUser();
  934.             $cs $em->getRepository(CompanySupplier::class)->findOneBy(['company'=>$order->getCompany(),'supplier'=>$order->getSupplier()]);
  935.             $configInDelivery $cs $cs->getConfigStepInDelivery() : true;
  936.             if ($order->getState() == || ($order->getState()==&& !$configInDelivery))
  937.             {
  938.                 $order->setState(5);
  939.                 $order->markAsCompleted();
  940.                 $order->setCompleteUser($user);
  941.                 $order->setCompleteDate(new \DateTime());
  942.                 $em->persist($order);
  943.                 $em->flush();
  944.                 $adminEmail $this->em->getRepository(User::class)->findOneBy(['role' => 'ROLE_ADMIN'])->getEmail();
  945.                 $email = (new TemplatedEmail())
  946.                 ->from(new Address($this->emailApp'Addvance3D'))
  947.                 ->to($adminEmail)
  948.                 ->subject('Orden de trabajo completada')
  949.                 ->htmlTemplate('order/email/completedEmail.html.twig')
  950.                 ->context([                
  951.                     'order' => $order,
  952.                 ]); 
  953.                 $mailer->send($email);
  954.                 $this->addFlash('success'$this->translator->trans('Orden de trabajo completada'));   
  955.                 $data['message']='Orden de trabajo completada';
  956.                 $data['reference']=$order->getRef();
  957.                 $data['path_name']='order_show';
  958.                 $data['path_parameters']='id:'.$order->getId();
  959.                 //Notificaciones - cliente
  960.                 $this->util->notifications($order->getCompany(), 3$data$this->getUser(), $order->getId());
  961.                 if($order->getCompany()!=$order->getSupplier()->getCompany()){
  962.                     //Notificaciones - proveedor
  963.                     $this->util->notifications($order->getSupplier()->getCompany(), 3$data$this->getUser(), $order->getId());
  964.                 }
  965.             }else{
  966.                 $this->addFlash('danger'$this->translator->trans('La orden debe estar en entrega'));  
  967.             }       
  968.         }
  969.         return $this->redirectToRoute('order_index');
  970.     }
  971.     /**
  972.      * @Route({"en": "/delete/{id}",
  973.      *         "es": "/borrar/{id}"}, name="order_delete", methods={"DELETE"})
  974.      */
  975.     public function delete(Request $requestOrder $order): Response
  976.     {
  977.         $this->denyAccessUnlessGranted(OrderVoter::DELETE$order);
  978.         if ($this->isCsrfTokenValid('delete'.$order->getId(), $request->request->get('_token'))) {
  979.             $rmOrder $this->rmOrder($order);
  980.             if($rmOrder['error']){
  981.                 $this->addFlash('danger'$rmOrder['msg']);
  982.             }
  983.             else{
  984.                 $this->addFlash('success'$this->translator->trans('Orden eliminada correctamente'));
  985.             }
  986.         }
  987.         return $this->redirectToRoute('order_index');
  988.     }
  989.     private function rmOrder(Order $order){
  990.         $em $this->em;
  991.         $result = ['error'=>false,'msg'=>''];
  992.         
  993.         try {
  994.             $em->remove($order);
  995.             $em->flush();
  996.         } catch (ForeignKeyConstraintViolationException $e) {
  997.             $result = ['error'=>true'msg'=>$this->translator->trans('No se puede eliminar una orden asociada')];
  998.         }
  999.         return $result;
  1000.     }
  1001.     /**
  1002.      * @Route({"en": "/shopping",
  1003.      *         "es": "/cesta"}, name="order_shopping", methods={"GET"})
  1004.      */
  1005.     public function shopping(Request $requestOrderRepository $orderRepository): Response
  1006.     {
  1007.         $admin =$this->getUser();
  1008.         if($admin == NULL){
  1009.             return $this->redirectToRoute('app_login');
  1010.         }
  1011.         $orders $orderRepository->getShoppingCar($admin);
  1012.         return $this->render('order/shopping.html.twig', [
  1013.             'orders' => $orders,
  1014.             'navbarTitle' => $this->translator->trans("Cesta")
  1015.         ]); 
  1016.     }
  1017.     /**
  1018.      * @Route("/chat/message", name="order_chat_message", methods={"POST"})
  1019.      */
  1020.     public function chatMessage(Request $requestMailerInterface $mailerOrderRepository $orderRepository): JsonResponse
  1021.     {
  1022.         $result = ['error'=>false,'msg'=>'','data'=>[]];
  1023.         $em $this->em;
  1024.         $user $this->getUser();
  1025.         $type $request->request->get('type',1); //1:Read, 2:Send/read
  1026.         $message $request->request->get('message');
  1027.         $oid $request->request->get('oid');
  1028.         
  1029.         if (empty($oid) || empty($user))
  1030.         {
  1031.             $result = ['error'=>true,'msg'=>$this->translator->trans("Error inesperado")];
  1032.         }
  1033.         elseif($type==&& empty($message)){
  1034.             $result = ['error'=>true,'msg'=>$this->translator->trans("El mensaje no puede estar vacío")];
  1035.         }
  1036.         else{    
  1037.             $order $em->getRepository(Order::class)->find($oid);
  1038.             if(empty($order)){
  1039.                 $result = ['error'=>true,'msg'=>$this->translator->trans("Error inesperado")];
  1040.             }
  1041.             else{
  1042.                 if($type==2){
  1043.                     $om = new OrderMessage();
  1044.                     $om->setOrder($order);
  1045.                     $om->setUser($user);
  1046.                     $om->setDateAdded(new \DateTime());
  1047.                     $om->setMessage($message);
  1048.                     $em->persist($om);
  1049.                     $em->flush();
  1050.                     $messages $em->getRepository(OrderMessage::class)->findBy(['order_'=>$order,'user'=>$user],['date_added'=>'DESC'],2);
  1051.                     if(count($messages)<|| ($messages[0]->getDateAdded()->format('U') - $messages[1]->getDateAdded()->format('U') > 300)){
  1052.                         $data['message']='Nuevo mensaje de chat';
  1053.                         $data['reference']=$order->getRef();
  1054.                         $data['path_name']='order_show';
  1055.                         $data['path_parameters']='id:'.$order->getId();
  1056.                         if($user->getCompany()->getType()==2){
  1057.                             //Msg generado por proveedor, Notificaciones - cliente
  1058.                             $this->util->notifications($order->getCompany(), 3$data$this->getUser(), $order->getId());
  1059.                         }
  1060.                         else{
  1061.                             //Msg generado por proveedor, Notificaciones - proveedor
  1062.                             $this->util->notifications($order->getSupplier()->getCompany(), 3$data$this->getUser(), $order->getId());
  1063.                         }                        
  1064.                     }                    
  1065.                 }
  1066.                 $messages $qb $em->createQueryBuilder()
  1067.                                 ->select('o,u,om')
  1068.                                 ->from(OrderMessage::class,'om')
  1069.                                 ->join('om.order_','o')
  1070.                                 ->join('om.user','u')
  1071.                                 ->where('om.order_ = :order')
  1072.                                 ->orderBy('om.date_added','ASC')
  1073.                                 ->setParameters(['order'=>$order])
  1074.                                 ->getQuery()->getArrayResult();
  1075.                 $result['data']=$messages;
  1076.             }
  1077.             
  1078.         }      
  1079.         return new JsonResponse($result);
  1080.     }
  1081.     /**
  1082.      * @Route({"en": "/export/{id}",
  1083.      *         "es": "/exportar/{id}"}, defaults={"id" = null}, name="order_export", methods={"GET"})
  1084.      */
  1085.     public function export(OrderRepository $orderRepositoryOrder $order null)
  1086.     {
  1087.         $trans $this->translator;
  1088.         if (null !== $order)
  1089.         {
  1090.             $filename $trans->trans("AD2_orden_"). $order->getRef() . '_' time() . ".xlsx";
  1091.         }else
  1092.         {
  1093.             $filename $trans->trans("AD2_ordenes_"). time() . ".xlsx";
  1094.         }
  1095.         $admin =$this->getUser();
  1096.         $company $admin->getCompany();
  1097.         $colorARGB $company && $company->getCorporateColor() ? str_replace('#','',$company->getCorporateColor()) : 'DD9933';
  1098.         $spreadsheet = new Spreadsheet();
  1099.         $sheet $spreadsheet->getActiveSheet();
  1100.         //$sheet->setTitle('Addvance Users');
  1101.         $sheet->getCell('A1')->setValue($trans->trans('Referencia orden'));
  1102.         $sheet->getCell('B1')->setValue($trans->trans('Empresa'));
  1103.         $sheet->getCell('C1')->setValue($trans->trans('Pieza'));
  1104.         $sheet->getCell('D1')->setValue($trans->trans('Referencia pieza'));
  1105.         $sheet->getCell('E1')->setValue($trans->trans('Centro de trabajo'));
  1106.         $sheet->getCell('F1')->setValue($trans->trans('Unidades'));
  1107.         $sheet->getCell('G1')->setValue($trans->trans('Estado'));
  1108.         $sheet->getCell('H1')->setValue($trans->trans('Pedido'));
  1109.         $sheet->getCell('I1')->setValue($trans->trans('Autor'));
  1110.         $sheet->getCell('J1')->setValue($trans->trans('Fecha de creación'));
  1111.         $sheet->getCell('K1')->setValue($trans->trans('Fecha Revisión'));
  1112.         $sheet->getCell('L1')->setValue($trans->trans('Fecha de finalización'));
  1113.         $sheet->getCell('M1')->setValue($trans->trans('Observaciones'));
  1114.         $styleArrayFirstRow = [
  1115.             'font' => [
  1116.                 'bold' => true,
  1117.                 'color' => array('rgb' => 'FFFFFF'),
  1118.             ]
  1119.         ];
  1120.         $highestColumn $sheet->getHighestColumn();
  1121.         $sheet->getStyle('A1:M1')->applyFromArray($styleArrayFirstRow);
  1122.         //$sheet->getStyle('A')->applyFromArray($styleArrayFirstRow);
  1123.         //$sheet->getColumnDimension('A')->setWidth(30);
  1124.         //$sheet->getStyle('A')->getFont()->setBold(true);
  1125.         $sheet->getDefaultColumnDimension()->setWidth(30);
  1126.         $sheet
  1127.             ->getStyle('A1:M1')
  1128.             ->getFill()
  1129.             ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
  1130.             ->getStartColor()
  1131.             ->setARGB($colorARGB);
  1132.         if (null!== $order)
  1133.         {
  1134.             $sheet->fromArray($orderRepository->generateExport($admin$order),null'A2'true);
  1135.         }else
  1136.         {
  1137.             $sheet->fromArray($orderRepository->generateExport($admin),null'A2'true);
  1138.         }
  1139.         $writer = new Xlsx($spreadsheet);
  1140.         $response =  new StreamedResponse(
  1141.             function () use ($writer) {
  1142.                 $writer->save('php://output');
  1143.             }
  1144.         );
  1145.         $response->headers->set('Content-Type''application/vnd.ms-excel');
  1146.         $response->headers->set('Content-Disposition''attachment;filename="'.$filename.'"');
  1147.         $response->headers->set('Cache-Control','max-age=0');
  1148.         return $response;
  1149.     }
  1150. }