File Coverage

blib/lib/WWW/Correios/PrecoPrazo.pm
Criterion Covered Total %
statement 70 70 100.0
branch 14 18 77.7
condition 11 12 91.6
subroutine 12 12 100.0
pod 3 3 100.0
total 110 115 95.6


line stmt bran cond sub pod time code
1             package WWW::Correios::PrecoPrazo;
2              
3 7     7   133061 use strict;
  7         16  
  7         251  
4 7     7   32 use warnings;
  7         41  
  7         186  
5              
6 7     7   8465 use Const::Fast;
  7         17333  
  7         43  
7 7     7   253226 use URI;
  7         499729  
  7         210  
8 7     7   53 use URI::Escape;
  7         8  
  7         6605  
9              
10             our $VERSION = 0.32;
11              
12             const my %INPUT_KEYS => (
13             'codigo_empresa' => 'nCdEmpresa',
14             'senha' => 'sDsSenha',
15             'codigo_servico' => 'nCdServico',
16             'cep_origem' => 'sCepOrigem',
17             'cep_destino' => 'sCepDestino',
18             'peso' => 'nVlPeso',
19             'formato' => 'nCdFormato',
20             'comprimento' => 'nVlComprimento',
21             'altura' => 'nVlAltura',
22             'largura' => 'nVlLargura',
23             'diametro' => 'nVlDiametro',
24             'mao_propria' => 'sCdMaoPropria',
25             'valor_declarado' => 'nVlValorDeclarado',
26             'aviso_recebimento' => 'sCdAvisoRecebimento',
27             'formato_retorno' => 'StrRetorno',
28             );
29              
30             const my @REQUIRED => qw( codigo_servico cep_origem cep_destino );
31              
32             const my %OUTPUT_KEYS => (
33             'EntregaDomiciliar' => 'entrega_domiciliar',
34             'Erro' => 'erro',
35             'Valor' => 'valor',
36             'MsgErro' => 'msg_erro',
37             'ValorMaoPropria' => 'valor_mao_propria',
38             'PrazoEntrega' => 'prazo_entrega',
39             'Codigo' => 'codigo_servico',
40             'ValorValorDeclarado' => 'valor_declarado',
41             'ValorAvisoRecebimento' => 'valor_aviso_recebimento',
42             'EntregaSabado' => 'entrega_sabado',
43             );
44              
45             const my %DEFAULTS => (
46             'codigo_empresa' => '',
47             'senha' => '',
48             'codigo_servico' => '40010',
49             'cep_origem' => '',
50             'cep_destino' => '',
51             'peso' => 0.1,
52             'formato' => 'caixa',
53             'comprimento' => 16,
54             'altura' => 2,
55             'largura' => 11,
56             'diametro' => 5,
57             'mao_propria' => 'N',
58             'valor_declarado' => '0',
59             'aviso_recebimento' => 'N',
60             'formato_retorno' => 'XML',
61             );
62              
63             const my %PACKAGING_FORMATS => (
64             'caixa' => 1,
65             'pacote' => 1,
66             'rolo' => 2,
67             'prisma' => 2,
68             'envelope' => 3,
69             );
70              
71             sub new {
72 5     5 1 1054 my $class = shift;
73 5 100       28 my %args = ref $_[0] ? %{ $_[0] } : @_;
  4         24  
74              
75 5         44 my $uri = URI->new;
76 5   100     20150 $uri->scheme( $args{scheme} || 'http' );
77 5   100     14513 $uri->host( $args{host} || 'ws.correios.com.br' );
78 5   100     641 $uri->path( $args{path} || '/calculador/CalcPrecoPrazo.aspx' );
79              
80 5         255 delete @args{qw{scheme host path}};
81              
82 5         26 my $atts = {
83             user_agent => _init_user_agent(\%args),
84             base_uri => $uri,
85             };
86              
87 5         41 return bless $atts, $class;
88             }
89              
90             sub query_multi {
91 6     6 1 14 my ($res, $parsed_response) = _query(@_);
92 6         31 return $parsed_response;
93             }
94              
95             sub query {
96 6     6 1 18 my ($res, $parsed_response) = _query(@_);
97 6         8 return { %{$parsed_response->[0]}, response => $res };
  6         50  
98             }
99              
100             sub _query {
101 12     12   18 my $self = shift;
102 12 100       38 my $args = ref $_[0] ? $_[0] : {@_};
103              
104 12 100       81 return (undef, [{}])
105             unless scalar(grep exists $args->{$_}, @REQUIRED) == @REQUIRED;
106              
107 4         16 $args->{cep_origem} =~ s/-//;
108 4         9 $args->{cep_destino} =~ s/-//;
109              
110 60   100     237 my $params = {
111 4         16 map { $INPUT_KEYS{$_} => $args->{$_} || $DEFAULTS{$_} }
112             keys %INPUT_KEYS
113             };
114              
115 4         25 $params->{ $INPUT_KEYS{formato} } = _pkg_format_code( $args->{formato} );
116              
117 4         49 my $uri = $self->{base_uri}->clone;
118 4         41 $uri->query_form($params);
119              
120 4         780 my $res = $self->{user_agent}->get( uri_unescape( $uri->as_string ) );
121 4         72 my $parsed_response = _parse_response($res);
122              
123 4         25 return ($res, $parsed_response);
124             }
125              
126             sub _parse_response {
127 6     6   44 my ($res) = @_;
128              
129 6         10 my @parsed_response;
130 6         8 my $i = 0;
131 6 50       22 if (my $content = $res->content) {
132 6 50       47 if (substr($content, 0, 5) eq '
133 6         70 while ($content =~ m{(.+?)}gs) {
134 9         26 my $inner_content = $1;
135 9         15 my %data;
136 9         317 $data{$1} = $2 while $inner_content =~ m{<([^<]+)>([^<]*)}gs;
137 9 100 66     87 if (
138             exists $data{Erro}
139             && $inner_content =~ m{(?:(?:)?)??}
140             ) {
141 7         16 $data{MsgErro} = $1;
142             }
143 9         18 push @parsed_response, \%data;
144 9         41 $i++;
145             }
146             }
147             }
148 6         20 return \@parsed_response;
149             }
150              
151             sub _init_user_agent {
152 5     5   11 my $args = shift;
153              
154 5         9 my $ua = $args->{user_agent};
155              
156 5 100       29 unless ($ua) {
157 3         10649 require LWP::UserAgent;
158 3         84731 $ua = LWP::UserAgent->new( %{$args} );
  3         30  
159             }
160              
161 5         9794 return $ua;
162             }
163              
164             sub _pkg_format_code {
165 4     4   7 my $format = shift;
166 4         6 my $code = undef;
167              
168 4 50       10 $format = $DEFAULTS{formato} unless $format;
169              
170 4 50       13 $code = $PACKAGING_FORMATS{$format}
171             if exists $PACKAGING_FORMATS{$format};
172              
173 4         5 $code = $PACKAGING_FORMATS{ $DEFAULTS{formato} };
174              
175 4         33 return $code;
176             }
177              
178             1;
179              
180             __END__