File Coverage

blib/lib/WWW/Correios/SRO.pm
Criterion Covered Total %
statement 61 96 63.5
branch 24 66 36.3
condition 33 109 30.2
subroutine 8 11 72.7
pod 5 5 100.0
total 131 287 45.6


line stmt bran cond sub pod time code
1             package WWW::Correios::SRO;
2 3     3   169421 use strict;
  3         20  
  3         69  
3 3     3   12 use warnings;
  3         4  
  3         62  
4              
5 3     3   745 use parent 'Exporter';
  3         487  
  3         13  
6             our @EXPORT_OK = qw( sro sro_en sro_ok sro_sigla status_da_entrega );
7              
8             our $VERSION = '0.13';
9             my $AGENT = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)';
10             my $TIMEOUT = 30;
11              
12             # Verificado em 6 de Abril de 2018
13             # https://www.correios.com.br/precisa-de-ajuda/como-rastrear-um-objeto/siglas-utilizadas-no-rastreamento-de-objeto
14             # (era http://www.correios.com.br/para-voce/precisa-de-ajuda/como-rastrear-um-objeto/siglas-utilizadas-no-rastreamento-de-objeto)
15             #
16             #
17             # Sabemos que as seguintes siglas são usadas: DH
18             # Como não existem na tabela dos correios, nao se encontra na hash.
19             # Um código com esse prefixo funcionará ao usar a funcao sro sem
20             # passar o parametro verifica_prefixo. Porém, se passar este
21             # parametro, deve retornar undef como qualquer SRO
22             # cujo prefixo não está previsto na tabela dos Correios.
23             my %siglas = (
24             AL => 'AGENTES DE LEITURA',
25             AR => 'AVISO DE RECEBIMENTO',
26             AS => 'ENCOMENDA PAC – ACAO SOCIAL',
27             BE => 'REMESSA ECONOMICA SEM AR DIGITAL',
28             BF => 'REMESSA EXPRESSA SEM AR DIGITAL',
29             BG => 'ETIQUETA LOG REM ECON C/AR BG',
30             BH => 'MENSAGEM FISICO-DIGITAL',
31             BI => 'ETIQUETA LOG REGIST URG',
32             CA => 'OBJETO INTERNACIONAL COLIS',
33             CB => 'OBJETO INTERNACIONAL COLIS',
34             CC => 'OBJETO INTERNACIONAL COLIS',
35             CD => 'OBJETO INTERNACIONAL COLIS',
36             CE => 'OBJETO INTERNACIONAL COLIS',
37             CF => 'OBJETO INTERNACIONAL COLIS',
38             CG => 'OBJETO INTERNACIONAL COLIS',
39             CH => 'OBJETO INTERNACIONAL COLIS',
40             CI => 'OBJETO INTERNACIONAL COLIS',
41             CJ => 'OBJETO INTERNACIONAL COLIS',
42             CK => 'OBJETO INTERNACIONAL COLIS',
43             CL => 'OBJETO INTERNACIONAL COLIS',
44             CM => 'OBJETO INTERNACIONAL COLIS',
45             CN => 'OBJETO INTERNACIONAL COLIS',
46             CO => 'OBJETO INTERNACIONAL COLIS',
47             CP => 'OBJETO INTERNACIONAL COLIS',
48             CQ => 'OBJETO INTERNACIONAL COLIS',
49             CR => 'OBJETO INTERNACIONAL COLIS',
50             CS => 'OBJETO INTERNACIONAL COLIS',
51             CT => 'OBJETO INTERNACIONAL COLIS',
52             CU => 'OBJETO INTERNACIONAL COLIS',
53             CV => 'OBJETO INTERNACIONAL COLIS',
54             CW => 'OBJETO INTERNACIONAL COLIS',
55             CX => 'OBJETO INTERNACIONAL COLIS',
56             CY => 'OBJETO INTERNACIONAL COLIS',
57             CZ => 'OBJETO INTERNACIONAL COLIS',
58             DA => 'ENCOMENDA SEDEX COM AR DIGITAL',
59             DB => 'REMESSA EXPRESSA COM AR DIGITAL (BRADESCO)',
60             DC => 'REMESSA EXPRESSA (ORGAO TRANSITO)',
61             DD => 'DEVOLUCAO DE DOCUMENTOS',
62             DE => 'REMESSA EXPRESSA COM AR DIGITAL',
63             DF => 'ENCOMENDA SEDEX (ETIQ LOGICA)',
64             DG => 'ENCOMENDA SEDEX (ETIQ LOGICA)',
65             DI => 'REMESSA EXPRESSA COM AR DIGITAL (ITAU)',
66             DJ => 'ENCOMENDA SEDEX',
67             DK => 'SEDEX EXTRA GRANDE',
68             DL => 'SEDEX LOGICO',
69             DM => 'ENCOMENDA SEDEX',
70             DN => 'ENCOMENDA SEDEX',
71             DO => 'REMESSA EXPRESSA COM AR DIGITAL (ITAU UNIBANCO)',
72             DP => 'SEDEX PAGAMENTO NA ENTREGA',
73             DQ => 'REMESSA EXPRESSA COM AR DIGITAL (BRADESCO)',
74             DR => 'REMESSA EXPRESSA COM AR DIGITAL (SANTANDER)',
75             DS => 'REMESSA EXPRESSA COM AR DIGITAL (SANTANDER)',
76             DT => 'REMESSA ECON. SEG. TRANSITO COM AR DIGITAL',
77             DU => 'ENCOMENDA SEDEX',
78             DV => 'SEDEX COM AR DIGITAL',
79             DW => 'ENCOMENDA SEDEX (ETIQ LOGICA)',
80             DX => 'SEDEX 10 LOGICO',
81             DY => 'ENCOMENDA SEDEX (ETIQ FISICA)',
82             DZ => 'ENCOMENDA SEDEX (ETIQ LOGICA)',
83             EA => 'OBJETO INTERNACIONAL EMS',
84             EB => 'OBJETO INTERNACIONAL EMS',
85             EC => 'ENCOMENDA PAC',
86             ED => 'OBJETO INTERNACIONAL PACKET EXPRESS',
87             EE => 'OBJETO INTERNACIONAL EMS',
88             EF => 'OBJETO INTERNACIONAL EMS',
89             EG => 'OBJETO INTERNACIONAL EMS',
90             EH => 'OBJETO INTERNACIONAL EMS',
91             EI => 'OBJETO INTERNACIONAL EMS',
92             EJ => 'OBJETO INTERNACIONAL EMS',
93             EK => 'OBJETO INTERNACIONAL EMS',
94             EL => 'OBJETO INTERNACIONAL EMS',
95             EM => 'SEDEX MUNDI',
96             EN => 'OBJETO INTERNACIONAL EMS',
97             EO => 'OBJETO INTERNACIONAL EMS',
98             EP => 'OBJETO INTERNACIONAL EMS',
99             EQ => 'ENCOMENDA SERVICO NAO EXPRESSA ECT',
100             ER => 'REGISTRADO',
101             ES => 'E-SEDEX OU EMS',
102             ET => 'OBJETO INTERNACIONAL EMS',
103             EU => 'OBJETO INTERNACIONAL EMS',
104             EV => 'OBJETO INTERNACIONAL EMS',
105             EW => 'OBJETO INTERNACIONAL EMS',
106             EX => 'OBJETO INTERNACIONAL EMS',
107             EY => 'OBJETO INTERNACIONAL EMS',
108             EZ => 'OBJETO INTERNACIONAL EMS',
109             FA => 'FAC REGISTRADO',
110             FB => 'FAC REGISTRADO',
111             FC => 'FAC REGISTRADO (5 DIAS)',
112             FD => 'FAC REGISTRADO (10 DIAS)',
113             FE => 'ENCOMENDA FNDE',
114             FF => 'REGISTRADO DETRAN',
115             FH => 'FAC REGISTRADO COM AR DIGITAL',
116             FJ => 'REMESSA ECONOMICA COM AR DIGITAL',
117             FM => 'FAC REGISTRADO (MONITORADO)',
118             FR => 'FAC REGISTRADO',
119             IA => 'INTEGRADA AVULSA',
120             IC => 'INTEGRADA A COBRAR',
121             ID => 'INTEGRADA DEVOLUCAO DE DOCUMENTO',
122             IE => 'INTEGRADA ESPECIAL',
123             IF => 'CPF',
124             II => 'INTEGRADA INTERNO',
125             IK => 'INTEGRADA COM COLETA SIMULTANEA',
126             IM => 'INTEGRADA MEDICAMENTOS',
127             IN => 'OBJETO DE CORRESP E EMS REC EXTERIOR',
128             IP => 'INTEGRADA PROGRAMADA',
129             IR => 'IMPRESSO REGISTRADO',
130             IS => 'INTEGRADA STANDARD',
131             IT => 'INTEGRADA TERMOLABIL',
132             IU => 'INTEGRADA URGENTE',
133             IX => 'EDEI ENCOMENDA EXPRESSA',
134             JA => 'REMESSA ECONOMICA COM AR DIGITAL',
135             JB => 'REMESSA ECONOMICA COM AR DIGITAL',
136             JC => 'REMESSA ECONOMICA COM AR DIGITAL',
137             JD => 'REMESSA ECONOMICA SEM AR DIGITAL',
138             JE => 'REMESSA ECONOMICA COM AR DIGITAL',
139             JF => 'REMESSA ECONOMICA COM AR DIGITAL',
140             JG => 'REGISTRADO PRIORITARIO',
141             JH => 'REGISTRADO PRIORITARIO',
142             JI => 'REMESSA ECONOMICA SEM AR DIGITAL',
143             JJ => 'REGISTRADO JUSTICA',
144             JK => 'REMESSA ECONOMICA SEM AR DIGITAL',
145             JL => 'REGISTRADO LOGICO',
146             JM => 'MALA DIRETA POSTAL ESPECIAL',
147             JN => 'MALA DIRETA POSTAL ESPECIAL',
148             JO => 'REGISTRADO PRIORITARIO',
149             JP => 'OBJETO RECEITA FEDERAL (EXCLUSIVO)',
150             JQ => 'REMESSA ECONOMICA COM AR DIGITAL',
151             JR => 'REGISTRADO PRIORITARIO',
152             JS => 'REGISTRADO LOGICO',
153             JT => 'REGISTRADO URGENTE',
154             JU => 'ETIQUETA FISICA REGISTRADO URGENTE',
155             JV => 'REMESSA ECONOMICA COM AR DIGITAL',
156             JW => 'CARTA COMERCIAL A FATURAR (5 DIAS)',
157             JX => 'CARTA COMERCIAL A FATURAR (10 DIAS)',
158             JY => 'REMESSA ECONOMICA (5 DIAS)',
159             JZ => 'REMESSA ECONOMICA (10 DIAS)',
160             LA => 'LOGISTICA REVERSA SIMULTANEA SEDEX',
161             LB => 'LOGISTICA REVERSA SIMULTANEA SEDEX',
162             LC => 'OBJETO INTERNACIONAL PRIME',
163             LD => 'OBJETO INTERNACIONAL PRIME',
164             LE => 'LOGISTICA REVERSA ECONOMICA',
165             LF => 'OBJETO INTERNACIONAL PRIME',
166             LG => 'OBJETO INTERNACIONAL PRIME',
167             LH => 'OBJETO INTERNACIONAL PRIME',
168             LI => 'OBJETO INTERNACIONAL PRIME',
169             LJ => 'OBJETO INTERNACIONAL PRIME',
170             LK => 'OBJETO INTERNACIONAL PRIME',
171             LL => 'OBJETO INTERNACIONAL PRIME',
172             LM => 'OBJETO INTERNACIONAL PRIME',
173             LN => 'OBJETO INTERNACIONAL PRIME',
174             LP => 'LOGISTICA REVERSA SIMULTANEA PAC',
175             LQ => 'OBJETO INTERNACIONAL PRIME',
176             LS => 'LOGISTICA REVERSA SEDEX',
177             LV => 'LOGISTICA REVERSA EXPRESSA',
178             LW => 'OBJETO INTERNACIONAL PRIME',
179             LX => 'OBJETO INTERNACIONAL PACKET ECONOMIC',
180             LY => 'OBJETO INTERNACIONAL PRIME',
181             LZ => 'OBJETO INTERNACIONAL PRIME',
182             MA => 'TELEGRAMA - SERVICOS ADICIONAIS',
183             MB => 'TELEGRAMA DE BALCAO',
184             MC => 'TELEGRAMA FONADO',
185             MD => 'MAQUINA DE FRANQUEAR (LOGICA)',
186             ME => 'TELEGRAMA',
187             MF => 'TELEGRAMA FONADO',
188             MH => 'CARTA VIA INTERNET',
189             MK => 'TELEGRAMA CORPORATIVO',
190             # ML => 'FECHA MALAS (RABICHO)', # <-- descontinuado? (sumiu da lista oficial)
191             MM => 'TELEGRAMA GRANDES CLIENTES',
192             MP => 'TELEGRAMA PRE-PAGO',
193             # MR => 'AR DIGITAL', # <-- descontinuado? (sumiu da lista oficial)
194             MS => 'ENCOMENDA SAUDE',
195             MT => 'TELEGRAMA VIA TELEMAIL',
196             MY => 'TELEGRAMA INTERNACIONAL ENTRANTE',
197             MZ => 'TELEGRAMA VIA CORREIOS ONLINE',
198             NE => 'TELE SENA RESGATADA',
199             NX => 'EDEI ENCOMENDA NAO URGENTE',
200             OA => 'ENCOMENDA SEDEX (ETIQUETA LOGICA)',
201             OB => 'ENCOMENDA SEDEX (ETIQUETA LOGICA)',
202             OC => 'ENCOMENDA SEDEX (ETIQUETA LOGICA)',
203             OD => 'ENCOMENDA SEDEX (ETIQUETA FISICA)',
204             PA => 'PASSAPORTE',
205             PB => 'ENCOMENDA PAC - NAO URGENTE',
206             PC => 'ENCOMENDA PAC A COBRAR',
207             PD => 'ENCOMENDA PAC',
208             PE => 'ENCOMENDA PAC (ETIQUETA FISICA)',
209             PF => 'PASSAPORTE',
210             PG => 'ENCOMENDA PAC (ETIQUETA FISICA)',
211             PH => 'ENCOMENDA PAC (ETIQUETA LOGICA)',
212             PI => 'ENCOMENDA PAC',
213             PJ => 'ENCOMENDA PAC',
214             PK => 'PAC EXTRA GRANDE',
215             PL => 'ENCOMENDA PAC',
216             PM => 'ENCOMENDA PAC (ETIQUETA FISICA)',
217             PN => 'ENCOMENDA PAC (ETIQUETA LOGICA)',
218             PO => 'ENCOMENDA PAC (ETIQUETA LOGICA)',
219             PP => 'ETIQUETA LOGICA PAC',
220             PR => 'REEMBOLSO POSTAL - CLIENTE AVULSO',
221             # QQ => 'OBJETO DE TESTE (SIGEP WEB)', # <-- descontinuado? (sumiu da lista oficial)
222             RA => 'REGISTRADO PRIORITARIO',
223             RB => 'CARTA REGISTRADA',
224             RC => 'CARTA REGISTRADA COM VALOR DECLARADO',
225             RD => 'REMESSA ECONOMICA DETRAN',
226             RE => 'MALA DIRETA POSTAL ESPECIAL',
227             RF => 'OBJETO DA RECEITA FEDERAL',
228             RG => 'REGISTRADO DO SISTEMA SARA',
229             RH => 'REGISTRADO COM AR DIGITAL',
230             RI => 'REGISTRADO PRIORITARIO INTERNACIONAL',
231             RJ => 'REGISTRADO AGENCIA',
232             RK => 'REGISTRADO AGENCIA',
233             RL => 'REGISTRADO LOGICO',
234             RM => 'REGISTRADO AGENCIA',
235             RN => 'REGISTRADO AGENCIA',
236             RO => 'REGISTRADO AGENCIA',
237             RP => 'REEMBOLSO POSTAL - CLIENTE INSCRITO',
238             RQ => 'REGISTRADO AGENCIA',
239             RR => 'REGISTRADO INTERNACIONAL',
240             RS => 'REMESSA ECONOMICA ORG TRANSITO COM OU SEM AR',
241             RT => 'REMESSA ECONOMICA TALAO/CARTAO SEM AR DIGITAL',
242             RU => 'REGISTRADO SERVICO ECT',
243             RV => 'REMESSA ECONOMICA CRLV/CRV/CNH COM AR DIGITAL',
244             RW => 'REGISTRADO INTERNACIONAL',
245             RX => 'REGISTRADO INTERNACIONAL',
246             RY => 'REMESSA ECONOMICA TALAO/CARTAO COM AR DIGITAL',
247             RZ => 'REGISTRADO',
248             SA => 'ETIQUETA SEDEX AGENCIA',
249             SB => 'SEDEX 10',
250             SC => 'SEDEX A COBRAR',
251             SD => 'REMESSA EXPRESSA DETRAN',
252             SE => 'ENCOMENDA SEDEX',
253             SF => 'SEDEX AGENCIA',
254             SG => 'SEDEX DO SISTEMA SARA',
255             SH => 'SEDEX COM AR DIGITAL',
256             SI => 'SEDEX AGENCIA',
257             SJ => 'SEDEX HOJE',
258             SK => 'SEDEX AGENCIA',
259             SL => 'SEDEX LOGICO',
260             SM => 'SEDEX 12',
261             SN => 'SEDEX AGENCIA',
262             SO => 'SEDEX AGENCIA',
263             SP => 'SEDEX PRE-FRANQUEADO',
264             SQ => 'SEDEX',
265             SR => 'SEDEX',
266             SS => 'SEDEX FISICO',
267             ST => 'REMESSA EXPRESSA TALAO/CARTAO SEM AR DIGITAL',
268             SU => 'ENCOMENDA SERVICO EXPRESSA ECT',
269             SV => 'REMESSA EXPRESSA CRLV/CRV/CNH COM AR DIGITAL',
270             SW => 'ENCOMENDA SEDEX',
271             SX => 'SEDEX 10',
272             SY => 'REMESSA EXPRESSA TALAO/CARTAO COM AR DIGITAL',
273             SZ => 'SEDEX AGENCIA',
274             TC => 'TESTE (OBJETO PARA TREINAMENTO)',
275             TE => 'TESTE (OBJETO PARA TREINAMENTO)',
276             TR => 'OBJETO TREINAMENTO - NAO GERA PRE-ALERTA',
277             TS => 'TESTE (OBJETO PARA TREINAMENTO)',
278             VA => 'OBJETO INTERNACIONAL COM VALOR DECLARADO',
279             VC => 'OBJETO INTERNACIONAL COM VALOR DECLARADO',
280             VD => 'OBJETO INTERNACIONAL COM VALOR DECLARADO',
281             VE => 'OBJETO INTERNACIONAL COM VALOR DECLARADO',
282             VF => 'OBJETO INTERNACIONAL COM VALOR DECLARADO',
283             VV => 'OBJETO INTERNACIONAL COM VALOR DECLARADO',
284             XA => 'AVISO DE CHEGADA OBJETO INTERNACIONAL TRIBUTADO',
285             XM => 'SEDEX MUNDI',
286             XR => 'OBJETO INTERNACIONAL (PPS TRIBUTADO)',
287             XX => 'OBJETO INTERNACIONAL (PPS TRIBUTADO)',
288             );
289              
290             # http://www.correios.com.br/para-sua-empresa/servicos-para-o-seu-contrato/guias/enderecamento/arquivos/guia_tecnico_encomendas.pdf/at_download/file
291             sub sro_ok {
292 19 100   19 1 1764 if ( $_[0] =~ m/^[A-Z|a-z]{2}([0-9]{8})([0-9])BR$/i ) {
293 11         34 my ( $numeros, $dv ) = ($1, $2);
294 11         41 my @numeros = split // => $numeros;
295 11         23 my @magica = ( 8, 6, 4, 2, 3, 5, 9, 7 );
296              
297 11         14 my $soma = 0;
298 11         45 foreach ( 0 .. 7 ) {
299 88         121 $soma += ( $numeros[$_] * $magica[$_] );
300             }
301              
302 11         16 my $resto = $soma % 11;
303 11 50       23 my $dv_check = $resto == 0 ? 5
    50          
304             : $resto == 1 ? 0
305             : 11 - $resto
306             ;
307 11         56 return $dv == $dv_check;
308             }
309             else {
310 8         30 return;
311             }
312             }
313              
314             sub sro_sigla {
315 8 100   8 1 2336 if ( sro_ok( @_ ) ) {
316 4         14 $_[0] =~ m/^([A-Z|a-z]{2}).*$/i;
317 4         8 my $prefixo = $1;
318 4         23 return $siglas{$prefixo};
319             } else {
320 4         24 return;
321             }
322             }
323              
324 0     0 1 0 sub sro { _sro('101', @_) }
325 0     0 1 0 sub sro_en { _sro('102', @_) }
326              
327             sub _sro {
328 0     0   0 my ($language, $code, $params) = @_;
329 0 0 0     0 return unless $code && length($code) % 13 == 0;
330 0         0 my @codes = ($code =~ /.{13}/g);
331 0 0 0     0 return if !@codes || (@codes > 1 && !$params->{multiple});
      0        
332              
333 0         0 foreach my $code_to_check (@codes) {
334 0 0       0 return unless sro_ok( $code_to_check );
335              
336 0 0       0 if ($params->{verifica_prefixo}) {
337 0         0 my $prefixo = sro_sigla( $code_to_check );
338 0 0       0 return unless defined $prefixo;
339             }
340             }
341              
342 0         0 my $agent = $params->{ua};
343 0 0       0 if (!$agent) {
344 0         0 require LWP::UserAgent;
345             $agent = LWP::UserAgent->new(
346             agent => $AGENT,
347 0 0       0 timeout => (exists $params->{timeout} ? $params->{timeout} : $TIMEOUT),
348             );
349             }
350              
351 0 0       0 my $results = wantarray ? 'T' : 'U';
352 0   0     0 my $user = $params->{username} || 'ECT';
353 0   0     0 my $pass = $params->{password} || 'SRO';
354              
355             # http://www.correios.com.br/para-voce/correios-de-a-a-z/pdf/rastreamento-de-objetos/manual_rastreamentoobjetosws.pdf
356 0         0 my $response = $agent->post(
357             'http://webservice.correios.com.br:80/service/rastro',
358             'Content-Type' => 'text/xml;charset=utf-8',
359             'SOAPAction' => 'buscaEventos',
360             'Content' => qq{
361             $user$passL$results$language$code}
362             );
363 0 0       0 return unless $response->is_success;
364              
365 0         0 my $data = _parse_response($response->content);
366 0 0       0 if (ref $data eq 'HASH') {
367 0 0       0 if (!$params->{multiple}) {
368 0         0 warn 'unexpected data from Correios webservice';
369 0         0 return;
370             }
371 0 0       0 if ($results eq 'U') {
372 0         0 foreach my $k (keys %$data) {
373 0         0 $data->{$k} = $data->{$k}[0];
374             }
375             }
376 0         0 return $data;
377             }
378 0 0       0 return $results eq 'T' ? @$data : $data->[0];
379             }
380              
381             sub _parse_response {
382 2     2   2001 my ($content) = @_;
383 2 50       10 return unless index($content, '') >= 0;
384              
385 2         3 my %data;
386 2         25 while ($content =~ m{(.+?)}gsi) {
387 3         17 my $object = $1;
388 3         5 my $tracking;
389 3 50       13 if ($object =~ m{([^>]+)}) {
390 3         6 $tracking = $1;
391             }
392 3 50       6 return unless $tracking;
393 3         3 my @events;
394 3         20 while ($object =~ m{(.+?)}gi) {
395 6         13 my $event = $1;
396 6         10 my $params = _parse_event($event);
397 6         21 push @events, $params;
398             }
399 3         13 $data{$tracking} = \@events;
400             }
401 2 100       36 return (keys %data == 1 ? (values %data)[0] : \%data);
402             }
403              
404             sub _parse_event {
405 85     85   106 my ($event) = @_;
406              
407 85 100       387 return $event if index($event, '<') < 0;
408              
409 10         12 my %params;
410 10         38 while ($event =~ m{<\s*([^>]+)\s*>\s*(.+?)\s*<\s*/\s*\1\s*>}g) {
411 79         154 my ($key, $value) = ($1, $2);
412 79         103 $params{$key} = _parse_event($value);
413             }
414 10         20 return \%params;
415             }
416              
417             sub status_da_entrega {
418 5     5 1 2120 my ($data) = @_;
419 5 50 33     35 die 'entrega_concluida() takes a HASHREF or ARRAYREF'
      33        
      33        
420             unless $data && ref $data && (ref $data eq 'ARRAY' || ref $data eq 'HASH');
421              
422 5 50       11 my $last = ref $data eq 'ARRAY' ? $data->[0] : $data;
423 5 50       8 return unless $last;
424              
425             # objeto dos Correios tem as mesmas chaves, independente do idioma.
426 5 50 33     38 if (!ref $last || ref $last ne 'HASH' || !exists $last->{tipo} || !exists $last->{status}) {
      33        
      33        
427 0         0 warn "status_da_entrega() data looks invalid. Missing keys?";
428 0         0 return;
429             }
430 5         8 my $tipo = $last->{tipo};
431 5         7 my $status = $last->{status};
432 5 50 33     20 if ($tipo eq 'BDR' || $tipo eq 'BDE' || $tipo eq 'BDI') {
    0 33        
    0 0        
      0        
      0        
      0        
      0        
433             # estado final. entrega efetuada!
434 5 100       15 return 'entregue' if $status <= 1;
435              
436             # acionar correios (produto extraviado, etc).
437 4 50 66     39 return 'erro' if $status == 9 || $status == 12 || $status == 28
      66        
      33        
      33        
      33        
      33        
      33        
      33        
438             || $status == 37 || $status == 43 || $status == 50
439             || $status == 51 || $status == 52 || $status == 80
440             ;
441              
442             # pacote aguardando retirada pelo interessado.
443 3 100 66     14 return 'retirar' if $status == 54 || $status == 2;
444              
445             # entrega incompleta, pacote retornando.
446 2 50 33     27 return 'incompleto'
      66        
      66        
      66        
      33        
      33        
      33        
      33        
      33        
      33        
447             if ( ($status != 20 && $status != 7 && $status <= 21)
448             || $status == 26 || $status == 33 || $status == 36
449             || $status == 40 || $status == 42 || $status == 48
450             || $status == 49 || $status == 56
451             );
452              
453 1         4 return 'acompanhar';
454             }
455             elsif ($tipo eq 'FC' && $status == 1) {
456 0           return 'incompleto';
457             }
458             elsif (
459             # pacote aguardando retirada.
460             ($tipo eq 'LDI' && ($status <= 3 || $status == 14))
461             || ($tipo eq 'OEC' && $status == 0)
462             ) {
463 0           return 'retirar';
464             }
465             else {
466 0           return 'acompanhar';
467             }
468             }
469              
470              
471             42;
472             __END__