Olá!
Estou desenvolvendo um sistema usando Spring Boot, Spring Data, Thymeleaf, Bootstrap, HTML5, JQuery e estou finalizando uma tela de “envio de lotes de boletos”, que contém uma tabela “dinâmica” com os boletos solicitados pelo usuário em um momento anterior.
A primeira coluna da tabela é um checkbox que o usuário vai usar pra selecionar os boletos que vão fazer parte do lote.
<table id="boletossolicitados" class="table table-hover">
<thead>
<tr class="table-active">
<th><input id="checktodos" type="checkbox" title="Selecionar todos boletos"></th>
<th>Exercício</th>
<th>Nosso número</th>
<th>Código do contribuinte</th>
<th>Razão social</th>
<th>CPF/CNPJ</th>
<th>Valor principal</th>
<th>Valor artigo 600 da CLT</th>
<th>Valor Lei 8022/1990</th>
<th>Data do pagamento</th>
<th>Valor do pagamento</th>
<th>Forma de cálculo</th>
<th>CPF/CNPJ fonte pagadora</th>
</tr>
</thead>
<tbody>
<tr th:each="boleto : ${boletosolicitados}" class="table-light">
<td>
<div class="form-check">
<input type="checkbox" class="form-check-input" th:id="${boleto.id}">
</div>
</td>
<td th:text="${boleto.exercicio}"></td>
<td th:text="${boleto.nossoNumeroAtual}"></td>
<td th:text="${boleto.contribuinte.codigo}"></td>
<td th:text="${boleto.contribuinte.razaoSocial}"></td>
<td th:text="${boleto.contribuinte.numeroDoDocumentoFormatado}"></td>
<td th:text="${boleto.valorPrincipalDoBoleto}"></td>
<td th:text="${boleto.valorEstimado600CLT}"></td>
<td th:text="${boleto.valorEstimado8022}"></td>
<td th:text="${boleto.dataPagamentoCR}"></td>
<td th:text="${boleto.valorPagamentoCR}"></td>
<td th:text="${boleto.formaDeCalculoUtilizada.label}"></td>
<td th:text="${boleto.cpfcnpjFontePagtoCR}"></td>
</tr>
</tbody>
</table>
<a id="enviarlotebtn" class="btn btn-primary btn-lg" title="Enviar lote para a FAESP com os boletos selecionados acima" href="#">Enviar lote</a>
Quando o usuário clica no botão “Enviar lote”, eu verifico(via JavaScript) a existência de pelo menos um boleto selecionado, caso contrário, é exibida uma mensagem informando da necessidade de selecionar boletos para o envio.
Se estiver tudo ok, um modal é exibido para confirmar o envio do lote:
<!-- MODAL CONFIRMAÇÃO ENVIO LOTE -->
<div class="confirmacaoenviolote">
<div class="modal fade" id="confirmacaoenvioloteModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalCenterTitle">ATENÇÃO !</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<h5>Confirma o envio do lote de boleto(s) ?</h5>
</div>
<div class="modal-footer">
<a class="btn btn-primary" id="confirmarEnvioBtn" th:href="@{enviarlote}">Confirmar</a>
<button type="button" class="btn btn-secondary" data-dismiss="modal">Não</button>
</div>
</div>
</div>
</div>
</div>
Se estiver tudo ok, o código javascript abaixo é executado para obter os id´s dos boletos selecionados (note que atribui o id do boleto ao id do checkbox usando th:id="${boleto.id}" do thymeleaf):
$('.confirmacaoenviolote #confirmarEnvioBtn').on('click', function(event){
event.preventDefault();
var idsvar = [];
$("#boletosselecionados tr").each(function(){
if($(this).find("input[type='checkbox']").is(":checked")){
var id = $(this).find("input[type='checkbox']").attr('id');
if(id != "checktodos"){
idsvar.push(id);
}
}
});
var data = {ids: idsvar};
var url = $(this).attr('href');
$.post(url, data);
});
O médoto “$.post(url, data);” executa o seguinte método no meu Spring Boot Controller:
@PostMapping(value = "/enviarlote")
public ModelAndView enviarLoteBoleto(@RequestParam("ids[]") String[] ids) {
HashMap<String, Object> retorno = this.loteBoletoCobrancaService.verificarBoletosLimitaMaximoUltrapassado(ids);
if(retorno!=null) {
String view = (String) retorno.get("redirecionarpagina");
ModelAndView mv = new ModelAndView(view);
mv.addObject("boletosselecionados", retorno.get("boletosselecionados"));
mv.addObject("boletoslimiteultrapassado", retorno.get("boletoslimiteultrapassado"));
mv.addObject("impossibilidadecriacaolote", retorno.get("impossibilidadecriacaolote"));
mv.addObject("boletosdivergentes", retorno.get("boletosdivergentes"));
mv.addObject("haBoletosLimiteMinimoUltrapassado", retorno.get("haBoletosLimiteMinimoUltrapassado"));
return mv;
}
return new ModelAndView("el/envioDeLotes");
}
O método “verificarBoletosLimitaMaximoUltrapassado()” na minha @Service “loteBoletoCobrancaService” verifica se os boletos selecionados para envio estão dentro de um prazo mínimo de pagamento (defini o mínimo de 10 dias para o pagamento do boleto contando a partir da data de envio do lote), se houver boletos com o prazo ultrapassado, o usuário deverá ser redirecionado para outra página que contém uma tabela com os boletos de prazo ultrapassado, e decidirá se continuará com o envio ou voltar e selecionar novos boletos.
Se não houver boletos com prazo ultrapassado, o método “verificarBoletosLimitaMaximoUltrapassado()” chamará outro método dentro da minha @Service que verificará se há boletos com valores divergentes (valor de pagamento informado pelo usuário abaixo do valor calculado do boleto), e caso houver, o usuário deverá ser redirecionado também para outra página que contém também uma tabela com os boletos com valores divergentes. E decidirá se continua com o processo de envio ou volta e seleciona novos boletos.
Se estiver tudo ok após todas as verificações na minha @Service, a página “envio de lotes de boletos” deverá ser atualizada, uma mensagem de sucesso será exibida e a tabela de boletos solicitados não conterá mais os boletos enviados no lote.
Observação: O método “verificarBoletosLimitaMaximoUltrapassado()” retorna um HashMap contendo os objetos e uma String “redirecionarpagina” que informará a página que o usuário deverá ser redirecionado.
A lógica toda está pronta, a minha dificuldade está em redirecionar o usuário de acordo com a view que eu setar no meu ModelAndView do método no @Controller…
Não sei se o método $.post é a melhor opção pois quando todo o código(já testei depurando, o parâmetro “ids” chega com os id´s corretamente e o código é executado sem erros) no meu @Controller é executado, não acontece nada.
Creio que o ajax não é a melhor alternativa neste caso, pois o usuário será redirecionado para outra página, o processo de envio do lote vai funcionar como um Wizard…
Alguém teria uma solução para o meu caso? Obrigado…