3 # Glyn Astill <glyn@8kb.co.uk> 11/10/2011
6 use Getopt::Long qw/GetOptions/;
7 Getopt::Long::Configure('no_ignore_case');
10 my $USAGE = '-m <mortgage value> -a <arrangement fee> -i <interest rate>';
15 my $interest_rate_term;
18 my $interest_rate_increase;
19 my $cap_rate_increase;
20 my $monthly_overpayment;
31 ##http://www.perl.com/doc/manual/html/lib/Getopt/Long.html
36 'arrangement_fee|a=n',
38 'interest_rate_term|it=n',
40 'interest_rate_increase|ii=f',
41 'cap_rate_increase|ic=f',
42 'monthly_overpayment|o=n',
43 'monthly_payment|p=n',
48 ## initial call ... $ARGV[0] and $ARGV[1] are the command line arguments
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);
60 $total_mortgage = $mortgage_value+$arrangement_fee;
61 $monthly_interest = ($interest_rate/100)/12;
63 $month_value = $total_mortgage;
64 if (! $monthly_payment) {
65 $monthly_payment = (($month_value*$monthly_interest)/(1-((1+$monthly_interest)**($term*12*-1))));
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";
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;
88 elsif ($cap_rate_increase && ($interest_rate > $cap_rate_increase)) {
89 $interest_rate = $cap_rate_increase;
91 $monthly_interest = ($interest_rate/100)/12;
92 $monthly_payment = (($month_value*$monthly_interest)/(1-((1+$monthly_interest)**(($term-$year)*12*-1))));
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 + $monthly_overpayment;
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);
107 if ($monthly_overpayment > 0) {
108 print " Overpayment ", sprintf("%.2f", $monthly_overpayment);
113 if ($month_value <= 0) {
114 print "Paid off in month ", $month, " of year ", $year, "\n";