Kenneth Gonzalez Kenneth Gonzalez - 5 months ago 6
HTML Question

Why does the total from last row is not calculating the sum?

I am doing a project that involves making an estimate and adding up does results. I am using the method GET and using some of the the info from the url. Also i am using WordPress to build the Web Page. Problem is that sum of the TOTAL column is not working and showing in the TOTAL row that i made. Is not an error but i think I need to add one more piece of code or change something in the javascript. So why does the id:"total" not showing the sum of the whole column? is the total.value wrong? does the id:"system_total" have a problem?

Here is how the HTML looks like:

<form >
<h2>Cotizacion</h2>
<table class="Cotization">
<tbody>
<tr>
<th style="width:25%;font-size:16px;text-align:center;">Description</th>
<th style="width:15%;" class="qtyhd" title="qtytt">Qty</th>
<th style="width:15%;" class="ratehd" title="ratett">Rate</th>
<th style="width:15%;" class="tlhd" title="totaltt">Total</th>
</tr>
<tr>
<td>PV Grid Tied System</td>
<td> <input id="system_qty" name="system_qty" value="1" type="number" /></td>
<td> <input id="system_rate" name="system_rate" value="0" type="number" /></td>
<td> <output id="system_total"> </output></td>
</tr>
<tr>
<td>Solar Modules 250w</td>
<td> <input id="modules_qty" name="modules_qty" value="0" type="number" /></td>
<td> <input id="modules_rate" name="modules_rate" value="0" type="number" /></td>
<td> <output id="modules_total"> </output></td>
</tr>
<tr>
<td>Inverter</td>
<td> <input id="inverter_qty" name="inverter_qty" value="1" type="number" /></td>
<td> <input id="inverter_rate" name="inverter_rate" value="0" type="number" /></td>
<td> <output id="inverter_total"> </output></td>
</tr>
<tr>
<td>Aluminum Fames</td>
<td> <input id="aluminum_qty" name="aluminum_qty" value="0" type="number" /></td>
<td> <input id="aluminum_rate" name="aluminum_rate" value="0" type="number" /></td>
<td> <output id="aluminum_total"> </output></td>
</tr>
<tr>
<td>Service Disconnect</td>
<td> <input id="servicedt_qty" name="servicedt_qty" value="1" type="number" /></td>
<td> <input id="servicedt_rate" name="servicedt_rate" value="0" type="number" /></td>
<td> <output id="servicedt_total"> </output></td>
</tr>
<tr>
<td>Installation</td>
<td> <input id="installation_qty" name="installation_qty" value="1" type="number" /></td>
<td> <input id="installation_rate" name="installation_rate" value="0" type="number" /></td>
<td> <output id="installation_total"> </output></td>
</tr>
<tr>
<td>Down Payment</td>
<td> <input id="dnpayment_qty" name="dnpayment_qty" value="-1" type="number" /></td>
<td> <input id="dnpayment_rate" name="dnpayment_rate" value="0" type="number" /></td>
<td> <output id="dnpayment_total"> </output></td>
</tr>
<tr>
<td>Total </td>
<td> </td>
<td> </td>
<td> <input id="total" name="total"/></td>
</tr>
</tbody>
</table>
</form>


And here is the javascript that might have the problem:

<script>
document.addEventListener('DOMContentLoaded', function () {
var system_size = Number(getParameterByName('system_size'));
var system_rate_input = document.getElementById('system_rate');
var modules_qty = document.getElementById('modules_qty');
var aluminum_qty = document.getElementById('aluminum_qty');
var systemTotal = Number(document.getElementById('system_total').innerText);
var moduleTotal = Number(document.getElementById('modules_total').innerText);
var inverterTotal = Number(document.getElementById('inverter_total').innerText);
var aluminumTotal = Number(document.getElementById('aluminum_total').innerText);
var servicedtTotal = Number(document.getElementById('servicedt_total').innerText);
var installationTotal = Number(document.getElementById('installation_total').innerText);
var dnpaymentTotal = Number(document.getElementById('dnpayment_total').innerText);
var total = document.getElementById('total');
modules_qty.value = Number(system_size) * 4;
aluminum_qty.value = Number(modules_qty.value);
system_rate_input.value = 2.9 * 1000 * 1.2 * system_size;
updateSystemTotal()
updateModulesTotal()
updateInverterTotal()
updateAluminumTotal()
updateServiceTotal()
updateInstallationTotal()
updateDownPaymentTotal()
total.value = Number(systemTotal) + Number(moduleTotal) + Number(inverterTotal) + Number(aluminumTotal) + Number(servicedtTotal) + Number(installationTotal) + Number(dnpaymentTotal);
})

// FIRST ROW

function updateSystemTotal() {
var output = document.getElementById('system_total');
var quantity = Number(document.getElementById('system_qty').value);
var system_rate = Number(document.getElementById('system_rate').value);
output.innerText = quantity * system_rate;
}

document.getElementById('system_rate').addEventListener('change', updateSystemTotal)

document.getElementById('system_qty').addEventListener('change', updateSystemTotal)

// Second ROW

