correios icon indicating copy to clipboard operation
correios copied to clipboard

Dimensões maiores que 70cm aumenta o valor do frete em R$20,00 (SOLUÇÃO)

Open mateussantin opened this issue 5 years ago • 13 comments

Segue arquivos em anexo corrigidos com a opção no admin para atualizar o valor dos correios sempre que necessário (atualmente 79 reais). (apagar o .txt do final do arquivo e substituir). ect/system.xml model/carrier/correiosMethod.php

CorreiosMethod.php.txt system.xml.txt

mateussantin avatar Sep 05 '18 17:09 mateussantin

Valeu @mateussantin! Se puder enviar na forma de uma PR, talvez o @pedro-teixeira possa mesclar a extensão. De qualquer forma, obrigado 👍

rafaelpatro avatar Sep 05 '18 19:09 rafaelpatro

Alguém poderia enviar a alteração completa do CorreiosMethod.php, não tenho conhecimento em PHP, tentei fazer as modificações explicadas acima mas só está dando erro. Agradeço desde já!!

ricardopi70 avatar Sep 17 '18 18:09 ricardopi70

Obrigado @mateussantin

Deu certo! Vou colocar o código inteiro de como ficou o arquivo:

`

/**

  • This source file is subject to the MIT License.

  • It is also available through http://opensource.org/licenses/MIT

  • @category PedroTeixeira

  • @package PedroTeixeira_Correios

  • @author Pedro Teixeira [email protected]

  • @copyright 2015 Pedro Teixeira (http://pedroteixeira.io)

  • @license http://opensource.org/licenses/MIT MIT

  • @link https://github.com/pedro-teixeira/correios / class PedroTeixeira_Correios_Model_Carrier_CorreiosMethod extends Mage_Shipping_Model_Carrier_Abstract implements Mage_Shipping_Model_Carrier_Interface { /*

    • _code property
    • @var string */ protected $_code = 'pedroteixeira_correios'; protected $_isFixed = true;

    /**

    • _result property
    • @var Mage_Shipping_Model_Rate_Result|Mage_Shipping_Model_Tracking_Result */ protected $_result = null;

    /**

    • ZIP code vars */ protected $_fromZip = null; protected $_toZip = null;

    /**

    • Value and Weight */ protected $_packageValue = null; protected $_packageWeight = null; protected $_volumeWeight = null; protected $_freeMethodWeight = null; protected $_midSize = null; protected $_splitUp = 0; protected $_postingDays = 0;

    /**

    • Post methods */ protected $_postMethods = null; protected $_postMethodsFixed = null; protected $_postMethodsExplode = null;

    /**

    • Free method request */ protected $_freeMethodRequest = false; protected $_freeMethodRequestResult = null;

    /**

    • Collect Rates

    • @param Mage_Shipping_Model_Rate_Request $request Mage request

    • @return bool|Mage_Shipping_Model_Rate_Result|Mage_Shipping_Model_Tracking_Result */ public function collectRates(Mage_Shipping_Model_Rate_Request $request) { // Do initial check if ($this->_inicialCheck($request) === false) { return false; }

      // Check package value if ($this->_packageValue < $this->getConfigData('min_order_value') || $this->_packageValue > $this->getConfigData('max_order_value') ) { $this->_throwError('valueerror', 'Value limits', LINE); return $this->_result; }

      // Check ZIP Code if (!preg_match('/^([0-9]{8})$/', $this->_toZip)) { $this->_throwError('zipcodeerror', 'Invalid Zip Code', LINE); return $this->_result; }

      if ($this->_packageWeight == 0) { $this->_packageWeight = $this->_getNominalWeight($request); }

      if ($this->getConfigData('weight_type') == PedroTeixeira_Correios_Model_Source_WeightType::WEIGHT_GR) { $this->_packageWeight = number_format($this->_packageWeight / 1000, 2, '.', ''); }

      // Check weight zero if ($this->_packageWeight <= 0) { $this->_throwError('weightzeroerror', 'Weight zero', LINE); return $this->_result; }

      $this->_postMethods = $this->getConfigData('postmethods'); $this->_postMethodsFixed = $this->_postMethods; $this->_postMethodsExplode = explode(',', $this->getConfigData('postmethods'));

      // Generate Volume Weight if ($this->_generateVolumeWeight($request) === false || $this->_removeInvalidServices() === false) { $this->_throwError('dimensionerror', 'Dimension error', LINE); return $this->_result; }

      $this->_filterMethodByItemRestriction($request);

      if (empty($this->_postMethods)) { return false; } //Show Quotes $this->_getQuotes();

      // Use descont codes $this->_updateFreeMethodQuote($request);

      return $this->_result; }

    /**

    • Retrieve all visible items from request

    • @param Mage_Shipping_Model_Rate_Request $request Mage request

    • @return array */ protected function _getRequestItems($request) {

      $allItems = $request->getAllItems(); $items = array();

      foreach ($allItems as $item) { if (!$item->getParentItemId()) { $items[] = $item; } }

      $items = $this->_loadBundleChildren($items);

      return $items; }

    /**

    • Gets Nominal Weight

    • @param Mage_Shipping_Model_Rate_Request $request Mage request

    • @return number */ protected function _getNominalWeight($request) { $weight = 0; $items = $this->_getRequestItems($request);

      foreach ($items as $item) { $product = Mage::getModel('catalog/product')->load($item->getProductId()); $weight += $product->getWeight(); }

      return $weight; }

    /**

    • Get shipping quote

    • @return Mage_Shipping_Model_Rate_Result|Mage_Shipping_Model_Tracking_Result */ protected function _getQuotes() { $softErrors = explode(',', $this->getConfigData('soft_errors')); $correiosReturn = $this->_getCorreiosReturn();

      if ($correiosReturn !== false) { $errorList = array(); $correiosReturn = $this->_addPostMethods($correiosReturn);

       foreach ($correiosReturn as $servicos) {
           $errorId = (string) $servicos->Erro;
           $errorList[$errorId] = $servicos->MsgErro;
      
           if ($errorId != '0' && !in_array($errorId, $softErrors)) {
               continue;
           }
      
           $servicos->Valor = $this->_getFormatPrice((string) $servicos->Valor);
           $this->_appendShippingReturn($servicos);
       }
       $this->_appendShippingErrors($errorList);
      

      } else { return $this->_result; }

      if ($this->_freeMethodRequest === true) { return $this->_freeMethodRequestResult; } else { return $this->_result; } }

    /**

    • Make initial checks and iniciate module variables

    • @param Mage_Shipping_Model_Rate_Request $request Mage request

    • @return bool */ protected function _inicialCheck(Mage_Shipping_Model_Rate_Request $request) {

      if (!$this->getConfigFlag('active')) { // Disabled Mage::log('pedroteixeira_correios: Disabled'); return false; }

      $origCountry = Mage::getStoreConfig('shipping/origin/country_id', $this->getStore()); $destCountry = $request->getDestCountryId(); if ($origCountry != 'BR' || $destCountry != 'BR') { // Out of delivery area Mage::log('pedroteixeira_correios: Out of delivery area'); return false; }

      $this->_fromZip = Mage::getStoreConfig('shipping/origin/postcode', $this->getStore()); $this->_toZip = $request->getDestPostcode();

      // Fix ZIP code $this->_fromZip = str_replace(array('-', '.'), '', trim($this->_fromZip)); $this->_toZip = str_replace(array('-', '.'), '', trim($this->_toZip));

      if (!preg_match('/^([0-9]{8})$/', $this->_fromZip)) { Mage::log('pedroteixeira_correios: From ZIP Code Error'); return false; }

      if (!trim($this->_toZip)) { return false; }

      $this->_result = Mage::getModel('shipping/rate_result'); $this->_packageValue = $request->getBaseCurrency()->convert( $request->getPackageValue(), $request->getPackageCurrency() );

      $this->_packageWeight = number_format($request->getPackageWeight(), 2, '.', ''); $this->_freeMethodWeight = number_format($request->getFreeMethodWeight(), 2, '.', ''); }

    /**

    • Get Correios return

    • @return bool|SimpleXMLElement[]

    • @throws Exception */ protected function _getCorreiosReturn() { $filename = $this->getConfigData('url_ws_correios');

      try { $client = new Zend_Http_Client($filename); $client->setConfig( array( 'timeout' => $this->getConfigData('ws_timeout'), 'adapter' => Mage::getModel('pedroteixeira_correios/http_client_adapter_socket') ) );

       $client->setParameterGet('StrRetorno', 'xml');
       $client->setParameterGet('nCdServico', $this->_postMethods);
       $client->setParameterGet('nVlPeso', $this->_packageWeight);
       $client->setParameterGet('sCepOrigem', $this->_fromZip);
       $client->setParameterGet('sCepDestino', $this->_toZip);
       $client->setParameterGet('nCdFormato', 1);
       $client->setParameterGet('nVlComprimento', $this->_midSize);
       $client->setParameterGet('nVlAltura', $this->_midSize);
       $client->setParameterGet('nVlLargura', $this->_midSize);
      
       if ($this->getConfigData('mao_propria')) {
           $client->setParameterGet('sCdMaoPropria', 'S');
       } else {
           $client->setParameterGet('sCdMaoPropria', 'N');
       }
      
       if ($this->getConfigData('aviso_recebimento')) {
           $client->setParameterGet('sCdAvisoRecebimento', 'S');
       } else {
           $client->setParameterGet('sCdAvisoRecebimento', 'N');
       }
      
       if ($this->getConfigData('valor_declarado')
           || in_array($this->getConfigData('acobrar_code'), $this->_postMethodsExplode)
       ) {
           $client->setParameterGet('nVlValorDeclarado', number_format($this->_packageValue, 2, ',', ''));
       } else {
           $client->setParameterGet('nVlValorDeclarado', 0);
       }
      
       $nCdEmpresa = $this->getConfigData('cod_admin');
       $sDsSenha = $this->getConfigData('senha_admin');
       if (!empty($nCdEmpresa) && !empty($sDsSenha)) {
           $client->setParameterGet('nCdEmpresa', $nCdEmpresa);
           $client->setParameterGet('sDsSenha', $sDsSenha);
       }
      
       $content = $client->request()->getBody();
      
       if ($content == '') {
           throw new Exception('No XML returned [' . __LINE__ . ']');
       }
      
       libxml_use_internal_errors(true);
       $sxe = simplexml_load_string($content);
       if (!$sxe) {
           throw new Exception('Bad XML [' . __LINE__ . ']');
       }
      
       $xml = new SimpleXMLElement($content);
      
       if (count($xml->cServico) <= 0) {
           throw new Exception('No tag cServico in Correios XML [' . __LINE__ . ']');
       }
      
       return $xml->cServico;
      

      } catch (Exception $e) { $this->_throwError('urlerror', 'URL Error - ' . $e->getMessage(), LINE); return false; } }

    /**

    • Apend shipping value to return

    • @param SimpleXMLElement $servico Service Data

    • @return void */

           /* Inicio - Aumenta taxa dos correios */
           protected function _generateAument(){
       		$items = Mage::getModel('checkout/cart')->getQuote()->getAllVisibleItems();
      
       		    foreach($items as $item){
       		        $_product = $this->_getSimpleProduct($item->getProduct());
      
       		        if ($_product->getData('volume_altura') == '' || (int) $_product->getData('volume_altura') == 0) {
       		            $itemAltura = $this->getConfigData('altura_padrao');
       		        } else {
       		            $itemAltura = $_product->getData('volume_altura');
       		        }
      
       		        if ($_product->getData('volume_largura') == '' || (int) $_product->getData('volume_largura') == 0) {
       		            $itemLargura = $this->getConfigData('largura_padrao');
       		        } else {
       		            $itemLargura = $_product->getData('volume_largura');
       		        }
      
       		        if ($_product->getData('volume_comprimento') == '' || (int) $_product->getData('volume_comprimento') == 0) {
       		            $itemComprimento = $this->getConfigData('comprimento_padrao');
       		        } else {
       		            $itemComprimento = $_product->getData('volume_comprimento');
       		        }
       		    }
      
       		    if ($itemAltura > 70 || $itemLargura > 70 || $itemComprimento > 70) {
       		        $this->add_aumento = 79;
       		    } else {
       		        $this->add_aumento;
       		    }
      
       		    return true;
       		}
           /* Fim - Aumenta taxa dos correios */
      

    protected function _appendShippingReturn(SimpleXMLElement $servico) { $correiosDelivery = (int) $servico->PrazoEntrega; $shippingMethod = (string) $servico->Codigo; $shippingPrice = (float) $servico->Valor; if ($shippingPrice <= 0) { return; }

     /* Inicio - Aumenta taxa dos correios */
     $this->_generateAument();
     $vl_aumento = $this->add_aumento;
     $shippingPrice = $shippingPrice + $vl_aumento;
     /* Fim - Aumenta taxa dos correios */
    
     $errorMsg = $this->_getSoftErrorMsg((string) $servico->Erro);
     $method = Mage::getModel('shipping/rate_result_method');
     $method->setCarrier($this->_code);
     $method->setCarrierTitle($this->getConfigData('title') . $this->_getSplitUpMsg() . $errorMsg);
     $method->setMethod($shippingMethod);
    
     $shippingCost  = $shippingPrice;
     $shippingPrice = $shippingPrice + $this->getConfigData('handling_fee');
    
     $shippingData = Mage::helper('pedroteixeira_correios')->getShippingLabel($shippingMethod);
     $shippingData = Mage::helper('pedroteixeira_correios')->__($shippingData);
    
     if ($shippingMethod == $this->getConfigData('acobrar_code')) {
         $shippingData = $shippingData . ' ( R$' . number_format($shippingPrice, 2, ',', '.') . ' )';
         $shippingPrice   = 0;
     }
    
     if ($this->getConfigFlag('prazo_entrega')) {
         if ($correiosDelivery > 0) {
             $method->setMethodTitle(
                 sprintf(
                     $this->getConfigData('msgprazo'),
                     $shippingData,
                     (int) ($correiosDelivery + $this->getConfigData('add_prazo') + $this->_postingDays)
                 )
             );
         }
     } else {
         $method->setMethodTitle($shippingData);
     }
    
     $method->setPrice($shippingPrice);
     $method->setCost($shippingCost);
    
     if ($this->_freeMethodRequest === true) {
         $this->_freeMethodRequestResult->append($method);
     } else {
         $this->_result->append($method);
     }
    

    }

    /**

    • Throw error

    • @param string $message Message placeholder

    • @param string $log Message

    • @param string|int $line Line of log

    • @param string $custom Custom variables for placeholder

    • @return void */ protected function _throwError($message, $log = null, $line = 'NO LINE', $custom = null) { $this->_result = null; $this->_result = Mage::getModel('shipping/rate_result');

      $error = Mage::getModel('shipping/rate_result_error'); $error->setCarrier($this->_code); $error->setCarrierTitle($this->getConfigData('title'));

      if (is_null($custom) || $this->getConfigData($message) == '') { Mage::log($this->_code . ' [' . $line . ']: ' . $log); $error->setErrorMessage($this->getConfigData($message)); } else { Mage::log($this->_code . ' [' . $line . ']: ' . $log); $error->setErrorMessage(sprintf($this->getConfigData($message), $custom)); }

      $this->_result->append($error); }

    /**

    • Retrieves a simple product
    • @param Mage_Catalog_Model_Product $product Catalog Product
    • @return Mage_Catalog_Model_Product */ protected function _getSimpleProduct($product) { $type = $product->getTypeInstance(true); if ($type->getProduct($product)->hasCustomOptions() && ($simpleProductOption = $type->getProduct($product)->getCustomOption('simple_product')) ) { $simpleProduct = $simpleProductOption->getProduct($product); if ($simpleProduct) { return $this->_getSimpleProduct($simpleProduct); } } return $type->getProduct($product); }

    /**

    • Generate Volume weight

    • @param Mage_Shipping_Model_Rate_Request $request Mage request

    • @return bool */ protected function _generateVolumeWeight($request) { $pesoCubicoTotal = 0;

      $items = $this->_getRequestItems($request);

      foreach ($items as $item) { $_product = $this->_getSimpleProduct($item->getProduct());

       if ($_product->getData('volume_altura') == '' || (int) $_product->getData('volume_altura') == 0) {
           $itemAltura = $this->getConfigData('altura_padrao');
       } else {
           $itemAltura = $_product->getData('volume_altura');
       }
      
       if ($_product->getData('volume_largura') == '' || (int) $_product->getData('volume_largura') == 0) {
           $itemLargura = $this->getConfigData('largura_padrao');
       } else {
           $itemLargura = $_product->getData('volume_largura');
       }
      
       if ($_product->getData('volume_comprimento') == '' || (int) $_product->getData('volume_comprimento') == 0) {
           $itemComprimento = $this->getConfigData('comprimento_padrao');
       } else {
           $itemComprimento = $_product->getData('volume_comprimento');
       }
      
       if ($this->getConfigFlag('check_dimensions')) {
           foreach ($this->_postMethodsExplode as $key => $method) {
               $sizeMax = max($itemAltura, $itemLargura, $itemComprimento);
               $sumMax  = ($itemAltura + $itemLargura + $itemComprimento);
               $isValid = ($sizeMax <= $this->getConfigData("validate/serv_{$method}/max/size"));
               $isValid &= ($sumMax <= $this->getConfigData("validate/serv_{$method}/max/sum"));
      
               if (!$isValid) {
                   unset($this->_postMethodsExplode[$key]);
               }
           }
      
           if (count($this->_postMethodsExplode) == 0) {
               return false;
           }
      
           $this->_postMethods      = implode(',', $this->_postMethodsExplode);
           $this->_postMethodsFixed = $this->_postMethods;
       }
      
       $itemAltura = $this->_getFitHeight($item);
       $pesoCubicoTotal += (($itemAltura * $itemLargura * $itemComprimento) *
               $item->getTotalQty()) / $this->getConfigData('coeficiente_volume');
      
       $this->_postingDays = max($this->_postingDays, (int) $_product->getData('posting_days'));
      

      }

      $this->_volumeWeight = number_format($pesoCubicoTotal, 2, '.', '');

      return true; }

    /**

    • Generate free shipping for a product

    • @param string $freeMethod Free method

    • @return void */ protected function _setFreeMethodRequest($freeMethod) { $this->_freeMethodRequest = true; $this->_freeMethodRequestResult = Mage::getModel('shipping/rate_result');

      $this->_postMethods = $freeMethod; $this->_postMethodsExplode = array($freeMethod);

      if ($this->getConfigData('weight_type') == PedroTeixeira_Correios_Model_Source_WeightType::WEIGHT_GR) { $this->_freeMethodWeight = number_format($this->_freeMethodWeight / 1000, 2, '.', ''); }

      $this->_packageWeight = $this->_freeMethodWeight; $this->_pacWeight = $this->_freeMethodWeight; }

    /**

    • Check if current carrier offer support to tracking
    • @return bool true */ public function isTrackingAvailable() { return true; }

    /**

    • Get Tracking Info

    • @param mixed $tracking Tracking

    • @return mixed */ public function getTrackingInfo($tracking) { $result = $this->getTracking($tracking); if ($result instanceof Mage_Shipping_Model_Tracking_Result) { if ($trackings = $result->getAllTrackings()) { return $trackings[0]; } } elseif (is_string($result) && !empty($result)) { return $result; }

      return false; }

    /**

    • Get Tracking

    • @param array $trackings Trackings

    • @return Mage_Shipping_Model_Tracking_Result */ public function getTracking($trackings) { $this->_result = Mage::getModel('shipping/tracking_result'); foreach ((array) $trackings as $code) { $this->_getTracking($code); }

      return $this->_result; }

    /**

    • Loads the parameters and calls the webservice using SOAP

    • @param string $code Code

    • @return bool|array

    • @throws Exception */ protected function _getTrackingRequest($code) { $response = false; $params = array( 'usuario' => $this->getConfigData('sro_username'), 'senha' => $this->getConfigData('sro_password'), 'tipo' => $this->getConfigData('sro_type'), 'resultado' => 'T', 'lingua' => $this->getConfigData('sro_language'), 'objetos' => $code, );

      try { $client = new SoapClient( $this->getConfigData('url_sro_correios'), Mage::helper('pedroteixeira_correios')->getStreamContext() ); $response = $client->buscaEventos($params); if (empty($response)) { throw new Exception("Empty response"); } } catch (Exception $e) { Mage::log("Soap Error: {$e->getMessage()}"); } return $response; }

    /**

    • Loads tracking progress details
    • @param SimpleXMLElement $evento XML Element Node
    • @param bool $isDelivered Delivery Flag
    • @return array */ protected function _getTrackingProgressDetails($evento, $isDelivered = false) { $date = new Zend_Date($evento->data, 'dd/MM/YYYY', new Zend_Locale('pt_BR')); $track = array( 'deliverydate' => $date->toString('YYYY-MM-dd'), 'deliverytime' => $evento->hora . ':00', 'status' => $evento->descricao, ); if (!$isDelivered) { $msg = array($evento->descricao); if (isset($evento->destino) && isset($evento->destino->local)) { $msg = array("{$evento->descricao} para {$evento->destino->local}"); } $track['activity'] = implode(' | ', $msg); $track['deliverylocation'] = "{$evento->local} - {$evento->cidade}/{$evento->uf}"; } return $track; }

    /**

    • Loads progress data using the WSDL response

    • @param string $request Request response

    • @return array */ protected function _getTrackingProgress($request) { $track = array(); $progress = array(); $eventTypes = explode(',', $this->getConfigData("sro_event_type_last"));

      if (count($request->return->objeto->evento) == 1) { $progress[] = $this->_getTrackingProgressDetails($request->return->objeto->evento); } else { foreach ($request->return->objeto->evento as $evento) { $progress[] = $this->_getTrackingProgressDetails($evento); $isDelivered = ((int) $evento->status < 2 && in_array($evento->tipo, $eventTypes)); if ($isDelivered) { $track = $this->_getTrackingProgressDetails($evento, $isDelivered); } } }

      $progress[] = $track; return $progress; }

    /**

    • Protected Get Tracking, opens the request to Correios

    • @param string $code Code

    • @return bool */ protected function _getTracking($code) { $error = Mage::getModel('shipping/tracking_result_error'); $error->setTracking($code); $error->setCarrier($this->_code); $error->setCarrierTitle($this->getConfigData('title')); $error->setErrorMessage($this->getConfigData('urlerror'));

      $request = $this->_getTrackingRequest($code); if (!isset($request->return)) { $this->_result->append($error); return false; }

      $progress = $this->_getTrackingProgress($request); if (!empty($progress)) { $track = array_pop($progress); $track['progressdetail'] = $progress;

       $tracking = Mage::getModel('shipping/tracking_result_status');
       $tracking->setTracking($code);
       $tracking->setCarrier($this->_code);
       $tracking->setCarrierTitle($this->getConfigData('title'));
       $tracking->addData($track);
      
       $this->_result->append($tracking);
       return true;
      

      } else { $this->_result->append($error); return false; } }

    /**

    • Returns the allowed carrier methods
    • @return array */ public function getAllowedMethods() { $output = array($this->_code => $this->getConfigData('title')); $serviceObject = Mage::getSingleton('pedroteixeira_correios/postmethod'); foreach ($serviceObject->getCollection() as $service) { $output[ $service->getMethodCode() ] = "{$service->getMethodCode()} - {$service->getMethodTitle()}"; } return $output; }

    /**

    • Define ZIP Code as required
    • @param string $countryId Country ID
    • @return bool */ public function isZipCodeRequired($countryId = null) { return true; }

    /**

    • Retrieve an average size.
    • For optimization purposes all tree box sizes are converted in one medium dimension.
    • Result cant exceed the minimum transportation limits.
    • @return PedroTeixeira_Correios_Model_Carrier_CorreiosMethod */ protected function _loadMidSize() { $volumeFactor = $this->getConfigData('coeficiente_volume'); $volumeTotal = $this->_volumeWeight * $volumeFactor; $pow = round(pow((int) $volumeTotal, (1 / 3))); $min = $this->getConfigData('midsize_min'); $this->_midSize = max($pow, $min); return $this; }

    /**

    • Validate post methods removing invalid services from quotation.

    • @return boolean|PedroTeixeira_Correios_Model_Carrier_CorreiosMethod */ protected function _removeInvalidServices() { $tmpMethods = $this->_postMethodsExplode; $tmpMethods = $this->_filterMethodByConfigRestriction($tmpMethods); $isDivisible = (count($tmpMethods) == 0);

      if ($isDivisible) { return $this->_splitPack(); }

      $this->_postMethodsExplode = $tmpMethods; $this->_postMethods = implode(',', $this->_postMethodsExplode); $this->_postMethodsFixed = $this->_postMethods; return $this; }

    /**

    • Include an additional method to quote content before showing.

    • When requested the new method is added in xml content as specified in config.xml like below:

    • <add_method_0>
      
    •     <code>10065</code>
      
    •     <price>2.45</price>
      
    •     <days>5</days>
      
    •     <from>
      
    •         <zip>00000000</zip>
      
    •         <weight>0.0</weight>
      
    •         <size>0</size>
      
    •     </from>
      
    •     <to>
      
    •         <zip>99999999</zip>
      
    •         <weight>0.1</weight>
      
    •         <size>150</size>
      
    •     </to>
      
    • </add_method_0>
      
    • @param SimpleXMLElement $cServico XML Node

    • @see http://www.correios.com.br/para-voce/consultas-e-solicitacoes/precos-e-prazos/servicos-nacionais_pasta/carta

    • @return SimpleXMLElement */ protected function _addPostMethods($cServico) { $addMethods = $this->getConfigData("add_postmethods"); if (empty($addMethods) || !is_array($addMethods)) { return $cServico; } foreach ($addMethods as $configData) { $isValid = true; $isValid &= $this->_packageWeight >= $configData['from']['weight']; $isValid &= $this->_packageWeight <= $configData['to']['weight']; $isValid &= $this->_midSize >= $configData['from']['size']; $isValid &= $this->_midSize <= $configData['to']['size']; $isValid &= $this->_toZip >= $configData['from']['zip']; $isValid &= $this->_toZip <= $configData['to']['zip'];

       if ($isValid) {
           $price   = $configData['price'];
           $days    = $configData['days'];
           $method  = $configData['code'];
           foreach ($cServico as $servico) {
               if ($servico->Codigo == $method) {
                   if (!empty($price)) {
                       $servico->Valor = number_format($price, 2, ',', '');
                   }
                   if (!empty($days)) {
                       $servico->PrazoEntrega = $days;
                   }
                   $servico->EntregaDomiciliar = 'S';
                   $servico->EntregaSabado     = 'S';
                   $servico->Erro              = '0';
                   $servico->MsgErro           = '<![CDATA[]]>';
               }
           }
       }
      

      }

      return $cServico; }

    /**

    • This keeps only postmethods available for all items in cart.

    • In other words you can set post methods by products.

    • Methods not available for all items in cart are removed.

    • Require attribute creation called postmethods.

    • Example:

    • code: postmethods

    • type: multiselect

    • label: [free]

    • value 1: 41068

    • value 2: 40096

    • ...

    • value 99: 81019

    • @param Mage_Shipping_Model_Rate_Request $request Mage request

    • @return PedroTeixeira_Correios_Model_Carrier_CorreiosMethod */ protected function _filterMethodByItemRestriction($request) { if ($this->getConfigFlag('filter_by_item')) { $items = $this->_getRequestItems($request); $intersection = $this->_postMethodsExplode; foreach ($items as $item) { $product = $this->_getSimpleProduct($item->getProduct()); $prodPostMethods = explode( ',', $product->getResource()->getAttributeRawValue( $product->getId(), 'postmethods', $request->getStoreId() ) ); $intersection = array_intersect($prodPostMethods, $intersection); }

       $this->_postMethodsExplode = $intersection;
       $this->_postMethods        = implode(',', $intersection);
       $this->_postMethodsFixed   = $this->_postMethods;
      

      }

      return $this; }

    /**

    • Added a fit size for items in large quantities.

    • Means you can join items like two or more glasses, pots and vases.

    • The calc is applied only for height side.

    • Required attribute fit_size. Example:

    •     code: fit_size
      
    •     type: varchar
      
    • After you can set a fit size for all products and improve your sells

    • @param Mage_Eav_Model_Entity_Abstract $item Order Item

    • @return number */ protected function _getFitHeight($item) { $product = $this->_getSimpleProduct($item->getProduct()); $height = $product->getData('volume_altura'); $height = ($height > 0) ? $height : (int) $this->getConfigData('altura_padrao'); $fitSize = (float) $product->getData('fit_size');

      if ($item->getQty() > 1 && is_numeric($fitSize) && $fitSize > 0) { $totalSize = $height + ($fitSize * ($item->getQty() - 1)); $height = $totalSize / $item->getQty(); }

      return $height; }

    /**

    • Splits the package in two parts.
    • If the package is already splited, each piece will be splited in two equal parts.
    • @return boolean|PedroTeixeira_Correios_Model_Carrier_CorreiosMethod */ protected function _splitPack() { $isSplitEnabled = $this->getConfigFlag('split_pack'); $isMethodAvailable = (count($this->_postMethodsExplode) > 0); if ($isSplitEnabled && $isMethodAvailable) { $this->_splitUp++; $this->_volumeWeight /= 2; $this->_packageWeight /= 2; $this->_packageValue /= 2; return $this->_removeInvalidServices(); } return false; }

    /**

    • Receive a list of methods, and validate one-by-one using the config settings.

    • Returns a list of valid methods or empty.

    • @param array $postmethods Services List

    • @return array */ protected function _filterMethodByConfigRestriction($postmethods) { $validMethods = array(); $this->_loadMidSize(); foreach ($postmethods as $key => $method) { $isOverSize = ($this->midSize > $this->getConfigData("validate/serv{$method}/max/size")); $isOverSize |= ($this->midSize * 3 > $this->getConfigData("validate/serv{$method}/max/sum")); $isOverWeight = ($this->packageWeight > $this->getConfigData("validate/serv{$method}/max/weight")); $isOverCubic = ($this->volumeWeight > $this->getConfigData("validate/serv{$method}/max/volume_weight")); $isZipAllowed = $this->_validateZipRestriction($method);

       if (!$isOverSize && !$isOverWeight && !$isOverCubic && $isZipAllowed) {
           $validMethods[] = $method;
       }
      

      } return $validMethods; }

    /**

    • Loads the zip range list.
    • Returns TRUE only if zip target is included in the range.
    • @param array $method Current Post Method
    • @return boolean */ protected function validateZipRestriction($method) { $zipConfig = $this->getConfigData("validate/serv{$method}/zips"); foreach ($zipConfig as $data) { $zipRange = explode(',', $data); $isBetweenRange = true; $isBetweenRange &= ($this->_toZip >= $zipRange[0]); $isBetweenRange &= ($this->_toZip <= $zipRange[1]); if ($isBetweenRange) { return true; } } return false; }

    /**

    • Some special errors must be sent to users.
    • If not applicable, the default error will be sent.
    • @param array $errorList Error List
    • @return boolean */ protected function _appendShippingErrors($errorList) { $output = false; $successCode = '0'; $hasValidQuote = array_key_exists($successCode, $errorList); if (!$hasValidQuote) { $displayErrorList = explode(',', $this->getConfigData('hard_errors')); if ($this->getConfigFlag('show_soft_errors')) { $softErrorList = explode(',', $this->getConfigData('soft_errors')); $displayErrorList = array_merge($displayErrorList, $softErrorList); } foreach ($errorList as $errorCode => $errorMsg) { $isDisplayError = in_array($errorCode, $displayErrorList); if ($isDisplayError) { $error = Mage::getModel('shipping/rate_result_error'); $error->setCarrier($this->_code); $error->setErrorMessage($errorMsg); $this->_result->append($error); $output = true; } } if (!$output) { $logMsg = implode(',', $errorList); Mage::log("{$this->_code}: Warning! There is no valid quotes, and no one error was throwed: {$logMsg}"); } } return $output; }

    /**

    • Returns a short message showing the number of the packs that will be needed.
    • @return string */ protected function _getSplitUpMsg() { $msg = ""; if ($this->_splitUp > 0) { $qty = pow(2, $this->_splitUp); $msg.= " / {$qty} volumes"; } return $msg; }

    /**

    • Returns a short warning message.
    • @param string $error Error Id
    • @return string */ protected function _getSoftErrorMsg($error) { $msg = ""; if ($this->getConfigFlag('show_soft_errors')) { $softErrorList = explode(',', $this->getConfigData('soft_errors')); $isSoftError = in_array($error, $softErrorList); if ($isSoftError) { $msg.= " / Área de Risco"; } } return $msg; }

    /**

    • Returns the price as float, and fixed by pack division.
    • @param string $price Price String
    • @return float */ protected function _getFormatPrice($price) { $stringPrice = str_replace('.', '', $price); $stringPrice = str_replace(',', '.', $stringPrice); $shippingPrice = floatval($stringPrice); $shippingPrice *= pow(2, $this->_splitUp); return $shippingPrice; }

    /**

    • Filter visible and bundle children products.
    • @param array $items Product Items
    • @return array / protected function _loadBundleChildren($items) { $visibleAndBundleChildren = array(); / @var $item Mage_Sales_Model_Quote_Item / foreach ($items as $item) { $product = $item->getProduct(); $isBundle = ($product->getTypeId() == Mage_Catalog_Model_Product_Type::TYPE_BUNDLE); if ($isBundle) { / @var $child Mage_Sales_Model_Quote_Item */ foreach ($item->getChildren() as $child) { $visibleAndBundleChildren[] = $child; } } else { $visibleAndBundleChildren[] = $item; } } return $visibleAndBundleChildren; } }

`

