File Coverage

blib/lib/Net/Correios/Preco.pm
Criterion Covered Total %
statement 49 49 100.0
branch 12 26 46.1
condition 2 6 33.3
subroutine 7 7 100.0
pod 0 2 0.0
total 70 90 77.7


line stmt bran cond sub pod time code
1 1     1   8 use strict;
  1         3  
  1         52  
2 1     1   7 use warnings;
  1         2  
  1         97  
3 1     1   17 use Scalar::Util ();
  1         3  
  1         22  
4 1     1   6 use JSON ();
  1         2  
  1         875  
5              
6             package Net::Correios::Preco;
7              
8             sub new {
9 1     1 0 4 my ($class, $parent) = @_;
10 1         3 Scalar::Util::weaken($parent);
11 1         41 return bless { parent => $parent }, $class;
12             }
13              
14             sub nacional {
15 2     2 0 6013 my ($self, @args) = @_;
16 2 50       8 die 'nacional() espera uma sequencia de parametros' unless @args;
17              
18 2         4 my $args;
19 2 100       10 if (ref $args[0] eq 'HASH') {
20 1         4 $args = $self->_parse_nacional(@args);
21             }
22             else {
23 1         4 $args = {@args};
24             }
25              
26 2         6 my $parent = $self->{parent};
27              
28 2         56 my $res = $parent->make_request(
29             'cartao',
30             'POST',
31             'preco/v1/nacional',
32             { content => JSON::encode_json($args) }
33             );
34 2         15 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         6 $self->{parent}->access_token('cartao');
45              
46 1         3 foreach my $arg (@args) {
47             my $tipo = $arg->{tipo} eq 'caixa' ? 2
48             : $arg->{tipo} eq 'envelope' ? 1
49             : $arg->{tipo} eq 'carta' ? 1
50             : $arg->{tipo} eq 'rolo' ? 3
51 1 0       4 : $arg->{tipo};
    0          
    0          
    50          
52              
53 1         9 my $cep_origem = $arg->{cep_origem};
54 1         8 $cep_origem =~ s/[\.\-]+//g;
55 1         3 my $cep_destino = $arg->{cep_destino};
56 1         5 $cep_destino =~ s/[\.\-]+//g;
57              
58 1         8 foreach my $servico (split /\s*,\s*/ => $arg->{codigo}) {
59 2   33     12 my $contrato = $arg->{contrato} || $self->{parent}{contrato};
60             my $params = {
61             ($contrato ? (nuContrato => $contrato) : ()),
62             nuRequisicao => $n++,
63             nuDR => $arg->{dr} || $self->{parent}{dr},
64             coProduto => $servico,
65             cepOrigem => $cep_origem,
66             cepDestino => $cep_destino,
67             psObjeto => $arg->{peso},
68             comprimento => $arg->{comprimento},
69             largura => $arg->{largura},
70             altura => $arg->{altura},
71             tpObjeto => $tipo,
72 2 50 33     32 ($arg->{data} ? (dtEvento => $arg->{data}) : ()),
    50          
73             };
74 2 50       8 if ($servico ne '04227') { # "mini envios" nao pode ter valor declarado
75 2 50       7 if ($arg->{valor_declarado}) {
76 2         3 $params->{vlDeclarado} = $arg->{valor_declarado};
77 2 50       9 my $vd = $servico eq '03220' ? '019'
    100          
78             : $servico eq '03298' ? '064'
79             : '019';
80 2         3 push @{$params->{servicosAdicionais}}, { coServAdicional => $vd };
  2         8  
81             }
82 2 50       5 if ($arg->{aviso_recebimento}) {
83 2         3 push @{$params->{servicosAdicionais}}, { coServAdicional => '001' };
  2         6  
84             }
85             }
86 2         4 push @{$req{parametrosProduto}}, $params;
  2         7  
87             }
88             }
89 1         3 return \%req;
90             }
91              
92             1;