File Coverage

lib/Spreadsheet/Engine/Function/NPER.pm
Criterion Covered Total %
statement 23 23 100.0
branch 7 10 70.0
condition 5 8 62.5
subroutine 5 5 100.0
pod 2 2 100.0
total 42 48 87.5


line stmt bran cond sub pod time code
1             package Spreadsheet::Engine::Function::NPER;
2              
3 28     28   158 use strict;
  28         55  
  28         938  
4 28     28   147 use warnings;
  28         65  
  28         744  
5              
6 28     28   171 use base 'Spreadsheet::Engine::Fn::investment';
  28         66  
  28         19152  
7              
8 105     105 1 2744 sub result_type { Spreadsheet::Engine::Value->new(type => 'n') }
9              
10             sub calculate {
11 105     105 1 4097 my ($self, $rate, $payment, $pv, $fv, $type) = @_;
12 105   100     353 $fv ||= 0;
13 105 100       191 $type = $type ? 1 : 0;
14              
15 105 50 66     333 die Spreadsheet::Engine::Value->num if $rate == 0 && $payment == 0;
16 105 100       679 return ($pv + $fv) / (-$payment) if $rate == 0;
17              
18 85         199 my $part1 = $payment * (1 + $rate * $type) / $rate;
19 85         116 my $part2 = $pv + $part1;
20 85 50 33     403 die Spreadsheet::Engine::Value->num if $part2 == 0 || $rate <= -1;
21              
22 85         148 my $part3 = ($part1 - $fv) / $part2;
23 85 50       188 die Spreadsheet::Engine::Value->num if $part3 <= 0;
24              
25 85         240 my $part4 = log($part3);
26 85         160 my $part5 = log(1 + $rate); # rate > -1
27 85         2008 return $part4 / $part5;
28             }
29              
30             1;
31              
32             __END__