fernandoweb91 avatar Sep 19 '18 12:09 fernandoweb91

Obrigado @fernandoplanejar91

Consegui fazer funcionar com a modificação inteira que você enviou.

E muito obrigado @mateussantin pela solução!!!

ricardopi70 avatar Sep 19 '18 17:09 ricardopi70

Olá @fernandoplanejar91 e @mateussantin, tentei colar o código acima e não deu certo. Vocês tem como enviar o arquivo por gentileza?

Obrigado pela ajuda.

cesaroito avatar Sep 25 '18 21:09 cesaroito

Segue arquivos em anexo corrigidos com a opção no admin para atualizar o valor dos correios sempre que necessário (atualmente 79 reais). (apagar o .txt do final do arquivo e substituir). ect/system.xml model/carrier/correiosMethod.php

CorreiosMethod.php.txt system.xml.txt

mateussantin avatar Sep 26 '18 11:09 mateussantin

Segue arquivos em anexo corrigidos com a opção no admin para atualizar o valor dos correios sempre que necessário (atualmente 79 reais). (apagar o .txt do final do arquivo e substituir). ect/system.xml model/carrier/correiosMethod.php

CorreiosMethod.php.txt system.xml.txt

@mateussantin, muito obrigado pela disposição em ajudar. Funcionou corretamente. Abs,

