CakePHP Brasil

21 abril 2009

Behavior com métodos dos Correios

Arquivado em: CakePHP, Tutoriais — Tags:, — Juan Basso @ 7:35 pm

Após criar o plugin para validações de itens brasileiros, duas funçõezinhas para verificar itens dos Correios.

O código está junto do projeto Cake PT-BR, no GitHub.

Similar ao Behavior de Validação, as funções dos Correios foram colocadas dentro de um Behavior. O nome dele é Correios (sugestivo :-) ). Nesse behavior há dois métodos:

  • valorFrete: calcula o valor do frete. Parâmetros:
    • servico: define o tipo de serviço que será feito. Os valores válidos são através das constantes: CORREIOS_SEDEX, CORREIOS_SEDEX_A_COBRAR, CORREIOS_SEDEX_10, CORREIOS_SEDEX_HOJE, CORREIOS_E_SEDEX, CORREIOS_ENCOMENDA_NORMAL, CORREIOS_PAC.
    • cepOrigem: Cep de origem no formato XXXXX-XXX.
    • cepDestino: Cep de destino no formato XXXXX-XXX.
    • peso: Peso, em quilos, do item a ser transportado. O valor deve ser um número e não deve ultrapassar 30.
    • maoPropria:(opcional. Padrão falso) Valor boleano para indicar se o transporte é com mão prórpria.
    • valorDeclarado: (opcional. Padrão 0.00) Valor do item a ser transportado.
    • avisoRecebimento: (opcional. Padrão falso) Calculo com aviso de recebimento.

    O retorno será negativo em caso de erro, que podem ser as constantes:

    • ERRO_CORREIOS_PARAMETROS_INVALIDOS: Um ou mais parâmetros com formato ou conteúdo inválido.
    • ERRO_CORREIOS_EXCESSO_PESO: Peso acima do limite (30 Kg).
    • ERRO_CORREIOS_FALHA_COMUNICACAO: Problema de comunicação com o site dos Correios.
    • ERRO_CORREIOS_CONTEUDO_INVALIDO: O conteúdo retornado pelo Correios não é o esperado.

    Em caso de sucesso, será retornado um array com os seguintes indices:

    • ufOrigem: UF da Origem
    • ufDestino: UF do Destino
    • capitalOrigem: Valor booleano indicando se a origem é considerada capital
    • capitalDestino: Valor booleando indicando se o destino é considerado capital
    • valorMaoPropria: Valor, em reais, da mão própria
    • valorTarifaValorDeclarado: Valor da tarifa pelo valor declarado
    • valorFrete: Valor apenas do frente, sem incluir os valores de mão própria e tarifa do valor declarado
    • valorTotal: Soma de todos os valores anteriores
  • endereco: Informa o endereço baseado em algum CEP. O único parâmetro é o CEP no formato XXXXX-XXX. Os valores de retorno podem ser as constantes ERRO_CORREIOS_PARAMETROS_INVALIDOS, ERRO_CORREIOS_FALHA_COMUNICACAO ou ERRO_CORREIOS_CONTEUDO_INVALIDO em caso de erro. Em caso de sucesso, o retorno será um array com os indices logradouro, bairro, cidade e uf.

Bem, agora vamos aos códigos. Um exemplo usando o behavior:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Correios extends AppModel {
	var $name = 'Correios';
	var $useTable = false;
	var $actsAs = array('CakeBr.Correios');
 
	function frete($cepDestino) {
		// Supondo que é uma loja que transporta produtos pequenos (até 1Kg)
		return $this->valorFrete(CORREIOS_SEDEX, Configure::read('Loja.CEP'), $cepDestino, 1.0);
	}
}
 
// Outro caso
class Endereco extends AppModel {
	var $name = 'Endereco';
	var $actsAs = array('CakeBr.Correios');
 
	function beforeSave($options) {
		$endereco = $this->endereco($this->data['Endereco']['CEP']);
		if ($endereco < 0) {
			return false;
		}
		$this->data['Endereco'] = array_merge($this->data['Endereco'], $endereco); // Aqui serão incluídas as informações de logradouro, bairro, cidade e uf.
	}
}

Qualquer dúvida, estamos aí.

4 Comentários »

  1. Os correios tinham um serviço que entregava estes dados via XML, mas agora ele foi descontinuado.

    Esse behaviour veio em boa hora, mas eu fico pensando se não seria mais “correto” (não se essa é a melhor palavra) fazer um datasource?

    Qual a licensa deste plugin? Posso fazer um datasource em cima deste behaviour?

    Valeu :)

    Comentário por Éber Freitas Dias — 24 abril 2009 @ 12:19 pm

  2. A licença é MIT, vou colocar dentro do arquivo depois. Fique a vontade em usar o código para o fim que desejar.

    Um datasource também seria interessante. Se você vai fazê-lo público, agradeceria se fizesse um fork no projeto e fizesse as devidas implementações, assim fica tudo “em família” hehe.

    Quando fiz como behavior nem passou pela cabeça usá-lo como datasource, mas realmente faz mais sentido.

    Comentário por Juan Basso — 24 abril 2009 @ 1:30 pm

  3. Tive o seguinte problema:
    utilizando o exemplo presente no site para fazer o teste e ver como funciona sempre recebia a seguinte mensagem do cake: “Notice: Object of class Endereco could not be converted to int [APP\plugins\cake_ptbr\models\behaviors\correios.php, line 36]”
    Resolvi alterando os parametros da função valorFrete, apenas adicionei um parametro $obj antes dos outros, ficando assim:
    linha 33 – function valorFrete($obj, $servico, $cepOrigem …

    Gostaria de saber se o erro ocorreu só aqui e se possível por que ocorreu esse erro comigo

    Comentário por Carlos — 13 maio 2009 @ 10:00 am

  4. Como você estava usando o plugin? Você chegou a ver os exemplos nos testes?

    Comentário por Juan Basso — 15 maio 2009 @ 11:11 pm

Feed RSS dos comentários deste post URL de TrackBack

Deixe um comentário

Powered by WordPress