Webservice Consulta de Frete JAMEF

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

<?php
class JamefConsultaFrete
{
	/* ATRIBUTOS */
	private $wsdlSchema    = 'http://';
	private $wsdlSock      = 'http://';
	private $wsdlHost      = 'www.jamef.com.br';
	private $wsdlQuery     = '/internet/e-comerce/calculafrete.asp?';
	private $trackQuery    = '/internet/e-comerce/calculafrete_xml.asp?';
	private $wsdlPort      = 80;
	private $function      = '';
	private $soapAction    = '';
	private $error         = false;

	//Login
	private $username      = ‘[CNPJ DA EMPRESA]’;
	private $_services     = array(
				'R' => 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    = 'http://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="http://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

<?php

$CNPJ = '';		// CNPJ da empresa
$CEP_ORIGEM = '';	// CEP da empresa
$CEP_DESTINO = '';	// CEP do destinatario
$CIDADE = '';	        // CIDADE do destinario
$UF = '';		// UF do destinario
$FILIAL_JAMEF = '';	// FILIAL da Jamef que irá fazer a coleta

$jamef = new JamefConsultaFrete($CNPJ, $CEP_ORIGEM, $CEP_DESTINO, $CIDADE, $UF, $FILIAL_JAMEF);
$jamef->setObject($largura, $comprimento, $altura, $diametro, $peso, $valor_declarado_da_nota, $qtde_volume);
$resultado = $jamef->getData()->procedure();

echo '<pre>';
print_r($resultado);
echo '</pre>';
?>
Anúncios

Você faz campanhas de marketing da forma correta?

 Gosto de escrever sobre algo que vivencio no meu dia-a-dia. Um dos assuntos são as ações/campanhas de marketing voltadas para o mercado virtual (e-commerce), o qual nos permite ter insights para as nossas próximas campanhas, uma forma de benchmarking, porém sempre avaliando o que podemos ou não utilizar.
     Decidi escolher esse tema dessa vez, depois de várias reuniões com profissionais de marketing digital e outros gestores de e-commerce, pois a grande a preocupação eram as campanhas absurdas e/ou mal planejadas que alguns sites produziam para tentar vender mais, ou mesmo, por modelos de negócios questionáveis de alguns prestadores de serviços, que oferecem ações fantásticas, investimentos baixos e com altos índices de conversão, o  “melhor dos mundos”. Será que copiar as ações de marketing é sinônimo de bom retorno (ROI)?
image1
     Eis que desses bate-papos surgiram notas avessas ou no mínimo curiosas, e por isso, vejo que compartilhar é uma forma de contribuir para que outros profissionais de e-commerce evitem tais caminhos abusivos ou tragam prejuízos a suas empresas. Há muitos oportunistas e é necessário defender as empresas honestas, que geram riqueza e emprego, movimentando a economia do país.
     Alguns gestores pensam que basta ler uma notícia, assistir um video, participar de um hangout, ir a algum evento da área, ou seja, ter contato de alguma forma com ações de marketing compartilhadas (muitas vezes pelos grandes varejistas) e logo querem por em prática – o famoso “mostrar serviço” – sem planejar, elaborar um plano de negócio, organizar as ideias/sugestões ou discutir com outras pessoas.
     Avaliar se a campanha serve para o nicho de atuação, saber como será a receptividade do público, viabilidade de custo e recursos (humano e tecnológico), é primordial. Algumas podem dar certo, e torcemos por isso, já outras o que se consegue são aborrecimentos dos consumidores (que depois podem terminar em financeiros).
tiro-pela-culatra
     Os e-consumidores estão cada vez mais espertos no quesito “fazer um bom negócio” e sabem diferenciar boas campanhas de outras. Existem ainda pessoas que podem acreditar em “contos de fada”, mas a grande maioria já demostra o contrário e não perdoa. Isso é enxergado pelos inúmeros sites de avaliação/reclamação que surgiram nos últimos tempos, além da forma como a rede social permite a dissipação da opinião dos usuários.
     Enumero 4 ações de marketing, que ao meu ver, estão fadadas ao fracasso se não forem bem executadas:
  • Monitorar  cliente autenticado (logado), que abandona o carrinho de compras (cupom de desconto)
    • O cliente abandona o produto no carrinho por avaliar que o frete não compensa ou por decidir finalizar depois. É ai que o monitoramento do site detecta o ocorrido e envia um email de retargeting, normalmente após uma hora já que não houve finalização. No e-mail vem escrito o quão importante o cliente é para a loja, por isso, participa de um canal de promoções exclusivas, onde poderá ter DESCONTO em suas compras e lógico o produto abandonado listado abaixo. Até ai uma campanha sensacional, uma métrica nova para apresentar aos diretores, mas o perigo está em oferecer descontos a todos os e-consumidores dali para frente, basta apenas deixar o produto no carrinho e não finalizar a compra. Aguardar um e-mail com o produto desejado e com desconto especial. Pode ser que a venda aumente sim, mas o prejuízo a acompanha.
  • Oferecer frete grátis para todo brasil 
    • Oferecer frete grátis já foi tema do meu post anterior (Frete! O pesadelo de todo gestor de e-commerce), onde alguém tem que pagar a conta, e se torna onerosa a partir de quando a loja não consegue mais controlá-la. Vejo alguns profissionais informar para embutir no preço de venda o custo de frete, porém esquecem da tributação/impostos que implica. E no final, podem estar pagando mais do que recebendo.
  • Alteração de preço descontrolada (PRICING)
    • Não é de hoje que as empresas mudam o preço apenas para forçar os consumidores mais indecisos a tomarem partido (e como não gostamos de perder, a escolha é fadada a COMPRA). Mas se isso não é feito com sabedoria e grandes recursos tecnológicos, pode provocar uma onda de ações judiciais. Hoje os consumidores já entram nos comparadores tirando print screen da tela como forma de se precaver de uma possível alteração de preço durante a experiência de compra. Algo que muitas plataformas (mesmo de grandes varejistas) podem ter erros de sincronização e motivar uma “chuva de reclamações”, tanto por sites especializados quanto nas redes sociais, Recentemente ocorreu um problema com o Walmart ao oferecer um item pelo valor mais baixo. Mesmo com o recurso de ERRATA, a reputação foi prejudicada e a fama de enganador ficou no ar.
  • Aumentar os preços semanas antes de datas comemorativas (Black Friday)
    • Essa ação é idêntica a citada acima, somente destaco para mostrar que a população esta mais atenta  e já não pode ser enganada com tanta facilidade. Estão cada vez mais criteriosos com as empresas que compram quanto também ao exercício do seu direito. O produto sofre interferência de preço pela alta da produção ou pela sua valorização (demanda). Administre a sua loja com sabedoria e faça o que for possível dentro do seu negócio.
     Todos sabemos que o Brasil tem uma carga tributária grande que não permite preços muito abaixo do que acompanhamos durante os meses antes dessas datas, mesmo com grandes negociações por parte do fabricante com os revendedores. As margens são cada vez mais estreitas para promover um investimento maior na categoria. Então como tentar ser igual o que ocorre em outros mercados, quando se pode criar ações para o perfil de cada empresa e com condições saudáveis? Todas essas campanhas foram pioneiras nesses mercados desenvolvidos e chegaram ao Brasil como se aqui fosse possível praticar sem nenhuma adaptação. Alguém ainda não se perguntou porque a Amazon não veio para o mercado brasileiro com a força que tem lá fora?
     Por tudo isso, listo abaixo alguns tópicos que sigo para saber se a campanha é uma boa opção para o negócio.
  • Custo de investimento
  • Prazo de retorno
  • ROI
  • Esforço desprendido
  • Recurso humano
  • Público-alvo
  • Opinião do diretor
  • Suporte da plataforma
  • Legislação
É possível minimizar os prejuízos se dedicarmos um tempo a mais no planejamento das atividades. Espero que esse tópico de discussão possa criar um debate sobre ações genuinamente brasileiras. Pode estar aí um caminho a percorrer para se ter melhores resultados!
Sugestões sempre bem vindas. Abraço e até a próxima.

Como recuperar os comentários dos produtos feitos pelos usuários do BuscaPé

Uma vez me perguntei porque não aproveitar o que os clientes escreviam sobre um produto (bem ou mal) nos comparadores como o BuscaPé? Procurei inúmeras vezes pela internet e nada de encontrar alguém falando sobre isso.

Fui atras e encontrei a API do BuscaPé Developer e pronto meu desejo começou a torna-se realidade. Foi então que criei a classe que compartilho com você agora. É possível fazer muitas coisas com essa API, e as explicações são bem explicativas e com exemplos de implementações, além de ter a opção de monetização $$ (ótimo para quem precisa).

O próximo passo seria um gestor de comentários sobre os produtos, como o COMENTA que já não esta mais disponível, mas a ideia é muito bacana. Quem sabe não tomo coragem e coloco isso em pratica.

Primeiramente é necessário criar um cadastro no BuscaPé. Tem uma página da própria empresa explicando tudo direitinho.

http://developer.buscape.com/tutoriais/procedimentos-para-desenvolver-sua-aplicacao/

Após criado o aplicativo de conexão você terá acesso a sua chave que será usado nessa conexão. O código foi desenvolvido em PHP, mas pode ser convertido facilmente em outras linguagens.

Depois que implementar você somente precisa fazer uma tabela do seu código de produto para o código do BuscaPé.

Para conseguir o código do Produto BuscaPé, existe um truque. Quando você abre o código fonte da pagina, procure por “unico”, você encontrará um atributo dessa forma da imagem.

codigo-fonte-buscape

Depois é só copiar o atributo “prodId” para a sua tabela de relacionamento.

Abraço e colaborações serão bem vindas.

<?php
class BuscaPe
{
 private $code = 0; 
 private $host = '';
 private $url = 'sandbox.buscape.com’; // utilize essa URL no modo DESENVOLVIMENTO
 //private $url = 'bws.buscape.com'; // URL de Produção
 private $key = [CHAVE_DESENVOLVEDOR];
 private $_data = null;
 public function __construct($code)
 {
 $this->initialize($code);
 return $this;
 }

 private function initialize($code)
 {
 $this->host = $_SERVER['SERVER_ADDR'];
 $this->setCode($code)->viewUserRatings();
 return $this;
 }
 /* attributes -> in */
 private function setCode($code)
 {
 if ($code > 0) $this->code = $code;
 return $this;
 }
 private function getCode()
 {
 return $this->code;
 }
 private function getHost()
 {
 return $this->host;
 }

 /* attributes -> out */
 private function setData($_data)
 {
 $this->_data = $_data;
 return $this;
 }
 public function getData()
 {
 return $this->_data;
 }

 private function getUserRating()
 {
 return $this->userRating;
 }
 private function setUserRating($userRating)
 {
 $this->userRating = $userRating;
 return $this;
 }

 private function getUserOpinions()
 {
 return $this->userOpinions;
 }
 private function setUserOpinions($userOpinions)
 {
 $this->userOpinions = $userOpinions;
 return $this;
 }

 private function getURL($service=‘viewUserRatings’)
 {
 $url = null;
 if ($this->getCode() > 0 &$service != ‘’) $url = 'http://'.$this->url.'/service/‘.$service.’/‘.$this->key.'/BR/?productId='.$this->getCode().'&clientIp='.$this->host;
 return $url;
 }

 /* Resource */
 public function viewUserRatings()
 {
 $url = $this->getURL('viewUserRatings');
 if ($url != null)
 {
 $xml = simplexml_load_file($url);
 if ($xml)
 {
 if ($this->getCode() > 0 & $xml != '') $this->setData($xml)->mapping();
 }
 }
 return $this;
 }

 private function mapping()
 {
 $xml = $this->getData();
 $this->setUserRating($xml->product->rating->userAverageRating)->setUserOpinions($xml->opinions);

 return $this;
 }

 private function filter($_opinion)
 {
 $word = '[bloqueada]';
 $_words = array (
 'bosta',
 'merda',
 'caralho',
 'diabo',
 'http://',
 'www',
 '@',
 '\$',
 );

 $_opinion['comment']['comment'] = str_ireplace($_words, $word, $_opinion['comment']['comment']);
 $_opinion['comment']['positive'] = str_ireplace($_words, $word, $_opinion['comment']['positive']);
 $_opinion['comment']['negative'] = str_ireplace($_words, $word, $_opinion['comment']['negative']);
 $_opinion['author'] = str_ireplace($_words, $word, $_opinion['author']);
 $_opinion['title'] = str_ireplace($_words, $word, $_opinion['title']);

 return $_opinion;
 }

 /* method public */
 public function getRating()
 {
 return doubleval($this->getUserRating()->rating);
 }

 public function getSpecification()
 {
 $v_spec = array();
 $xml = $this->getData();
 $specs = $xml->product->specification->item;

 $s = sizeof($specs);
 if ($s > 0)
 {
 foreach($specs as $spec)
 {
 $v_spec[] = array (
 'label' => utf8_decode($spec->attributes()->label),
 'value' => utf8_decode($spec->value[0])
 );
 }
 }
 return $v_spec;
 }

 public function getNumComments()
 {
 return $this->getUserRating()->numComments;
 }

 public function getOpinions()
 {
 $v_opinions = array();
 $opinions = $this->getUserOpinions();
 $s = sizeof($opinions);
 if ($s>0)
 {
 foreach($opinions as $opinion)
 {
 $v_date = date_parse($opinion->attributes()->date);
 $v_opinion = array (
 'Recommend' => $opinion->attributes()->RecommendProduct,
 'date' => str_pad($v_date['day'], 2, "0", STR_PAD_LEFT).'/'.str_pad($v_date['month'], 2, "0", STR_PAD_LEFT).'/'.$v_date['year'],
 'title' => ucfirst(strtolower(htmlentities(utf8_decode($opinion->title)))),
 'author' => htmlentities(utf8_decode($opinion->author)),
 'rating' => $opinion->rating->userAverageRating->rating,
 'comment' => array (
 'comment' => htmlentities(utf8_decode($opinion->comment->comment)),
 'positive' => htmlentities(utf8_decode($opinion->comment->positive)),
 'negative' => htmlentities(utf8_decode($opinion->comment->negative))
 )
 );

 $v_opinions[] = $this->filter($v_opinion);
 }
 }
 return $v_opinions;
 }
}
$id_produto = "271739";
$buscape = new BuscaPe($id_produto);
$_opinioes = $buscape->getOpinions();
$pontuacao = $buscape->getRating();
$num_comentarios = $buscape->getNumComments();
echo “Pontuação desse produto é = ”.$pontuacao.”<br?>”;
echo “Esse produto tem = ”.$num_comentarios.” comentário(s)”;
print_r($_opinioes);
?>

Frete! O pesadelo de todo gestor de e-commerce

Texto revisado

Recebo e leio constantemente as opiniões de clientes informando de que as lojas são ótimas, as experiências são agradáveis, fácil navegação para encontrar tudo o que precisa, bons produtos, facilidades na escolha do pagamento, etc e etc. Nos gestores ficamos felizes, parece um “conto de fadas”, a loja ser reconhecida pelos seus esforços e conquistar a satisfação de seus clientes é uma experiência gratificante. Porém, como todo super-homem, temos ponto fraco, a criptonita, o conhecido FRETE.

O custo de transportar uma mercadoria até o cliente é uma das discussões mais antigas entre os lojistas e seus e-consumidores. Antes, para adquirir um produto, o cliente deveria se deslocar até a empresa X, procurar o produto desejado, andar até a empresa Y, Z e fazer cotações dos produtos para finalmente concluir sua compra. Saíam felizes depois da décima quinta loja visitada, pois acreditava ter feito um bom negócio e estavam leva-no para casa o item tão desejado.

As coisas mudaram! A violência e os riscos de sair de casa aumentaram, o tempo se tornou curto e cada vez mais escasso na agenda das pessoas. O cliente quando ia buscar a mercadoria na loja, com certeza tinha-se um custo (só passava despercebido): seja o combustível, passe de transporte, taxi, o estacionamento e muitas outras despesas.

EmbalagemEntretanto, a tecnologia disponibilizou uma nova forma de comprar, a VIRTUAL. Essa nova forma de adquirir produtos – que utiliza a internet como ambiente de compra e venda – oferece a comodidade de receber as nossas compras em casa, no trabalho ou qualquer outro lugar que desejar colocar para entrega, ao invés de termos que andar por N lojas; efetuar compras com agilidade e gastar pouco tempo na tomada de decisão, além da liberdade de horário para comprar – o melhor dos mundos! E agora eu me pergunto: quem paga por toda essa comodidade de receber o produto em casa?
Sabemos que os custos operacionais de um e-commerce exige menos que uma loja física tradicional (que acredito ser mais indicada para produtos especializados, tema para outra discussão).  Porém, não podemos desprezar ou ignorar a conta de transporte para os produtos até o cliente.

Quando as lojas virtuais surgiram, era comum o frete ser calculado dentro de um percentual do valor total do pedido ou da nota fiscal. Esse mesmo cálculo era feito pelos transportadores, e assim, os sites cobravam de seus clientes esse valor, tornando junto a negociação a todos.

Por exemplo: se um produto era vendido por R$100,00 o frete 10% do valor da compra, seria R$10,00 o valor cobrado.

No passado dos e-commerces, para melhorarem suas participações dentro dos canais existentes e aumentarem seus adeptos da compra virtual (consequentemente melhorar seus faturamento), o frete foi banalizado, como forma de investimento, utilizado como marketing e isso agradou a todos (e como!), ajudando a contribuir para o crescimento desse canal de vendas.

Sabemos que essa realidade de cálculo de frete mudou, e muito. O Brasil é um dos maiores países em extensão territorial e sua malha viária é precária. Faltam investimentos para pavimentação, manutenção de veículos, além dos altos custos operacionais e de impostos (ex. protocolo 21/2011). Tudo isso, torna o valor do frete para um produto pequeno, cobrado pelo transportador, extremamente caro. Às vezes, dependendo da localidade, próximo ao valor de venda do produto.

Como a prática de baixos valores para o fretes tornaram-se comuns e acostumou mal os novos e-consumidores, e é dever dos gestores de e-commerces renovarem constantemente suas estratégias para gerenciar essas despesas. As estratégias podem ser, desde tabelas de valores de frete por região à incorporação de parte do valor do frete no preço de venda dos produtos.

“Trabalhe com inteligência ou vai perder dinheiro, e ele, é FINITO”.

A realidade é que essa despesa é cara e, se não for tomado o devido cuidado, tornar-se um “custo fixo” alto. Ter uma estratégia de frete balanceada é uma obrigatoriedade em e-commerce. Saber dosar uma boa política que custeia parte do valor cobrado do frete ao cliente pode ter resultados positivos para o crescimento da loja, além de conseguir boas opiniões e motivar novos clientes. Pense nisso e dedique um pouco do seu tempo nessa etapa do seu e-commerce. Pode estar ai um caminho a percorrer para ter melhores resultados!

Sugestões sempre bem vindas. Abraço é até a próxima.

Uma Visão de Sustentabilidade Corporativa

Exemplo da importância de avaliar o corte de um canal de distribuição, como o E- commerce, de grande rede varejista (Carrefour), citando algumas considerações sobre os efeitos e consequências no valor da empresa.Carrefour desativa vendas on-line em processo de reestruturação
(por Thiago Santos, publicado na FOLHA DE SÃO PAULO em 07/12/2012) http://www1.folha.uol.com.br/mercado/1197587-carrefour-desativa-vendas-on-line- em-processo-de-reestruturacao.shtmlO Carrefour Brasil anunciou nesta sexta-feira (7) a suspensão de suas vendas on-line. O site está fora de atividade desde hoje e traz um comunicado oficial sobre o seu encerramento.De acordo com o Carrefour, a medida faz parte de um plano de reestruturação da empresa iniciado há dois anos.

A intenção é concentrar esforços no fortalecimento de seus hipermercados. Lojas com a bandeira Carrefour serão revitalizadas com a expansão do conceito de “nova geração”, em funcionamento em duas unidades, uma em Santo André e a outra em São Caetano do Sul (ambas no ABC paulista). O modelo traz mudanças no atendimento, no layout das lojas e na disposição dos produtos.

Além disso, há planos de expansão da bandeira Atacadão, rede de lojas populares do grupo.

Segundo a empresa, clientes que fizeram pedidos que ainda não foram entregues ainda poderão consultar o andamento deles por meio do site da empresa. Os clientes também têm à disposição o e-mail lojavirtual@carrefour.com.br e o telefone (11) 4004-0126.

Quem possuía lista de casamento ou créditos a serem resgatados no site receberá cartões-presente que poderão ser utilizados em qualquer loja da rede. O cliente também pode receber o valor correspondente de volta.

“A empresa está empenhada em minimizar qualquer problema que venha surgir mesmo após a suspensão do e-commerce”, informou o grupo em nota.

O Carrefour não divulgou qual era o faturamento do site e quanto será economizado com a sua suspensão. Parte dos funcionários do segmento será absorvida em outras operações, mas haverá cortes. A empresa também não divulgou quantos funcionários seriam desligados.

NOTIFICAÇÃO

O Procon-SP enviou nesta sexta-feira (7) uma notificação ao Carrefour para que o grupo apresente quais providências serão tomadas para garantir os direitos dos consumidores. O órgão pede informações como a quantidade de consumidores que ainda não tiveram seus produtos entregues e a estimativa de prazo para a entrega de todos os itens adquiridos até o fechamento do site.

O Carrefour tem prazo de uma semana para responder ao órgão. Segundo orientação do Procon, clientes prejudicados devem, primeiro, tentar solucionar o caso entrando em contato com a empresa. Caso não haja solução, o consumidor pode reclamar ao órgão de defesa do consumidor de sua região.

Mensagem do CarrefourImagem da nota oficial no site do Carrefour.com.br

 ANALISE CRITICA
Por: Thiago Zampieri

É de conhecimento comum que qualquer ação tomada, mesmo que bem estudada como o plano de reestruturação do Carrefour, pode acarretar em consequências intangíveis, ou seja, tanto pode produzir sucesso, ou um inicio de um fracasso.

Sabemos que essa iniciativa foi no Brasil e que pode ter sido tomada frente a crise europeia, sede da matriz do grupo (origem francesa). O Carrefour Brasil foi uma das ultimas empresas a entrar no mercado de venda pela internet e sua duração foi considerada curta, tendo em vista os seus principais concorrentes diretos (grandes magazines e varejistas). Imagina-se que por ter sido tardio, a operação e-commerce teria sido bem planejada a ponto de avaliar os principais riscos já conhecidos de outras empresas similares (esse setor é um dos que mais cresce a cada ano segundo o site E-commerce Brasil, referencia no assunto) e queria logo estaria dando o retorno do investimento.

Uma das opiniões de vários especialista é que a aposta de utilizar o estoque das unidades físicas como estoque da operação e-commerce não foi assertiva, pois a maioria dos grandes varejistas, apostam em um CD (Centro de Distribuição) para esse abastecimento, favorece assim o processo de envio (único remetente), concentração da carga (MRP, Volume de Compra, Supply Chain, Gerenciamento de Transportes). Uma fonte ou indicador para isso são as quantidades de reclamações e insatisfações dos clientes, publicadas no site ReclameAqui. Utilizavam também esse canal apenas como mais um simples de canal de comercialização e buscavam o fator receita para a empresa, se esquecendo dos benefícios que esse canal pode trazer ao fator relacionamento.

No qual a informação poderia ser usada estrategicamente para analisar perfis de compras, cruzar hábitos e identificar ofertas, algo que a Amazon faz desde 1995, e tem sido uma das principais razões do seu sucesso. Se a margem na Internet não é alta o suficiente, seria possível oferecer produtos financeiros diferenciados, tornando a operação lucrativa.

Assim, o processo de decisão, na minha opinião, foi errôneo desde o inicio, da “noite para o dia” tiraram o site do ar e no lugar colocaram uma nota oficial que informava o fechamento das operação e-commerce, aos seus milhares de consumidores, temporariamente para uma reestruturação das lojas físicas. Uma diretiva que era planejada a 2 anos (o site tem pouco mais de 2 anos de atividade), sem ter uma plano especifico sobre aqueles que ainda aguardavam seus produtos comprados via internet, gerando ocorrências nos principais PROCONs do pais.

Outro ponto a ser debatido é que a maioria dos clientes que acessavam o site são clientes das lojas físicas, e que buscavam esse canal para saber preços e ofertas de produtos e assim evitar contratempos e ter maior conforto; também trouxe descredibilidade a marca como um todo, uma vez que o fortalecimento da empresa se da pela atitudes perante seu público-alvo.

Entendo que as estratégias escolhidas pelos stakeholders da operação e- commerce, como: preços agressivos, divulgação em vários meios de comunicação (mídias pagas), inúmeros segmentos/departamentos, excesso no mix de produtos e por últimos descontos absurdos indica a necessidade de fechar as metas de faturamento sem se preocupa com resultados lucrativo, em outras palavras, indicaria que o fim estaria próximo. Tudo isso criou na realidade, desmotivação da equipe de trabalho, demissões em massa, migração para outras empresas, queda de valor de mercado, redução do Market share e principalmente, o cliente. Como alguém pode confiar em uma empresa que não da atenção devida ao seu consumidor, que traz o resultado desejado pelos acionistas? Onde fica o imensurável?

Sim o imensurável é o quanto os acionistas ainda iram perder para que o administrador perceba que estão com a estratégia errada. Considero essa atitude de escolha mal planejada e nada sustentável, do ponto de vista corporativo, pois além de “nadar contra a maré”, perder um outro meio de compreender os hábitos de compras de seus clientes e fomentar suas estratégias comerciais, tanto nas vendas não presenciais como presenciais.

E ai o que vocês acham?

Concurso Cultural #SigaMundomax

#SigaMundomax

Galera, já está no ar o Concurso Cultural #SigaMundomax, concurso promovido pela Mundomax para premiar com Guitarras, Violões, Gaitas, Camisetas… nossa ta cheio de prêmios legal!!! O concurso cultural visa aumentar os seguidores do Twitter da Mundomax que estipulou um número mínimo de seguidores para valer o Concurso, basta ativar o número de 5.000 Followers.

São duas categorias de participação: Frase Criativa e Sou Popular!

vamos aproveitar ai!!! a oportunidade é otima, então acessem o site: http://siga.mundomax.com.br

Video Motivacional – Parte 1

Galera quando vi esse video vi como nos não damos importância as coisas simples, até a andar de bicicletas.

No meio de tantas atrocidades que vimos no dia-a-dia e nos deparamos com uma criança achando fantastico apenas por conseguir uma conquista sua.

 

Então tira essa bunda do sofá da sala e comece a produzir coisas que some no mundo, não seja um peso MORTO aos olhos das pessoas.

Como diz o menino Keep Going to try!!!!!

PS: fonte do video  (Parabéns!)

See you later e não deixem de comentar…