cesaroito avatar Sep 26 '18 12:09 cesaroito

Olá pessoal,

Encontrei um erro, quando você compra somente 1 produto na medida por exemplo 105x3x3 é calculado o aumento de R$ 79,00 e o frete fica R$ 124,50, OK, até ai funcionando.

Mas se eu adicionar também no carrinho um produto menor que 70cm, por exemplo 16x2x11 o frete fica R$ 47,80, ou seja, quando tem mais de um produto no carrinho ele está ignorando que um deles é maior que 70cm.

Por favor alguém sabe uma solução para esse caso?

Abraços!

fernandoweb91 avatar Oct 23 '18 17:10 fernandoweb91

Também estou com esse problema, alguém conseguiu resolver???

Olá pessoal,

Encontrei um erro, quando você compra somente 1 produto na medida por exemplo 105x3x3 é calculado o aumento de R$ 79,00 e o frete fica R$ 124,50, OK, até ai funcionando.

Mas se eu adicionar também no carrinho um produto menor que 70cm, por exemplo 16x2x11 o frete fica R$ 47,80, ou seja, quando tem mais de um produto no carrinho ele está ignorando que um deles é maior que 70cm.

Por favor alguém sabe uma solução para esse caso?

Abraços!

ricardopi70 avatar Nov 12 '18 11:11 ricardopi70

