How to notify the tracking of the mails to the user?

4

I have an eCommerce that integrates with Mail , except for the tracking system, which only includes the tracking code in order. I need every time I change the status, the customer is notified via email.

With the code below, I can make an inquiry to the Post office and I can check the return of the STATUS.

$error = array();

$url = 'http://websro.correios.com.br/sro_bin/txect01$.QueryList';
$url .= '?P_LINGUA=001&P_TIPO=001&P_COD_UNI=' . $code;
try {
    $client = new Zend_Http_Client();
    $client->setUri($url);
    $content = $client->request();
    $body = $content->getBody();

} catch (Exception $e) {
    $error[] = $e;
    return false;
}

However, this way I should be doing the checking periodically (12h, 24h) and checking each code. Is there any way to be getting only the return of the codes that there was indeed change, and just having an observer treating them? Or will the only way be with a script of my own, configured to CRON , be querying the code and doing proper handling of the return?

    
asked by anonymous 21.08.2015 / 14:48

1 answer

6

I made the basic example for you to understand the logic of two ways , Track do HTML and Objetos in array for database storage, and the hash for comparing it in DB!

<?php

class Tracking {

    public $track;
    public $table;
    public $erro = false;
    public $erroMsg = false;    

    /**
    * Construtor
    *
    * @param string $track Código da encomenda
    * return void
    */
    public function setTrack($track=false){

        if ( strlen($track) !== 13) {
            $this->erro = true;
            $this->erroMsg = 'Código de encomenda Inválido!';
        }
        $this->track = $track;

    }

    public function trackHTML()
    {
        if( $this->erro === true ):
            return $this->erro;
        else:

            $url = 'http://websro.correios.com.br/sro_bin/txect01$.QueryList?P_LINGUA=001&P_TIPO=001&P_COD_UNI=' . $this->track;
            $html = utf8_encode( file_get_contents( $url ) );

            if (strpos($html, "src=../correios/") !==false) {
                $html  = str_replace('src=../correios/',
                    'src=http://websro.correios.com.br/correios/', $html );
            }

            preg_match( '/<table  border cellpadding=1 hspace=10>.*<\/TABLE>/s', $html, $table );

            // hash para monitoramento de alteração de status
            $this->hash = md5($html);           

            return ( count( $table ) == 1 ) ? $table[0] : "Objeto não encontrado";

        endif;
    }


    public function trackObject(){

        $html = utf8_encode( file_get_contents('http://websro.correios.com.br/sro_bin/txect01$.QueryList?P_LINGUA=001&P_TIPO=001&P_COD_UNI=' . $this->track ));

        // Verifica se o objeto ainda não foi postado, caso seja o caso, retorna erro e mensagem
        if (strstr($html, '<table') === false){
            $this->erro = true;
            $this->erroMsg = 'Objeto ainda não foi adicionado no sistema';
            return;
        }

        // hash para monitoramento de alteração de status
        $this->hash = md5($html);

        // Limpa o codigo html
        $html = preg_replace("@\r|\t|\n| +@", ' ', $html);
        $html = str_replace('</tr>', "</tr>\n", $html);

        // Pega as linhas com o rastreamento
        if (preg_match_all('@<tr>(.*)</tr>@', $html, $mat,PREG_SET_ORDER)){
            $track = array();
            $mat = array_reverse($mat);
            $temp = null;
            // Formata as linhas e gera um vetor
            foreach($mat as $item){
                if (preg_match("@<td rowspan=[12]>(.*)</td><td>(.*)</td><td><FONT COLOR=\"[0-9A-F]{6}\">(.*)</font></td>@", $item[0], $d)){
                    // Cria uma linha de track
                    $tmp = array(
                        'date' => $d[1],
                        'DateSql' => preg_replace('@([0-9]{2})/([0-9]{2})/([0-9]{4}) ([0-9]{2}):([0-9]{2})@', '$3-$2-$1 $4:$5:00',$d[1] ),
                        'local' => $d[2],
                        'action' => strtolower($d[3]),
                        'details' => ''
                    );

                    // Se tiver um encaminhamento armazenado
                    if ($temp){
                        $tmp['details'] = $temp;
                        $temp = null;
                    }

                    // Adiciona o item na lista de rastreamento
                    $track[] = (object)$tmp;
                }else if (preg_match("@<td colspan=2>(.*)</td>@", $item[0], $d)){
                    // Se for um encaminhamento, armazena para o proximo item
                    $temp = $d[1];
                }
                $this->status = $tmp['action'];
            }
            $this->track = $track;
            return $this->track;
        }

        // Caso retorne um html desconhecido ou falhe, retorna erro de comunicação
        $this->erro = true;
        $this->erroMsg = 'Falha de Comunicação com os correios';

    }   

}

Instantiating the class

$track = new Tracking();
$track->setTrack('PI205094504BR');

if($track->erro !== true){

    echo $track->trackHTML();

    echo '<br />';
    echo 'Hash para monitoramento de alteração de status: ';
    echo $track->hash;

} else {
    echo $track->erroMsg;
}

In this example the result is this:

In the second example, returns the data in array

if($track->erro !== true){

    echo '<pre>';
    print_r( $track->trackObject() );
    echo '</pre>';

    echo '<br />';
    echo 'Hash para monitoramento de alteração de status: ';
    echo $track->hash;

} else {
    echo $track->erroMsg;
}

Output:

Array
(
    [0] => stdClass Object
        (
            [date] => 20/07/2015 14:04
            [DateSql] => 2015-07-20 14:04:00
            [local] => CTCE VITORIA/GCCAP - Viana/ES
            [action] => postado
            [details] => 
        )

    [1] => stdClass Object
        (
            [date] => 20/07/2015 22:00
            [DateSql] => 2015-07-20 22:00:00
            [local] => CTCE VITORIA/GCCAP - Viana/ES
            [action] => encaminhado
            [details] => Encaminhado para CTE BENFICA - Rio De Janeiro/RJ
        )

    [2] => stdClass Object
        (
            [date] => 21/07/2015 16:55
            [DateSql] => 2015-07-21 16:55:00
            [local] => CTE BENFICA - Rio De Janeiro/RJ
            [action] => encaminhado
            [details] => Encaminhado para CTCE CUIABA - Varzea Grande/MT
        )

    [3] => stdClass Object
        (
            [date] => 24/07/2015 15:35
            [DateSql] => 2015-07-24 15:35:00
            [local] => CTCE CUIABA - Varzea Grande/MT
            [action] => encaminhado
            [details] => Em trânsito para AC DIAMANTINO - Diamantino/MT
        )

    [4] => stdClass Object
        (
            [date] => 28/07/2015 09:48
            [DateSql] => 2015-07-28 09:48:00
            [local] => Diamantino/MT
            [action] => saiu para entrega ao destinat��rio
            [details] => 
        )

    [5] => stdClass Object
        (
            [date] => 28/07/2015 16:59
            [DateSql] => 2015-07-28 16:59:00
            [local] => AC DIAMANTINO - Diamantino/MT
            [action] => entrega efetuada
            [details] => 
        )

)

Hash para monitoramento de alteração de status: ccebc8ce6343aea4692500bae90a49d3

In this example I used file_get_contents , but I usually use cURL

    
27.08.2015 / 06:10