File Coverage

blib/lib/WWW/Correios/PrecoPrazo.pm
Criterion Covered Total %
statement 57 57 100.0
branch 14 18 77.7
condition 11 12 91.6
subroutine 10 10 100.0
pod 2 2 100.0
total 94 99 94.9


line stmt bran cond sub pod time code
1             package WWW::Correios::PrecoPrazo;
2              
3 5     5   79117 use strict;
  5         9  
  5         152  
4 5     5   17 use warnings;
  5         5  
  5         100  
5              
6 5     5   2310 use Const::Fast;
  5         11023  
  5         24  
7 5     5   2909 use URI;
  5         26565  
  5         121  
8 5     5   28 use URI::Escape;
  5         4  
  5         3419  
9              
10             our $VERSION = 0.31;
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 4     4 1 792 my $class = shift;
73 4 100       15 my %args = ref $_[0] ? %{ $_[0] } : @_;
  3         12  
74              
75 4         25 my $uri = URI->new;
76 4   100     12145 $uri->scheme( $args{scheme} || 'http' );
77 4   100     9972 $uri->host( $args{host} || 'ws.correios.com.br' );
78 4   100     416 $uri->path( $args{path} || '/calculador/CalcPrecoPrazo.aspx' );
79              
80 4         165 delete @args{qw{scheme host path}};
81              
82 4         14 my $atts = {
83             user_agent => _init_user_agent(\%args),
84             base_uri => $uri,
85             };
86              
87 4         73 return bless $atts, $class;
88             }
89              
90             sub query {
91 6     6 1 9 my $self = shift;
92 6 100       17 my $args = ref $_[0] ? $_[0] : {@_};
93              
94 6 100       35 return {} unless scalar(grep exists $args->{$_}, @REQUIRED) == @REQUIRED;
95 2         6 $args->{cep_origem} =~ s/-//;
96 2         4 $args->{cep_destino} =~ s/-//;
97              
98 30   100     103 my $params = {
99 2         8 map { $INPUT_KEYS{$_} => $args->{$_} || $DEFAULTS{$_} }
100             keys %INPUT_KEYS
101             };
102              
103 2         10 $params->{ $INPUT_KEYS{formato} } = _pkg_format_code( $args->{formato} );
104              
105 2         12 my $uri = $self->{base_uri}->clone;
106 2         19 $uri->query_form($params);
107              
108 2         402 return _parse_response($self->{user_agent}->get( uri_unescape( $uri->as_string ) ));
109             }
110              
111             sub _parse_response {
112 3     3   45 my ($res) = @_;
113 3         8 my %data = ( response => $res );
114              
115 3 50       10 if (my $content = $res->content) {
116 3 50       20 if (substr($content, 0, 5) eq '
117 3         64 $data{$1} = $2 while $content =~ m{<([^<]+)>([^<]*)}gs;
118 3 100 66     22 if (
119             exists $data{Erro}
120             && $content =~ m{(?:)?}
121             ) {
122 1         3 $data{MsgErro} = $1;
123             }
124             }
125             }
126 3         19 return \%data;
127             }
128              
129             sub _init_user_agent {
130 4     4   5 my $args = shift;
131              
132 4         10 my $ua = $args->{user_agent};
133              
134 4 100       17 unless ($ua) {
135 3         4399 require LWP::UserAgent;
136 3         66126 $ua = LWP::UserAgent->new( %{$args} );
  3         20  
137             }
138              
139 4         5307 return $ua;
140             }
141              
142             sub _pkg_format_code {
143 2     2   4 my $format = shift;
144 2         2 my $code = undef;
145              
146 2 50       5 $format = $DEFAULTS{formato} unless $format;
147              
148 2 50       5 $code = $PACKAGING_FORMATS{$format}
149             if exists $PACKAGING_FORMATS{$format};
150              
151 2         6 $code = $PACKAGING_FORMATS{ $DEFAULTS{formato} };
152              
153 2         4 return $code;
154             }
155              
156             1;
157              
158             __END__