Bom dia @ricardopi70 Essa alteração reajusta o valor da taxa de manipulação, caso algum dos itens do carrinho exceda 70 cm.

Localize o trecho a seguir: https://github.com/pedro-teixeira/correios/blob/2c828ac48627de551b7faed83f22f814b5c8bdef/app/code/community/PedroTeixeira/Correios/Model/Carrier/CorreiosMethod.php#L486

...e cole esse código, exatamente após o trecho localizado.

if (empty($this->getIsCorreiosHandlingFixed()) && $sizeMax > 70) {
    $correiosFee = 20;
    $handlingFee = $this->getConfigData('handling_fee');
    $path = "carriers/{$this->getCarrierCode()}/handling_fee";
    Mage::app()->getStore($this->getStore())->setConfig($path, $correiosFee + $handlingFee);
    $this->setIsCorreiosHandlingFixed(true);
}

P.S.

  • Habilitar opção de Validar Dimensões dos Produtos
  • Não compatível com as modificações previamente sugeridas neste tópico. Aplicar este ajuste nos arquivos originais do módulo.

rafaelpatro avatar Nov 12 '18 14:11 rafaelpatro

Obrigado @rafaelpatro, está funcionando corretamente agora. Valeu!

ricardopi70 avatar Nov 13 '18 12:11 ricardopi70

