src/Controller/MontagemController.php line 573

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use App\Entity\LojasRevendaSincronizacaoNovo;
  5. use App\Entity\ProdutoBlingWp;
  6. use App\Entity\ProdutoBling;
  7. use App\Entity\EntregaPedido;
  8. use App\Entity\ProdutoPedido;
  9. use App\Entity\DemandaPedido;
  10. use App\Entity\ItemSeparacaoDemanda;
  11. use App\Entity\User;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\HttpFoundation\Response;
  14. use Symfony\Component\Routing\Annotation\Route;
  15. use Symfony\Component\HttpFoundation\JsonResponse;
  16. use Symfony\Contracts\HttpClient\HttpClientInterface;
  17. class MontagemController extends BaseController
  18. {
  19.     
  20.     /**
  21.      * @Route("/gestao-montagem/transferencia", name="transferencia_demanda", methods={"POST"})
  22.      */
  23.     public function transferirDemanda(Request $request): Response
  24.     {
  25.         $data json_decode($request->getContent(), false);
  26.         $demanda $this->getDoctrine()->getRepository(DemandaPedido::class)->find($data->id);
  27.         
  28.         $destino = ($data->destino=='co') ? 'sj' 'co';
  29.         
  30.         if(!$demanda instanceof DemandaPedido) {
  31.             return new JsonResponse([], 400);
  32.         }
  33.         
  34.         if($demanda->getStatus()!=='pendente') {
  35.             return new JsonResponse(['mensagem'=>'Somente demanda pendente pode ser transferido!'], 400);
  36.         }
  37.         
  38.         // Verifica se esta demanda já não existe neste local de destino;
  39.         $demandaNoDestino $this->getDoctrine()->getRepository(DemandaPedido::class)->findOneBy([
  40.         'local' => $destino,
  41.         'pedido' => $demanda->getPedido()
  42.         ]);
  43.         
  44.         if($demandaNoDestino instanceof DemandaPedido) {
  45.             return new JsonResponse(['mensagem'=>'Esta demanda já existe no destino'], 400);
  46.         }
  47.         
  48.         if($data->manter=='nao') { // Mudar o local somente
  49.             
  50.             $demanda->setLocal($destino);
  51.             
  52.         } else { // Criar uma nova demanda para o outro local
  53.             
  54.             $novaDemanda = clone $demanda;
  55.             $novaDemanda->setLocal($destino);
  56.             
  57.             $this->getDoctrine()->getManager()->persist($novaDemanda);
  58.         }
  59.         
  60.         $this->getDoctrine()->getManager()->flush();
  61.         
  62.         return new JsonResponse([], 200);
  63.     }
  64.     
  65.     /**
  66.      * @Route("/gestao-montagem-json/salvar-assinatura", name="salvar_assintura", methods={"POST"})
  67.      */
  68.     public function salvarAssinatura(Request $request): Response
  69.     {
  70.         $data json_decode($request->getContent(), false);
  71.         $demanda $this->getDoctrine()->getRepository(DemandaPedido::class)->find($data->id);
  72.         
  73.         if(!$demanda instanceof DemandaPedido) {
  74.             return new JsonResponse([], 400);
  75.         }
  76.         
  77.         $imageData base64_decode($data->assinatura);
  78.         
  79.         $fileNameOriginal "demanda_{$demanda->getId()}uniqid() . '.png';
  80.         $fileName '/www/wwwroot/gestor.moveispollo.com.br/public/assinaturas-pedidos/' $fileNameOriginal;
  81.         $fileNameNf '/www/wwwroot/gestor.moveispollo.com.br/public/img_notas/' $fileNameOriginal;
  82.         
  83.         file_put_contents($fileName$imageData);
  84.         file_put_contents($fileNameNf$imageData);
  85.         
  86.         $demanda->setAssinatura($fileNameOriginal);
  87.         $demanda->setAssinadoAt(new \DateTime());
  88.         
  89.         $this->getDoctrine()->getManager()->flush();
  90.         
  91.         return new JsonResponse(['img'=>$fileNameOriginal], 200);
  92.         
  93.     }
  94.   
  95.     /**
  96.      * @Route("/gestao-montagem/pendencia-demanda", name="pendencia_demanda", methods={"POST"})
  97.     */
  98.     public function pendenciaDemanda(Request $request): Response
  99.     {
  100.         $data json_decode($request->getContent(), false);
  101.         $demanda $this->getDoctrine()->getRepository(DemandaPedido::class)->find($data->id);
  102.         
  103.         if(!$demanda instanceof DemandaPedido) {
  104.             return new JsonResponse([], 400);
  105.         }
  106.         
  107.         if($data->pendencia=='progresso' || $data->pendencia=='concluido'){
  108.             $demanda->setPendencia(null);
  109.         } else {
  110.             $demanda->setPendencia($data->pendencia);
  111.         }
  112.         
  113.         $this->getDoctrine()->getManager()->flush();
  114.         
  115.         return new JsonResponse([], 200);
  116.     }
  117.     
  118.     /**
  119.      * @Route("/gestao-montagem/finalizar-demanda/{id}/{status}", name="finalizar_demanda")
  120.      */
  121.     public function finalizarItemDemanda(Request $requestHttpClientInterface $client$id$status): Response
  122.     {
  123.         $demanda $this->getDoctrine()->getRepository(ItemSeparacaoDemanda::class)->find($id);
  124.         
  125.         if(!$demanda instanceof ItemSeparacaoDemanda) {
  126.             return new JsonResponse([], 400);
  127.         }
  128.         
  129.         if($demanda->getChecklist()=='concluido' || $demanda->getChecklist()==null) {
  130.             $demanda->setChecklist('pendente');
  131.         } else {
  132.             $demanda->setChecklist('concluido');
  133.         }
  134.         
  135.         $this->getDoctrine()->getManager()->flush();
  136.         
  137.         return new JsonResponse([], 200);
  138.     }
  139.     
  140.     private function listaDemandas($local$tipo)
  141.     {
  142.         $pedidosData = [];
  143.         if($tipo=='todos') {
  144.             
  145.             $demandasPendentes $this->getDoctrine()->getRepository(DemandaPedido::class)
  146.             ->findBy(['local'=>$local'status'=>'pendente'], ['clienteVaiRetirarImediatamente'=>'desc''isUrgente'=>'desc''createdAt'=>'asc']);
  147.             $demandasEsquerda $this->getDoctrine()->getRepository(DemandaPedido::class)
  148.                 ->createQueryBuilder('d')
  149.                 ->where('d.local = :local')
  150.                 //->andWhere('d.status !=:status')
  151.                 ->setParameter('local'$local)
  152.                 //->setParameter('status', 'pendente')
  153.                 ->orderBy('d.status''DESC')
  154.                 ->addOrderBy('d.id''ASC')
  155.                 ->setMaxResults(80)
  156.                 ->getQuery()
  157.                 ->getResult();
  158.                 
  159.                  // Limitar o array a apenas 50 posições
  160.                  //$demandasDireita = array_slice($demandasDireita, 0, 50);
  161.             
  162.         } else {
  163.             
  164.             $demandasPendentes $this->getDoctrine()->getRepository(DemandaPedido::class)
  165.             ->findBy(['local'=>$local'tipo'=>$tipo'status'=>'pendente'],['clienteVaiRetirarImediatamente'=>'desc''isUrgente'=>'desc''createdAt'=>'asc']);
  166.             
  167.             $demandasEsquerda $this->getDoctrine()->getRepository(DemandaPedido::class)
  168.                 ->createQueryBuilder('d')
  169.                 ->where('d.local = :local')
  170.                 ->andWhere('d.tipo = :tipo')
  171.                 ->setParameter('local'$local)
  172.                 ->setParameter('tipo'$tipo)
  173.                 ->orderBy('d.status''DESC')
  174.                 ->addOrderBy('d.id''ASC')
  175.                 ->setMaxResults(80)
  176.                 ->getQuery()
  177.                 ->getResult();
  178.         }
  179.         
  180.         $demandas $demandasPendentes $demandasEsquerda;
  181.         foreach ($demandas as $demanda) {
  182.             
  183.             
  184.             $pedidoNumero 
  185.             empty($demanda->getPedido()->getPedido()) ? 
  186.             $demanda->getPedido()->getNotaFiscal().'-NF' 
  187.             $this->replaceAssistencia($demanda->getPedido()->getPedido());
  188.             
  189.             $pedidosData[] = [
  190.                 'id' => $demanda->getId(),
  191.                 'local' => $local,
  192.                 'tipo' => $demanda->getTipo(),
  193.                 'pedido' => $pedidoNumero,
  194.                 'dataPedido' => $demanda->getCreatedAt()->format('d/m/Y'),
  195.                 'responsavel' => ($demanda->getResponsavel()=='bruno@moveispollo.com.br') ? 'BRUNO' mb_strtoupper($demanda->getResponsavel()),
  196.                 'status' => (!$demanda->getStatus()) ? 'pendente' $demanda->getStatus(),
  197.                 'cliente' => $this->abreviarNome($demanda->getPedido()->getContato()),
  198.                 'isAssistencia' => ($demanda->getPedido()->getIsAssistencia()==null) ? false $demanda->getPedido()->getIsAssistencia(),
  199.                 'obsCadastro' => $demanda->getPedido()->getObservacaoCadastro(),
  200.                 'obsProblema' => $demanda->getPedido()->getProblemaObs(),
  201.                 'montarMoveis' => $demanda->getPedido()->getMontarMoveis(),
  202.                 'embalagem' => $demanda->getPedido()->getEmbalagem(),
  203.                 'montagem' => $demanda->getPedido()->getMontagem(),
  204.                 'periodoEntrega' => $demanda->getPedido()->getPeriodoEntrega(),
  205.                 'dataEntrega' => ($demanda->getPedido()->getDataEntrega() instanceof \DateTime) ? $demanda->getPedido()->getDataEntrega()->format('d/m/Y') : 'Não informado',
  206.                 'pediodoEntrega' => $demanda->getPedido()->getPeriodoEntrega(),
  207.                 'meioEntrega' => mb_strtoupper($demanda->getPedido()->getMeioEntrega()),
  208.                 'entregarHoje' => mb_strtoupper($demanda->getPedido()->getEntregarHoje()),
  209.                 'formaPagamento' => mb_strtoupper($demanda->getPedido()->getFormaPagamento()),
  210.                 'receberNaEntrega' => mb_strtoupper($demanda->getPedido()->getReceberNaEntrega()),
  211.                 'pendencia' => (!$demanda->getPendencia()) ? 'null' mb_strtoupper($demanda->getPendencia()),
  212.                 'isUrgente' => (!$demanda->getIsUrgente()) ? false $demanda->getIsUrgente(),
  213.                 'clienteVaiRetirarImediatamente' => (!$demanda->getClienteVaiRetirarImediatamente()) ? false $demanda->getClienteVaiRetirarImediatamente(),
  214.                 'assinatura' => (!$demanda->getAssinatura()) ? '' $demanda->getAssinatura(),
  215.                 'origemMontagem' => (!$demanda->getPedido()->getOrigemMontagem()) ? '' $demanda->getPedido()->getOrigemMontagem(),
  216.                 'vendaCom' => $demanda->getPedido()->getTipoDocumento()
  217.             ];
  218.             
  219.         }
  220.         
  221.         return $pedidosData;
  222.         
  223.     }
  224.     
  225.     /**
  226.      * @Route("/gestao-montagem/finalizar/{pedido}/{tipo}/{local}", name="gestao_montagem_json_finalizar")
  227.      */
  228.     public function finalizarPedido(Request $request$pedido$tipo$local): Response
  229.     {
  230.         $demanda $this->getDoctrine()->getRepository(DemandaPedido::class)->find($pedido);
  231.         $demanda->setStatus('concluido');
  232.         $demanda->setUpdatedAt(new \DateTime());
  233.         $this->getDoctrine()->getManager()->flush();
  234.         
  235.         return new JsonResponse([], 200);
  236.     }
  237.     
  238.     /**
  239.      * @Route("/gestao-montagem/aceitar/{pedido}/{colaborador}", name="gestao_montagem_json_aceitar")
  240.      */
  241.     public function aceitarPedido(Request $request$pedido$colaborador): Response
  242.     {
  243.         
  244.         $colaboradorEntity $this->getDoctrine()->getRepository(User::class)->find($colaborador);
  245.         if(!$colaboradorEntity instanceof User){
  246.             return new JsonResponse(["colaborador nao localizado: " $colaborador], 400);
  247.         }
  248.         
  249.         $demandasEmAndamento $this->getDoctrine()->getRepository(DemandaPedido::class)->findBy([
  250.             'responsavel'=>$colaboradorEntity->getEmail(), 
  251.             'status'=>'em_andamento'
  252.             'pendencia'=>null
  253.         ]);
  254.         
  255.         if(count($demandasEmAndamento)>0) {
  256.             return new JsonResponse(['mensagem'=>'Existe pedido em andamento. Não é possível pegar outro pedido com algum em progresso.'], 400);
  257.         }
  258.         
  259.         $demanda $this->getDoctrine()->getRepository(DemandaPedido::class)->find($pedido);
  260.         $demanda->setResponsavel($colaboradorEntity->getEmail());
  261.         $demanda->setStatus('em_andamento');
  262.         $demanda->setUpdatedAt(new \DateTime());
  263.         $this->getDoctrine()->getManager()->flush();
  264.         
  265.         $this->setarAcoesSeparacaoCardPedido($demanda->getPedido()->getId(), $demanda->getTipo(), $colaboradorEntity->getEmail());
  266.         
  267.         return new JsonResponse([], 200);
  268.         
  269.     }
  270.     
  271.     private function setarAcoesSeparacaoCardPedido($idPedido$tipo$responsavel) {
  272.         
  273.         $pedido $this->getDoctrine()->getRepository(EntregaPedido::class)->find($idPedido);
  274.         
  275.         $tipoStr = ($tipo=='separacao') ? 'Separação' 'Montagem';
  276.         
  277.         if(!$pedido instanceof EntregaPedido) {
  278.             return new JsonResponse([], 400);
  279.         }
  280.         
  281.         $numeroPedido = ($pedido->getPedido()!='') ? $pedido->getPedido() : $pedido->getNotaFiscal();
  282.         
  283.         if(!$pedido->getTempoGastoSeparacao()) {
  284.             $messageBody "O Pedido / NF  *$numeroPedido* foi Aceito para *$tipoStr* pelo $responsavel.\n\nCliente: " $pedido->getContato();
  285.     
  286.             $destinatarios = ['556291089053''5562994542599'];
  287.             foreach ($destinatarios as $destinatario) {
  288.                 $this->sendMensagemViaWhatsapp("text"$destinatario$messageBodynullnullnullnull);
  289.             }
  290.         
  291.         }
  292.         
  293.         $pedido->setSeparadorAceitouAt(new \DateTime('now'));
  294.         $pedido->setSeparador($responsavel);
  295.         
  296.         //$pedido->setStatus('aceito');
  297.         
  298.         $this->getDoctrine()->getManager()->flush();
  299.         
  300.     }
  301.     
  302.     /**
  303.      * @Route("/gestao-montagem-json/detalhe/{pedido}", name="gestao_montagem_json_detalhe")
  304.      */
  305.     public function listaDetalhePedidos(Request $requestHttpClientInterface $client$pedido): Response
  306.     {
  307.        
  308.         //return new JsonResponse($this->listaDemandas($local), 200);
  309.         $demanda $this->getDoctrine()->getRepository(DemandaPedido::class)->find($pedido);
  310.         
  311.         $pedidoReplace str_replace('-Assistência',''$demanda->getPedido()->getPedido());
  312.         
  313.         $dados $this->getPedido(trim($pedidoReplace), $clienttrue$demanda->getPedido());
  314.         
  315.         //return new JsonResponse($dados, 200);
  316.         
  317.         $produtos = [];
  318.         $produtosChecklist = [];
  319.         
  320.         foreach ($dados['itens'] as $produtoPedido) {
  321.             
  322.             $produtos[] = [
  323.                 'cliente' => $this->abreviarNome($demanda->getPedido()->getContato()),
  324.                 'id' => 0,
  325.                 'img' => 'https://polo.srvtmp.com.br/uploads/produtos/' $produtoPedido['codigo'] . '.jpg',
  326.                 'codigo' => $produtoPedido['codigo'],
  327.                 'titulo' => $produtoPedido['descricao'],
  328.                 'quantidade' => str_pad($produtoPedido['quantidade'], 2"0"STR_PAD_LEFT),
  329.                 'checklist'  => 'pendente',
  330.                 'isSimples' => false,
  331.                 'isSimplesMesmo' => false
  332.             ];
  333.             
  334.         }
  335.         
  336.         foreach ($dados['estruturas'] as $prodtoEstrutura) {
  337.             
  338.             $isSimples = (bool) $prodtoEstrutura['isSimples'];
  339.             
  340.             if($isSimples) {
  341.                 
  342.                 $quantidade = ($prodtoEstrutura['quantidade']==0) ? $prodtoEstrutura['quantidade'];
  343.                 
  344.                 $produtosChecklist[] = [
  345.                     'cliente' => $this->abreviarNome($demanda->getPedido()->getContato()),
  346.                     'id' => 0,
  347.                     'img' => 'https://polo.srvtmp.com.br/uploads/produtos/' $prodtoEstrutura['codigo'] . '.jpg',
  348.                     'codigo' => $prodtoEstrutura['codigo'],
  349.                     'titulo' => $prodtoEstrutura['nome'],
  350.                     'quantidade' => str_pad($quantidade2"0"STR_PAD_LEFT),
  351.                     'checklist'  => 'pendente',
  352.                     'isSimples' => true,
  353.                     'isSimplesMesmo' => true
  354.                 ];
  355.                 
  356.             }
  357.             
  358.         }
  359.         
  360.         foreach ($dados['itens'] as $produtoPedidoNovo) {
  361.             
  362.             if($produtoPedidoNovo['estruturas']=="") {
  363.                 $quantidade = ($produtoPedidoNovo['quantidade']==0) ? $produtoPedidoNovo['quantidade'];
  364.                 $produtosChecklist[] = [
  365.                     'cliente' => $this->abreviarNome($demanda->getPedido()->getContato()),
  366.                     'id' => 0,
  367.                     'img' => 'https://polo.srvtmp.com.br/uploads/produtos/' $produtoPedidoNovo['codigo'] . '.jpg',
  368.                     'codigo' => $produtoPedidoNovo['codigo'],
  369.                     'titulo' => $produtoPedidoNovo['descricao'],
  370.                     'quantidade' => str_pad($quantidade2"0"STR_PAD_LEFT),
  371.                     'checklist'  => 'pendente',
  372.                     'isSimples' => true,
  373.                     'isSimplesMesmo' => true
  374.                 ];
  375.             }
  376.                 
  377.         }
  378.         
  379.         
  380.         
  381.         /*
  382.         
  383.         // Verifica se os produtos já não foram carregados para este pedido
  384.         $produtosPedido = $this->getDoctrine()->getRepository(ProdutoPedido::class)->findBy(['pedido'=>$demanda->getPedido()]);
  385.         $itensSeparacaoDemanda = $this->getDoctrine()->getRepository(ItemSeparacaoDemanda::class)->findBy(['pedido'=>$demanda->getPedido()]);
  386.         
  387.         if(count($produtosPedido)<=0) {
  388.             $this->loadProdutosPedido($demanda->getPedido(), $client, 'produto');
  389.             $produtosPedido = $this->getDoctrine()->getRepository(ProdutoPedido::class)->findBy(['pedido'=>$demanda->getPedido()]);
  390.         }
  391.         
  392.         if(count($itensSeparacaoDemanda)<=0) {
  393.             $this->loadProdutosPedido($demanda->getPedido(), $client, 'separacao');
  394.             $itensSeparacaoDemanda = $this->getDoctrine()->getRepository(ItemSeparacaoDemanda::class)->findBy(['pedido'=>$demanda->getPedido()]);
  395.         }
  396.         
  397.         $produtosData = [];
  398.         $produtosSimplesData = [];
  399.         
  400.         if($demanda->getTipo()=='separacao') {
  401.             
  402.             foreach ($itensSeparacaoDemanda as $itemSeparacaoDemanda) {
  403.                 
  404.                 $produtosData[] = [
  405.                     'cliente' => $this->abreviarNome($demanda->getPedido()->getContato()),
  406.                     'id' => $itemSeparacaoDemanda->getId(),
  407.                     'img' => 'https://polo.srvtmp.com.br/uploads/produtos/' . $itemSeparacaoDemanda->getProduto()->getCodigo() . '.jpg',
  408.                     'codigo' => $itemSeparacaoDemanda->getProduto()->getCodigo(),
  409.                     'titulo' => $itemSeparacaoDemanda->getProduto()->getTitulo(),
  410.                     'quantidade' => str_pad($itemSeparacaoDemanda->getQuantidade(), 2, "0", STR_PAD_LEFT),
  411.                     'checklist'  => (!$itemSeparacaoDemanda->getChecklist()) ? 'pendente' : $itemSeparacaoDemanda->getChecklist(),
  412.                     'isSimples' => $itemSeparacaoDemanda->getIsSimples(),
  413.                     'isSimplesMesmo' => $itemSeparacaoDemanda->getIsSimplesMesmo()
  414.                 ];
  415.                 
  416.             }
  417.             
  418.         } else {
  419.             
  420.             foreach ($produtosPedido as $produtoPedido) {
  421.                 
  422.                 $produtosData[] = [
  423.                     'cliente' => $this->abreviarNome($demanda->getPedido()->getContato()),
  424.                     'id' => $produtoPedido->getId(),
  425.                     'img' => 'https://polo.srvtmp.com.br/uploads/produtos/' . $produtoPedido->getProduto()->getCodigo() . '.jpg',
  426.                     'codigo' => $produtoPedido->getProduto()->getCodigo(),
  427.                     'titulo' => $produtoPedido->getProduto()->getTitulo(),
  428.                     'estruturas' => json_decode($produtoPedido->getProduto()->getEstrutura()),
  429.                     'quantidade' => str_pad($produtoPedido->getQuantidade(), 2, "0", STR_PAD_LEFT),
  430.                     'isMontado'  => $produtoPedido->getIsMontado(),
  431.                     'isSeparado' => $produtoPedido->getIsMontado(),
  432.                     'isSimples' => true,
  433.                     'isSimplesMesmo' => true,
  434.                     'checklist'  => (!$produtoPedido->getChecklist()) ? 'pendente' : $produtoPedido->getChecklist(),
  435.                 ];
  436.                 
  437.             }
  438.             
  439.         }
  440.         
  441.         */
  442.         
  443.         $produtosAgrupados = [];
  444.         foreach ($produtosChecklist as $produtoCheck) {
  445.             $codigo $produtoCheck['codigo'];
  446.             
  447.             // Se o código já existir no array agrupado, soma a quantidade
  448.             if (isset($produtosAgrupados[$codigo])) {
  449.                 $produtosAgrupados[$codigo]['quantidade'] += $produtoCheck['quantidade'];
  450.             } else {
  451.                 // Se não existir, adiciona o produto
  452.                 $produtosAgrupados[$codigo] = $produtoCheck;
  453.             }
  454.         }
  455.         
  456.         // Formata a quantidade final para ter zero à esquerda caso tenha só um dígito
  457.         foreach ($produtosAgrupados as &$produtoAgrupado) {
  458.             $produtoAgrupado['quantidade'] = str_pad($produtoAgrupado['quantidade'], 2'0'STR_PAD_LEFT);
  459.         }
  460.         
  461.         // Reindexa o array agrupado (caso precise de um array numericamente indexado)
  462.         $produtosAgrupados array_values($produtosAgrupados);
  463.         
  464.         return new JsonResponse(['produtos'=>$produtos'checklist'=>$produtosAgrupados], 200);
  465.     }
  466.     
  467.     private function loadProdutosPedido($pedido$client$tipo) {
  468.         
  469.         $itens $this->getPedido($pedido->getPedido(), $client);
  470.         
  471.         //if($tipo=='separacao'){
  472.             
  473.             if(is_array($itens)){
  474.                 
  475.                 foreach ($itens['itens'] as $item) {
  476.                     
  477.                     $produtoBlng $this->getDoctrine()->getRepository(ProdutoBling::class)->findOneBy(['codigo'=>$item['codigo']]);
  478.                     
  479.                     // $isSimples = false;
  480.                     
  481.                     // if(isset($item['estruturas'])) {
  482.                     //     $isSimples = (count($item['estruturas'])>0) ? false : false;
  483.                     // }
  484.   
  485.                     if($produtoBlng instanceof ProdutoBling) { // Esses são os produtos que estão no pedido
  486.                         
  487.                         $itemSeparacao = new ItemSeparacaoDemanda();
  488.                         
  489.                         $itemSeparacao->setProduto($produtoBlng);
  490.                         $itemSeparacao->setQuantidade($item['quantidade']);
  491.                         $itemSeparacao->setChecklist('pendente');
  492.                         $itemSeparacao->setPedido($pedido);
  493.                         $itemSeparacao->setIsSimplesMesmo($produtoBlng->getIsSimples());
  494.                         $itemSeparacao->setIsSimples(false);
  495.                         $this->getDoctrine()->getManager()->persist($itemSeparacao);
  496.                         $this->getDoctrine()->getManager()->flush();
  497.                         
  498.                     }
  499.                     
  500.                 }
  501.                 
  502.                 $item['estruturas'] = $this->agrupaEstruturas($itens['itens']);
  503.                 
  504.                 foreach ($item['estruturas'] as $estrutura) { // Esses são os produtos de estruturas de cada um dos produtos
  505.                     
  506.                     $itemSeparacao = new ItemSeparacaoDemanda();
  507.                 
  508.                     $produtoBlng $this->getDoctrine()->getRepository(ProdutoBling::class)->findOneBy(['codigo'=>$estrutura['codigo']]);
  509.                     
  510.                     $itemSeparacao->setProduto($produtoBlng);
  511.                     $itemSeparacao->setQuantidade($estrutura['quantidade']);
  512.                     $itemSeparacao->setChecklist('pendente');
  513.                     $itemSeparacao->setPedido($pedido);
  514.                     $itemSeparacao->setIsSimplesMesmo($produtoBlng->getIsSimples());
  515.                     $itemSeparacao->setIsSimples(true);
  516.                     
  517.                     $this->getDoctrine()->getManager()->persist($itemSeparacao);
  518.                     $this->getDoctrine()->getManager()->flush();
  519.                     
  520.                 }
  521.                 
  522.             }
  523.             
  524.         //} else {
  525.             
  526.             // if(is_array($itens)){
  527.                 
  528.             //     foreach ($itens['itens'] as $item) {
  529.                     
  530.             //         $produtoBlng = $this->getDoctrine()->getRepository(ProdutoBling::class)->findOneBy(['codigo'=>$item['codigo']]);
  531.                 
  532.             //         if($produtoBlng instanceof ProdutoBling) {
  533.                         
  534.             //             $produto = new ProdutoPedido();
  535.                         
  536.             //             $produto->setProduto($produtoBlng);
  537.             //             $produto->setQuantidade($item['quantidade']);
  538.             //             $produto->setIsMontado(false);
  539.             //             $produto->setIsSeparado(false);
  540.             //             $produto->setPedido($pedido);
  541.             //             $produto->setIsSimples($item['isSimples']);
  542.             //             $this->getDoctrine()->getManager()->persist($produto);
  543.             //             $this->getDoctrine()->getManager()->flush();
  544.                         
  545.             //         }
  546.                     
  547.             //     }
  548.                 
  549.             // }
  550.             
  551.         //}
  552.         
  553.     }
  554.     
  555.     private function replaceAssistencia($pedido) {
  556.         return str_ireplace(['Assistência''-'],[''.'A'],$pedido);
  557.     }
  558.     
  559.     /**
  560.      * @Route("/gestao-montagem-json/{local}/{tipo}", name="gestao_montagem_json")
  561.      */
  562.     public function listaPedidos($local$tipo): Response
  563.     {
  564.         return new JsonResponse($this->listaDemandas($local$tipo), 200);
  565.     }
  566.     
  567.     private function abreviarNome($nomeCompleto) {
  568.         // Separa o nome completo em partes
  569.         $partes explode(' '$nomeCompleto);
  570.     
  571.         // Se houver apenas um nome, retorna como está
  572.         if (count($partes) == 1) {
  573.             return $nomeCompleto;
  574.         }
  575.     
  576.         // Mantém o primeiro e o último nome completos
  577.         $primeiroNome array_shift($partes);
  578.         $ultimoNome array_pop($partes);
  579.     
  580.         // Converte os nomes intermediários para iniciais
  581.         $iniciais '';
  582.         foreach ($partes as $parte) {
  583.             $iniciais .= strtoupper($parte[0]) . '. ';
  584.         }
  585.     
  586.         // Concatena o primeiro nome, as iniciais e o último nome
  587.         return $primeiroNome ' ' $iniciais $ultimoNome;
  588.     }
  589.     
  590.     /**
  591.      * @Route("/gestao-montagem/{local}", name="gestao_montagem")
  592.      */
  593.     public function index($local): Response
  594.     {
  595.         return $this->render('montagem/index.html.twig', [
  596.             'controller_name' => 'MontagemController',
  597.             'local' => $local,
  598.             'tipo' => 'todos',
  599.             'colaboradores' => $this->getColaboradores($local)
  600.         ]);
  601.     }
  602.     
  603.     private function getColaboradores($local) {
  604.         
  605.         $separadores_co = [
  606.             ['id'=>21'nome'=>'Ronald'],
  607.             ['id'=>36'nome'=>'Gregory'],
  608.             ['id'=>40'nome'=>'Emanuel'],
  609.             ['id'=>29'nome'=>'Lucas'],
  610.             ['id'=>22'nome'=>'Marcos'],
  611.             ['id'=>31'nome'=>'Victor'],
  612.             ['id'=>41'nome'=>'Kevin'],
  613.             ['id'=>23'nome'=>'Fábio'],
  614.             ['id'=>43'nome'=>'Adriel'],
  615.         ];
  616.         
  617.         $separadores_sj = [
  618.             ['id'=>7'nome'=>'Geovair'],
  619.             ['id'=>34'nome'=>'Nelson'],
  620.             ['id'=>19'nome'=>'Mateus'],
  621.             ['id'=>26'nome'=>'Samuel'],
  622.             ['id'=>30'nome'=>'Claudiano'],
  623.             ['id'=>27'nome'=>'Luiz'],
  624.             ['id'=>35'nome'=>'Cris'],
  625.             ['id'=>38'nome'=>'Nathan'],
  626.             ['id'=>42'nome'=>'Kawan'],
  627.         ];
  628.         
  629.         return ($local=='co') ? json_encode($separadores_co) : json_encode($separadores_sj);
  630.         
  631.     }
  632.     
  633.     /**
  634.      * @Route("/gestao-montagem/{local}/{tipo}", name="gestao_montagem_tipo")
  635.      */
  636.     public function indexTipo($local$tipo): Response
  637.     {
  638.         
  639.         return $this->render('montagem/index.html.twig', [
  640.             'controller_name' => 'MontagemController',
  641.             'local' => $local,
  642.             'tipo' => $tipo,
  643.             'colaboradores' => $this->getColaboradores($local)
  644.         ]);
  645.     }
  646.     private function getPedido($numero$client$tipoPedido='pedido'$pedidoMake=null) {
  647.         
  648.         $response $client->request(
  649.             'GET',
  650.             SincronizacaoController::URL_API_BLING '/pedido/'.$numero.'/json/',
  651.             [
  652.                 'query' => [
  653.                     'apikey' => SincronizacaoController::KEY_API_POLLO
  654.                 ]
  655.             ]
  656.         );
  657.         $statusCode $response->getStatusCode();
  658.         $numeroNota '';
  659.         $dados = [
  660.             'telefone' =>'',
  661.             'endereco' => '',
  662.             'endereco_entrega' => '',
  663.             'tipo'     => $tipoPedido,
  664.             'numeroNf' => '',
  665.             'numeroPedido' => $numero,
  666.             'isUrgente' => 'Não',
  667.             'assistencia' => 'Não',
  668.             'contato' => ''
  669.             'periodosEntrega' => '',
  670.             'entregarHoje' => '',
  671.             'vendedor' => '',
  672.             'embalagem' => 'Desmontado',
  673.             'exigeLadoBalcao' => false// Qual lado do balcão
  674.             'cnpj' => '',
  675.             'frete' =>'',
  676.             'solicitarColeta' => '',
  677.             'nomeTrasportadora' => '',
  678.             'meioEntrega' => '',
  679.             'esperarClientePagar' => 'Não',
  680.             'cotarFrete' => '',
  681.             'itens' => '',
  682.             'dataAgendamentoEntrega' => ''
  683.         ];
  684.         if ($statusCode == SincronizacaoController::HTTP_STATUS_CODE_OK) {
  685.             $content $response->toArray();
  686.             if(isset($content['retorno'])){
  687.                 if(isset($content['retorno']['pedidos'])){
  688.                     if(count($content['retorno']['pedidos']) > 0) {
  689.                         if(isset($content['retorno']['pedidos'][0])){
  690.                             
  691.                             $pedido $content['retorno']['pedidos'][0]['pedido'];
  692.                             
  693.                             if(!empty($content['retorno']['pedidos'][0]['pedido']['cliente']['endereco'])){
  694.                                 
  695.                                 $dados['endereco'] = $content['retorno']['pedidos'][0]['pedido']['cliente']['endereco'] . ',  ' 
  696.                                                      $content['retorno']['pedidos'][0]['pedido']['cliente']['numero'] . ',  ' 
  697.                                                      $content['retorno']['pedidos'][0]['pedido']['cliente']['complemento'] . ',  ' 
  698.                                                      $content['retorno']['pedidos'][0]['pedido']['cliente']['bairro'] . ',  ' 
  699.                                                      $content['retorno']['pedidos'][0]['pedido']['cliente']['cidade'] . '/' 
  700.                                                      $content['retorno']['pedidos'][0]['pedido']['cliente']['uf'] . ',  ' 
  701.                                                      $content['retorno']['pedidos'][0]['pedido']['cliente']['cep'] . ',  ';
  702.                                     
  703.                             }
  704.                             $dados['contato'] = $content['retorno']['pedidos'][0]['pedido']['cliente']['nome'];
  705.                             
  706.                             $telefones = [];
  707.                             if(isset($content['retorno']['pedidos'][0]['pedido']['cliente']['celular'])){
  708.                                 if($content['retorno']['pedidos'][0]['pedido']['cliente']['celular']!=""){
  709.                                     $telefone $content['retorno']['pedidos'][0]['pedido']['cliente']['celular'];
  710.                                     $telefone '55'.$telefone;
  711.                                     $telefones[] = preg_replace('/\D/'''$telefone);
  712.                                     
  713.                                 }
  714.                             }
  715.                             
  716.                             if(isset($content['retorno']['pedidos'][0]['pedido']['cliente']['fone'])){
  717.                                 if($content['retorno']['pedidos'][0]['pedido']['cliente']['fone']!=""){
  718.                                     $telefone $content['retorno']['pedidos'][0]['pedido']['cliente']['fone'];
  719.                                     $telefone '55'.$telefone;
  720.                                     $telefones[] = preg_replace('/\D/'''$telefone);
  721.                                 }
  722.                             }
  723.                             
  724.                             $dados['telefone'] = implode('|'$telefones);
  725.                             
  726.                             if(isset($content['retorno']['pedidos'][0]['pedido']['nota'])){
  727.                                 $dados['numeroNf'] = intval($content['retorno']['pedidos'][0]['pedido']['nota']['numero']);
  728.                             }
  729.                             
  730.                             $dados['vendedor'] =  $content['retorno']['pedidos'][0]['pedido']['vendedor'];
  731.                             
  732.                             $dados['cnpj'] = '';
  733.                             $dados['totalvenda'] = '';
  734.                             $dados['itens'] = [];
  735.                             
  736.                             if(!empty($content['retorno']['pedidos'][0]['pedido']['cliente']['cnpj'])){
  737.                                 $dados['cnpj'] = $content['retorno']['pedidos'][0]['pedido']['cliente']['cnpj'];
  738.                             }
  739.                             
  740.                             $dataPedido = \DateTime::createFromFormat('Y-m-d'$content['retorno']['pedidos'][0]['pedido']['data']);
  741.                             $dados['data'] = $dataPedido->format('d/m/Y');
  742.                             
  743.                             $totalItens 0;
  744.                             $totalItensTotal 0;
  745.                             $valorSubTotal 0;
  746.                             $descontosItens 0;
  747.                             if(!empty($content['retorno']['pedidos'][0]['pedido']['itens'])){
  748.                                 foreach ($content['retorno']['pedidos'][0]['pedido']['itens'] as $item) {
  749.                                     
  750.                                     if(in_array($item['item']['codigo'], $this->skusDebalcao())){
  751.                                         $dados['exigeLadoBalcao'] = true;
  752.                                     }
  753.                                     
  754.                                     $totalItens++;
  755.                                     $valorTotal $item['item']['quantidade'] * $item['item']['valorunidade'];
  756.                                     $valorSubTotal += $valorTotal;
  757.                                     $totalItensTotal += $item['item']['quantidade'];
  758.                                     $descontosItens += $item['item']['descontoItem'];
  759.                                     
  760.                                     // $img = '';
  761.                                     // $pathFile = '/www/wwwroot/gestor.moveispollo.com.br/public/uploads/produtos/' . $item['item']['codigo'] . '.jpg';
  762.                                     
  763.                                     // if(file_exists($pathFile)){
  764.                                     //     $img = 'https://polo.srvtmp.com.br/uploads/produtos/' . $item['item']['codigo'] . '.jpg';
  765.                                     // } else {
  766.                                         
  767.                                     //     $produtoBling = $this->getProduto(SincronizacaoController::KEY_API_POLLO, 
  768.                                     //         $item['item']['codigo'], $client, $xml=false);
  769.                                             
  770.                                     //     if(isset($produtoBling['retorno']['produtos'][0])) {
  771.                                     //         if(isset($produtoBling['retorno']['produtos'][0]['produto']['imagem'][0])) {
  772.                                     //             $img = $produtoBling['retorno']['produtos'][0]['produto']['imagem'][0]['link'];
  773.                                     //             $img = str_ireplace('\\','',$img);
  774.                                     //         }
  775.                                     //     }
  776.                                         
  777.                                     // }
  778.                         
  779.                                     $dados['itens'][] = [
  780.                                         'codigo' => $item['item']['codigo'],
  781.                                         'descricao' => $item['item']['descricao'],
  782.                                         'un' => $item['item']['un'],
  783.                                         'quantidade' => abs($item['item']['quantidade']),
  784.                                         'valorunidade' => number_format($item['item']['valorunidade'], 2',''.'),
  785.                                         'valorTotal' => number_format($valorTotal2',''.'),
  786.                                         //'img' => $img,
  787.                                         'estruturas' => $this->getEstruturas($item['item']['codigo']) // Primeiro nivel
  788.                                     ];
  789.                                 }
  790.                             }
  791.                             
  792.                             $dados['parcelas'] = [];
  793.                             if(!empty($content['retorno']['pedidos'][0]['pedido']['parcelas'])) {
  794.                                 foreach ($content['retorno']['pedidos'][0]['pedido']['parcelas'] as $parcela) {
  795.                                     
  796.                                     
  797.                                     $dataVencimento = \DateTime::createFromFormat('Y-m-d'$parcela['parcela']['dataVencimento']);
  798.                                     
  799.                                     $dados['parcelas'][] = [
  800.                                         'valor' => number_format($parcela['parcela']['valor'], 2',''.'),
  801.                                         'dias' => '0',
  802.                                         'dataVencimento' => $dataVencimento->format('d/m/Y'),
  803.                                         'formaPagamento' => $parcela['parcela']['forma_pagamento']['descricao'],
  804.                                         'obs' => $parcela['parcela']['obs']
  805.                                     ];
  806.                                 }
  807.                             }
  808.             
  809.                             $dados['numero_itens'] = $totalItens;
  810.                             $dados['numero_itens_total'] = $totalItensTotal;
  811.                             $dados['descontos'] = number_format($descontosItens2',''.');
  812.                             $dados['valorTotalPedido'] = number_format($valorSubTotal2',''.');
  813.                             $dados['valorTotalComDesconto'] = number_format($content['retorno']['pedidos'][0]['pedido']['totalvenda'], 2',''.');
  814.                             
  815.                             $dados['obs'] = $content['retorno']['pedidos'][0]['pedido']['observacoes'];
  816.                             $dados['frete'] = (isset($content['retorno']['pedidos'][0]['pedido']['valorfrete'])) ? $content['retorno']['pedidos'][0]['pedido']['valorfrete'] : '';
  817.                             
  818.                             $dados['descontoGeral'] = $content['retorno']['pedidos'][0]['pedido']['desconto'];
  819.                             
  820.                             $pedidoEntrega $this->getDoctrine()->getRepository(EntregaPedido::class)->findOneBy(['pedido' => $numero]);
  821.                             $dados['showMaisPedidos'] = false;
  822.                             
  823.                             $dados['estruturas'] = $this->agrupaEstruturas($dados['itens']);
  824.                             
  825.                             if($pedidoEntrega instanceof EntregaPedido){
  826.                                 if($pedidoMake instanceof EntregaPedido){
  827.                                     $dados['mais_info'] = $this->makeProdutoData($pedidoMaketrue);
  828.                                 } else {
  829.                                     $dados['mais_info'] = $this->makeProdutoData($pedidoEntregatrue);
  830.                                 }
  831.                                 
  832.                                 $dados['showMaisPedidos'] = true;
  833.                             }
  834.                             
  835.                             if(!empty($content['retorno']['pedidos'][0]['pedido']['transporte'])){
  836.                                 
  837.                                 if(!empty($content['retorno']['pedidos'][0]['pedido']['transporte']['enderecoEntrega'])){    
  838.                                     
  839.                                         $dados['endereco_entrega'] = 
  840.                                             $content['retorno']['pedidos'][0]['pedido']['transporte']['enderecoEntrega']['endereco'] . ',  ' 
  841.                                             $content['retorno']['pedidos'][0]['pedido']['transporte']['enderecoEntrega']['numero'] . ',  ' 
  842.                                             $content['retorno']['pedidos'][0]['pedido']['transporte']['enderecoEntrega']['complemento'] . ',  ' .
  843.                                             $content['retorno']['pedidos'][0]['pedido']['transporte']['enderecoEntrega']['bairro'] . ',  ' 
  844.                                             $content['retorno']['pedidos'][0]['pedido']['transporte']['enderecoEntrega']['cidade'] . '/' 
  845.                                             $content['retorno']['pedidos'][0]['pedido']['transporte']['enderecoEntrega']['uf'] . ',  ' 
  846.                                             $content['retorno']['pedidos'][0]['pedido']['transporte']['enderecoEntrega']['cep'] . ',  ';
  847.                                 }
  848.                                 
  849.                             }
  850.                             
  851.                             //print_r($dados['itens']); exit;
  852.                             
  853.                             return $dados;
  854.                             
  855.                         }
  856.                     }
  857.                 }
  858.             }
  859.         } else {
  860.             exit('Erro em bucar pedido: ' $numero);
  861.         }
  862.         return false;
  863.     }
  864.     
  865.     public function agrupaEstruturas($itens) {
  866.         
  867.         $estruturas = [];
  868.         
  869.         foreach ($itens as $item) {
  870.             if(isset($item['estruturas']) && !empty($item['estruturas'])){
  871.             
  872.                 foreach ($item['estruturas'] as $estrutura) {
  873.                     
  874.                     $produtoBling $this->getDoctrine()->getRepository(ProdutoBling::class)->findOneBy(['codigo' => $estrutura->codigo]);
  875.                     if(!$produtoBling instanceof ProdutoBling){
  876.                         continue;
  877.                     }
  878.                     
  879.                     $isSimples false;
  880.                     if($produtoBling->getIsSimples()){
  881.                         $isSimples $produtoBling->getIsSimples();
  882.                     }
  883.                     
  884.                     $quantidade $estrutura->quantidade $item['quantidade'];
  885.                     
  886.                     $estruturas[] = [
  887.                         'nome' => $estrutura->nome,
  888.                         'codigo' => $estrutura->codigo,
  889.                         'quantidade' => $quantidade,
  890.                         'isSimples' => $isSimples
  891.                     ];
  892.                 }
  893.             }
  894.         }
  895.         $itensAgrupados = array();
  896.         
  897.         // Iterar sobre os itens originais
  898.         foreach ($estruturas as $item) {
  899.             
  900.             $codigo $item["codigo"];
  901.             $quantidade $item["quantidade"];
  902.             
  903.             // Se o código já existir no array $itensAgrupados, adicione a quantidade
  904.             if (isset($itensAgrupados[$codigo])) {
  905.                 $itensAgrupados[$codigo]["quantidade"] += $quantidade;
  906.             } else {
  907.                 // Se não, crie uma nova entrada no array
  908.                 $itensAgrupados[$codigo] = array(
  909.                     "nome" => $item["nome"],
  910.                     "codigo" => $codigo,
  911.                     "quantidade" => $quantidade,
  912.                     'isSimples' => $item["isSimples"]
  913.                 );
  914.             }
  915.         }
  916.         
  917.         // Resultado final com itens agrupados e quantidades somadas
  918.         $resultadoFinal array_values($itensAgrupados);
  919.         return $resultadoFinal;
  920.     }
  921.     
  922.     public function getEstruturas($codigo){
  923.         
  924.         $produtoBling $this->getDoctrine()->getRepository(ProdutoBling::class)->findOneBy(['codigo' => $codigo]);
  925.         
  926.         if($produtoBling instanceof ProdutoBling) {
  927.             $estruturas json_decode($produtoBling->getEstrutura());
  928.             if(!empty($produtoBling->getEstrutura())){
  929.                 
  930.                 foreach ($estruturas as $estrutura){ // Pego para cada item uma estrutura dentro
  931.                     $subEstruturas $this->getSubEstruturas($estrutura->codigo);
  932.                     if(!empty($subEstruturas)){
  933.                         foreach ($subEstruturas as $subEstrutura){
  934.                             $estruturas[] = $subEstrutura;
  935.                         }
  936.                     }
  937.                 }
  938.                 
  939.                 return (count($estruturas)>0) ? $estruturas '';
  940.             }
  941.             return '';
  942.         }
  943.         
  944.         return '';
  945.     }
  946.     
  947.     public function getSubEstruturas($codigo) { 
  948.         
  949.         $produtoBling $this->getDoctrine()->getRepository(ProdutoBling::class)->findOneBy(['codigo' => $codigo]);
  950.         
  951.         if($produtoBling instanceof ProdutoBling) {
  952.             $estruturas json_decode($produtoBling->getEstrutura());
  953.             if(!empty($produtoBling->getEstrutura())){
  954.                 return (count($estruturas)>0) ? $estruturas '';
  955.             }
  956.             return '';
  957.         }
  958.         
  959.         return '';
  960.     }
  961.     
  962.     private function getProduto($apiKeyStore$codigoProduto$client$xml=false) {
  963.         $format 'json';
  964.         if($xml){
  965.             $format 'xml';
  966.         }
  967.         $response $client->request(
  968.             'GET',
  969.             SincronizacaoController::URL_API_BLING '/produto/'.$codigoProduto.'/'.$format,
  970.             [
  971.                 'query' => [
  972.                     'apikey'  => $apiKeyStore,
  973.                     'estoque' => 'S',
  974.                     'imagem'  => 'S',
  975.                     'situacao' => 'A'
  976.                 ]
  977.             ]
  978.         );
  979.         $statusCode $response->getStatusCode();
  980.         if ($statusCode == SincronizacaoController::HTTP_STATUS_CODE_OK) {
  981.             if($xml){
  982.                 return $response->getContent();
  983.             }
  984.             $content $response->toArray();
  985.             return $content;
  986.         } else {
  987.             return [];
  988.         }
  989.         return [];
  990.     }
  991.     
  992. }