Skip to content
Snippets Groups Projects
Commit 31b90cf3 authored by aspangaro's avatar aspangaro
Browse files

Add 1st version of calculator but need work

parent c256243b
No related branches found
No related tags found
No related merge requests found
<?php
/* Copyright (C) 2002 David Tufts <http://dave.imarc.net>
* Copyright (C) 2014 Alexandre Spangaro <alexandre.spangaro@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
require '../../main.inc.php';
$langs->load("loan");
/* --------------------------------------------------- *
* Set Form DEFAULT values
* --------------------------------------------------- */
$default_sale_price = "150000";
$default_annual_interest_percent = 7.0;
$default_year_term = 30;
$default_down_percent = 10;
$default_show_progress = TRUE;
/* --------------------------------------------------- *
* Initialize Variables
* --------------------------------------------------- */
$sale_price = 0;
$annual_interest_percent = 0;
$year_term = 0;
$down_percent = 0;
$this_year_interest_paid = 0;
$this_year_principal_paid = 0;
$form_complete = false;
$show_progress = false;
$monthly_payment = false;
$show_progress = false;
$error = false;
/* --------------------------------------------------- *
* Set the USER INPUT values
* --------------------------------------------------- */
if (isset($_REQUEST['form_complete'])) {
$sale_price = $_REQUEST['sale_price'];
$annual_interest_percent = $_REQUEST['annual_interest_percent'];
$year_term = $_REQUEST['year_term'];
$down_percent = $_REQUEST['down_percent'];
$show_progress = (isset($_REQUEST['show_progress'])) ? $_REQUEST['show_progress'] : false;
$form_complete = $_REQUEST['form_complete'];
}
// This function does the actual mortgage calculations
// by plotting a PVIFA (Present Value Interest Factor of Annuity)
// table...
function get_interest_factor($year_term, $monthly_interest_rate) {
global $base_rate;
$factor = 0;
$base_rate = 1 + $monthly_interest_rate;
$denominator = $base_rate;
for ($i=0; $i < ($year_term * 12); $i++) {
$factor += (1 / $denominator);
$denominator *= $base_rate;
}
return $factor;
}
// If the form is complete, we'll start the math
if ($form_complete) {
// We'll set all the numeric values to JUST
// numbers - this will delete any dollars signs,
// commas, spaces, and letters, without invalidating
// the value of the number
$sale_price = preg_replace( "[^0-9.]", "", $sale_price);
$annual_interest_percent = preg_replace( "[^0-9.]", "", $annual_interest_percent);
$year_term = preg_replace( "[^0-9.]", "", $year_term);
$down_percent = preg_replace( "[^0-9.]", "", $down_percent);
if (((float) $year_term <= 0) || ((float) $sale_price <= 0) || ((float) $annual_interest_percent <= 0)) {
$error = "You must enter a <b>Sale Price of Home</b>, <b>Length of Motgage</b> <i>and</i> <b>Annual Interest Rate</b>";
}
if (!$error) {
$month_term = $year_term * 12;
$down_payment = $sale_price * ($down_percent / 100);
$annual_interest_rate = $annual_interest_percent / 100;
$monthly_interest_rate = $annual_interest_rate / 12;
$financing_price = $sale_price - $down_payment;
$monthly_factor = get_interest_factor($year_term, $monthly_interest_rate);
$monthly_payment = $financing_price / $monthly_factor;
}
} else {
if (!$sale_price) { $sale_price = $default_sale_price; }
if (!$annual_interest_percent) { $annual_interest_percent = $default_annual_interest_percent; }
if (!$year_term) { $year_term = $default_year_term; }
if (!$down_percent) { $down_percent = $default_down_percent; }
if (!$show_progress) { $show_progress = $default_show_progress; }
}
if ($error) {
print("<font color=\"red\">" . $error . "</font><br><br>\n");
$form_complete = false;
}
/*
* View
*/
llxHeader();
echo "<font size='-1' color='#000000'>This <b>mortgage calculator</b> can be used to figure out monthly payments of a home mortgage loan,
based on the home's sale price, the term of the loan desired, buyer's down payment percentage, and the loan's interest rate.
This calculator factors in PMI (Private Mortgage Insurance) for loans where less than 20% is put as a down payment. Also taken
into consideration are the town property taxes, and their effect on the total monthly mortgage payment.<br></font>";
print '<form method="GET" name="information" action="'.$_SERVER['PHP_SELF'].'">';
print '<input type="hidden" name="form_complete" value="1">';
print '<table cellpadding="2" cellspacing="0" border="0" width="100%">';
print '<tr>';
print '<td align="right"><img src="/images/clear.gif" width="225" height="1" border="0" alt=""></td>';
print '<td align="smalltext" width="100%"><img src="/images/clear.gif" width="250" height="1" border="0" alt=""></td>';
print '</tr>';
print '<tr bgcolor="#cccccc">';
print '<td align="center" colspan="2"><b>Purchase &amp; Financing Information</b></td>';
print '</tr>';
print '<tr bgcolor="#eeeeee">';
print '<td align="right">Sale Price of Home:</td>';
print '<td width="100%"><input type="text" size="10" name="sale_price" value="'.$sale_price.'"> '.$langs->trans("Currency".$conf->currency).'</td>';
print '</tr>';
print '<tr bgcolor="#eeeeee">';
print '<td align="right">Percentage Down:</td>';
print '<td><input type="text" size="5" name="down_percent" value="'.$down_percent.'">%</td>';
print '</tr>';
print '<tr bgcolor="#eeeeee">';
print '<td align="right">Length of Mortgage:</td>';
print '<td><input type="text" size="3" name="year_term" value="'.$year_term.'">years</td>';
print '</tr>';
print '<tr bgcolor="#eeeeee">';
print '<td align="right">Annual Interest Rate:</td>';
print '<td><input type="text" size="5" name="annual_interest_percent" value="'.$annual_interest_percent.'">%</td>';
print '</tr>';
print '<tr bgcolor="#eeeeee">';
print '<td align="right">Explain Calculations:</td>';
if (! empty($show_progress))
{
print '<td><input type="checkbox" name="show_progress" value="1" checked>Show me the calculations and amortization</td>';
}
else
{
print '<td><input type="checkbox" name="show_progress" value="1">Show me the calculations and amortization</td>';
}
print '</tr>';
print '</table>';
print '<br><center><input class="button" type="submit" value="'.$langs->trans("Calculate").'"> &nbsp; &nbsp; ';
print '<input class="button" type="submit" name="cancel" value="'.$langs->trans("Cancel").'"></center>';
// If the form has already been calculated, the $down_payment
// and $monthly_payment variables will be figured out, so we can show them in this table
if ($form_complete && $monthly_payment)
{
print '<br>';
print '<table cellpadding="2" cellspacing="0" border="0" width="100%">';
print '<tr valign="top">';
print '<td align="center" colspan="2" bgcolor="#000000"><font color="#ffffff"><b>Mortgage Payment Information</b></font></td>';
print '</tr>';
print '<tr valign="top" bgcolor="#eeeeee">';
print '<td align="right">Down Payment:</td>';
print '<td><b>' . number_format($down_payment, "2", ".", ",") . ' ' . $langs->trans("Currency".$conf->currency) . '</b></td>';
print '</tr>';
print '<tr valign="top" bgcolor="#eeeeee">';
print '<td align="right">Amount Financed:</td>';
print '<td><b>' . number_format($financing_price, "2", ".", ",") . ' ' . $langs->trans("Currency".$conf->currency) . '</b></td>';
print '</tr>';
print '<tr valign="top" bgcolor="#cccccc">';
print '<td align="right">Monthly Payment:</td>';
print '<td><b>' . number_format($monthly_payment, "2", ".", ",") . ' ' . $langs->trans("Currency".$conf->currency) . '</b><br><font>(Principal &amp; Interest ONLY)</font></td>';
print '</tr>';
if ($down_percent < 20)
{
$pmi_per_month = 55 * ($financing_price / 100000);
print '<tr valign="top" bgcolor="#FFFFCC">';
print '<td align="right">&nbsp;</td>';
print '<td>';
print '<br>';
echo 'Since you are putting LESS than 20% down, you will need to pay PMI
(<a href="http://www.google.com/search?hl=en&q=private+mortgage+insurance">Private Mortgage Insurance</a>), which tends
to be about $55 per month for every $100,000 financed (until you have paid off 20% of your loan). This could add
'."\$" . number_format($pmi_per_month, "2", ".", ",").' to your monthly payment.';
print '</td>';
print '</tr>';
print '<tr valign="top" bgcolor="#FFFF99">';
print '<td align="right">Monthly Payment:</td>';
print '<td><b>' . number_format(($monthly_payment + $pmi_per_month), "2", ".", ",") . $langs->trans("Currency".$conf->currency) . '</b><br><font>';
print '(Principal &amp; Interest, and PMI)</td>';
print '</tr>';
}
print '<tr valign="top" bgcolor="#CCCCFF">';
print '<td align="right">&nbsp;</td>';
print '<td>';
print '<br>';
$assessed_price = ($sale_price * .85);
$residential_yearly_tax = ($assessed_price / 1000) * 14;
$residential_monthly_tax = $residential_yearly_tax / 12;
if ($pmi_per_month)
{
$pmi_text = "PMI and ";
}
echo "Residential (or Property) Taxes are a little harder to figure out... In Massachusetts, the average resedential tax rate seems
to be around $14 per year for every $1,000 of your property's assessed value.";
print '<br><br>';
print "Let's say that your property's <i>assessed value</i> is 85% of what you actually paid for it - ";
print number_format($assessed_price, "2", ".", ",") . ' ' . $langs->trans("Currency".$conf->currency) . 'This would mean that your yearly residential taxes will be around';
print number_format($residential_yearly_tax, "2", ".", ",") . ' ' . $langs->trans("Currency".$conf->currency);
print 'This could add ' . number_format($residential_monthly_tax, "2", ".", ",") . ' ' . $langs->trans("Currency".$conf->currency) . 'to your monthly payment';
print '</td>';
print '</tr>';
print '<tr valign="top" bgcolor="#9999FF">';
print '<td align="right">TOTAL Monthly Payment:</td>';
print '<td><b>' . number_format(($monthly_payment + $pmi_per_month + $residential_monthly_tax), "2", ".", ",") . ' ' . $langs->trans("Currency".$conf->currency) . '</b><br><font>';
print '(including '.$pmi_text.' residential tax)</font></td>';
print '</tr>';
}
print '</table>';
print '</form>';
// This prints the calculation progress and
// the instructions of HOW everything is figured
// out
if ($form_complete && $show_progress) {
$step = 1;
print '<br><br>';
print '<table cellpadding="5" cellspacing="0" border="1" width="100%">';
print '<tr valign="top">';
print '<td><b>'. $step++ .'</b></td>';
print '<td>';
echo 'The <b>down payment</b>
= The price of the home multiplied by the percentage down divided by 100 (for 5% down becomes 5/100 or 0.05)<br><br>
' . number_format($down_payment,"2",".",",") . ' ' . $langs->trans("Currency".$conf->currency) . ' = '.number_format($sale_price,"2",".",",") . ' ' . $langs->trans("Currency".$conf->currency) . ' X
('.$down_percent.' / 100)';
print '</td>';
print '</tr>';
print '<tr valign="top">';
print '<td><b>' . $step++ . '</b></td>';
print '<td>';
print 'The <b>interest rate</b> = The annual interest percentage divided by 100<br><br>';
print $annual_interest_rate . ' = ' . $annual_interest_percent . '% / 100';
print '</td>';
print '</tr>';
print '<tr valign="top" bgcolor="#cccccc">';
print '<td colspan="2">';
print 'The <b>monthly factor</b> = The result of the following formula:';
print '</td>';
print '</tr>';
print '<tr valign="top">';
print '<td><b>' . $step++ . '</b></td>';
print '<td>';
print 'The <b>monthly interest rate</b> = The annual interest rate divided by 12 (for the 12 months in a year)<br><br>';
print $monthly_interest_rate . ' = ' . $annual_interest_rate . ' / 12';
print '</td>';
print '</tr>';
print '<tr valign="top">';
print '<td><b>' . $step++ . '</b></td>';
print '<td>';
print 'The <b>month term</b> of the loan in months = The number of years you\'ve taken the loan out for times 12<br><br>';
print $month_term . ' Months = ' . $year_term . ' Years X 12';
print '</td>';
print '</tr>';
print '<tr valign="top">';
print '<td><b>' . $step++ . '</b></td>';
print '<td>';
print 'The montly payment is figured out using the following formula:<br>';
print 'Monthly Payment = ' . number_format($financing_price, "2", "", "") . ' * ';
print number_format($monthly_interest_rate, "4", "", "") . ' / ';
print '(1 - ((1 + ' . number_format($monthly_interest_rate, "4", "", "") . ')';
print '<sup>-(' . $month_term . ')</sup>)))';
print '<br><br>';
print 'The <a href="#amortization">amortization</a> breaks down how much of your monthly payment goes towards the bank\'s interest,';
print 'and how much goes into paying off the principal of your loan.';
print '</td>';
print '</tr>';
print '</table>';
print '<br>';
// Set some base variables
$principal = $financing_price;
$current_month = 1;
$current_year = 1;
// This basically, re-figures out the monthly payment, again.
$power = -($month_term);
$denom = pow((1 + $monthly_interest_rate), $power);
$monthly_payment = $principal * ($monthly_interest_rate / (1 - $denom));
print("<br><br><a name=\"amortization\"></a>Amortization For Monthly Payment: <b>\$" . number_format($monthly_payment, "2", ".", ",") . "</b> over " . $year_term . " years<br>\n");
print '<table class="noborder" width="100%">';
// This LEGEND will get reprinted every 12 months
$legend = '<tr class="liste_titre">';
$legend.= '<td class="liste_titre" align="center">' . $langs->trans("Month") . '</td>';
$legend.= '<td class="liste_titre" align="center">' . $langs->trans("Interest") . '</td>';
$legend.= '<td class="liste_titre" align="center">' . $langs->trans("Capital") . '</td>';
$legend.= '<td class="liste_titre" align="center">' . $langs->trans("Position") . '</td>';
$legend.= '</tr>';
echo $legend;
// Loop through and get the current month's payments for
// the length of the loan
while ($current_month <= $month_term)
{
$interest_paid = $principal * $monthly_interest_rate;
$principal_paid = $monthly_payment - $interest_paid;
$remaining_balance = $principal - $principal_paid;
$this_year_interest_paid = $this_year_interest_paid + $interest_paid;
$this_year_principal_paid = $this_year_principal_paid + $principal_paid;
$var = !$var;
print "<tr ".$bc[$var].">";
print '<td align="right">' . $current_month . '</td>';
print '<td align="right">' . number_format($interest_paid, "2", ".", ",") . ' ' . $langs->trans("Currency".$conf->currency) . '</td>';
print '<td align="right">' . number_format($principal_paid, "2", ".", ",") . ' ' . $langs->trans("Currency".$conf->currency) . '</td>';
print '<td align="right">' . number_format($remaining_balance, "2", ".", ",") . ' ' . $langs->trans("Currency".$conf->currency) . '</td>';
print '</tr>';
($current_month % 12) ? $show_legend = FALSE : $show_legend = TRUE;
if ($show_legend) {
print '<tr>';
print '<td colspan="4"><b>' . $langs->trans("Totalsforyear") . ' ' . $current_year . '</td>';
print '</tr>';
$total_spent_this_year = $this_year_interest_paid + $this_year_principal_paid;
print '<tr>';
print '<td>&nbsp;</td>';
print '<td colspan="3">';
print 'You will spend ' . number_format($total_spent_this_year, "2", ".", ",") . ' ' . $langs->trans("Currency".$conf->currency) . ' on your house in year ' . $current_year . '<br>';
print number_format($this_year_interest_paid, "2", ".", ",") . ' ' . $langs->trans("Currency".$conf->currency) . ' will go towards INTEREST<br>';
print number_format($this_year_principal_paid, "2", ".", ",") . ' ' . $langs->trans("Currency".$conf->currency) . ' will go towards PRINCIPAL<br>';
print '</td>';
print '</tr>';
print '<tr>';
print '<td colspan="4">&nbsp;<br></td>';
print '</tr>';
$current_year++;
$this_year_interest_paid = 0;
$this_year_principal_paid = 0;
if (($current_month + 6) < $month_term)
{
echo $legend;
}
}
$principal = $remaining_balance;
$current_month++;
}
print("</table>\n");
}
llxFooter();
$db->close();
......@@ -181,6 +181,7 @@ insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, left
insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->loan->enabled', __HANDLER__, 'left', 2220__+MAX_llx_menu__, 'accountancy', 'tax_loan', 2200__+MAX_llx_menu__, '/compta/loan/index.php?leftmenu=tax_loan&amp;mainmenu=accountancy', 'Loans', 1, 'loan', '$user->rights->loan->read', '', 0, 1, __ENTITY__);
insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->loan->enabled && $leftmenu=="tax_loan"', __HANDLER__, 'left', 2221__+MAX_llx_menu__, 'accountancy', '', 2220__+MAX_llx_menu__, '/compta/loan/card.php?leftmenu=tax_loan&amp;action=create', 'NewLoan', 2, 'loan', '$user->rights->loan->write', '', 0, 2, __ENTITY__);
insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->loan->enabled && $leftmenu=="tax_loan"', __HANDLER__, 'left', 2222__+MAX_llx_menu__, 'accountancy', '', 2220__+MAX_llx_menu__, '/compta/loan/index.php?leftmenu=tax_loan', 'Payments', 2, 'companies', '$user->rights->loan->read', '', 0, 3, __ENTITY__);
insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->loan->enabled && $leftmenu=="tax_loan"', __HANDLER__, 'left', 2223__+MAX_llx_menu__, 'accountancy', '', 2220__+MAX_llx_menu__, '/compta/loan/calc.php?leftmenu=tax_loan', 'Calculator', 2, 'companies', '$user->rights->loan->calc', '', 0, 4, __ENTITY__);
insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->tax->enabled', __HANDLER__, 'left', 2250__+MAX_llx_menu__, 'accountancy', 'tax_social', 2200__+MAX_llx_menu__, '/compta/sociales/index.php?leftmenu=tax_social', 'SocialContributions', 1, '', '$user->rights->tax->charges->lire', '', 0, 1, __ENTITY__);
insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->tax->enabled && $leftmenu=="tax_social"', __HANDLER__, 'left', 2251__+MAX_llx_menu__, 'accountancy', '', 2250__+MAX_llx_menu__, '/compta/sociales/charges.php?leftmenu=tax_social&amp;action=create', 'MenuNewSocialContribution', 2, '', '$user->rights->tax->charges->creer', '', 0, 2, __ENTITY__);
insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->tax->enabled && $leftmenu=="tax_social"', __HANDLER__, 'left', 2252__+MAX_llx_menu__, 'accountancy', '', 2250__+MAX_llx_menu__, '/compta/charges/index.php?leftmenu=tax_social&amp;mainmenu=accountancy&amp;mode=sconly', 'Payments', 2, '', '$user->rights->tax->charges->lire', '', 0, 3, __ENTITY__);
......
......@@ -817,6 +817,7 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu
$newmenu->add("/compta/loan/index.php?leftmenu=tax_loan&amp;mainmenu=accountancy",$langs->trans("Loans"),1,$user->rights->loan->read, '', $mainmenu, 'tax_loan');
if (empty($leftmenu) || preg_match('/^tax_loan/i',$leftmenu)) $newmenu->add("/compta/loan/card.php?leftmenu=tax_loan&action=create",$langs->trans("NewLoan"),2,$user->rights->loan->write);
if (empty($leftmenu) || preg_match('/^tax_loan/i',$leftmenu)) $newmenu->add("/compta/loan/index.php?leftmenu=tax_loan",$langs->trans("Payments"),2,$user->rights->loan->read);
if (empty($leftmenu) || preg_match('/^tax_loan/i',$leftmenu)) $newmenu->add("/compta/loan/calc.php?leftmenu=tax_loan",$langs->trans("Calculator"),2,$user->rights->loan->calc);
}
// Social contributions
......
......@@ -118,6 +118,14 @@ class modLoan extends DolibarrModules
$this->rights[$r][3] = 0;
$this->rights[$r][4] = 'delete';
$this->rights[$r][5] = '';
$r++;
$this->rights[$r][0] = 525;
$this->rights[$r][1] = 'Access loan calculator';
$this->rights[$r][2] = 'r';
$this->rights[$r][3] = 0;
$this->rights[$r][4] = 'calc';
$this->rights[$r][5] = '';
$r++;
$this->rights[$r][0] = 527;
......
......@@ -698,6 +698,7 @@ Permission517=Export salaries
Permission520=Read Loans
Permission522=Create/modify loans
Permission524=Delete loans
Permission525=Access loan calculator
Permission527=Export loans
Permission531=Read services
Permission532=Create/modify services
......
......@@ -17,6 +17,8 @@ ConfirmPayLoan=Confirm classify paid this loan
ErrorLoanCapital=<font color=red>Loan amount</font> has to be numeric and greater than zero.
ErrorLoanLength=<font color=red>Loan length</font> has to be numeric and greater than zero.
ErrorLoanInterest=<font color=red>Annual interest</font> has to be numeric and greater than zero.
# Calc
Totalsforyear=Totals for year
# Admin
ConfigLoan=Configuration of the module loan
LOAN_ACCOUNTING_ACCOUNT_CAPITAL=Accountancy code capital by default
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment