File Coverage

blib/lib/Net/Correios/Preco.pm
Criterion Covered Total %
statement 48 48 100.0
branch 11 22 50.0
condition 2 6 33.3
subroutine 7 7 100.0
pod 0 2 0.0
total 68 85 80.0


line stmt bran cond sub pod time code
1 1     1   7 use strict;
  1         2  
  1         32  
2 1     1   5 use warnings;
  1         2  
  1         27  
3 1     1   5 use Scalar::Util ();
  1         2  
  1         14  
4 1     1   4 use JSON ();
  1         1  
  1         617  
5              
6             package Net::Correios::Preco;
7              
8             sub new {
9 1     1 0 3 my ($class, $parent) = @_;
10 1         4 Scalar::Util::weaken($parent);
11 1         10 return bless { parent => $parent }, $class;
12             }
13              
14             sub nacional {
15 2     2 0 4397 my ($self, @args) = @_;
16 2 50       6 die 'nacional() espera uma sequencia de parametros' unless @args;
17              
18 2         4 my $args;
19 2 100       6 if (ref $args[0] eq 'HASH') {
20 1         3 $args = $self->_parse_nacional(@args);
21             }
22             else {
23 1         4 $args = {@args};
24             }
25              
26 2         4 my $parent = $self->{parent};
27              
28 2         59 my $res = $parent->make_request(
29             'cartao',
30             'POST',
31             'preco/v1/nacional',
32             { content => JSON::encode_json($args) }
33             );
34 2         12 return $parent->parse_response($res);
35             }
36              
37             sub _parse_nacional {
38 1     1   2 my ($self, @args) = @_;
39 1         2 my $n = 1;
40 1         4 my %req = ( idLote => 1, parametrosProduto => [] );
41              
42             # fazemos o pedido do token antes para garantirmos que temos
43             # os dados de contrato e DR dentro do objeto. É no-op se já fez.
44 1         5 $self->{parent}->access_token('cartao');
45              
46 1         2 foreach my $arg (@args) {
47             my $tipo = $arg->{tipo} eq 'caixa' ? 2
48             : $arg->{tipo} eq 'envelope' ? 1
49             : $arg->{tipo} eq 'rolo' ? 3
50 1 0       3 : $arg->{tipo};
    0          
    50          
51              
52 1         2 my $cep_origem = $arg->{cep_origem};
53 1         5 $cep_origem =~ s/[\.\-]+//g;
54 1         2 my $cep_destino = $arg->{cep_destino};
55 1         4 $cep_destino =~ s/[\.\-]+//g;
56              
57 1         5 foreach my $servico (split /\s*,\s*/ => $arg->{codigo}) {
58 2   33     22 my $contrato = $arg->{contrato} || $self->{parent}{contrato};
59             my $params = {
60             ($contrato ? (nuContrato => $contrato) : ()),
61             nuRequisicao => $n++,
62             nuDR => $arg->{dr} || $self->{parent}{dr},
63             coProduto => $servico,
64             cepOrigem => $cep_origem,
65             cepDestino => $cep_destino,
66             psObjeto => $arg->{peso},
67             comprimento => $arg->{comprimento},
68             largura => $arg->{largura},
69             altura => $arg->{altura},
70             tpObjeto => $tipo,
71 2 50 33     29 ($arg->{data} ? (dtEvento => $arg->{data}) : ()),
    50          
72             };
73 2 50       8 if ($arg->{valor_declarado}) {
74 2         3 $params->{vlDeclarado} = $arg->{valor_declarado};
75 2 50       7 my $vd = $servico eq '03220' ? '019'
    100          
76             : $servico eq '03298' ? '064'
77             : '019';
78 2         2 push @{$params->{servicosAdicionais}}, { coServAdicional => $vd };
  2         7  
79             }
80 2 50       5 if ($arg->{aviso_recebimento}) {
81 2         2 push @{$params->{servicosAdicionais}}, { coServAdicional => '001' };
  2         5  
82             }
83 2         4 push @{$req{parametrosProduto}}, $params;
  2         5  
84             }
85             }
86 1         3 return \%req;
87             }
88              
89             1;