File Coverage

blib/lib/Net/Correios/SRO.pm
Criterion Covered Total %
statement 48 73 65.7
branch 14 38 36.8
condition 30 98 30.6
subroutine 8 11 72.7
pod 4 7 57.1
total 104 227 45.8


line stmt bran cond sub pod time code
1 1     1   10 use strict;
  1         2  
  1         33  
2 1     1   5 use warnings;
  1         2  
  1         28  
3 1     1   6 use Scalar::Util ();
  1         1  
  1         14  
4 1     1   6 use utf8;
  1         1  
  1         5  
5              
6             package Net::Correios::SRO;
7              
8             sub new {
9 1     1 0 3 my ($class, $parent) = @_;
10 1         5 Scalar::Util::weaken($parent);
11 1         11 return bless { parent => $parent }, $class;
12             }
13              
14             # minha versão da consulta por SRO ;)
15             sub busca {
16 1     1 1 1461 my ($self, $tipo, @sro) = @_;
17              
18 1 50       4 if (length($tipo) > 1) {
19 1         2 unshift @sro, $tipo;
20 1         4 $tipo = 'T';
21             }
22              
23 1         3 my $res = $self->objetos( objetos => \@sro, resultado => $tipo );
24 1         2 my %data;
25 1         2 foreach my $item (@{$res->{objetos}}) {
  1         4  
26 2         4 $data{ $item->{codObjeto} } = $item;
27             $data{ $item->{codObjeto} }{situacao} = $tipo eq 'P'
28             ? 'indisponível'
29             : ($item->{mensagem} && $item->{mensagem} =~ /\ASRO-020/) ? 'não encontrado'
30 2 100 66     23 : $self->nome_do_evento($item->{eventos}[0]{codigo}, $item->{eventos}[0]{tipo});
    50          
31             }
32 1         5 return \%data;
33             }
34              
35             sub nome_do_evento {
36 1     1 1 3 my ($self, $codigo, $tipo) = @_;
37 1 50 33     8 return 'indisponivel' unless defined $codigo && defined $tipo;
38 1 50 33     6 if ($codigo eq 'BDR' || $codigo eq 'BDE' || $codigo eq 'BDI') {
    0 33        
    0 0        
    0 0        
      0        
      0        
      0        
      0        
39             # estado final. entrega efetuada!
40 1 50       6 return 'entregue' if $tipo <= 1;
41              
42             # acionar correios (produto extraviado, etc).
43 1 50 33     17 return 'erro' if $tipo == 9 || $tipo == 12 || $tipo == 28
      33        
      33        
      33        
      33        
      33        
      33        
      33        
44             || $tipo == 37 || $tipo == 43 || $tipo == 50
45             || $tipo == 51 || $tipo == 52 || $tipo == 80
46             ;
47              
48             # pacote aguardando retirada pelo interessado.
49 1 50 33     4 return 'retirar' if $tipo == 54 || $tipo == 2;
50              
51             # entrega incompleta, pacote retornando.
52 1 50 33     42 return 'incompleto'
      33        
      33        
      33        
      33        
      33        
      33        
      33        
      33        
      33        
53             if ( ($tipo != 20 && $tipo != 7 && $tipo <= 21)
54             || $tipo == 26 || $tipo == 33 || $tipo == 36
55             || $tipo == 40 || $tipo == 42 || $tipo == 48
56             || $tipo == 49 || $tipo == 56
57             );
58              
59 1 50       8 return 'devolvido' if $tipo == 23;
60              
61 0         0 return 'acompanhar';
62             }
63             elsif ($codigo eq 'FC' && $tipo == 1) {
64 0         0 return 'incompleto';
65             }
66             elsif ($codigo eq 'OEC' && $tipo == 9) {
67 0         0 return 'incompleto';
68             }
69             elsif (
70             # pacote aguardando retirada.
71             ($codigo eq 'LDI' && ($tipo <= 3 || $tipo == 14))
72             || ($codigo eq 'OEC' && $tipo == 0)
73             ) {
74 0         0 return 'retirar';
75             }
76             else {
77 0         0 return 'acompanhar';
78             }
79             }
80              
81             # http://www.correios.com.br/para-sua-empresa/servicos-para-o-seu-contrato/guias/enderecamento/arquivos/guia_tecnico_encomendas.pdf/at_download/file
82             sub sro_ok {
83 0 0   0 1 0 if ( $_[-1] =~ m/^[A-Z|a-z]{2}([0-9]{8})([0-9])BR$/i ) {
84 0         0 my ( $numeros, $dv ) = ($1, $2);
85 0         0 my @numeros = split // => $numeros;
86 0         0 my @magica = ( 8, 6, 4, 2, 3, 5, 9, 7 );
87              
88 0         0 my $soma = 0;
89 0         0 foreach ( 0 .. 7 ) {
90 0         0 $soma += ( $numeros[$_] * $magica[$_] );
91             }
92              
93 0         0 my $resto = $soma % 11;
94 0 0       0 my $dv_check = $resto == 0 ? 5
    0          
95             : $resto == 1 ? 0
96             : 11 - $resto
97             ;
98 0         0 return $dv == $dv_check;
99             }
100 0         0 return;
101             }
102              
103             sub objetos {
104 2     2 1 1649 my ($self, %args) = @_;
105              
106 2         5 my @codes;
107 2         2 foreach my $code (@{$args{objetos}}) {
  2         8  
108 4 50 33     18 die "código SRO '$code' é inválido" unless defined $code && length($code) == 13;
109 4         9 push @codes, uc($code);
110             }
111 2 50       7 die "pelo menos 1 objeto é necessário para consulta" unless @codes;
112 2   100     19 my $tipo = $args{resultado} || 'U';
113 2 50 66     10 die "resultado precisa ser 'U' (último), 'P' (primeiro) ou 'T' (todos)"
      33        
114             unless $tipo eq 'T' || $tipo eq 'U' || $tipo eq 'P';
115              
116 2         9 my $query_string = 'codigosObjetos=' . join('&codigosObjetos=', @codes)
117             . '&resultado=' . $tipo;
118              
119 2         5 my $url = 'srorastro/v1/objetos?' . $query_string;
120 2         4 my $parent = $self->{parent};
121              
122 2         9 my $res = $parent->make_request('cartao', 'GET', $url);
123              
124 2         8 return $parent->parse_response($res);
125             }
126              
127             sub imagens {
128 0     0 0   my ($self, @codes) = @_;
129 0           my $parent = $self->{parent};
130              
131 0           my $body = '[' . join(',', map qq("$_"), @codes) . ']';
132              
133 0           my $res = $parent->make_request(
134             'cartao',
135             'POST',
136             'srorastro/v1/objetos/imagens',
137             { content => '[' . join(',', map qq("$_"), @codes) . ']' }
138             );
139 0           return $parent->parse_response($res);
140             }
141              
142             sub recibo {
143 0     0 0   my ($self, $recibo) = @_;
144 0           my $parent = $self->{parent};
145              
146 0           my $res = $parent->make_request('cartao', 'GET', 'srorastro/v1/recibo/' . $recibo);
147 0           return $parent->parse_response($res);
148             }
149              
150             1;
151             __END__