validate - Calcular desde 3 campos de entrada en forma dinámica yii2
yii2 compare (1)
En mi forma dinámica, necesito calcular datos de 3 campos (cantidad, tasa, descuento) y pasarlo a la unidad de descuento. La fórmula será - unitdiscount = ((qty*rate*discount)/100)
. Ya tengo onchange event ( getValue
) en inputfield qty y lo calculo a medida que paso (qty*rate)
a value
. Cuando agregue el nuevo onchange ( getUnitdiscount
), no se pasa el value
campo calcificado. En lugar de eso, obtengo unitdiscount
. Además, no estoy seguro de cómo puedo calcular a partir de 3 campos de entrada.
Calculé el value
con la ayuda de Pasar los datos calculados en un texbox no desde ningún modelo en forma dinámica yii2
Mi código actual parece ...
_formar
<div class="col-xs-1 col-sm-1 col-lg-1 nopadding">
<?= $form->field($modelsProductsales, "[{$i}]rate")->label(false)->textInput([''maxlength'' => true,''onchange'' => ''getValue($(this))'', ''onkeyup'' => ''getValue($(this))'',''onchange'' => ''getUnitdiscount($(this))'', ''onkeyup'' => ''getUnitdiscount($(this))'',''placeholder'' => ''Rate'']) ?>
</div>
<div class="col-xs-1 col-sm-1 col-lg-1 nopadding">
<?= $form->field($modelsProductsales, "[{$i}]qty")->label(false)->textInput([''maxlength'' => true,''onchange'' => ''getTotal($(this))'', ''onkeyup'' => ''getTotal($(this))'',''onchange'' => ''getValue($(this))'', ''onkeyup'' => ''getValue($(this))'',''onchange'' => ''getUnitdiscount($(this))'', ''onkeyup'' => ''getUnitdiscount($(this))'',''placeholder'' => ''Qty'']) ?>
</div>
<div class="col-xs-1 col-sm-1 col-lg-1 nopadding">
<?= $form->field($modelsProductsales, "[{$i}]free")->label(false)->textInput([''maxlength'' => true,''onchange'' => ''getTotal($(this))'', ''onkeyup'' => ''getTotal($(this))'',''placeholder'' => ''Free'']) ?>
</div>
<div class="col-xs-1 col-sm-1 col-lg-1 nopadding">
<?= $form->field($modelsProductsales, "[{$i}]discount")->label(false)->textInput([''maxlength'' => true,''placeholder'' => ''Discount'']) ?>
</div>
<div class="col-xs-1 col-sm-1 col-lg-1 ">
<input type="text" class="form-control" id="productsales-<?= $i ?>-value">
</div>
<input type="text" class="form-control" id="productsales-<?= $i ?>-unitdiscount">
Función JS
<?php
/* start getting the product value */
$script = <<< JS
function getValue(item) {
var index = item.attr("id").replace(/[^0-9.]/g, "");
var total = current = next = 0;
var id = item.attr("id");
var myString = id.split("-").pop();
if(myString == "qty") {
fetch = index.concat("-rate");
} else {
fetch = index.concat("-qty");
}
temp = $("#productsales-"+fetch+"").val();
if(!isNaN(temp) && temp.length != 0) {
next = temp;
}
current = item.val();
if(isNaN(current) || current.length == 0) {
current = 0;
}
if(!isNaN(current) && !isNaN(next)) {
total =parseFloat((parseFloat(current) * parseFloat(next))).toFixed(2);
}
valueField = "productsales-".concat(index).concat("-value");
$("#"+valueField+"").val(total);
}
JS;
$this->registerJs($script, View::POS_END);
/* end getting the product value */
?>
<?php
/* start getting the product Unit discount */
$script = <<< JS
function getUnitdiscount(item) {
var index = item.attr("id").replace(/[^0-9.]/g, "");
var total = current = next = 0;
var id = item.attr("id");
var myString = id.split("-").pop();
if(myString == "qty") {
fetch = index.concat("-rate");
} else {
fetch = index.concat("-qty");
}
temp = $("#productsales-"+fetch+"").val();
if(!isNaN(temp) && temp.length != 0) {
next = temp;
}
current = item.val();
if(isNaN(current) || current.length == 0) {
current = 0;
}
if(!isNaN(current) && !isNaN(next)) {
total =parseFloat((parseFloat(current) * parseFloat(next))).toFixed(2);
}
unitdiscountField = "productsales-".concat(index).concat("-unitdiscount");
$("#"+unitdiscountField+"").val(total);
}
JS;
$this->registerJs($script, View::POS_END);
/* end getting the product Unit discount */
?>
Actualización: he cambiado los inptfields y he puesto onchange(getUnitdiscount)
delante de onchange ( getUnitdiscount
). Ahora estoy obteniendo la unitdiscount
tanto en unitdiscount
como en value
.
He intentado con el siguiente javascript que no da el resultado correcto.
<?php
/* start getting the total udisc */
$script = <<< JS
function getUdisc(item) {
var index = item.attr("id").replace(/[^0-9.]/g, "");
var total = current = next = previous =0;
var id = item.attr("id");
var myString = id.split("-").pop();
if(myString == "qty") {
fetch2 = index.concat("-discount");
fetch1 = index.concat("-rate");
} else if(myString == "discount") {
fetch3 = index.concat("-qty");
fetch1 = index.concat("-rate");
} else {
fetch2 = index.concat("-discount");
fetch3 = index.concat("-qty");
}
temp = $("#productsales-"+fetch1+"").val();
if(!isNaN(temp) && temp.length != 0) {
next = temp;
}
current = item.val();
if(isNaN(current) || current.length == 0) {
current = 0;
}
previous = item.val();
if(isNaN(previous) || previous.length == 0) {
previous = 0;
}
if(!isNaN(current) && !isNaN(next) && !isNaN(previous)) {
total = parseFloat(current) + parseFloat(next) + parseFloat(previous);
}
udiscField = "productsales-".concat(index).concat("-udisc");
$("#"+udiscField+"").val(total);
}
JS;
$this->registerJs($script, View::POS_END);
/* end getting the total udisc */
?>
Mediante este javascript, si pongo rate = 50.50
, qty = 100
, discount = 10
debería dar el resultado 160.50
pero da 70.50
. (He tomado una fórmula simple como unitdiscount = rate + qty + discount
para probar si unitdiscount = rate + qty + discount
los valores correctamente, luego puedo cambiar la fórmula a una compleja).
Pruebe de esta manera:
function getUdisc(item) {
var index = item.attr("id").replace(/[^0-9.]/g, "");
var total = current = next = previous = 0;
var id = item.attr("id");
var myString = id.split("-").pop();
if (myString == "qty") {
fetch1 = index.concat("-discount");
fetch2 = index.concat("-rate");
} else if (myString == "discount") {
fetch1 = index.concat("-qty");
fetch2 = index.concat("-rate");
} else {
fetch1 = index.concat("-discount");
fetch2 = index.concat("-qty");
}
temp1 = $("#productsales-"+fetch1+"").val();
temp2 = $("#productsales-"+fetch2+"").val();
if (!isNaN(temp1) && temp1.length != 0) {
next = temp1;
}
if (isNaN(temp2) || temp2.length == 0) {
previous = temp2;
}
current = item.val();
if (isNaN(current) || current.length == 0) {
current = 0;
}
if (!isNaN(current) && !isNaN(next) && !isNaN(previous)) {
total = (parseFloat(current) + parseFloat(next) + parseFloat(previous)).toFixed(2);
}
udiscField = "productsales-".concat(index).concat("-udisc");
$("#"+udiscField+"").val(total);
}