<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use App\Entity\LojasRevendaSincronizacaoNovo;
use App\Entity\ProdutoBlingWp;
use App\Entity\ProdutoBling;
use App\Entity\EntregaPedido;
use App\Entity\ProdutoPedido;
use App\Entity\DemandaPedido;
use App\Entity\ItemSeparacaoDemanda;
use App\Entity\User;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Contracts\HttpClient\HttpClientInterface;
class MontagemController extends BaseController
{
/**
* @Route("/gestao-montagem/transferencia", name="transferencia_demanda", methods={"POST"})
*/
public function transferirDemanda(Request $request): Response
{
$data = json_decode($request->getContent(), false);
$demanda = $this->getDoctrine()->getRepository(DemandaPedido::class)->find($data->id);
$destino = ($data->destino=='co') ? 'sj' : 'co';
if(!$demanda instanceof DemandaPedido) {
return new JsonResponse([], 400);
}
if($demanda->getStatus()!=='pendente') {
return new JsonResponse(['mensagem'=>'Somente demanda pendente pode ser transferido!'], 400);
}
// Verifica se esta demanda já não existe neste local de destino;
$demandaNoDestino = $this->getDoctrine()->getRepository(DemandaPedido::class)->findOneBy([
'local' => $destino,
'pedido' => $demanda->getPedido()
]);
if($demandaNoDestino instanceof DemandaPedido) {
return new JsonResponse(['mensagem'=>'Esta demanda já existe no destino'], 400);
}
if($data->manter=='nao') { // Mudar o local somente
$demanda->setLocal($destino);
} else { // Criar uma nova demanda para o outro local
$novaDemanda = clone $demanda;
$novaDemanda->setLocal($destino);
$this->getDoctrine()->getManager()->persist($novaDemanda);
}
$this->getDoctrine()->getManager()->flush();
return new JsonResponse([], 200);
}
/**
* @Route("/gestao-montagem-json/salvar-assinatura", name="salvar_assintura", methods={"POST"})
*/
public function salvarAssinatura(Request $request): Response
{
$data = json_decode($request->getContent(), false);
$demanda = $this->getDoctrine()->getRepository(DemandaPedido::class)->find($data->id);
if(!$demanda instanceof DemandaPedido) {
return new JsonResponse([], 400);
}
$imageData = base64_decode($data->assinatura);
$fileNameOriginal = "demanda_{$demanda->getId()}" . uniqid() . '.png';
$fileName = '/www/wwwroot/gestor.moveispollo.com.br/public/assinaturas-pedidos/' . $fileNameOriginal;
$fileNameNf = '/www/wwwroot/gestor.moveispollo.com.br/public/img_notas/' . $fileNameOriginal;
file_put_contents($fileName, $imageData);
file_put_contents($fileNameNf, $imageData);
$demanda->setAssinatura($fileNameOriginal);
$demanda->setAssinadoAt(new \DateTime());
$this->getDoctrine()->getManager()->flush();
return new JsonResponse(['img'=>$fileNameOriginal], 200);
}
/**
* @Route("/gestao-montagem/pendencia-demanda", name="pendencia_demanda", methods={"POST"})
*/
public function pendenciaDemanda(Request $request): Response
{
$data = json_decode($request->getContent(), false);
$demanda = $this->getDoctrine()->getRepository(DemandaPedido::class)->find($data->id);
if(!$demanda instanceof DemandaPedido) {
return new JsonResponse([], 400);
}
if($data->pendencia=='progresso' || $data->pendencia=='concluido'){
$demanda->setPendencia(null);
} else {
$demanda->setPendencia($data->pendencia);
}
$this->getDoctrine()->getManager()->flush();
return new JsonResponse([], 200);
}
/**
* @Route("/gestao-montagem/finalizar-demanda/{id}/{status}", name="finalizar_demanda")
*/
public function finalizarItemDemanda(Request $request, HttpClientInterface $client, $id, $status): Response
{
$demanda = $this->getDoctrine()->getRepository(ItemSeparacaoDemanda::class)->find($id);
if(!$demanda instanceof ItemSeparacaoDemanda) {
return new JsonResponse([], 400);
}
if($demanda->getChecklist()=='concluido' || $demanda->getChecklist()==null) {
$demanda->setChecklist('pendente');
} else {
$demanda->setChecklist('concluido');
}
$this->getDoctrine()->getManager()->flush();
return new JsonResponse([], 200);
}
private function listaDemandas($local, $tipo)
{
$pedidosData = [];
if($tipo=='todos') {
$demandasPendentes = $this->getDoctrine()->getRepository(DemandaPedido::class)
->findBy(['local'=>$local, 'status'=>'pendente'], ['clienteVaiRetirarImediatamente'=>'desc', 'isUrgente'=>'desc', 'createdAt'=>'asc']);
$demandasEsquerda = $this->getDoctrine()->getRepository(DemandaPedido::class)
->createQueryBuilder('d')
->where('d.local = :local')
//->andWhere('d.status !=:status')
->setParameter('local', $local)
//->setParameter('status', 'pendente')
->orderBy('d.status', 'DESC')
->addOrderBy('d.id', 'ASC')
->setMaxResults(80)
->getQuery()
->getResult();
// Limitar o array a apenas 50 posições
//$demandasDireita = array_slice($demandasDireita, 0, 50);
} else {
$demandasPendentes = $this->getDoctrine()->getRepository(DemandaPedido::class)
->findBy(['local'=>$local, 'tipo'=>$tipo, 'status'=>'pendente'],['clienteVaiRetirarImediatamente'=>'desc', 'isUrgente'=>'desc', 'createdAt'=>'asc']);
$demandasEsquerda = $this->getDoctrine()->getRepository(DemandaPedido::class)
->createQueryBuilder('d')
->where('d.local = :local')
->andWhere('d.tipo = :tipo')
->setParameter('local', $local)
->setParameter('tipo', $tipo)
->orderBy('d.status', 'DESC')
->addOrderBy('d.id', 'ASC')
->setMaxResults(80)
->getQuery()
->getResult();
}
$demandas = $demandasPendentes + $demandasEsquerda;
foreach ($demandas as $demanda) {
$pedidoNumero =
empty($demanda->getPedido()->getPedido()) ?
$demanda->getPedido()->getNotaFiscal().'-NF' :
$this->replaceAssistencia($demanda->getPedido()->getPedido());
$pedidosData[] = [
'id' => $demanda->getId(),
'local' => $local,
'tipo' => $demanda->getTipo(),
'pedido' => $pedidoNumero,
'dataPedido' => $demanda->getCreatedAt()->format('d/m/Y'),
'responsavel' => ($demanda->getResponsavel()=='bruno@moveispollo.com.br') ? 'BRUNO' : mb_strtoupper($demanda->getResponsavel()),
'status' => (!$demanda->getStatus()) ? 'pendente' : $demanda->getStatus(),
'cliente' => $this->abreviarNome($demanda->getPedido()->getContato()),
'isAssistencia' => ($demanda->getPedido()->getIsAssistencia()==null) ? false : $demanda->getPedido()->getIsAssistencia(),
'obsCadastro' => $demanda->getPedido()->getObservacaoCadastro(),
'obsProblema' => $demanda->getPedido()->getProblemaObs(),
'montarMoveis' => $demanda->getPedido()->getMontarMoveis(),
'embalagem' => $demanda->getPedido()->getEmbalagem(),
'montagem' => $demanda->getPedido()->getMontagem(),
'periodoEntrega' => $demanda->getPedido()->getPeriodoEntrega(),
'dataEntrega' => ($demanda->getPedido()->getDataEntrega() instanceof \DateTime) ? $demanda->getPedido()->getDataEntrega()->format('d/m/Y') : 'Não informado',
'pediodoEntrega' => $demanda->getPedido()->getPeriodoEntrega(),
'meioEntrega' => mb_strtoupper($demanda->getPedido()->getMeioEntrega()),
'entregarHoje' => mb_strtoupper($demanda->getPedido()->getEntregarHoje()),
'formaPagamento' => mb_strtoupper($demanda->getPedido()->getFormaPagamento()),
'receberNaEntrega' => mb_strtoupper($demanda->getPedido()->getReceberNaEntrega()),
'pendencia' => (!$demanda->getPendencia()) ? 'null' : mb_strtoupper($demanda->getPendencia()),
'isUrgente' => (!$demanda->getIsUrgente()) ? false : $demanda->getIsUrgente(),
'clienteVaiRetirarImediatamente' => (!$demanda->getClienteVaiRetirarImediatamente()) ? false : $demanda->getClienteVaiRetirarImediatamente(),
'assinatura' => (!$demanda->getAssinatura()) ? '' : $demanda->getAssinatura(),
'origemMontagem' => (!$demanda->getPedido()->getOrigemMontagem()) ? '' : $demanda->getPedido()->getOrigemMontagem(),
'vendaCom' => $demanda->getPedido()->getTipoDocumento()
];
}
return $pedidosData;
}
/**
* @Route("/gestao-montagem/finalizar/{pedido}/{tipo}/{local}", name="gestao_montagem_json_finalizar")
*/
public function finalizarPedido(Request $request, $pedido, $tipo, $local): Response
{
$demanda = $this->getDoctrine()->getRepository(DemandaPedido::class)->find($pedido);
$demanda->setStatus('concluido');
$demanda->setUpdatedAt(new \DateTime());
$this->getDoctrine()->getManager()->flush();
return new JsonResponse([], 200);
}
/**
* @Route("/gestao-montagem/aceitar/{pedido}/{colaborador}", name="gestao_montagem_json_aceitar")
*/
public function aceitarPedido(Request $request, $pedido, $colaborador): Response
{
$colaboradorEntity = $this->getDoctrine()->getRepository(User::class)->find($colaborador);
if(!$colaboradorEntity instanceof User){
return new JsonResponse(["colaborador nao localizado: " . $colaborador], 400);
}
$demandasEmAndamento = $this->getDoctrine()->getRepository(DemandaPedido::class)->findBy([
'responsavel'=>$colaboradorEntity->getEmail(),
'status'=>'em_andamento',
'pendencia'=>null
]);
if(count($demandasEmAndamento)>0) {
return new JsonResponse(['mensagem'=>'Existe pedido em andamento. Não é possível pegar outro pedido com algum em progresso.'], 400);
}
$demanda = $this->getDoctrine()->getRepository(DemandaPedido::class)->find($pedido);
$demanda->setResponsavel($colaboradorEntity->getEmail());
$demanda->setStatus('em_andamento');
$demanda->setUpdatedAt(new \DateTime());
$this->getDoctrine()->getManager()->flush();
$this->setarAcoesSeparacaoCardPedido($demanda->getPedido()->getId(), $demanda->getTipo(), $colaboradorEntity->getEmail());
return new JsonResponse([], 200);
}
private function setarAcoesSeparacaoCardPedido($idPedido, $tipo, $responsavel) {
$pedido = $this->getDoctrine()->getRepository(EntregaPedido::class)->find($idPedido);
$tipoStr = ($tipo=='separacao') ? 'Separação' : 'Montagem';
if(!$pedido instanceof EntregaPedido) {
return new JsonResponse([], 400);
}
$numeroPedido = ($pedido->getPedido()!='') ? $pedido->getPedido() : $pedido->getNotaFiscal();
if(!$pedido->getTempoGastoSeparacao()) {
$messageBody = "O Pedido / NF *$numeroPedido* foi Aceito para *$tipoStr* pelo $responsavel.\n\nCliente: " . $pedido->getContato();
$destinatarios = ['556291089053', '5562994542599'];
foreach ($destinatarios as $destinatario) {
$this->sendMensagemViaWhatsapp("text", $destinatario, $messageBody, null, null, null, null);
}
}
$pedido->setSeparadorAceitouAt(new \DateTime('now'));
$pedido->setSeparador($responsavel);
//$pedido->setStatus('aceito');
$this->getDoctrine()->getManager()->flush();
}
/**
* @Route("/gestao-montagem-json/detalhe/{pedido}", name="gestao_montagem_json_detalhe")
*/
public function listaDetalhePedidos(Request $request, HttpClientInterface $client, $pedido): Response
{
//return new JsonResponse($this->listaDemandas($local), 200);
$demanda = $this->getDoctrine()->getRepository(DemandaPedido::class)->find($pedido);
$pedidoReplace = str_replace('-Assistência','', $demanda->getPedido()->getPedido());
$dados = $this->getPedido(trim($pedidoReplace), $client, true, $demanda->getPedido());
//return new JsonResponse($dados, 200);
$produtos = [];
$produtosChecklist = [];
foreach ($dados['itens'] as $produtoPedido) {
$produtos[] = [
'cliente' => $this->abreviarNome($demanda->getPedido()->getContato()),
'id' => 0,
'img' => 'https://polo.srvtmp.com.br/uploads/produtos/' . $produtoPedido['codigo'] . '.jpg',
'codigo' => $produtoPedido['codigo'],
'titulo' => $produtoPedido['descricao'],
'quantidade' => str_pad($produtoPedido['quantidade'], 2, "0", STR_PAD_LEFT),
'checklist' => 'pendente',
'isSimples' => false,
'isSimplesMesmo' => false
];
}
foreach ($dados['estruturas'] as $prodtoEstrutura) {
$isSimples = (bool) $prodtoEstrutura['isSimples'];
if($isSimples) {
$quantidade = ($prodtoEstrutura['quantidade']==0) ? 1 : $prodtoEstrutura['quantidade'];
$produtosChecklist[] = [
'cliente' => $this->abreviarNome($demanda->getPedido()->getContato()),
'id' => 0,
'img' => 'https://polo.srvtmp.com.br/uploads/produtos/' . $prodtoEstrutura['codigo'] . '.jpg',
'codigo' => $prodtoEstrutura['codigo'],
'titulo' => $prodtoEstrutura['nome'],
'quantidade' => str_pad($quantidade, 2, "0", STR_PAD_LEFT),
'checklist' => 'pendente',
'isSimples' => true,
'isSimplesMesmo' => true
];
}
}
foreach ($dados['itens'] as $produtoPedidoNovo) {
if($produtoPedidoNovo['estruturas']=="") {
$quantidade = ($produtoPedidoNovo['quantidade']==0) ? 1 : $produtoPedidoNovo['quantidade'];
$produtosChecklist[] = [
'cliente' => $this->abreviarNome($demanda->getPedido()->getContato()),
'id' => 0,
'img' => 'https://polo.srvtmp.com.br/uploads/produtos/' . $produtoPedidoNovo['codigo'] . '.jpg',
'codigo' => $produtoPedidoNovo['codigo'],
'titulo' => $produtoPedidoNovo['descricao'],
'quantidade' => str_pad($quantidade, 2, "0", STR_PAD_LEFT),
'checklist' => 'pendente',
'isSimples' => true,
'isSimplesMesmo' => true
];
}
}
/*
// Verifica se os produtos já não foram carregados para este pedido
$produtosPedido = $this->getDoctrine()->getRepository(ProdutoPedido::class)->findBy(['pedido'=>$demanda->getPedido()]);
$itensSeparacaoDemanda = $this->getDoctrine()->getRepository(ItemSeparacaoDemanda::class)->findBy(['pedido'=>$demanda->getPedido()]);
if(count($produtosPedido)<=0) {
$this->loadProdutosPedido($demanda->getPedido(), $client, 'produto');
$produtosPedido = $this->getDoctrine()->getRepository(ProdutoPedido::class)->findBy(['pedido'=>$demanda->getPedido()]);
}
if(count($itensSeparacaoDemanda)<=0) {
$this->loadProdutosPedido($demanda->getPedido(), $client, 'separacao');
$itensSeparacaoDemanda = $this->getDoctrine()->getRepository(ItemSeparacaoDemanda::class)->findBy(['pedido'=>$demanda->getPedido()]);
}
$produtosData = [];
$produtosSimplesData = [];
if($demanda->getTipo()=='separacao') {
foreach ($itensSeparacaoDemanda as $itemSeparacaoDemanda) {
$produtosData[] = [
'cliente' => $this->abreviarNome($demanda->getPedido()->getContato()),
'id' => $itemSeparacaoDemanda->getId(),
'img' => 'https://polo.srvtmp.com.br/uploads/produtos/' . $itemSeparacaoDemanda->getProduto()->getCodigo() . '.jpg',
'codigo' => $itemSeparacaoDemanda->getProduto()->getCodigo(),
'titulo' => $itemSeparacaoDemanda->getProduto()->getTitulo(),
'quantidade' => str_pad($itemSeparacaoDemanda->getQuantidade(), 2, "0", STR_PAD_LEFT),
'checklist' => (!$itemSeparacaoDemanda->getChecklist()) ? 'pendente' : $itemSeparacaoDemanda->getChecklist(),
'isSimples' => $itemSeparacaoDemanda->getIsSimples(),
'isSimplesMesmo' => $itemSeparacaoDemanda->getIsSimplesMesmo()
];
}
} else {
foreach ($produtosPedido as $produtoPedido) {
$produtosData[] = [
'cliente' => $this->abreviarNome($demanda->getPedido()->getContato()),
'id' => $produtoPedido->getId(),
'img' => 'https://polo.srvtmp.com.br/uploads/produtos/' . $produtoPedido->getProduto()->getCodigo() . '.jpg',
'codigo' => $produtoPedido->getProduto()->getCodigo(),
'titulo' => $produtoPedido->getProduto()->getTitulo(),
'estruturas' => json_decode($produtoPedido->getProduto()->getEstrutura()),
'quantidade' => str_pad($produtoPedido->getQuantidade(), 2, "0", STR_PAD_LEFT),
'isMontado' => $produtoPedido->getIsMontado(),
'isSeparado' => $produtoPedido->getIsMontado(),
'isSimples' => true,
'isSimplesMesmo' => true,
'checklist' => (!$produtoPedido->getChecklist()) ? 'pendente' : $produtoPedido->getChecklist(),
];
}
}
*/
$produtosAgrupados = [];
foreach ($produtosChecklist as $produtoCheck) {
$codigo = $produtoCheck['codigo'];
// Se o código já existir no array agrupado, soma a quantidade
if (isset($produtosAgrupados[$codigo])) {
$produtosAgrupados[$codigo]['quantidade'] += $produtoCheck['quantidade'];
} else {
// Se não existir, adiciona o produto
$produtosAgrupados[$codigo] = $produtoCheck;
}
}
// Formata a quantidade final para ter zero à esquerda caso tenha só um dígito
foreach ($produtosAgrupados as &$produtoAgrupado) {
$produtoAgrupado['quantidade'] = str_pad($produtoAgrupado['quantidade'], 2, '0', STR_PAD_LEFT);
}
// Reindexa o array agrupado (caso precise de um array numericamente indexado)
$produtosAgrupados = array_values($produtosAgrupados);
return new JsonResponse(['produtos'=>$produtos, 'checklist'=>$produtosAgrupados], 200);
}
private function loadProdutosPedido($pedido, $client, $tipo) {
$itens = $this->getPedido($pedido->getPedido(), $client);
//if($tipo=='separacao'){
if(is_array($itens)){
foreach ($itens['itens'] as $item) {
$produtoBlng = $this->getDoctrine()->getRepository(ProdutoBling::class)->findOneBy(['codigo'=>$item['codigo']]);
// $isSimples = false;
// if(isset($item['estruturas'])) {
// $isSimples = (count($item['estruturas'])>0) ? false : false;
// }
if($produtoBlng instanceof ProdutoBling) { // Esses são os produtos que estão no pedido
$itemSeparacao = new ItemSeparacaoDemanda();
$itemSeparacao->setProduto($produtoBlng);
$itemSeparacao->setQuantidade($item['quantidade']);
$itemSeparacao->setChecklist('pendente');
$itemSeparacao->setPedido($pedido);
$itemSeparacao->setIsSimplesMesmo($produtoBlng->getIsSimples());
$itemSeparacao->setIsSimples(false);
$this->getDoctrine()->getManager()->persist($itemSeparacao);
$this->getDoctrine()->getManager()->flush();
}
}
$item['estruturas'] = $this->agrupaEstruturas($itens['itens']);
foreach ($item['estruturas'] as $estrutura) { // Esses são os produtos de estruturas de cada um dos produtos
$itemSeparacao = new ItemSeparacaoDemanda();
$produtoBlng = $this->getDoctrine()->getRepository(ProdutoBling::class)->findOneBy(['codigo'=>$estrutura['codigo']]);
$itemSeparacao->setProduto($produtoBlng);
$itemSeparacao->setQuantidade($estrutura['quantidade']);
$itemSeparacao->setChecklist('pendente');
$itemSeparacao->setPedido($pedido);
$itemSeparacao->setIsSimplesMesmo($produtoBlng->getIsSimples());
$itemSeparacao->setIsSimples(true);
$this->getDoctrine()->getManager()->persist($itemSeparacao);
$this->getDoctrine()->getManager()->flush();
}
}
//} else {
// if(is_array($itens)){
// foreach ($itens['itens'] as $item) {
// $produtoBlng = $this->getDoctrine()->getRepository(ProdutoBling::class)->findOneBy(['codigo'=>$item['codigo']]);
// if($produtoBlng instanceof ProdutoBling) {
// $produto = new ProdutoPedido();
// $produto->setProduto($produtoBlng);
// $produto->setQuantidade($item['quantidade']);
// $produto->setIsMontado(false);
// $produto->setIsSeparado(false);
// $produto->setPedido($pedido);
// $produto->setIsSimples($item['isSimples']);
// $this->getDoctrine()->getManager()->persist($produto);
// $this->getDoctrine()->getManager()->flush();
// }
// }
// }
//}
}
private function replaceAssistencia($pedido) {
return str_ireplace(['Assistência', '-'],[''.'A'],$pedido);
}
/**
* @Route("/gestao-montagem-json/{local}/{tipo}", name="gestao_montagem_json")
*/
public function listaPedidos($local, $tipo): Response
{
return new JsonResponse($this->listaDemandas($local, $tipo), 200);
}
private function abreviarNome($nomeCompleto) {
// Separa o nome completo em partes
$partes = explode(' ', $nomeCompleto);
// Se houver apenas um nome, retorna como está
if (count($partes) == 1) {
return $nomeCompleto;
}
// Mantém o primeiro e o último nome completos
$primeiroNome = array_shift($partes);
$ultimoNome = array_pop($partes);
// Converte os nomes intermediários para iniciais
$iniciais = '';
foreach ($partes as $parte) {
$iniciais .= strtoupper($parte[0]) . '. ';
}
// Concatena o primeiro nome, as iniciais e o último nome
return $primeiroNome . ' ' . $iniciais . $ultimoNome;
}
/**
* @Route("/gestao-montagem/{local}", name="gestao_montagem")
*/
public function index($local): Response
{
return $this->render('montagem/index.html.twig', [
'controller_name' => 'MontagemController',
'local' => $local,
'tipo' => 'todos',
'colaboradores' => $this->getColaboradores($local)
]);
}
private function getColaboradores($local) {
$separadores_co = [
['id'=>21, 'nome'=>'Ronald'],
['id'=>36, 'nome'=>'Gregory'],
['id'=>40, 'nome'=>'Emanuel'],
['id'=>29, 'nome'=>'Lucas'],
['id'=>22, 'nome'=>'Marcos'],
['id'=>31, 'nome'=>'Victor'],
['id'=>41, 'nome'=>'Kevin'],
['id'=>23, 'nome'=>'Fábio'],
['id'=>43, 'nome'=>'Adriel'],
];
$separadores_sj = [
['id'=>7, 'nome'=>'Geovair'],
['id'=>34, 'nome'=>'Nelson'],
['id'=>19, 'nome'=>'Mateus'],
['id'=>26, 'nome'=>'Samuel'],
['id'=>30, 'nome'=>'Claudiano'],
['id'=>27, 'nome'=>'Luiz'],
['id'=>35, 'nome'=>'Cris'],
['id'=>38, 'nome'=>'Nathan'],
['id'=>42, 'nome'=>'Kawan'],
];
return ($local=='co') ? json_encode($separadores_co) : json_encode($separadores_sj);
}
/**
* @Route("/gestao-montagem/{local}/{tipo}", name="gestao_montagem_tipo")
*/
public function indexTipo($local, $tipo): Response
{
return $this->render('montagem/index.html.twig', [
'controller_name' => 'MontagemController',
'local' => $local,
'tipo' => $tipo,
'colaboradores' => $this->getColaboradores($local)
]);
}
private function getPedido($numero, $client, $tipoPedido='pedido', $pedidoMake=null) {
$response = $client->request(
'GET',
SincronizacaoController::URL_API_BLING . '/pedido/'.$numero.'/json/',
[
'query' => [
'apikey' => SincronizacaoController::KEY_API_POLLO
]
]
);
$statusCode = $response->getStatusCode();
$numeroNota = '';
$dados = [
'telefone' =>'',
'endereco' => '',
'endereco_entrega' => '',
'tipo' => $tipoPedido,
'numeroNf' => '',
'numeroPedido' => $numero,
'isUrgente' => 'Não',
'assistencia' => 'Não',
'contato' => '',
'periodosEntrega' => '',
'entregarHoje' => '',
'vendedor' => '',
'embalagem' => 'Desmontado',
'exigeLadoBalcao' => false, // Qual lado do balcão
'cnpj' => '',
'frete' =>'',
'solicitarColeta' => '',
'nomeTrasportadora' => '',
'meioEntrega' => '',
'esperarClientePagar' => 'Não',
'cotarFrete' => '',
'itens' => '',
'dataAgendamentoEntrega' => ''
];
if ($statusCode == SincronizacaoController::HTTP_STATUS_CODE_OK) {
$content = $response->toArray();
if(isset($content['retorno'])){
if(isset($content['retorno']['pedidos'])){
if(count($content['retorno']['pedidos']) > 0) {
if(isset($content['retorno']['pedidos'][0])){
$pedido = $content['retorno']['pedidos'][0]['pedido'];
if(!empty($content['retorno']['pedidos'][0]['pedido']['cliente']['endereco'])){
$dados['endereco'] = $content['retorno']['pedidos'][0]['pedido']['cliente']['endereco'] . ', ' .
$content['retorno']['pedidos'][0]['pedido']['cliente']['numero'] . ', ' .
$content['retorno']['pedidos'][0]['pedido']['cliente']['complemento'] . ', ' .
$content['retorno']['pedidos'][0]['pedido']['cliente']['bairro'] . ', ' .
$content['retorno']['pedidos'][0]['pedido']['cliente']['cidade'] . '/' .
$content['retorno']['pedidos'][0]['pedido']['cliente']['uf'] . ', ' .
$content['retorno']['pedidos'][0]['pedido']['cliente']['cep'] . ', ';
}
$dados['contato'] = $content['retorno']['pedidos'][0]['pedido']['cliente']['nome'];
$telefones = [];
if(isset($content['retorno']['pedidos'][0]['pedido']['cliente']['celular'])){
if($content['retorno']['pedidos'][0]['pedido']['cliente']['celular']!=""){
$telefone = $content['retorno']['pedidos'][0]['pedido']['cliente']['celular'];
$telefone = '55'.$telefone;
$telefones[] = preg_replace('/\D/', '', $telefone);
}
}
if(isset($content['retorno']['pedidos'][0]['pedido']['cliente']['fone'])){
if($content['retorno']['pedidos'][0]['pedido']['cliente']['fone']!=""){
$telefone = $content['retorno']['pedidos'][0]['pedido']['cliente']['fone'];
$telefone = '55'.$telefone;
$telefones[] = preg_replace('/\D/', '', $telefone);
}
}
$dados['telefone'] = implode('|', $telefones);
if(isset($content['retorno']['pedidos'][0]['pedido']['nota'])){
$dados['numeroNf'] = intval($content['retorno']['pedidos'][0]['pedido']['nota']['numero']);
}
$dados['vendedor'] = $content['retorno']['pedidos'][0]['pedido']['vendedor'];
$dados['cnpj'] = '';
$dados['totalvenda'] = '';
$dados['itens'] = [];
if(!empty($content['retorno']['pedidos'][0]['pedido']['cliente']['cnpj'])){
$dados['cnpj'] = $content['retorno']['pedidos'][0]['pedido']['cliente']['cnpj'];
}
$dataPedido = \DateTime::createFromFormat('Y-m-d', $content['retorno']['pedidos'][0]['pedido']['data']);
$dados['data'] = $dataPedido->format('d/m/Y');
$totalItens = 0;
$totalItensTotal = 0;
$valorSubTotal = 0;
$descontosItens = 0;
if(!empty($content['retorno']['pedidos'][0]['pedido']['itens'])){
foreach ($content['retorno']['pedidos'][0]['pedido']['itens'] as $item) {
if(in_array($item['item']['codigo'], $this->skusDebalcao())){
$dados['exigeLadoBalcao'] = true;
}
$totalItens++;
$valorTotal = $item['item']['quantidade'] * $item['item']['valorunidade'];
$valorSubTotal += $valorTotal;
$totalItensTotal += $item['item']['quantidade'];
$descontosItens += $item['item']['descontoItem'];
// $img = '';
// $pathFile = '/www/wwwroot/gestor.moveispollo.com.br/public/uploads/produtos/' . $item['item']['codigo'] . '.jpg';
// if(file_exists($pathFile)){
// $img = 'https://polo.srvtmp.com.br/uploads/produtos/' . $item['item']['codigo'] . '.jpg';
// } else {
// $produtoBling = $this->getProduto(SincronizacaoController::KEY_API_POLLO,
// $item['item']['codigo'], $client, $xml=false);
// if(isset($produtoBling['retorno']['produtos'][0])) {
// if(isset($produtoBling['retorno']['produtos'][0]['produto']['imagem'][0])) {
// $img = $produtoBling['retorno']['produtos'][0]['produto']['imagem'][0]['link'];
// $img = str_ireplace('\\','',$img);
// }
// }
// }
$dados['itens'][] = [
'codigo' => $item['item']['codigo'],
'descricao' => $item['item']['descricao'],
'un' => $item['item']['un'],
'quantidade' => abs($item['item']['quantidade']),
'valorunidade' => number_format($item['item']['valorunidade'], 2, ',', '.'),
'valorTotal' => number_format($valorTotal, 2, ',', '.'),
//'img' => $img,
'estruturas' => $this->getEstruturas($item['item']['codigo']) // Primeiro nivel
];
}
}
$dados['parcelas'] = [];
if(!empty($content['retorno']['pedidos'][0]['pedido']['parcelas'])) {
foreach ($content['retorno']['pedidos'][0]['pedido']['parcelas'] as $parcela) {
$dataVencimento = \DateTime::createFromFormat('Y-m-d', $parcela['parcela']['dataVencimento']);
$dados['parcelas'][] = [
'valor' => number_format($parcela['parcela']['valor'], 2, ',', '.'),
'dias' => '0',
'dataVencimento' => $dataVencimento->format('d/m/Y'),
'formaPagamento' => $parcela['parcela']['forma_pagamento']['descricao'],
'obs' => $parcela['parcela']['obs']
];
}
}
$dados['numero_itens'] = $totalItens;
$dados['numero_itens_total'] = $totalItensTotal;
$dados['descontos'] = number_format($descontosItens, 2, ',', '.');
$dados['valorTotalPedido'] = number_format($valorSubTotal, 2, ',', '.');
$dados['valorTotalComDesconto'] = number_format($content['retorno']['pedidos'][0]['pedido']['totalvenda'], 2, ',', '.');
$dados['obs'] = $content['retorno']['pedidos'][0]['pedido']['observacoes'];
$dados['frete'] = (isset($content['retorno']['pedidos'][0]['pedido']['valorfrete'])) ? $content['retorno']['pedidos'][0]['pedido']['valorfrete'] : '';
$dados['descontoGeral'] = $content['retorno']['pedidos'][0]['pedido']['desconto'];
$pedidoEntrega = $this->getDoctrine()->getRepository(EntregaPedido::class)->findOneBy(['pedido' => $numero]);
$dados['showMaisPedidos'] = false;
$dados['estruturas'] = $this->agrupaEstruturas($dados['itens']);
if($pedidoEntrega instanceof EntregaPedido){
if($pedidoMake instanceof EntregaPedido){
$dados['mais_info'] = $this->makeProdutoData($pedidoMake, true);
} else {
$dados['mais_info'] = $this->makeProdutoData($pedidoEntrega, true);
}
$dados['showMaisPedidos'] = true;
}
if(!empty($content['retorno']['pedidos'][0]['pedido']['transporte'])){
if(!empty($content['retorno']['pedidos'][0]['pedido']['transporte']['enderecoEntrega'])){
$dados['endereco_entrega'] =
$content['retorno']['pedidos'][0]['pedido']['transporte']['enderecoEntrega']['endereco'] . ', ' .
$content['retorno']['pedidos'][0]['pedido']['transporte']['enderecoEntrega']['numero'] . ', ' .
$content['retorno']['pedidos'][0]['pedido']['transporte']['enderecoEntrega']['complemento'] . ', ' .
$content['retorno']['pedidos'][0]['pedido']['transporte']['enderecoEntrega']['bairro'] . ', ' .
$content['retorno']['pedidos'][0]['pedido']['transporte']['enderecoEntrega']['cidade'] . '/' .
$content['retorno']['pedidos'][0]['pedido']['transporte']['enderecoEntrega']['uf'] . ', ' .
$content['retorno']['pedidos'][0]['pedido']['transporte']['enderecoEntrega']['cep'] . ', ';
}
}
//print_r($dados['itens']); exit;
return $dados;
}
}
}
}
} else {
exit('Erro em bucar pedido: ' . $numero);
}
return false;
}
public function agrupaEstruturas($itens) {
$estruturas = [];
foreach ($itens as $item) {
if(isset($item['estruturas']) && !empty($item['estruturas'])){
foreach ($item['estruturas'] as $estrutura) {
$produtoBling = $this->getDoctrine()->getRepository(ProdutoBling::class)->findOneBy(['codigo' => $estrutura->codigo]);
if(!$produtoBling instanceof ProdutoBling){
continue;
}
$isSimples = false;
if($produtoBling->getIsSimples()){
$isSimples = $produtoBling->getIsSimples();
}
$quantidade = $estrutura->quantidade * $item['quantidade'];
$estruturas[] = [
'nome' => $estrutura->nome,
'codigo' => $estrutura->codigo,
'quantidade' => $quantidade,
'isSimples' => $isSimples
];
}
}
}
$itensAgrupados = array();
// Iterar sobre os itens originais
foreach ($estruturas as $item) {
$codigo = $item["codigo"];
$quantidade = $item["quantidade"];
// Se o código já existir no array $itensAgrupados, adicione a quantidade
if (isset($itensAgrupados[$codigo])) {
$itensAgrupados[$codigo]["quantidade"] += $quantidade;
} else {
// Se não, crie uma nova entrada no array
$itensAgrupados[$codigo] = array(
"nome" => $item["nome"],
"codigo" => $codigo,
"quantidade" => $quantidade,
'isSimples' => $item["isSimples"]
);
}
}
// Resultado final com itens agrupados e quantidades somadas
$resultadoFinal = array_values($itensAgrupados);
return $resultadoFinal;
}
public function getEstruturas($codigo){
$produtoBling = $this->getDoctrine()->getRepository(ProdutoBling::class)->findOneBy(['codigo' => $codigo]);
if($produtoBling instanceof ProdutoBling) {
$estruturas = json_decode($produtoBling->getEstrutura());
if(!empty($produtoBling->getEstrutura())){
foreach ($estruturas as $estrutura){ // Pego para cada item uma estrutura dentro
$subEstruturas = $this->getSubEstruturas($estrutura->codigo);
if(!empty($subEstruturas)){
foreach ($subEstruturas as $subEstrutura){
$estruturas[] = $subEstrutura;
}
}
}
return (count($estruturas)>0) ? $estruturas : '';
}
return '';
}
return '';
}
public function getSubEstruturas($codigo) {
$produtoBling = $this->getDoctrine()->getRepository(ProdutoBling::class)->findOneBy(['codigo' => $codigo]);
if($produtoBling instanceof ProdutoBling) {
$estruturas = json_decode($produtoBling->getEstrutura());
if(!empty($produtoBling->getEstrutura())){
return (count($estruturas)>0) ? $estruturas : '';
}
return '';
}
return '';
}
private function getProduto($apiKeyStore, $codigoProduto, $client, $xml=false) {
$format = 'json';
if($xml){
$format = 'xml';
}
$response = $client->request(
'GET',
SincronizacaoController::URL_API_BLING . '/produto/'.$codigoProduto.'/'.$format,
[
'query' => [
'apikey' => $apiKeyStore,
'estoque' => 'S',
'imagem' => 'S',
'situacao' => 'A'
]
]
);
$statusCode = $response->getStatusCode();
if ($statusCode == SincronizacaoController::HTTP_STATUS_CODE_OK) {
if($xml){
return $response->getContent();
}
$content = $response->toArray();
return $content;
} else {
return [];
}
return [];
}
}