Oi boa tarde, estou com problemas para desenvolver uma calculadora de prazos.
O usuário deve inserir a data inicial e a quantidade de dias de projeto, ai a calculadora da como resultado qual a data final em dias uteis desse projeto e uma lista em XML ou JSON com os feriados e datas comemorativas desse período.
isoo foi oque eu consegui fazer, mas não funciona, poderiam me ajudar?
package command;
import java.util.Calendar;
import java.util.Date;
public class Calculadora{
private static final int HOLIDAY = 0;
public static int nuDiasExecutadosUteis (Date inicio) {
//Numero de dias que se passaram, sem contar com a data de inicio e data de fim
//Observação: Contando que a data inicio e data fim sejam dias uteis
int nuDiasExecutados = (int) (new Date().getTime() - inicio.getTime ()) / 86400000;
int totalDiasExecutadosUteis = 0;
Calendar cal = Calendar.getInstance();
cal.setTime(inicio);
for (int i = 1; i < nuDiasExecutados ; i++){
//Acrescenta mais um dia na data para poder verificar se é dia util
cal.add(Calendar.DATE, 1);
//Verifica se não é dia uti
if (cal.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY && cal.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY
&& cal.get(Calendar.DAY_OF_WEEK) != HOLIDAY ) {
totalDiasExecutadosUteis += 1;
}
}
return totalDiasExecutadosUteis;
}
}
Acredito que antes de mais nada, você deve considerar ter uma base para cadastro de feriados, ou se tiver uma api gratuita que possa consultar… mas lembre-se que existem feriados locais;
Sim toda essa parte eu ja tenho pronta, e ja criei uma pagina para cadastrar os feriados locais e pontos facultativos. Falta só a calculadora/calendario. Encontrei muitas em PHP, porem meu projeto é restrito ao Java
Tenho algo parecido aqui:
public static Date calculaPrazoDataDiasUteis(Date data, int dias) throws Exception{
//Este método receberá a data inicial e a quantidade de dias
int i = 0;
Calendar c = Calendar.getInstance();
c.setTime(data);
//Inicia o contador..
while(i < dias){
if(validaDiaUtil(c.getTime())){
i++;
}
c.add(Calendar.DATE, 1);
}
while(!validaDiaUtil(c.getTime())){
c.add(Calendar.DATE, 1);
}
return c.getTime();
}
private static boolean validaDiaUtil(Date novaData) throws SQLException {
return novaData.getDay() != 0 && novaData.getDay() != 6 && !validaFeriado(novaData);
}
private static boolean validaFeriado(Date data) throws SQLException {
FeriadoDao feriadoDao = new FeriadoDao();
return !feriadoDao.validaFeriado(data);
}
Nao sei se te contempla.
E onde eu chamaria o banco pra ele pular os feriados e datas locais cadastradas?
o metodo validaFeriado da classe FeriadoDao
public boolean validaFeriado(Date data) throws SQLException {
String script = "select * from feriados f where f.data = :data";
preparedStatement = conectarRetorno().prepareStatement(script);
preparedStatement.setDate(1, new java.sql.Date(data.getTime()));
String descFeriado = "";
ResultSet rs = preparedStatement.executeQuery();
if(rs.next()){
descFeriado = rs.getString("FER_DESCRICAO");
}
return descFeriado.equals("") || descFeriado.equals("PRORROGAÇÃO PAGAMENTO DIREX");
}
Ai depende da sua implementação, você pode criar uma tabela que em uma das colunas tem o campo data, daí se a data que você enviou existir nesta tabela, você retorna true indicando que é um feriado.
Neste método estou fazendo um inverso, retorno true quando não é feriado.