]> git.8kb.co.uk Git - playtime/mortgage_calculator/blob - mcalc.pl
6bb75784f8da4487b9406a94e1e7817622642670
[playtime/mortgage_calculator] / mcalc.pl
1 #!/usr/bin/perl
2
3 # Glyn Astill <glyn@8kb.co.uk> 11/10/2011
4
5 use strict;
6 use Getopt::Long qw/GetOptions/;
7 Getopt::Long::Configure('no_ignore_case');
8
9 my $debug = 0;
10 my $USAGE = '-m <mortgage value> -a <arrangement fee> -i <interest rate>';
11
12 my $mortgage_value;
13 my $arrangement_fee;
14 my $interest_rate;
15 my $interest_rate_term;
16 my $monthly_payment;
17 my $term;
18 my $interest_rate_increase;
19 my $cap_rate_increase;
20 my $monthly_overpayment;
21
22 my $year;
23 my $month;
24
25 my $total_mortgage;
26 my $monthly_interest;
27 my $month_value;
28 my $total_paid;
29 my $interest_accrued;
30
31 ##http://www.perl.com/doc/manual/html/lib/Getopt/Long.html
32 use vars qw{%opt};
33 die $USAGE unless 
34         GetOptions(\%opt,
35                    'mortgage_value|m=n',
36                    'arrangement_fee|a=n',
37                    'interest_rate|i=f',
38                    'interest_rate_term|it=n',
39                    'term|t=n',
40                    'interest_rate_increase|ii=f',
41                    'cap_rate_increase|ic=f',
42                    'monthly_overpayment|o=n',
43                    'monthly_payment|p=n',
44                    )
45         and keys %opt
46         and ! @ARGV;
47         
48 ## initial call ... $ARGV[0] and $ARGV[1] are the command line arguments
49
50 $mortgage_value = $opt{mortgage_value};
51 $arrangement_fee = ($opt{arrangement_fee} // 0);
52 $interest_rate = ($opt{interest_rate} // 5);
53 $interest_rate_term = ($opt{interest_rate_term} // 1);
54 $monthly_payment = ($opt{monthly_payment} // 0);
55 $term = ($opt{term} // 25);
56 $interest_rate_increase = ($opt{interest_rate_increase} // 0);
57 $cap_rate_increase = $opt{cap_rate_increase};
58 $monthly_overpayment = ($opt{monthly_overpayment} // 0);
59
60 $total_mortgage = $mortgage_value+$arrangement_fee;
61 $monthly_interest = ($interest_rate/100)/12;
62
63 $month_value = $total_mortgage;
64 if (! $monthly_payment) {
65         $monthly_payment = (($month_value*$monthly_interest)/(1-((1+$monthly_interest)**($term*12*-1))));
66 }
67
68 print "\nMortgage value: ",$mortgage_value,"\n";
69 print "Arrangement fee added on: ",$arrangement_fee, "\n";
70 print "Term: ", $term, " year(s)\n";
71 print "Interest rate: ",$interest_rate, "% (Monthly rate = ", $monthly_interest, "%)\n";
72 print "Interest rate term: ",$interest_rate_term, " years\n";
73 print "Initial monthly payment: ", sprintf("%.2f", $monthly_payment) ,"\n";
74 print "After initial term rate jumps by: ",$interest_rate_increase,"%\n";
75 print "Cap rate jumps at: ",$cap_rate_increase,"%\n" if ($cap_rate_increase);
76 print "---------------------------------------\n";
77 print "Total mortgage value: ",$total_mortgage,"\n";
78 print "---------------------------------------\n\n";
79
80 do_it: {
81         for ($year = 1; $year < $term; $year++) {
82                 if ($year > $interest_rate_term) {
83                         if ((! $cap_rate_increase) || ($interest_rate < $cap_rate_increase)) {
84                                 $interest_rate = $interest_rate + $interest_rate_increase;
85                                 if ($interest_rate < 0) {
86                                         $interest_rate=0.0000000001;
87                                 }
88                                 elsif ($cap_rate_increase && ($interest_rate > $cap_rate_increase)) {
89                                         $interest_rate = $cap_rate_increase;
90                                 }       
91                                 $monthly_interest = ($interest_rate/100)/12;
92                                 $monthly_payment = (($month_value*$monthly_interest)/(1-((1+$monthly_interest)**(($term-$year)*12*-1))));
93                         }
94                 }
95
96                 for ($month = 1; $month <= 12; $month++) {              
97                         $month_value = $month_value+($month_value*$monthly_interest)-($monthly_payment+$monthly_overpayment);
98                         $total_paid = $total_paid + $monthly_payment;
99                         $interest_accrued = $interest_accrued + ($month_value*$monthly_interest);
100                         if (($month == 12) || ($month_value <= 0)){
101                                 print "End of year ", pack("A5",$year);
102                                 print "Mortgage: ", pack("A11",sprintf("%.2f", $month_value));
103                                 print "Total paid: ", pack("A11", sprintf("%.2f", $total_paid));
104                                 print "Total interest: ", pack("A11", sprintf("%.2f", $interest_accrued));
105                                 print " (Rate ", $interest_rate, "%, Monthly Payment ", sprintf("%.2f", $monthly_payment);
106
107                                 if ($monthly_overpayment > 0) {
108                                         print " Overpayment ", sprintf("%.2f", $monthly_overpayment);
109                                 }
110
111                                 print ")\n";
112                                 
113                                 if ($month_value <= 0) {
114                                         print "Paid off in month ", $month, " of year ", $year, "\n";
115                                         last do_it;
116                                 }
117
118                         }
119                 }
120          }
121  }
122  
123 __END__