Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

kevinfoca

Problema com frete via sedex

Recommended Posts

Olá, eu procurei o sistema de frete para cálculo de sedex no oscommerce. Encontrei um muito interessante que quebra o pacote para ter vários pacotes quando dá acima de 30kgs. Porém, alguns produtos meus sozinhos já passam os 30kgs. Sendo assim, preciso que fique indisponível a opção sedex quando um produto passe os 30kgs.

 

Assim eu agradeceria muitos quem puder me ajudar em alguma dessas duas formas:

 

1 - MAIS FACIL - Quando tiver mais de 30kgs no carrinho, aparecer uma mensagem de "opção indisponível" ou simplesmente não aparecer. Assim ficaria só o outro método de entrega.

 

2 - MAIS DIFICIL - Fazer o mesmo que acima, porém só quando tiver um produto que tenha SOZINHO mais de 30kgs. Assim, ainda funcionaria para no caso da pessoa adicionar 4 produtos de 10 kgs, o sistema dividiria em dois pacotes de 20kgs e continuava ok. Porém quando alguém adicionar um produto de 30kgs, a opção ficaria inválida.

 

Segue o código atual:

 

<?php
/*
  Welson Tavares
  welsontavares@yahoo.com.br
  17/02/2006

  Última alteração: 25/04/2006
  Notas:
   - Corrigido problema com peso com números decimais
   
   
   alterado para PAC por MARCELO_73
   14/11/2007

--------- Update ----------> 15/11/2008   
   alterado para Sedex por www.aminhaloja.com.br
   - Corrigido problema em pacotes com peso igual ou superior a 29.00Kg;
   - Adicionado opção na administração do módulo para escolher o tipo de peso que a loja trabalha;
   - Retirada chamada HANDLING inválida;
   - Retirada consulta SQL desnecessária para CEP de origem.
*/

class SedexAminhaloja
{
  var $code, $title, $description, $enabled, $sedex;

  // class constructor
  function SedexAminhaloja() {
    $this->code = 'SedexAminhaloja';
    $this->title = MODULE_SHIPPING_SEDEX_AMINHALOJA_TEXT_TITLE;
    $this->description = MODULE_SHIPPING_SEDEX_AMINHALOJA_TEXT_DESCRIPTION. '<br><a href="http://www.aminhaloja.com.br" target = "_blank"><u><i>
	  						www.aminhaloja.com.br</i></u></a><br>';
    $this->sort_order = MODULE_SHIPPING_SEDEX_AMINHALOJA_SORT_ORDER;
    $this->icon = '';
    $this->enabled = ((MODULE_SHIPPING_SEDEX_AMINHALOJA_STATUS == 'Sim') ? true : false);
    $this->sedex = 1;
  }

// class methods
  function quote($method = '') {
    global $order, $shipping_weight, $cart, $total_count;

    $cep_origem = SHIPPING_ORIGIN_ZIP;

    $cep_destino = $order->delivery['postcode'];

   if(MODULE_SHIPPING_SEDEX_AMINHALOJA_MODE_PESO == 'Gramas') {
  
    if ($cart->show_weight())
    {
      $peso = $cart->show_weight();
      $peso = $peso/1000;
    }
   
    else
      $peso = 1;

    if($peso<=1000)
      $peso = 1;
}

    $peso=$cart->show_weight();
   
    $peso=$this->arredonda_peso($peso);

	$Var_Quant = intval($peso / 30);
   	$peso = $peso % 30;

   if ($Var_Quant > 0) {
       if (!$shipping = $this->calcula_frete_correios($cep_origem, $cep_destino, 30))
         $shipping = 0;
      $shipping_cost = $Var_Quant * ($shipping + MODULE_SHIPPING_SEDEX_AMINHALOJA_HANDLING);
   }else{

    if (!$shipping = $this->calcula_frete_correios($cep_origem, $cep_destino, $peso))
      $shipping = 0;
}
    $this->quotes = array('id' => $this->code, 
						  'module' =>MODULE_SHIPPING_SEDEX_AMINHALOJA_TEXT_TITLE, 
						  'methods' => array(array('id' => $this->code, 
						  						   'title' => MODULE_SHIPPING_SEDEX_AMINHALOJA_TEXT_WAY, 
												   'cost' =>$shipping_cost += ($shipping + MODULE_SHIPPING_SEDEX_AMINHALOJA_HANDLING))));

    if ($shipping > 0)
      return $this->quotes;
    else
      return $this->quotes['error'] = MODULE_SHIPPING_SEDEX_AMINHALOJA_INVALID_ZONE;
}

