Ir para conteúdo
Nerdmonkey

Organização de itens em caixas para cálculo de frete nos Correios

Recommended Posts

A quanto tempo não posto aqui. As novidades do fórum estão bem bacanas... já volto com uma bomba rs

 

Estou adaptando um classe para arranjar os produtos do carrinho de um e-comerce em caixas para calcular o frete juntos aos correios.

Gostaria de sugestões dos colegas para implementar, sempre que um caixa atingir o limite, gerar uma nova caixa... a parte da comunicação com a API do correios está bem tranquilo.

O que tá pegando mesmo é essa parte da organização dos itens em várias caixas.

Vou deixar aqui o código completo que estou testando...

 

/

config.php

<?php

define("MIN_LARGURA", 11);
define("MAX_LARGURA", 105);
define("MIN_ALTURA", 2);
define("MAX_ALTURA", 105);
define("MIN_COMPRIMENTO", 16);
define("MAX_COMPRIMENTO", 105);
define("MIN_SOMA_CLA", 29);
define("MAX_SOMA_CLA", 200);

function dd($data) {
    echo '<pre>';
    var_dump($data);
    echo '</pre>';
}

index.php

<?php

require_once 'config.php';
require_once 'Boxes.php';

$cart = [
    [
        'title' => 'Book - The art of war',
        'A' => 25, 
        'L' => 70, 
        'C' => 90,
    ],
    [
        'title' => 'Book - The art of war',
        'A' => 25, 
        'L' => 70, 
        'C' => 90,
    ],
    [
        'title' => 'Book - The art of war',
        'A' => 25, 
        'L' => 70, 
        'C' => 90,
    ],
];

$boxes = new Boxes($cart);
dd($boxes->createBoxes());

Boxes.php

<?php

class Boxes {
    
    private $cart = [];
    
    private $box = [];
    
    private $box_properties = [];
    
    /**
     * __construct
     * 
     * @param array $cart
     */
    public function __construct($cart = []) 
    {
        $this->cart = $cart;
        $this->box_properties = [
            'altura' => 0,
            'largura' => 0,
            'comprimento' => 0,
            'qtd_itens' => 0,
            'message' => null,
            'volume' => 0,
            'volume_itens' => 0,
            'volume_vazio' => 0,
            'comprimento_remanescente' => 0,
            'largura_remanescente' => 0,
            'altura_remanescente' => 0
        ];
    }
    
    /**
     * Order items inside the box
     * 
     * @return array
     */
    public function orderBox()
    {
        foreach ($this->cart as $k => $item):
            $new_height = min($item['A'], $item['L'], $item['C']);
            $new_length = max($item['A'], $item['L'], $item['C']);
            $width = [$item['A'], $item['L'], $item['C']];
            
            sort($width) ;
            array_shift($width);
            array_pop($width);

            $item['L'] = isset($width[0]) ? $width[0] : $new_height;
            $item['A'] = $new_height ;
            $item['C'] = $new_length ;
            $item['LC'] = $item['L'] * $item['C'] ;
            $this->cart[$k] = $item;
        endforeach;
        
        usort($this->cart, function($a, $b){
            return $a['LC'] < $b['LC'];
        });

        return $this->cart ;
    }
    
    /**
     * Create and put items inside the box
     * 
     * @return array
     */
    public function createBoxes()
    {
        $this->cart = $this->orderBox();
        $this->box = json_decode(json_encode($this->box_properties,FALSE));
        $this->organizeItems();
        $this->box->volume = ($this->box->altura * $this->box->largura * $this->box->comprimento);
	$this->box->volume_vazio = $this->box->volume - $this->box->volume_itens;
        $this->minSpecifications();
        $this->errors();
        
        return $this->box;
    }

    private function organizeItems()
    {
        foreach ($this->cart as $item):
            $this->box->qtd_itens++;
            $this->box->volume_itens += ($item['A'] * $item['L'] * $item['C']);
            $this->allocateItems($item);      
            $this->box->altura += $item['A'];
            
            if($item['L'] > $this->box->largura):
                $this->box->largura = $item['L'];
            endif;

            if ($item['C'] > $this->box->comprimento):
                $this->box->comprimento = $item['C'];
            endif;

            $this->box->comprimento_remanescente = $this->box->comprimento;
            $this->box->largura_remanescente = $this->box->largura - $item['L'];
            $this->box->altura_remanescente = $item['A'];
        endforeach;
    }

