diff --git a/README.md b/README.md new file mode 100644 index 0000000..489f242 --- /dev/null +++ b/README.md @@ -0,0 +1,266 @@ +# kohana-rastreador-ECT + +Módulo Kohana para rastreamento de pacotes nos Correios (ECT) + +**Autor:** Luiz Alberto + +**URL:** https://github.com/madeinnordeste/kohana-rastreador-ECT + + + Kohana version: 3.3.1 + +Mais informacoes sobre o Webservice dos Correios em docs/Guia-Tecnico-Rastreamento-XML-Cliente-Versão-e-commerce-v-1-5.pdf + + +##Limites + +* O usuario ECT e senha SRO limitam-se a dois objetos por cosulta, outros usuários podem ser obtidos através de contratocom os Correios; +* O número máximo de pacotes por consulta é 50. + +##Classes + +### ECT_Pacote + +Objeto pacote, usado pelo rastreador para realizar a consulta dos eventos. + +####- __construct($numero) + + $pacote = new ECT_Pacote('SW614400906BR'); + +####- numero() + +Retorna o numero do pacote + + $pacote = new ECT_Pacote('SW614400906BR'); + echo $pacote->numero(); //SW614400906BR + +#### -md5() + +Retorna o hash md5 dos eventos do pacote + + $pacote = new ECT_Pacote('SW614400906BR'); + echo $pacote->md5(); //d5ea9cd04fe80f8fb778ad06fabefc5e + + + +####- eventos() + +Retorna um array com a lista de eventos do objeto, se existir + +Exemplo de retorno: + + array(2) ( + 0 => object stdClass(13) { + public tipo => string(3) "BDE" + public status => string(2) "01" + public data => string(10) "24/12/2013" + public hora => string(5) "14:51" + public descricao => string(8) "Entregue" + public recebedor => object stdClass(0) { + } + public documento => object stdClass(0) { + } + public comentario => object stdClass(0) { + } + public local => string(23) "CEE VILA SANTA CATARINA" + public codigo => string(8) "04368970" + public cidade => string(9) "SAO PAULO" + public uf => string(2) "SP" + public sto => string(8) "72651300" + } + 1 => object stdClass(10) { + public tipo => string(3) "OEC" + public status => string(2) "01" + public data => string(10) "24/12/2013" + public hora => string(5) "09:51" + public descricao => string(34) "Saiu para entrega ao destinatário" + public local => string(23) "CEE VILA SANTA CATARINA" + public codigo => string(8) "04368970" + public cidade => string(9) "SAO PAULO" + public uf => string(2) "SP" + public sto => string(8) "72651300" + } + ) + +####- evento($index=0) + +Retorna o evento com $index do objeto, se existir + +Exemplo de retorno: + + object stdClass(13) { + public tipo => string(3) "BDE" + public status => string(2) "01" + public data => string(10) "24/12/2013" + public hora => string(5) "14:51" + public descricao => string(8) "Entregue" + public recebedor => object stdClass(0) {} + public documento => object stdClass(0) {} + public comentario => object stdClass(0) {} + public local => string(23) "CEE VILA SANTA CATARINA" + public codigo => string(8) "04368970" + public cidade => string(9) "SAO PAULO" + public uf => string(2) "SP" + public sto => string(8) "72651300" + } + +####- ultimo_evento() + +Retorna o último evento do pacote, se existir + +####- primeiro_evento() + +Retorna o primeiro evento do pacote, se existir + +### ECT_Rastreador + +Objeto rastreador de pacotes + +####- __counstruct($pacotes) + +Adicionar um pacote através do construtor: + + $pacote1 = new ECT_Pacote('SW614400906BR'); + $rastreador = new ECT_Rastreador($pacote1); + +Adicionar uma lista de pacotes através do construtor: + + $pacote1 = new ECT_Pacote('SW614400906BR'); + $pacote2 = new ECT_Pacote('SW624400906BR'); + $pacote3 = new ECT_Pacote('SW634400906BR'); + $pacotes = array($pacote1, $pacote2, $pacote3); + $rastreador = new ECT_Rastreador($pacotes); + + +####- add_pacote($pacotes = array()) + +Adiciona um objeto ECT_Pacote ao rastreador ou um array contendo objetos ECT_Pacotes + +Adicionar um pacote: + + $pacote = new ECT_Pacote('SW614400906BR'); + $rastreador = new ECT_Rastreador; + $rastreador->add_pacote($pacote); + +Adicionar uma lista de pacotes: + + $pacote = new ECT_Pacote('SW614400906BR'); + $pacote2 = new ECT_Pacote('SW624400906BR'); + $pacote3 = new ECT_Pacote('SW634400906BR'); + $pacotes = array($pacote1, $pacote2, $pacote3); + $rastreador = new ECT_Rastreador; + $rastreador->add_pacote($pacotes); + + +####- consultar() + +Realiza a consulta dos eventos do(s) pacotes contidos no rastreador. Insere esses eventos em cada pacote. + + $pacote = new ECT_Pacote('SW614400906BR'); + $rastreador = new ECT_Rastreador($pacote); + $rastreador->consultar(); + +####- pacotes() + +Retorna uma lista (Array) com os pacotes contidos no rastreador + + $pacote = new ECT_Pacote('SW614400906BR'); + $rastreador = new ECT_Rastreador($pacote); + $rastreador->consultar(); + $pacotes = $rastreador->pacotes(); + +Exemplo de retorno: + + array(2) ( + "SW914400906BR" => object ECT_Pacote(4) { + protected numero => string(13) "SW914400906BR" + protected json => string(1547) "[{"tipo":"BDE",…" + protected json_md5 => string(32) "d5ea9cd04fe80f8fb778ad06fabefc5e" + protected eventos => array(6) ( + 0 => object stdClass(13) { + public tipo => string(3) "BDE" + public status => string(2) "01" + public data => string(10) "24/12/2013" + public hora => string(5) "14:51" + public descricao => string(8) "Entregue" + public recebedor => object stdClass(0) { + } + public documento => object stdClass(0) { + } + public comentario => object stdClass(0) { + } + public local => string(23) "CEE VILA SANTA CATARINA" + public codigo => string(8) "04368970" + public cidade => string(9) "SAO PAULO" + public uf => string(2) "SP" + public sto => string(8) "72651300" + } + ) + } + "SW914401331BR" => object ECT_Pacote(4) { + protected numero => string(13) "SW914401331BR" + protected json => string(1548) "[{"tipo":"BDE" …" + protected json_md5 => string(32) "7173e94c3f23bb80fb95ed9a14778f11" + protected eventos => array(6) ( + 0 => object stdClass(13) { + public tipo => string(3) "BDE" + public status => string(2) "01" + public data => string(10) "24/12/2013" + public hora => string(5) "17:28" + public descricao => string(8) "Entregue" + public recebedor => object stdClass(0) { + } + public documento => object stdClass(0) { + } + public comentario => object stdClass(0) { + } + public local => string(12) "CDD BARREIRO" + public codigo => string(8) "30647970" + public cidade => string(14) "BELO HORIZONTE" + public uf => string(2) "MG" + public sto => string(8) "20420005" + } + ) + } + ) + + + +##Exemplo completo + +Realizar a consulta de dois pacotes: + + $pacote1 = new ECT_Pacote('SW614400906BR'); + $pacote2 = new ECT_Pacote('SW614401331BR'); + $pacotes = array($pacote, $pacote2); + + $rastreador = new ECT_Rastreador($pacotes); + + $rastreador->consultar(); + + $lista_de_pacotes = $rastreador->pacotes(); + + //percorre todos os pacotes + foreach($lista_de_pacotes as $pacote){ + + //numero do pacote + echo Debug::vars($pacote->numero()); + + //hash md5 dos eventos do pacote + echo Debug::vars($pacote->numero()); + + //ultimo evento do pacote + echo Debug::vars($pacote->ultimo_evento()); + + //primeiro evento do pacote + echo Debug::vars($pacote->primeiro_evento()); + + //eventos do pacote + echo Debug::vars($pacote->eventos()); + + //penultimo evento do pacote + echo Debug::vars($pacote->evento(1)); + + } + + diff --git a/classes/ECT/Base.php b/classes/ECT/Base.php new file mode 100644 index 0000000..d63d90a --- /dev/null +++ b/classes/ECT/Base.php @@ -0,0 +1,14 @@ +$var = $value; + return $this; + } + + public function get($var){ + return $this->$var; + } + +} diff --git a/classes/ECT/Pacote.php b/classes/ECT/Pacote.php new file mode 100644 index 0000000..3cd3bd0 --- /dev/null +++ b/classes/ECT/Pacote.php @@ -0,0 +1,45 @@ +numero = $numero; + } + + public function numero(){ + return $this->numero; + } + + public function md5(){ + return $this->json_md5; + } + + public function importar_json_eventos($json){ + $this->json = $json; + $this->json_md5 = md5($json); + $this->eventos = json_decode($json); + } + + public function eventos(){ + return $this->eventos; + } + + public function evento($index=0){ + return isset($this->eventos[$index]) ? $this->eventos[$index] : NULL; + } + + public function ultimo_evento(){ + return $this->evento(0); + } + + public function primeiro_evento(){ + return $this->evento( (sizeof($this->eventos) - 1) ); + + } + +} diff --git a/classes/ECT/Rastreador.php b/classes/ECT/Rastreador.php new file mode 100644 index 0000000..51db080 --- /dev/null +++ b/classes/ECT/Rastreador.php @@ -0,0 +1,138 @@ +add_pacote($pacotes); + + return $this; + } + + /** + * Adiciona pacotes ao rastreador + * @param $pacotes Array com objetos ECT_Pacote ou um só objeto ECT_Pacote + * @return $this + **/ + public function add_pacote($pacotes = array()){ + + if(!is_array($pacotes)){ + $pacotes = array($packages->get('numero') => $pacotes); + }else{ + $lista = array(); + foreach($pacotes as $pacote){ + $lista[$pacote->get('numero')] = $pacote; + } + $pacotes = $lista; + } + + $this->pacotes = Arr::merge($this->pacotes, $pacotes); + + return $this; + + } + + + /** + * Consulta os eventos dos pacotes + * + * @return void + * @author + * Tipo: + * L: lista de objetos. O servidor fara a consulta individual + * de cada identificador informado; + * F: intervalo de objetos. O servidor fara a consulta sequencial + * do primeiro ao ultimo objeto informado, nao sendo necessario + * informar os valores intermediarios. + * + * Resultado: + * T: serão retornados todos os eventos do objeto; + * U: será retornado apenas o último evento do objeto. + **/ + public function consultar(){ + + $numeros = array_keys($this->pacotes); + $numeros = implode('', $numeros); + + //faz a consulta no webservice dos Correios + $config = $config = Kohana::$config->load('rastreadorect'); + $url = $config->webservice; + + $request = Request::factory($url) + ->method('POST') + ->post('Usuario', $config->usuario) + ->post('Senha', $config->senha) + ->post('Tipo', 'L') + ->post('Resultado', 'T') + ->post('Objetos', $numeros); + + $response = $request->execute(); + + if( 200 == $response->status() ){ + $xml = $response->body(); + $this->processar($xml); + } + + } + + + /** + * Processa o XML retornado pelo webservice + * + * @return void + * @author + **/ + private function processar($xml){ + + $data = (array)simplexml_load_string($xml); + + //se houverem objetos + if( isset($data['objeto']) ){ + + //percorre os objetos + foreach ($data['objeto'] as $pacote){ + + $pacote = (array)$pacote; + + $pacote_atual = $this->pacotes[(string)$pacote['numero']]; + + //se houverem eventos + if( isset($pacote['evento']) ){ + + $pacote_atual->importar_json_eventos( json_encode($pacote['evento']) ); + + } + + + } + + } + + } + + + /** + * Retorna a lista de pacotes do rastreador + * + * @return array + **/ + public function pacotes(){ + + return $this->pacotes; + + } + + + +} diff --git a/config/rastreadorect.php b/config/rastreadorect.php new file mode 100644 index 0000000..f1da26d --- /dev/null +++ b/config/rastreadorect.php @@ -0,0 +1,7 @@ + 'ECT', + 'senha' => 'SRO', + 'webservice' => 'http://websro.correios.com.br/sro_bin/sroii_xml.eventos', +); \ No newline at end of file diff --git "a/docs/Guia-Tecnico-Rastreamento-XML-Cliente-Versa\314\203o-e-commerce-v-1-5.pdf" "b/docs/Guia-Tecnico-Rastreamento-XML-Cliente-Versa\314\203o-e-commerce-v-1-5.pdf" new file mode 100644 index 0000000..9a8edf8 Binary files /dev/null and "b/docs/Guia-Tecnico-Rastreamento-XML-Cliente-Versa\314\203o-e-commerce-v-1-5.pdf" differ