  function check()
  {
    if (!isset($this->_check)) {
      $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_SHIPPING_SEDEX_AMINHALOJA_STATUS'");
	  $this->_check =tep_db_num_rows($check_query);
    }
    return $this->_check;
  }

  function install() {
		tep_db_query("insert into " . TABLE_CONFIGURATION . " 
		(configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values
		('Entrega via Sedex', 'MODULE_SHIPPING_SEDEX_AMINHALOJA_STATUS', 'Sim', 'Ativar Entrega via Sedex?', '6', '0', 'tep_cfg_select_option(array(\'Sim\', \'Não\'), ',now())");
		
		tep_db_query("insert into " . TABLE_CONFIGURATION . " 
		(configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values 
		('Taxa de manipulação', 'MODULE_SHIPPING_SEDEX_AMINHALOJA_HANDLING', '0', 'Taxa de manipulação para este módulo de transporte.', '6', '0', now())");

		tep_db_query("insert into " . TABLE_CONFIGURATION . " 
		(configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function,date_added) values 
		('Modo', 'MODULE_SHIPPING_SEDEX_AMINHALOJA_MODE', 'Peso', 'A tabela de transporte baseado em Peso total ou Quantia Total de pedidos.', '6', '0', 'tep_cfg_select_option(array(\'Peso\',\'Preço\', \'Por_item\'), ', now())");
	
		tep_db_query("insert into " . TABLE_CONFIGURATION . " 
		(configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function,date_added) values 
		('Tipo de Peso', 'MODULE_SHIPPING_SEDEX_AMINHALOJA_MODE_PESO', 'Quilo Gramas', 'Sua loja trabalha com pesos em:', '6', '0', 'tep_cfg_select_option(array(\'Quilo Gramas\',\'Gramas\'), ', now())");		

		tep_db_query("insert into " . TABLE_CONFIGURATION . " 
		(configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values 
		('Ordem de exibição.', 'MODULE_SHIPPING_SEDEX_AMINHALOJA_SORT_ORDER', '0', 'Determina a ordem de exibição do meio de envio.', '6', '0', now())");

	for ($i = 1; $i <= $this->sedex; $i++) {
       $default_countries = '';
       if ($i == 1) {
			$default_states_or_countries = 'Santa Catarina,Sao Paulo,Pernambuco,Rio de Janeiro,Para,Parana,Minas Gerais,Distrito Federal,Espirito Santo,
											Mato Grosso do Sul,Rio Grande do Sul,Bahia,Goias,Mato Grosso,Tocantins,Alagoas,Sergipe,Paraiba,Piaui,Rondonia,Acre,Amapa,
											Amazonas,Ceara,Maranhao,Para,Rio Grande do Norte,Roraima';
         $default_prices = '2:0.00';
       }
       
		tep_db_query("insert into " . TABLE_CONFIGURATION . " 
		(configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values 
		('Região " . $i ." Estados', 'MODULE_SHIPPING_SEDEX_AMINHALOJA" . $i ."', '" . $default_states_or_countries . "', 'Separar por vírgula se tiver mais de um estado', '6', '0', now())");

		tep_db_query("insert into " . TABLE_CONFIGURATION . " 
		(configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values 
		('Região " . $i ." Tarifas', 'MODULE_SHIPPING_SEDEX_AMINHALOJA_COST" . $i ."', '" . $default_prices . "' , '', '6', '0', now())");
   }
}

  function remove() {
    $keys = '';
    $keys_array = $this->keys();
    for ($i=0; $i<sizeof($keys_array); $i++)     
      $keys .= "'" . $keys_array[$i] . "',";

    $keys = substr($keys, 0, -1);

    tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in (" . $keys . ")");
}

  function calcula_frete_correios($cep_origem, $cep_destino, $peso)
  {
    $conexao = fsockopen("www.correios.com.br", 80, $errno, $errstr, 30);
    if (!$conexao)
     echo "$errstr ($errno)<br />\n";
    else
    {
      $saida = "GET /encomendas/precos/calculo.cfm?servico=40010&CepOrigem=$cep_origem&CepDestino=$cep_destino&Peso=$peso HTTP/1.1\r\n";
$saida .= "Host: www.correios.com.br\r\n";
$saida .= "Connection: Close\r\n\r\n";

      fwrite($conexao, $saida);
      $resposta = "";
     
      while (!feof($conexao))       
       $resposta .= fgets($conexao, 128);
       
      fclose($conexao);
   
      ereg ("&Tarifa=([0-9]+\.[0-9]+)", $resposta, $reg);
     
      // essa aquia gabiarra dessa versão
      if (!$reg[1])
        ereg ("&Tarifa=([0-9]+)", $resposta, $reg);
      $resultado = $reg[1];
      return $resultado;
    }
  }

  function keys()
  {
     $keys = array('MODULE_SHIPPING_SEDEX_AMINHALOJA_STATUS',
	 			   'MODULE_SHIPPING_SEDEX_AMINHALOJA_HANDLING', 
				   'MODULE_SHIPPING_SEDEX_AMINHALOJA_MODE',
				   'MODULE_SHIPPING_SEDEX_AMINHALOJA_MODE_PESO', 
				   'MODULE_SHIPPING_SEDEX_AMINHALOJA_SORT_ORDER');

     for ($i=1; $i<=$this->sedex; $i++)
     {
       $keys[] = 'MODULE_SHIPPING_SEDEX_AMINHALOJA' . $i;
       $keys[] = 'MODULE_SHIPPING_SEDEX_AMINHALOJA_COST' . $i;
     }

     return $keys;
   }

   function arredonda_peso($peso)
   {
      $tipo=gettype($peso); //armazena tipo de variável do peso

      $peso=ereg_replace(",",".",$peso); //substitui vírgula por ponto

      settype($peso,"float"); //força o peso ser um número decimal

      if (floor($peso)<$peso)
        $peso = ceil($peso);

      settype($peso,$tipo);
        return $peso; //retorna peso com valor arredondado e com mesmo tipo informado
   }
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Kevin, não entendo de PHP, mas a lógica não é difícil para resolver isso.

 

Na hora que ele calcula o valor do frete, você coloca um if comparando o peso total.

Para saber se tem mais de um item, você precisa ter em algum lugar uma informação que te diga quanto itens são. Se estiver trabalhando com xml, faça um loop nos seus produtos comparando peso a peso. Se todos tiverem menos de trinta beleza.

 

Agora, mesmo que consigo tudo isso, você ainda terá uma complicação. Se o cliente comprar um produto de 35kg e um de 10kg, o que vai fazer?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, confira seu código então e veja se em algum lugar consegue as informações dos produtos um a um. Isso é normal se estiver usando xml.

Aí é só fazer o que eu disse, do loop.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nesse caso a coisa fica mais complicada. Não pelo grau de dificuldade em criar o que precisa, mas pelo fato que é preciso estudar seu código para ver como é o funcionamento de seu sistema.

Pedir para você postar alguma parte não será suficiente, é preciso ver muito mais. Te aconselho contratar alguém para te ajudar ou sentar na frente do código e não descansar enquanto não entendo-lo muito bem.

Compartilhar este post


Link para o post
Compartilhar em outros sites

entao... o lance é q eu não sei como faço isso. =/

 

criar um script de frete é simples

mais você tem que ir no correios para fornecimento da tabela de frete por regiao

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

entao... o lance é q eu não sei como faço isso. =/

 

criar um script de frete é simples

mais você tem que ir no correios para fornecimento da tabela de frete por regiao

 

Desculpe, mas essa não é a dúvida dele. O que ele quer é saber quando um produto tem acima de 30kg para bloquear a opção de escoha de alguns tipos de fretes.

 

Pelo que entendi, a parte dele de calcular o valor do frete já está funcionando.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

 

entao... o lance é q eu não sei como faço isso. =/

 

criar um script de frete é simples

mais você tem que ir no correios para fornecimento da tabela de frete por regiao

 

Desculpe, mas essa não é a dúvida dele. O que ele quer é saber quando um produto tem acima de 30kg para bloquear a opção de escoha de alguns tipos de fretes.

 

Pelo que entendi, a parte dele de calcular o valor do frete já está funcionando.

 

Isso mesmo! O frete funciona, só quero que o Sedex fique indisponível quando um produto for acima de 30kgs.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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