Calculate the values automatically

Asked

Viewed 46 times

1

I have a form where the user can register more than one passenger:

inserir a descrição da imagem aqui

He can choose the type of passenger. See:

inserir a descrição da imagem aqui

For each type of passenger, of course, a different value. Ex.:

  • Adult: R$ 140,00
  • Child up to 6 years: R$ 60,00
  • Child from 6 to 12 years: R$ 90,00
  • Adolescent from 12 to 18 years: 120,00

How do I, as it is selecting another field and according to the type of passenger, is calculated automatically in Total Value?

Check below the code I have:

<table border="0" width="100%">
  <tr class='linhas'>
    <td>
    <table border="0" width="100%">
      <tr>
        <td  style="padding: 5px">
          <select id="TipoPassageiro" name="TipoDocumento[]" class="form-control">
            <option>Pax</option>
            <option value="Adulto">Adulto</option>
            <option value="Adolescente entre 12 e 18 anos">Adolescente entre 12 e 18 anos</option>
            <option value="Criança entre 6 e 12 anos">Criança entre 6 e 12 anos</option>
            <option value="Criança de colo de até 6 anos">Criança de colo de até 6 anos</option>
          </select>
        </td>
      <td  style="padding: 5px"><input type="text" name="NomePAX[]" class="form-control" placeholder="Nome do pax" value=""></td>
      <td  style="padding: 5px">
        <select id="TipoDocumento" name="TipoDocumento[]" class="form-control">
          <option>Tipo de documento</option>
          <option value="Carteira de Identidade">Carteira de Identidade</option>
          <option value="Carteira Nacional de Habilitação">Carteira Nacional de Habilitação</option>
          <option value="Carteira de Trabalho">Carteira de Trabalho</option>
          <option value="Certidão de Nascimento">Certidão de Nascimento</option>
          <option value="Passaporte">Passaporte</option>
          <option value="Cédula de Identidade Estrangeira">Cédula de Identidade Estrangeira</option>
          <option value="Outros">Outros</option>
        </select>
      </td>
      <td  style="padding: 5px">
         <input type="text" name="Documento[]" class="form-control" placeholder="RG da pessoa autorizada" value="">
      </td>
      <td  style="padding: 5px">
         <input type="text" name="OrgaoEmissor[]" class="form-control" placeholder="Órgão Emissor" value="">
      </td>
    </tr>
  </table>
  </td>
      <td style="padding: 5px" valign="top"><button type="button" class="removerCampo btn btn-danger" title="Remover linha"><i class="fa fa-minus-square" aria-hidden="true"></i> Remover</button></td>
  <tr>
      <td colspan="3"><button type="button" class="adicionarCampo btn btn-primary" title="Adicionar item"><i class="fa fa-plus-square" aria-hidden="true"></i> Adicionar mais passageiros</button></td>
  </tr>
  </table>
  <div class="text-right">
    <strong>Valor do Pacote:</strong> <span style="font-family: Arial"> R$ 150,00</span><br>
    <strong>Valor Total:</strong> <span style="font-family: Arial"> R$ 0,00</span>
  </div>

Jquery

<script type="text/javascript">
 $(function () {
   function removeCampo() {
         $(".removerCampo").unbind("click");
         $(".removerCampo").bind("click", function () {
            if($("tr.linhas").length > 1){
                 $(this).parent().parent().remove();
            }
         });
   }
   $(".adicionarCampo").click(function () {
      if ($('.linhas').length < 15) {
          var adulto = '<?php echo $visualizar[1]->ValorAdulto; ?>';
          var crianca6Anos = '<?php echo $visualizar[1]->ValorCrianca6Anos; ?>';
          var crianca6a12Anos = '<?php echo $visualizar[1]->ValorCrianca6a12Anos; ?>';
          var adolescentes = '<?php echo $visualizar[1]->ValorAdolescentes; ?>';
          novoCampo = $("tr.linhas:first").clone();
          novoCampo.find('input[type="text"]').val("");
          novoCampo.find('select').val("");
          novoCampo.insertAfter("tr.linhas:last");
          removeCampo();
      }
    });
 });
</script>
  • 1

    Where is the information of values (prices) in the code? And this .prop('checked',true) what do you mean? Looking at the code I didn’t see any checkbox or radiobutton.

  • I changed the code Sam. the values will come from BD through PHP.

  • Field+field+field, why not calculate when the number appears?

  • Right. Bring in 140.00 format.

  • I don’t mean to be skeptical, Sam, but is it possible to do this automatic calculation? I ask because, as I am dealing with values related to different types of passengers, how will I be able to do so that, after the fifth field, when selecting Adolescents, identify how many fields selected as Adolescents were chosen earlier? I don’t know if my doubt is clear. I even took the solution that you passed in the previous post to try here, but it’s exactly at this point that I can’t move forward.

1 answer

1


First you have to change these id's to class: id="TipoPassageiro" and id="TipoDocumento"; because when you clone you will duplicate id's, which is incorrect.

Another error is that the two selects have the same name: name="TipoDocumento[]".

To add the values as selects are changed, the suggestion is to create an event change who will go through the selects by adding up and then play the result in a span retaining the total value.

Put the total value (without the R$) within a span with a id:

<strong>Valor Total:</strong>
<span style="font-family: Arial">
   R$ <span id="valortotal">0,00</span>
</span>

Another thing is to create a way to identify select options by codes. To do this put a data-tipo in each option with a number that will be the price identifier:

<select class="TipoPassageiro" name="TipoDocumento[]" class="form-control">
   <option>Pax</option>
   <option data-tipo="1" value="Adulto">Adulto</option>
   <option data-tipo="2" value="Adolescente entre 12 e 18 anos">Adolescente entre 12 e 18 anos</option>
   <option data-tipo="3" value="Criança entre 6 e 12 anos">Criança entre 6 e 12 anos</option>
   <option data-tipo="4" value="Criança de colo de até 6 anos">Criança de colo de até 6 anos</option>
</select>

So, type 1 = adult, type 2 = adolescent etc..

At the event change create an object where each item refers to a type of value, and do not need to quote prices, since decimals are separated by . (dot):

$(document).on("change", ".TipoPassageiro", function(){

   // objeto com os preços separados por "tipo"
    var precos = {
       tipo1: 140.50,
       tipo2: 120.00,
       tipo3: 90.00,
       tipo4: 60.10
    }

    // inicia o valor total com 0
    var valor_total = 0;

    // laço que irá percorrer os selects e somar de acordo com o tipo selecionado
    $(".TipoPassageiro").each(function(){

       // pega o valor do tipo (1, 2, 3 ou 4)
       var tipo = $("option:selected", this).data("tipo");

       // só inclui na soma o select que tiver um tipo selecionado
       if(tipo) valor_total += parseFloat(precos['tipo'+tipo]);
    });

    // formata a soma final com duas casas decimais separadas por vírgula
    $("#valortotal").text(valor_total.toFixed(2).replace(".", ","));

 });

Just replace the above prices with PHP code. When making the sums I used parseFloat() in case at some point you will use pennies.

Example:

$(function () {
   
   function removeCampo() {
         $(".removerCampo").unbind("click");
         $(".removerCampo").bind("click", function () {
            if($("tr.linhas").length > 1){
                 $(this).parent().parent().remove();
            }
         });
   }
   $(".adicionarCampo").click(function () {
      if ($('.linhas').length < 15) {
          novoCampo = $("tr.linhas:first").clone();
          novoCampo.find('input[type="text"]').val("");
          novoCampo.find('select').val("");
          novoCampo.insertAfter("tr.linhas:last");
          removeCampo();
      }
    });
    
   $(document).on("change", ".TipoPassageiro", function(){
   
       var precos = {
          tipo1: 140.50,
          tipo2: 120.00,
          tipo3: 90.00,
          tipo4: 60.10
       }
       
       var valor_total = 0;
   
       $(".TipoPassageiro").each(function(){
          var tipo = $("option:selected", this).data("tipo");
          if(tipo) valor_total += parseFloat(precos['tipo'+tipo]);
       });
      
       $("#valortotal").text(valor_total.toFixed(2).replace(".", ","));
   
    });
 });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table border="0" width="100%">
  <tr class='linhas'>
    <td>
    <table border="0" width="100%">
      <tr>
        <td  style="padding: 5px">
         <select class="TipoPassageiro" name="TipoDocumento[]" class="form-control">
            <option>Pax</option>
            <option data-tipo="1" value="Adulto">Adulto</option>
            <option data-tipo="2" value="Adolescente entre 12 e 18 anos">Adolescente entre 12 e 18 anos</option>
            <option data-tipo="3" value="Criança entre 6 e 12 anos">Criança entre 6 e 12 anos</option>
            <option data-tipo="4" value="Criança de colo de até 6 anos">Criança de colo de até 6 anos</option>
         </select>
        </td>
      <td  style="padding: 5px"><input type="text" name="NomePAX[]" class="form-control" placeholder="Nome do pax" value=""></td>
      <td  style="padding: 5px">
        <select class="TipoDocumento" name="TipoDocumento[]" class="form-control">
          <option>Tipo de documento</option>
          <option value="Carteira de Identidade">Carteira de Identidade</option>
          <option value="Carteira Nacional de Habilitação">Carteira Nacional de Habilitação</option>
          <option value="Carteira de Trabalho">Carteira de Trabalho</option>
          <option value="Certidão de Nascimento">Certidão de Nascimento</option>
          <option value="Passaporte">Passaporte</option>
          <option value="Cédula de Identidade Estrangeira">Cédula de Identidade Estrangeira</option>
          <option value="Outros">Outros</option>
        </select>
      </td>
      <td  style="padding: 5px">
         <input type="text" name="Documento[]" class="form-control" placeholder="RG da pessoa autorizada" value="">
      </td>
      <td  style="padding: 5px">
         <input type="text" name="OrgaoEmissor[]" class="form-control" placeholder="Órgão Emissor" value="">
      </td>
    </tr>
  </table>
  </td>
      <td style="padding: 5px" valign="top"><button type="button" class="removerCampo btn btn-danger" title="Remover linha"><i class="fa fa-minus-square" aria-hidden="true"></i> Remover</button></td>
  <tr>
      <td colspan="3"><button type="button" class="adicionarCampo btn btn-primary" title="Adicionar item"><i class="fa fa-plus-square" aria-hidden="true"></i> Adicionar mais passageiros</button></td>
  </tr>
  </table>
  <div class="text-right">
    <strong>Valor do Pacote:</strong> <span style="font-family: Arial"> R$ 150,00</span><br>
    <strong>Valor Total:</strong> <span style="font-family: Arial"> R$ <span id="valortotal">0,00</span></span>
  </div>

  • 1

    Excellent Sam. I swear I thought it was impossible. Thank you very much!

  • 1

    I’m glad it worked out.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.