Segue arquivos em anexo corrigidos com a opção no admin para atualizar o valor dos correios sempre que necessário (atualmente 79 reais). (apagar o .txt do final do arquivo e substituir). ect/system.xml model/carrier/correiosMethod.php

CorreiosMethod.php.txt system.xml.txt

Olá boa noite Gostaria saber como o Pedro Teixeira chama os atributos de altura largura e profundidade? Segue a imagem de exemplo como a Jadlog chama image

Obrigada pela atenção Malka Gruenberg

malkahakuk avatar Aug 06 '19 02:08 malkahakuk

Bom dia @ricardopi70 Essa alteração reajusta o valor da taxa de manipulação, caso algum dos itens do carrinho exceda 70 cm.

Localize o trecho a seguir: https://github.com/pedro-teixeira/correios/blob/2c828ac48627de551b7faed83f22f814b5c8bdef/app/code/community/PedroTeixeira/Correios/Model/Carrier/CorreiosMethod.php#L486

...e cole esse código, exatamente após o trecho localizado.

if (empty($this->getIsCorreiosHandlingFixed()) && $sizeMax > 70) {
    $correiosFee = 20;
    $handlingFee = $this->getConfigData('handling_fee');
    $path = "carriers/{$this->getCarrierCode()}/handling_fee";
    Mage::app()->getStore($this->getStore())->setConfig($path, $correiosFee + $handlingFee);
    $this->setIsCorreiosHandlingFixed(true);
}

