Quem já precisou integrar a consulta de frete da transportadora JAMEF se deparou com o problema de não retornar o prazo de entrega. Eis a solução. Ao criar esse conexão também montei o código para trazer o prazo de entrega.
Um detalhe importante é quanto ao tempo de processamento, o servidor da JAMEF demora para responder e isso pode tornar a consulta mais lenta que encontrado em outros webservices.
consultajamef.php
array('name' => 'Transportadora Jamef', 'title' => 'Encomenda Rodoviario', 'code' => '54'), //Rodoviario 'A' => array('name' => 'Transportadora Jamef', 'title' => 'Encomenda Aereo', 'code' => '55'), //Aereo ); //Config. private $zipcodeSRC = ‘[CEP_ORIGEM]’; private $zipcodeDST = ‘[CEP_DESTINO]’; private $ufDST = ‘[UF_DESTINO]’; private $cityDST = ‘[CIDADE_DESTINO]’; private $width = 0.00; //Largura private $length = 0.00; //Comprimento private $height = 0.00; //Altura private $diameter = 0.00; //Diametro private $weight = 0.00; //Peso private $price = 0.00; //Valor Declarado //Serviços private $ndocSRC = array( //Documento do Destinatário 174 => array('name' => 'AJU', 'title' => '(Filial Aracajú)', 'uf' => 'SE'), 122 => array('name' => 'BAR', 'title' => '(Filial Barueri)', 'uf' => 'SP'), 111 => array('name' => 'BAU', 'title' => '(Filial Bauru)', 'uf' => 'SP'), 1 => array('name' => 'BHZ', 'title' => '(Filial Belo Horizonte)', 'uf' => 'MG'), 13 => array('name' => 'BNU', 'title' => '(Filial Blumenau)', 'uf' => 'SC'), 163 => array('name' => 'BSB', 'title' => '(Filial Brasilia)', 'uf' => 'DF'), 160 => array('name' => 'CCM', 'title' => '(Filial Criciuma)', 'uf' => 'SC'), 12 => array('name' => 'CPQ', 'title' => '(Filial Campinas)', 'uf' => 'SP'), 5 => array('name' => 'CXJ', 'title' => '(Filial Caxias do Sul)', 'uf' => 'RS'), 10 => array('name' => 'CWB', 'title' => '(Filial Curitiba)', 'uf' => 'PR'), 192 => array('name' => 'FES', 'title' => '(Filial Feira de Santana)', 'uf' => 'BA'), 11 => array('name' => 'FLN', 'title' => '(Filial Florianópolis)', 'uf' => 'SC'), 177 => array('name' => 'FOR', 'title' => '(Filial Fortaleza)', 'uf' => 'CE'), 148 => array('name' => 'GYN', 'title' => '(Filial Goiânia)', 'uf' => 'GO'), 193 => array('name' => 'ITJ', 'title' => '(Filial Itajaí)', 'uf' => 'SC'), 4 => array('name' => 'JAS', 'title' => '(Filial Jaraguá do Sul)', 'uf' => 'SC'), 9 => array('name' => 'JOI', 'title' => '(Filial Joinville)', 'uf' => 'SC'), 8 => array('name' => 'LDB', 'title' => '(Filial Londrina)', 'uf' => 'PR'), 149 => array('name' => 'MAO', 'title' => '(Filial Manaus)', 'uf' => 'AM'), 183 => array('name' => 'MCZ', 'title' => '(Filial Maceió)', 'uf' => 'AL'), 14 => array('name' => 'POA', 'title' => '(Filial Porto Alegre)', 'uf' => 'RS'), 159 => array('name' => 'PSA', 'title' => '(Filial Pouso Alegre)', 'uf' => 'RS'), 121 => array('name' => 'RAO', 'title' => '(Filial Ribeirão Preto)', 'uf' => 'SP'), 171 => array('name' => 'REC', 'title' => '(Filial Recife)', 'uf' => 'PE'), 3 => array('name' => 'RIO', 'title' => '(Filial Rio de Janeiro)', 'uf' => 'RJ'), 2 => array('name' => 'SAO', 'title' => '(Filial São Paulo)', 'uf' => 'SP'), 125 => array('name' => 'SJK', 'title' => '(Filial São José dos Campos', 'uf' => 'SP'), 124 => array('name' => 'SJP', 'title' => '(Filial São José do Rio Preto)', 'uf' => 'SP'), 168 => array('name' => 'SSA', 'title' => '(Filial Salvador)', 'uf' => 'BA'), 109 => array('name' => 'UDI', 'title' => '(Filial Uberlândia)', 'uf' => 'MG'), 7 => array('name' => 'VIX', 'title' => '(Filial Vitória)', 'uf' => 'ES') ); private $company = [CODIGO_FILIAL_JAMEF]; //Empresa private $volume = 1; //Quantidade de Volume //Adicionais private $cost = 0.00; //AdValore private $timeProcedure = 1; //Tempo Minimo private $weightAdd = 0.00; //Kg adicional //Dados private $_data = array(); //Registro - retorno da Jamef /* CONSTRUTOR */ public function __construct($username, $src_zipcode, $dst_zipcode, $dst_city, $dst_uf, $company) { //Limpa os vetores de dados. $this->reset(); $this->setUsername($username); $this->setCompany($company); $this->setZipcodeSRC($src_zipcode); $this->setZipcodeDST($dst_zipcode); $this->setCityDST($dst_city); $this->setUFDST($dst_uf); } public function setObject($width=0.00, $length=0.00, $height=0.00, $diameter=0.00, $weight=0.00, $price=0.00,$volume=1) { $this->setWidth($width); $this->setLength($length); $this->setHeight($height); $this->setDiameter($diameter); $this->setWeight($weight); $this->setPrice($price); $this->setVolume($volume); return $this; } /* METODOS */ private function getUsername() { return $this->username; } private function getPassword() { return $this->password; } private function getCompany() { return $this->company; } private function setCompany($org_id) { if ($org_id > 0) $this->company = $org_id; } private function getWsdlSchema() { return $this->wsdlSchema; } private function getWsdlSock() { return $this->wsdlSock; } private function getWsdlHost() { return $this->wsdlHost; } private function getWsdlPort() { return $this->wsdlPort; } private function getWsdlQuery() { return $this->wsdlQuery; } private function getFunction() { return $this->function; } private function getSoapAction() { return $this->soapAction; } private function getWsdl() { return $this->getWsdlSchema().$this->getWsdlHost().$this->getWsdlQuery(); } private function getTracking() { return $this->getWsdlSchema().$this->getWsdlHost().$this->trackQuery; } private function checkConnect() { $fp = @fsockopen($this->getWsdlHost(), $this->getWsdlPort(), $errno, $errstr, 3); if (is_resource($fp)) { @fclose($fp); return true; } return false; } private function setZipcodeSRC($zipcode) { $zipcode = str_replace(array('(', ')', '-', '.', ' '), '', $zipcode); if (is_numeric($zipcode) & strlen($zipcode) == 8) { $this->zipcodeSRC = $zipcode; return true; } return false; } private function getZipcodeSRC() { return $this->zipcodeSRC; } private function setZipcodeDST($zipcode) { $zipcode = str_replace(array('(', ')', '-', '.', ' '), '', $zipcode); if (is_numeric($zipcode) & strlen($zipcode) == 8) { $this->zipcodeDST = $zipcode; return true; } return false; } private function getZipcodeDST() { return $this->zipcodeDST; } private function setUFDST($uf) { if (strlen($uf) == 2) { $this->ufDST = $uf; return true; } return false; } private function getUFDST() { return $this->ufDST; } private function setCityDST($city) { $this->cityDST = $city; } private function getCityDST() { return $this->city; } private function setWeight($weight) { $weight = doubleval($weight); if (is_double($weight)) { $this->weight = $weight; return true; } return false; } private function getWeight() { return ($this->weight + $this->getWeightAdd()) * 1; //peso deve ser informado em Kilograma. } private function getWeightAdd() { return $this->weightAdd; } private function setDiameter($diameter) { $diameter = doubleval($diameter); if (is_double($diameter)) { $this->diameter = $diameter/100; return true; } return false; } private function getDiameter() { return $this->diameter; } private function setWidth($width) { $width = doubleval($width); if (is_double($width)) { $this->width = $width/100; return true; } return false; } private function getWidth() { return $this->width; } private function setLength($length) { $length = doubleval($length); if (is_double($length)) { $this->length = $length/100; return true; } return false; } public function getLength() { return $this->length; } private function setHeight($height) { $height = doubleval($height); if (is_double($height)) { $this->height = $height/100; return true; } return false; } private function getHeight() { return $this->height; } private function setPrice($price) { $price = doubleval($price); if (is_double($price)) { $this->price = $price; return true; } return false; } private function getPrice() { return $this->price; } private function getCost() { return $this->cost; } private function getTimeProcedure() { return $this->timeProcedure; } private function reset() { $this->width = 0.00; //Largura $this->length = 0.00; //Comprimento $this->height = 0.00; //Altura $this->diameter = 0.00; //Diametro $this->weight = 0.00; //Peso $this->price = 0.00; //Valor Declarado } private function getServicesId($code) { $_services = $this->_services; $name = $_services[$code]['code']; return $name; //JAMEF } private function getNDocSRC() { return $this->ndocSRC[$this->getCompany()]; } private function getVolume() { return $this->volume; } private function setVolume($volume) { if ($volume <= 0)$volume = 1; $this->volume = $volume; } private function getServicesName($code) { $_services = $this->_services; $name = $_services[$code]['name']; return $name; } private function getServicesTitle($code) { $_services = $this->_services; $name = $_services[$code]['title']; return $name; } private function getConnect() { $wsdl = $this->getWsdl(); $client = new soap_client($wsdl, true); // true = sem namespace //$client = new nusoap_client($wsdl, 'wsdl'); // true = sem namespace $client->soap_defencoding = 'UTF-8'; return $client; } private function curl_post($url, $fields) { //open connection $ch = curl_init(); //set the url, number of POST vars, POST data curl_setopt($ch,CURLOPT_URL, $url); curl_setopt($ch,CURLOPT_POST, count($fields)); curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string); //execute post $result = curl_exec($ch); //close connection curl_close($ch); return $result; } public function getDeliveryDB($city, $uf) { $time = 7; if ($city != '' & $uf != '') { $l_date = date('d/m/Y'); $url = 'https://www.jamef.com.br/jamef/previsao_entrega.do'; $data = '?x=x&calcula=x&txtUf_orig=PR&txtMum_orig=LONDRINA&txtDataEmbarque='.$l_date.'&txtUf_dest='.$uf.'&txtMum_dest='.$city.'&=&'; $result = $this->curl_post($url, $data); $result = str_replace("'", '"', str_replace(array("{'array':[", "]}"), "", trim($result))); $result = json_decode($result, true); if ($result != null) { if ($result['dataEntrega'] != '') $time = Main::diffDate($result['dataEmbarque'], $result['dataEntrega']); } } return $time; } private function callFunction($format='CalcularFrete', $_param=array()) { switch($format) { case 'CalcularFrete': $xml = $this->convert($_param, 'CalcularFreteResult4’); $url = $this->getTracking().$xml; //echo $url; //exit(); ini_set('allow_url_fopen', 1); $_result = @file_get_contents($url); if(!is_string($_result)) $error = true; break; } $this->error = $error; return $_result; } private function setParam($_param) { $xml = $this->convert($_param, 'CalcularFreteResult2’); } private function toDecimal($value) { return number_format($value, 2, '.', ''); } private function toNumber($value) { return number_format($value, 2, ',', '.'); } private function toNumber2($value, $dec=2) { return number_format($value, $dec, ',', ''); } private function convertDecimal($value) { $l_value = str_replace(".", "", $value); $l_value = str_replace(",", ".", $l_value); $l_value = $this->toDecimal(doubleval($l_value)); return $l_value; } private function check() { $l_weight = $this->getWeight(); if ($l_weight > 0) { $l_block = $this->checkConnect(); return $l_block; } return false; } private function __get_days_up($code, $days) { $l_time = 0; switch($code) { default: $l_time = 1; if (intval($days) >= 10) $l_time = 3; elseif (intval($days) >= 5) $l_time = 2; break; } return $l_time; } private function addCost($code, $price) { $l_cost = $price; $l_price = $this->getPrice(); $v_cost = $this->getCost(); switch($code) { default: $l_cost = ($v_cost * $l_price) + $price; break; } return doubleval($l_cost); } private function getDeliveryTime($time) { //Regra Padrao if ($time < 1) return 3; return $time; } private function getUF() { $_array = $this->getNDocSRC(); return $_array['uf']; } private function convert($_param, $format='XML') { $xml = ''; $v_param = $_param[0]; if (is_array($v_param)) { $i = 0; $f = sizeof($v_param); $v_keys = array_keys($v_param); switch($format) { case 'CalcularFreteResultXML’: $xml = ' <'.$this->getFunction().' xmlns="https://schemas.xmlsoap.org/soap/encoding/">'; while($i<$f) { $key = $v_keys[$i]; $value = $v_param[$key]; $xml .= ' <'.$key.'>'.$value.''; $i++; } $xml .= 'getFunction().'>'; break; case 'CalcularFreteResult’: while($i<$f) { $key = $v_keys[$i]; $value = $v_param[$key]; $xml[] = $key.'='.$value; $i++; } $xml = implode(",", $xml); break; case 'CalcularFreteResult2’: while($i<$f) { $key = $v_keys[$i]; $value = $v_param[$key]; $xml[] = $value; $i++; } $xml = implode(",", $xml); break; case 'CalcularFreteResult4’: while($i<$f){ $key = $v_keys[$i]; $value = $v_param[$key]; $xml[] = $key.'='.$value; $i++; } $xml = implode("&", $xml); break; } } return $xml; } public function getData(){ $error = false; $check = $this->check(); if ($check){ //echo $this->getWidth(); //echo ($this->getVolume()*$this->getWidth()*$this->getHeight()*$this->getLength()); exit(); $_param = array ( array ( 'P_CIC_NEGC' => $this->getUsername(), 'P_COG_REGN' => $this->getCompany(), 'P_CEP' => $this->getZipcodeDST(), 'P_PESO_KG' => $this->toNumber2($this->getWeight()), 'P_VLR_CARG' => $this->toNumber2($this->getPrice()), 'P_UF' => $this->getUF(), 'P_CUBG' => $this->toNumber2(($this->getWidth()*$this->getHeight()*$this->getLength()), 4) ) ); //echo ' '; print_r($_param); echo ' ';//exit(); $_result = $this->callFunction(‘CalcularFrete, $_param); $error = $this->error; $_data = array(); if (!$error){ $data = ($_result); $xml = new xml2array(); $_array = $xml->parse($data); //echo ' '; print_r($_array); exit(); $_array = $_array[0]['children'][0]['children']; if ($_array[0]['tagData'] == '1'){ $_data = array( 0 => array( 'Codigo' => $this->getServicesId($_array[3]['tagData']), 'Valor' => $_array[2]['tagData'], 'PrazoEntrega' => $this->getDeliveryDB($this->getCityDST(), $this->getUFDST()), 'Erro' => 0, 'MsgErro' => '', 'ValorMaoPropria' => 0, 'ValorAvisoRecebimento' => 0, 'ValorValorDeclarado' => 0.00, 'EntregaDomiciliar' => 'N', 'Seguro' => 'N', 'EntregaSabado' => 'N' ) ); } } $this->_data = $_data; } return $this; } public function procedure() { $_data = $this->_data; $l_count = sizeof($_data); if ($l_count > 0) { $x = 0; //Inicio while($x < $l_count){ $l_value = $this->convertDecimal($_data[$x]['Valor']); $l_time1 = intval($_data[$x]['PrazoEntrega']); $l_code = $_data[$x]['Codigo']; if ($l_code != '' & $l_value > 0.00 & $l_time1 > 0) //Codigo com erro -1 -2 -99{ $l_time = $this->getDeliveryTime($l_time1); $l_value= $this->convertDecimal($_data[$x]['Valor'])*0.9; $_data[$x]['Nome'] = $this->getServicesName($l_code); $_data[$x]['Descricao'] = $this->getServicesTitle($l_code); $_data[$x]['ValorReal'] = $l_value; $_data[$x]['Valor'] = $this->convertDecimal($this->toNumber($this->addCost($l_code, $_data[$x]['ValorReal']))); $_data[$x]['ValorTotal'] = $this->toDecimal($_data[$x]['Valor'] + $_data[$x]['ValorMaoPropria'] + $_data[$x]['ValorAvisoRecebimento'] + $_data[$x]['ValorValorDeclarado']); $_data[$x]['PrazoEntregaReal'] = $l_time1; $_data[$x]['PrazoEntrega'] = ($l_time + $this->getTimeProcedure() + $this->__get_days_up($l_code, $l_time)); } else unset($_data[$x]); $x++; } } else return -1; return $_data; } } ?>
resultado.php
setObject($largura, $comprimento, $altura, $diametro, $peso, $valor_declarado_da_nota, $qtde_volume); $resultado = $jamef->getData()->procedure(); print_r($resultado); ?>