kevinfoca 0 Denunciar post Postado Agosto 19, 2009 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
Claudio Neto 3 Denunciar post Postado Setembro 3, 2009 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
kevinfoca 0 Denunciar post Postado Setembro 8, 2009 entao... eu quero q quando apareça um produto de 35kgs nao apareça essa opção. A outra opção daí rola tranquilo. ;D Compartilhar este post Link para o post Compartilhar em outros sites
Claudio Neto 3 Denunciar post Postado Setembro 8, 2009 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
kevinfoca 0 Denunciar post Postado Setembro 8, 2009 entao... o lance é q eu não sei como faço isso. =/ Compartilhar este post Link para o post Compartilhar em outros sites
Claudio Neto 3 Denunciar post Postado Setembro 9, 2009 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
ystaygon 0 Denunciar post Postado Setembro 16, 2009 entao... o lance é q eu não sei como faço isso. =/ criar um script de frete é simplesmais 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
Claudio Neto 3 Denunciar post Postado Setembro 16, 2009 entao... o lance é q eu não sei como faço isso. =/ criar um script de frete é simplesmais 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
kevinfoca 0 Denunciar post Postado Setembro 16, 2009 entao... o lance é q eu não sei como faço isso. =/ criar um script de frete é simplesmais 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