/**
  * Calculates the shipping rate.
  *
  * @param array $package Order package.
  *
  * @return void
  */
 public function calculate_shipping($package = array())
 {
     global $woocommerce;
     $rates = array();
     $errors = array();
     $shipping_values = $this->correios_calculate($package);
     if (!empty($shipping_values)) {
         foreach ($shipping_values as $code => $shipping) {
             if (!isset($shipping->Erro)) {
                 continue;
             }
             $name = WC_Correios_Connect::get_service_name($code);
             $error_number = (string) $shipping->Erro;
             $error_message = WC_Correios_Error::get_message($shipping->Erro);
             $errors[$error_number] = array('error' => $error_message, 'number' => $error_number);
             // Set the shipping rates.
             if (in_array($error_number, array('0', '010'))) {
                 $label = 'yes' == $this->display_date ? WC_Correios_Connect::estimating_delivery($name, $shipping->PrazoEntrega, $this->additional_time) : $name;
                 $cost = $this->fix_format(esc_attr($shipping->Valor));
                 $fee = $this->get_fee($this->fix_format($this->fee), $cost);
                 array_push($rates, array('id' => $name, 'label' => $label, 'cost' => $cost + $fee));
             }
         }
         // Display correios errors.
         if (!empty($errors)) {
             foreach ($errors as $error) {
                 if ('' != $error['error']) {
                     $type = '010' == $error['number'] ? 'notice' : 'error';
                     $message = '<strong>' . __('Correios', 'woocommerce-correios') . ':</strong> ' . esc_attr($error['error']);
                     if (function_exists('wc_add_notice')) {
                         wc_add_notice($message, $type);
                     } else {
                         if ('error' == $type) {
                             $woocommerce->add_error($message);
                         } else {
                             $woocommerce->add_message($message);
                         }
                     }
                 }
             }
         }
         $rates = apply_filters('woocommerce_correios_shipping_methods', $rates, $package);
         // Add rates.
         foreach ($rates as $rate) {
             $this->add_rate($rate);
         }
     }
 }
 /**
  * Get the shipping rates.
  *
  * @param  object $shipping_values Shipping values.
  * @param  array  $options         Plugin options.
  * @param  array  $package         Product package.
  *
  * @return array                   Shipping rates.
  */
 protected static function get_the_shipping($shipping_values, $options, $package)
 {
     $_rates = array();
     if (!empty($shipping_values)) {
         foreach ($shipping_values as $code => $shipping) {
             if (isset($shipping->Erro) && 0 == $shipping->Erro) {
                 $date = isset($options['display_date']) ? $options['display_date'] : 'no';
                 $fee = isset($options['fee']) ? $options['fee'] : 0;
                 $add_time = isset($options['additional_time']) ? $options['additional_time'] : 0;
                 $name = WC_Correios_Connect::get_service_name($code);
                 $label = 'yes' == $date ? WC_Correios_Connect::estimating_delivery($name, $shipping->PrazoEntrega, $add_time) : $name;
                 $cost = str_replace(',', '.', esc_attr($shipping->Valor));
                 $fee = WC_Correios_Connect::get_fee(str_replace(',', '.', $fee), $cost);
                 $_rates[] = array('id' => $name, 'label' => $label, 'cost' => $cost + $fee);
             }
         }
     }
     $_rates = apply_filters('woocommerce_correios_shipping_methods', $_rates, $package);
     // Format the cost.
     $rates = array();
     foreach ($_rates as $rate) {
         $rates[] = array('id' => $rate['id'], 'label' => $rate['label'], 'cost' => self::get_price($rate['cost']));
     }
     return $rates;
 }