P.S.

  • Habilitar opção de Validar Dimensões dos Produtos
  • Não compatível com as modificações previamente sugeridas neste tópico. Aplicar este ajuste nos arquivos originais do módulo.

Olá a todos, agradeço a colaboração do pessoal. Ficou muito boa a solução. Mesmo com a correção do @ricardopi70, tive problemas ainda quando eu coloco apenas 1 produto no carrinho com tamanho acima de 70 ele estava adicionando 2 vezes o valor do manuseio. Fiz de uma outra forma e estou colocando aqui para vocês, caso mais alguém esteja com o mesmo problema.

public $check_size = 0;

protected function _generateAument()
{

    $items = Mage::getModel('checkout/cart')->getQuote()->getAllVisibleItems();

    foreach($items as $item){
        $_product = $this->_getSimpleProduct($item->getProduct());

        if ($_product->getData('volume_altura') == '' || (int) $_product->getData('volume_altura') == 0) {
            $itemAltura = $this->getConfigData('altura_padrao');
        } else {
            $itemAltura = $_product->getData('volume_altura');
        }

        if ($_product->getData('volume_largura') == '' || (int) $_product->getData('volume_largura') == 0) {
            $itemLargura = $this->getConfigData('largura_padrao');
        } else {
            $itemLargura = $_product->getData('volume_largura');
        }

        if ($_product->getData('volume_comprimento') == '' || (int) $_product->getData('volume_comprimento') == 0) {
            $itemComprimento = $this->getConfigData('comprimento_padrao');
        } else {
            $itemComprimento = $_product->getData('volume_comprimento');
        }

        if ($itemAltura > 70 || $itemLargura > 70 || $itemComprimento > 70) {
                $this->check_size = 1;
        }
    }

    if ($this->check_size == 1) {
        $this->add_aumento = $this->getConfigData('aument');
    } else {
        $this->add_aumento;
    }

    return true;
}

gilliattbastos avatar Apr 02 '20 20:04 gilliattbastos