function updateModulesTotal() {
var output = document.getElementById('modules_total');
var quantity = Number(document.getElementById('modules_qty').value);
var modules_rate = Number(document.getElementById('modules_rate').value);
output.innerText = quantity * modules_rate;
}

document.getElementById('modules_rate').addEventListener('change', updateModulesTotal)

document.getElementById('modules_qty').addEventListener('change', updateModulesTotal)

// Third ROW

function updateInverterTotal() {
var output = document.getElementById('inverter_total');
var quantity = Number(document.getElementById('inverter_qty').value);
var inverter_rate = Number(document.getElementById('inverter_rate').value);
output.innerText = quantity * inverter_rate;
}

document.getElementById('inverter_rate').addEventListener('change', updateInverterTotal)

document.getElementById('inverter_qty').addEventListener('change', updateInverterTotal)

// Fourth ROW

function updateAluminumTotal() {
var output = document.getElementById('aluminum_total');
var quantity = Number(document.getElementById('aluminum_qty').value);
var aluminum_rate = Number(document.getElementById('aluminum_rate').value);
output.innerText = quantity * aluminum_rate;
}

document.getElementById('aluminum_rate').addEventListener('change', updateAluminumTotal)

document.getElementById('aluminum_qty').addEventListener('change', updateAluminumTotal)

// Fith ROW

function updateServiceTotal() {
var output = document.getElementById('servicedt_total');
var quantity = Number(document.getElementById('servicedt_qty').value);
var servicedt_rate = Number(document.getElementById('servicedt_rate').value);
output.innerText = quantity * servicedt_rate;
}
document.getElementById('servicedt_rate').addEventListener('change', updateServiceTotal)

document.getElementById('servicedt_qty').addEventListener('change', updateServiceTotal)
// Six ROW

function updateInstallationTotal() {
var output = document.getElementById('installation_total');
var quantity = Number(document.getElementById('installation_qty').value);
var installation_rate = Number(document.getElementById('installation_rate').value);
output.innerText = quantity * installation_rate;
}
document.getElementById('installation_rate').addEventListener('change', updateInstallationTotal)

document.getElementById('installation_qty').addEventListener('change', updateInstallationTotal)

//Seventh ROW

function updateDownPaymentTotal() {
var output = document.getElementById('dnpayment_total');
var quantity = Number(document.getElementById('dnpayment_qty').value);
var dnpayment_rate = Number(document.getElementById('dnpayment_rate').value);
output.innerText = quantity * dtpayment_rate;
}
document.getElementById('dnpayment_rate').addEventListener('change', updateDownPaymentTotal)

document.getElementById('dnpayment_qty').addEventListener('change', updateDownPaymentTotal)

// DON't TOUCH ANYTHING BELOW THIS POINT!!!

function getParameterByName(name, url) {
if (!url) url = window.location.href;
name = name.replace(/[\[\]]/g, "\\$&");
var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
results = regex.exec(url);
if (!results) return null;
if (!results[2]) return '';
return decodeURIComponent(results[2].replace(/\+/g, " "));
</script>

Answer
var systemTotal = Number(document.getElementById('system').innerText);

There is no element called "system" in the snippets you provided. Are you sure you don't need to get the value from "system_total"?


Edit:

Total is showing 0 at the beginning, because the subtotals aren't initialized. To fix this, you can use your update functions before calculating the total.

document.addEventListener('DOMContentLoaded', function () {
    var system_size = Number(getParameterByName('system_size'));
    var system_rate_input = document.getElementById('system_rate');
    var modules_qty = document.getElementById('modules_qty');
    var aluminum_qty = document.getElementById('aluminum_qty');
    var total = document.getElementById('total');
    modules_qty.value = Number(system_size) * 4;
    aluminum_qty.value = Number(modules_qty.value);
    system_rate_input.value = 2.9 * 1000 * 1.2 * system_size;
    updateSystemTotal();
    updateModulesTotal();
    updateInverterTotal();
    updateAluminumTotal();
    updateServiceTotal();
    updateInstallationTotal();
    updateDownPaymentTotal();
    updateTotal();
})

function updateTotal() {
    var total = document.getElementById('total');
    var systemTotal = Number(document.getElementById('system_total').innerText);
    var moduleTotal = Number(document.getElementById('modules_total').innerText);
    var inverterTotal = Number(document.getElementById('inverter_total').innerText);
    var aluminumTotal = Number(document.getElementById('aluminum_total').innerText);
    var servicedtTotal = Number(document.getElementById('servicedt_total').innerText);
    var installationTotal = Number(document.getElementById('installation_total').innerText);
    var dnpaymentTotal = Number(document.getElementById('dnpayment_total').innerText);
    total.value = Number(systemTotal) + Number(moduleTotal) + Number(inverterTotal) + Number(aluminumTotal) + Number(servicedtTotal) + Number(installationTotal) + Number(dnpaymentTotal);
}

Further, you are updating the subtotals as soon as the user edits Quantities or Rates, but you are not updating the "Total" value. You could call updateTotal() in your own update functions to solve this issue:

function updateSystemTotal() {
    var output = document.getElementById('system_total');
  var quantity = Number(document.getElementById('system_qty').value);
  var system_rate = Number(document.getElementById('system_rate').value);
  output.innerText = quantity * system_rate;
  updateTotal();
}