    private function allocateItems($item)
    {
        if($this->box->comprimento_remanescente >= $item['C'] && $this->box->largura_remanescente >= $item['L']):
            if($item['A'] > $this->box->altura_remanescente):
                $this->box->altura += $item['A'] - $this->box->altura_remanescente ;
            endif;

            if($item['C'] > $this->box->comprimento):
                $this->box->comprimento = $item['C'];
            endif;

            $this->box->comprimento_remanescente = $this->box->comprimento - $item['C'];
            $this->box->largura_remanescente = $this->box->largura_remanescente - $item['L'] ;
            $this->box->altura_remanescente = $item['A'] > $this->box->altura_remanescente ? $item['A'] : $this->box->altura_remanescente ;
        endif;
    }
    
    private function minSpecifications()
    {
        if($this->box->altura > 0 && $this->box->altura < MIN_ALTURA):
            $this->box->altura = MIN_ALTURA ;
        endif;
        
        if($this->box->largura > 0 && $this->box->largura < MIN_LARGURA):
            $this->box->largura = MIN_LARGURA ;
        endif;
        
        if($this->box->comprimento > 0 && $this->box->comprimento < MIN_COMPRIMENTO):
            $this->box->comprimento = MIN_COMPRIMENTO ;
        endif;
    }
    
    private function errors() 
    {
        if($this->box->altura > MAX_ALTURA):
            $this->box->message = "Erro: Altura maior que o permitido.";
        endif;
        
	if($this->box->largura > MAX_LARGURA ):
            $this->box->message = "Erro: Largura maior que o permitido.";
        endif;
        
	if($this->box->comprimento > MAX_COMPRIMENTO ):
            $this->box->message = "Erro: Comprimento maior que o permitido.";
        endif;
        
	if(($this->box->comprimento + $this->box->comprimento + $this->box->comprimento) < MIN_SOMA_CLA):
            $this->box->message = "Erro: Soma dos valores C+L+A menor que o permitido.";
        endif;
		
	if(($this->box->comprimento + $this->box->comprimento + $this->box->comprimento) > MAX_SOMA_CLA):
            $this->box->message = "Erro: Soma dos valores C+L+A maior que o permitido.";
        endif;
    }
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Está lá em cima. Nas constantes. Solução, até onde pesquisei, nada simples.

Mas como não desisto fácil... bora continuar tentando :pensive:

Compartilhar este post


Link para o post
Compartilhar em outros sites

A ideia talvez seria aplicar um método quase no mesmo estilo que você fez no método errors(), só que ao invés de disparar um erro, você abriria uma nova caixa caso o cliente fosse adicionando mais itens no carrinho.

Qual ideia você teve que não é simples? De repente se você colocar ela aqui a galera pode ajudar a simplificar ou dar novas ideias.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A justificativa do meu argumento de não ser tão simples de resolver esse problema https://pt.wikipedia.org/wiki/Problema_da_mochila. Fora o fato de que ninguém, pelo menos que eu conheça, como programador, tenha feito parecido ou consiga palpitar sobre um caminha por onde seguir. Mas já imaginava que não seria fácil antes mesmo de começar. Dinamismo, de certa forma, na minha opinião,  torna o código reutilizável, e de certa forma, aumenta sua complexabilidade de desenvolvimento, para soluções bem elaboradas.

 

A sua ideia é boa, estou realmente trabalhando em cima disso atualmente. A lógica é verificar quando uma caixa atingiu seu limite > fechar esta caixa, tendo seus parâmetros para medir a cubagem definidos(A * C * L) > abrir uma nova caixa e começar a alocar os itens que não foram alocados na caixa anterior, pois excederiam os limites especificados pelos Correios.

 

Isso me daria margem para definir o valor do frete com base na cubagem de cada caixa. Posso ter 'n' caixas, cada uma com 'm' volume e peso distintos. Bem complexo, pelo menos pra mim, no momento. Mas acredito que não é impossível. :sweat_smile:

Compartilhar este post


Link para o post
Compartilhar em outros sites
8 horas atrás, Nerdmonkey disse:

A sua ideia é boa, estou realmente trabalhando em cima disso atualmente. A lógica é verificar quando uma caixa atingiu seu limite > fechar esta caixa, tendo seus parâmetros para medir a cubagem definidos(A * C * L) > abrir uma nova caixa e começar a alocar os itens que não foram alocados na caixa anterior, pois excederiam os limites especificados pelos Correios.

 

Isso me daria margem para definir o valor do frete com base na cubagem de cada caixa. Posso ter 'n' caixas, cada uma com 'm' volume e peso distintos. Bem complexo, pelo menos pra mim, no momento. Mas acredito que não é impossível.

 

Perfeito, a lógica ta bacana, vai verificando cada produto que entra, e eu acho que aquele método errors() que você fez é quase que meio caminho andado, pq pelo o que eu entendi ele verifica o tamanho das caixas e dispara os erros informando que tal largura/altura/comprimento da caixa foi excedido, só que, caso o cliente já esteja com a caixa cheia ou quase cheia e queira continuar comprando e o produto que ele adicionar não caber na caixa atual, chama um método tipo "newBox()", bota a caixa que já está cheia em um array nesse método e guarda ele, deixa o cliente continuar comprando e abrindo novas caixas se necessário.

Eu só não consigo te ajudar mais precisamente pq, sinceramente, eu não manjo muito do cálculo que é feito pra definir o tamanho/volume de uma caixa, pq pelo o que você falou você ta multiplicando todos eles, A*C*L, que no caso daria 157500 (25*70*90), como você extrai o valor final das caixas com esse resultado?

Compartilhar este post


Link para o post
Compartilhar em outros sites
Citar

Perfeito, a lógica ta bacana, vai verificando cada produto que entra, e eu acho que aquele método errors() que você fez é quase que meio caminho andado...

 

Estou trabalhando nisso. A lógica aqui é verificar quando a caixa exceder altura, largura ou comprimento. Normalmente, vai exceder em altura, porque os produtos são pequenos, ai na organização, consigo ir colocado os maiores por baixo e ir ajustando os demais no espaço remanescente. 

 

Citar

como você extrai o valor final das caixas com esse resultado?

 

É nessa questão mesmo que estou testando uma possível solução. Mas o conceito você pegou bem. É gerar a caixa, quando bater no limite, eu fecho a caixa e começo uma nova. Estou testando algumas formas de aplicar isso na classe. O trabalhoso está sendo armazenas os itens que cabem na caixa. Guardá-los e fechar a caixa. Pegar somente o que passa e ir colocando em novas caixas conforme a quantidade.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pensei em uma solução bem elegante e que se aproximaria bem do tamanho da embalagem necessária para trasnportar os produtos.

 

Você precisa inicialmente calcular o  cm³ (centimetro cúbico = multiplicar a altura, com a largura, com o comprimento) encontrando o volume que o produto ocupa. Apos fazer isso com cada produto, você soma os volumes e depois calcula a raiz cúbica desse valor, o resultado dessa raiz cúbica será cada uma das medidas da sua embalagem (altura, comprimento e largura) sempre gerará uma embalagem quadrada, mas não importa,  pois isso irá aproximar bem o valor do frete real. Caso ultrapasse a medida máxima permitida pelos correios, basta dividir em mais caixas e somar os fretes

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por BTK
      Boa noite, estou tentando criar um curl que faz cadastro no site(o proprietário está ciente disso) porem ele está me retornando (HTTP/1.1 100 Continue HTTP/1.1 302 Moved Temporarily)

       $ch = curl_init();   
          
                                                                                                                     
          curl_setopt($ch, CURLOPT_URL, "https://www.cafefacil.com.br/customer/account/create/");                                     
          curl_setopt($ch, CURLOPT_HEADER, true);                                                                                                   
          curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36');                                                                                                                                               
          curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);                                                                                         
          curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);                                                                                       
          curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);                                                                                       
          curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
          curl_setopt($ch, CURLOPT_COOKIESESSION, true);                                                                             
          curl_setopt($ch, CURLOPT_COOKIEJAR, getcwd().'/cafefacil.txt');
          curl_setopt($ch, CURLOPT_COOKIEFILE, getcwd().'/cafefacil.txt'); 
          
          
          
          
          $b1 = curl_exec($ch);
          
          $form_key = value($b1, 'type="hidden" name="form_key" value="', '"');
          
          curl_setopt($ch, CURLOPT_URL, 'https://www.cafefacil.com.br/customer/account/createpost/');                                     
          curl_setopt($ch, CURLOPT_HEADER, true);                                                                                                   
          curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36');                                                                                                                                                  
          curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);                                                                                         
          curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);                                                                                    
          curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);                                                                                       
          curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
          curl_setopt($ch, CURLOPT_COOKIESESSION, true);   
          curl_setopt($ch, CURLOPT_REFERER, 'https://www.cafefacil.com.br/customer/account/create/');                                                                           
          curl_setopt($ch, CURLOPT_COOKIEJAR, getcwd().'/cafefacil.txt');
          curl_setopt($ch, CURLOPT_COOKIEFILE, getcwd().'/cafefacil.txt'); 
          curl_setopt($ch, CURLOPT_POST, 1);                                                                                                    
          $boundary = '---------------------------WebKitFormBoundaryRQ3KHJbpfmPf11v6';
          
          $data = '-----------------------------'.$boundary.'
          Content-Disposition: form-data; name="success_url"
          
          
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="error_url"
          
          
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="form_key"
          
          '.$form_key.'
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="tipopessoa"
          
          15
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="firstname"
          
          NomeTest SobreNomeTest
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="nomefantasia"
          
          
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="inscricaoestadual"
          
          
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="email"
          
          nometestsobrenometest@gmail.com
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="day"
          
          01
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="month"
          
          01
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="year"
          
          1990
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="dob"
          
          01/01/1990
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="taxvat"
          
          199.758.750-50
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="celular"
          
          (11)4712-8491
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="password"
          
          senhatest
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="confirmation"
          
          senhatest
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="persistent_remember_me"
          
          on
          -----------------------------'.$boundary.'--';
          
          $header[] = "Content-Type: multipart/form-data; boundary=".$boundary;
          curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
          curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 
          
            
          echo $exec = curl_exec($ch);
          curl_close($ch);
    • Por allencar.limma
      Tento incluir as informações de um formulário no banco de dados e não consigo. conforme código abaixo.
      <? /*Incluir as informações no formulario */ include "config.php"; $nome = trim($_POST['nome']); $masp = trim($_POST['masp']); $cpf = trim($_POST['cpf']); $telefone = trim($_POST['telefone']); $email = trim($_POST['email']); $endereco = trim($_POST['endereco']); $data_nascimento = trim($_POST['data_nascimento']); $unidade_lotacao = trim($_POST['unidade_lotacao']); /* Vamos checar algum erro nos campos */ if ((!$nome) || (!$masp) || (!$cpf) || (!$telefone) || (!$email) || (!$endereco) || (!$data_nascimento) || (!$unidade_lotacao)){ echo "ERRO: <br /><br />"; if (!$nome){ echo "Nome Completo é requerido.<br />"; } if (!$masp){ echo "Masp é requerido.<br />"; } if (!$cpf){ echo "CPF é requerido.<br /)>"; } if (!$telefone){ echo "Telefone é requerido.<br />"; } if (!$email){ echo "Email é requerido.<br />"; } if (!$endereco){ echo "Endereço é requerido.<br />"; } if (!$data_nascimento){ echo "Data de Nascimento é requerido.<br />"; } if (!$unidade_lotacao){ echo "Unidade de Lotação é requerido.<br>"; } echo "Preencha os campos abaixo: <br />"; include "formulario_cadastro.php"; }else { /* Vamos checar se o nome de Usuário escolhido e/ou Email já existem no banco de dados */ $sql_email_check = mysql_query( "SELECT COUNT(usuario_id) FROM usuarios WHERE email='{$email}'" ); $sql_masp_check = mysql_query( "SELECT COUNT(usuario_id) FROM usuarios WHERE masp='{$masp}'" ); $sql_cpf_check = mysql_query( "SELECT COUNT(usuario_id) FROM usuarios WHERE cpf='{$cpf}'" ); $eReg = mysql_fetch_array($sql_email_check); $uReg = mysql_fetch_array($sql_masp_check); $uReg = mysql_fetch_array($sql_cpf_check); $email_check = $eReg[0]; $masp_check = $uReg[0]; $cpf_check = $uReg[0]; if (($email_check > 0) || ($masp_check > 0) || ($cpf_check > 0)){ echo "<strong>ERRO</strong>: <br /><br />"; if ($email_check > 0){ echo "Este email já está sendo utilizado.<br /><br />"; unset($email); } if ($masp_check > 0){ echo "Este Masp já está sendo utilizado.<br /><br />"; unset($masp); } if ($cpf_check > 0){ echo "Este CPF já está sendo utilizado.<br /><br />"; unset($cpf); } include "formulario_cadastro.php"; }else{ /* Se passarmos por esta verificação ilesos é hora de finalmente cadastrar os dados. Vamos utilizar uma função para gerar a senha de forma randômica*/ function makeRandomPassword(){ $salt = "abchefghjkmnpqrstuvwxyz0123456789"; srand((double)microtime()*1000000); $i = 0; while ($i <= 7){ $num = rand() % 33; $tmp = substr($salt, $num, 1); $pass = $pass . $tmp; $i++; } return $pass; } $senha_randomica = makeRandomPassword(); $senha = md5($senha_randomica); // Inserindo os dados no banco de dados //$cpf = htmlspecialchars($cpf); ***RETIRADO PELO FATO DE NÃO ESTA SENDO USADO $sql = mysql_query( "INSERT INTO usuarios (none, masp, cpf, telefone, email, endereco, data_nascimento, unidade_lotacao) VALUES ('$nome', '$masp', '$cpf', '$telefone', '$email', '$endereco', '$data_nascimento', '$unidade_lotacao', now())") or die( mysql_error() ); if (!$sql){ echo "Ocorreu um erro ao criar sua conta, entre em contato."; }else{ $usuario_id = mysql_insert_id(); // Enviar um email ao usuário para confirmação e ativar o cadastro! $headers = "MIME-Version: 1.0\n"; $headers .= "Content-type: text/html; charset=iso-8859-1\n"; $headers .= "From: RCI - <rci@rcionline.com.br>"; $subject = "Confirmação de cadastro - www.rcionline.com.br"; $mensagem = "Prezado {$nome} {$masp},<br /> Obrigado pelo seu cadastro em nosso site, <a href='http://www.rcionline.com.br'> http://www.rcionline.com.br</a>!<br /> <br /> Para confirmar seu cadastro e ativar sua conta em nosso site, podendo acessar à áreas exclusivas, por favor clique no link abaixo ou copie e cole na barra de endereço do seu navegador.<br /> <br /> <a href='http://www.rcionline.com.br/ativar.php?id={$usuario_id}&code={$senha}'> http://www.rcionline.com.br/ativar.php?id={$usuario_id}&code={$senha} </a> <br /> <br /> Após a ativação de sua conta, você poderá ter acesso ao conteúdo exclusivo efetuado o login com os seguintes dados abaixo:<br > <br /> <strong>Usuario</strong>: {$usuario_id}<br /> <strong>Senha</strong>: {$senha_randomica}<br /> <br /> Obrigado!<br /> <br /> Webmaster<br /> <br /> <br /> Esta é uma mensagem automática, por favor não responda!"; mail($email, $subject, $mensagem, $headers); echo "Foi enviado para seu email - ( ".$email." ) um pedido de confirmação de cadastro, por favor verifique e sigas as instruções!"; } } } ?>  
    • Por vinicius.david
      Gostaria que fosse possível encontrar produtos pela marca no Opencart 2.3.0.2. Quando a pessoa digitar no buscar a marca do produto, ele deveria mostrar todos os produtos que pertencem aquela marca. Em catalog/model/catalog/product.php já existe por padrão a função de procurar por fabricante: 

      if (!empty($data['filter_manufacturer_id'])) {                 $sql .= " AND p.manufacturer_id = '" . (int) $data['filter_manufacturer_id'] . "'";             }
      Mas ela não faz a função de procurar por marca. Alguém já encontrou alguma solução na internet para este caso?
    • Por manolegal
      Bom dia.
      Recebo em meu formulário um dado em forma de url.
      Extraio desta url o CNPJ da empresa. A seguir faço uma pesquisa para verificar se este CNPJ está em minha base de dados, sendo que se estiver trago dados da empresa para preenchimento do campo empresa do formulário.
      Estando a empresa no BD, consigo trazer os dados corretamente, porém estes dados não passados para o formulário para serem o valor inicial do campo empresa.
      $cnpj_numero = 12345678910; $Sql_cnpj = "SELECT id_empresa as id_empresa_bd_ext, upper(empresas.empresa) as fornecedor_bd_ext FROM empresas WHERE empresas.cnpj = '$cnpj_numero'"; $Resultado_cnpj = executa($Sql_cnpj); while ($linha_cnpj = pg_fetch_array($Resultado_cnpj)){ $empresa_bd_ext = $linha_cnpj["fornecedor_bd_ext"]; $forn_hid_bd_ext = $linha_cnpj["id_empresa_bd_ext"]; } echo "Fornecedor BD: $empresa_bd_ext - $forn_hid_bd_ext<br><hr>"; // Está mostrando dados corretamente // Definir valor a ser recebido pelo campo Empresa do Formulário if ($cnpj_numero != ""){ $empresa = $empresa_bd_ext; $forn_hid = $forn_hid_bd_ext; }else{ // Caso url não tenha trazido CNPJ, atribuo outro valor $empresa = $empresa_bd; $forn_hid = $forn_hid_bd; } O campo empresa do formulário não está recebendo o valor de $empresa. Considerando que exista um CNPJ, onde pode estar o problema?
    • Por edvaldo123
      Olá para todos, preciso de um código em PHP ou HMTL que mostre cotações de moedas, pra colocar em um site de notícias. Vou deixar um link abaixo onde tem exatamente o que preciso, porém queria remover algumas linhas desse código para não identificar seu site de origem.

      http://www.precododolar.com/widgets/cotacao.php
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.