Hello fellow StackOverFlow,
I come across the following question:
How can I add all of them input
with name
VN_TOTAL[] when the input with name VN_GRABIVA[] of the same row of the table is empty or equal to zero.
Said total I need to save in the input
with ID siniva .
In the same way, I need to add all of them input
with name
VN_TOTAL[] when the input with name VN_GRABIVA[] of the same row of the table has a value greater than zero.
I need this sum in the input with ID coniva .
In the following image I show the result that I am looking for as an example:
https://i.ibb.co/CsbfqZ1/zrmrf.jpg
$(document).ready(function() {
var tr = 2;
$('#addrowdte').on("click", function() {
$(".details-dte").append('<tr id="'+tr+'"> <td><button onclick="remove_tr('+tr+')" class="btn btn-default btn-sm"><i class="fas fa-trash"></i></button> </td> <td> <input onkeyup="subtotal('+tr+');" type="text" class="input-sm separ-miles cantidad'+tr+'" name="VN_CANTIDA[]" value=""> </td> <td> <div class="input-group"> <input style="min-width: 100px;" type="text" class="form-control input-sm" required="required" id="ADD_CODIGO'+tr+'" name="VN_CODPRO[]" value=""> <a data-toggle="modal" data-target="#modal-search-product" onclick="getrowid('+tr+');" class="input-group-addon input-sm"><i class="fas fa-search"></i></a> </div> </td> <td> <input id="ADD_DETALLE'+tr+'" type="text" class="input-sm" name="VN_DETALLE[]" value=""> </td> <td> <input id="ADD_VALUNI'+tr+'" type="text" class="input-sm separ-miles precio'+tr+'" name="VN_VALUNI[]" value=""> </td> <td> <input type="text" class="input-sm separ-miles subtotal'+tr+'" name="VN_PARCIAL[]" value=""> </td> <td> <input onkeyup="get_total('+tr+');" type="text" class="input-sm separ-miles descuento'+tr+'" name="VN_TASADES[]" placeholder="00,00"> </td> <td> <input id="ADD_VALIVA'+tr+'" type="text" class="input-sm separ-miles iva'+tr+'" name="VN_GRABIVA[]" value=""> </td> <td> <input type="text" class="input-sm separ-miles total'+tr+'" name="VN_TOTAL[]" value=""> </td> </tr>');
tr++;
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.10.2/css/all.min.css" rel="stylesheet"/>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/css/bootstrap.min.css" rel="stylesheet"/>
<table class="table table-condensed table-bordered table-hover table-striped">
<thead class="bg-info text-white">
<tr>
<td class="text-center"><a id="addrowdte" class="btn btn-warning btn-xs"><i class="fas fa-plus"></i></a>
</td>
<th>CANTIDAD</th>
<th>CODIGO</th>
<th>NOMBRE</th>
<th>PRECIO</th>
<th>SUB TOTAL</th>
<th>DCTO %</th>
<th>IVA %</th>
<th>TOTAL</th>
</tr>
</thead>
<tbody class="details-dte">
<tr id="1">
<td>
<button onclick="remove_tr(1)" class="btn btn-default btn-sm"><i class="fas fa-trash"></i>
</button>
</td>
<td>
<input onkeyup="subtotal(1);" type="text" class="input-sm separ-miles cantidad1" name="VN_CANTIDA[]" value="">
</td>
<td>
<div class="input-group">
<input style="min-width: 100px;" type="text" class="form-control input-sm" required="required" id="ADD_CODIGO1" name="VN_CODPRO[]" value="">
<a data-toggle="modal" data-target="#modal-search-product" onclick="getrowid(1);" class="input-group-addon input-sm"><i class="fas fa-search"></i></a>
</div>
</td>
<td>
<input id="ADD_DETALLE1" type="text" class="input-sm" name="VN_DETALLE[]" value="">
</td>
<td>
<input id="ADD_VALUNI1" type="text" class="input-sm separ-miles precio1" name="VN_VALUNI[]" value="">
</td>
<td>
<input type="text" class="input-sm separ-miles subtotal1" name="VN_PARCIAL[]" value="">
</td>
<td>
<input onkeyup="get_total(1);" type="text" class="input-sm separ-miles descuento1" name="VN_TASADES[]" placeholder="00,00">
</td>
<td>
<input id="ADD_VALIVA1" type="text" class="input-sm separ-miles iva1" name="VN_GRABIVA[]" value="">
</td>
<td>
<input type="text" class="input-sm separ-miles total1" name="VN_TOTAL[]" value="">
</td>
</tr>
</tbody>
</table>
<script>
function remove_tr(id) {
event.preventDefault();
if (id != 1) {
$('#' + id).remove();
}
}
function subtotal(idrow) {
var rowid = idrow;
var cantidad, precio, total, iva;
if ($('.cantidad' + rowid).val().length > 0) {
cantidad = parseFloat($('.cantidad' + rowid).val());
} else {
cantidad = 0;
}
if ($('.precio' + rowid).val().length > 0) {
precio = parseFloat($('.precio' + rowid).val());
} else {
precio = 0;
}
total = (precio * cantidad);
$('.subtotal' + rowid).val(total);
if ($('.iva' + rowid).val().length > 0) {
iva = parseFloat($('.iva' + rowid).val());
iva = (total * iva / 100);
total = (total + iva);
}
$('.total' + rowid).val(total);
};
function get_total(idrow) {
var rowid = idrow;
var subtotal, descuento, total, iva;
subtotal = parseFloat($('.subtotal' + rowid).val());
if ($('.descuento' + rowid).val().length <= 0) {
descuento = 0;
} else {
descuento = parseFloat($('.descuento' + rowid).val());
}
total = (subtotal * descuento / 100);
total = (subtotal - total);
if ($('.iva' + rowid).val().length > 0) {
iva = parseFloat($('.iva' + rowid).val());
iva = (total * iva / 100);
total = (total + iva);
}
$('.total' + rowid).val(total);
}
</script><br>
<span>Total sin iva:</span>
<input type="text" id="siniva" value="">
<br><br>
<span>Total con iva:</span>
<input type="text" id="coniva" value="">
Any questions or news I will be very aware.
One solution is that every time you vary the amounts, you update a property in the total input corresponding to the row you are modifying, so that when you go through all the inputs to calculate the total amount, you can discern between adding the amount to the field with VAT or to the field without VAT.
Something like that:
Later when you need to calculate the totals you can iterate through all the total inputs to add their values taking into account the flag
tieneIVA
:Here is your code with this change:
Tips that may help you and that I have included in the code, so you can see the implementation of these there:
Intenta siempre que puedas, separar el código
HTML
del códigoJavaScript
y viceversa (a no ser que estés trabajando conJSX
). Si quieres usar un template determinado que vas a utilizar de manera contínua en el código, una técnica que puedes utilizar es situar elHTML
correspondiente a dicho template dentro de una etiqueta template o incluso dentro de una etiquetascript
de tipotemplate
. Esto hará que el código del template sea más fácil de leer y modificar. Si te hace falta que ciertas variables en el template sean dinámicas, podrías situar placeholders para remplazarlos con parámetros con un simple replace.En la misma línea de esta recomendación, intenta añadir los eventos
JavaScript
, desde el códigoJavaScript
en vez de directo en elHTML
. En vez de añadir un evento por cada botón o input de cada fila (que van aumentando a medida que aumentan las filas), puedes, mediante delegación de eventos añadir dicho evento solo una vez y funcionará sin importar la cantidad de filas que tenga la tabla.Intenta siempre que puedas hacer caching en variables de los objetos
jQuery
si estos objetos los vas a usar de manera contínua en el código. Cada vez que llamas a$("selector")
,jQuery
necesita recorrer elDOM
para buscar y seleccionar dicho elemento, por lo que esto tiene un coste. Solo usa los selectores dentro de la lógica del código si los elementos que estás intentando seleccionar son dinámicos y pueden cambiar, pero si los elementos son fijos, asígnalos a variables y usa esas variables en su lugar, así la búsqueda del elemento y este coste de procesamiento se realiza solo una vez.Si vas a repetir un código más de una vez, debes plantearte si no es mejor usar una función para realizar la funcionalidad de esa lógica. En tu código tienes múltiples lugares en los que chequeas si el valor de un
input
tiene una longitud mayor que0
para dependiendo de esto aplicarle unparseFloat
. Puedes crear una pequeña función para esto y aplicarla cada vez que quieras hacerlo (tu código será más sencillo de leer y de escalar).Intenta no tener en la interfaz elementos que al interactuar con ellos ignoras la interacción del usuario con
JavaScript
, esto es confuso para el usuario porque su interacción no es respetada. En su lugar puedes medianteCSS
cambiar la apariencia de los elementos con los que no se puede interactuar. En el código oculté el ícono de borrar de la primera fila, esto no es ideal, lo ideal sería no mostrar el ícono si hay solo una fila o mostrarlos si hay más de una (el usuario debe poder borrar la primera fila si lo desea), pero aunque no es ideal, es mejor solución que mostrar el ícono de borrar e ignorarlo conJavaScript
si se se trata de la primera fila.About the code that you have, it can be done by going through each row (tr) and looking if the VAT field is empty, depending on this field we add to the quantity of prices with VAT or to the quantity of prices without VAT. I add a simple example in which the function is executed when you click on 'calculate totals', once the VAT field and total of the rows are filled. Hope this can help you.