Commit 04e6c7d0 by Billy Larru

[EDIT leyendo horario de salida diferente de 00:00 y 24:00]

parent 5a1dc576
......@@ -24,222 +24,226 @@ import salidasautomaticas.util.EstandarDAO;
*/
public class SalidasMysqlDAO implements SalidasDAO {
private static final Logger log = LogManager.getLogger(SalidasMysqlDAO.class);
@Override
public JSONArray obtenerHorariosSalida() throws Exception {
JSONArray jsonArray = new JSONArray();
int diaSemana = obtenerDiaSemana();
if (diaSemana == 7) {
return jsonArray;
}
Connection cn = MysqlDAOFactory.obtenerConexion("nuevo");
String query = "SELECT {campo_salida} as salida FROM ("
+ "SELECT"
+ " p.salidaLV, "
+ " p.salidaS "
+ "FROM "
+ "personal p "
+ "WHERE "
+ "p.codtipo!=3 "//Que registren asistencia
+ "AND p.retirado = 0 "
+ "AND NOT p.codlocal IN ('L035', 'L053', 'L038') "//Que no sea profesores por horas, pronoe belisario y grupo MH
+ "AND NOT p.pronoe = 1 "//Que no sea pronoe
+ "AND NOT p.codcargo IN (71, 13, 96, 41) "//Que no sea policia ni de cafeteria ni vigilante ni interna psicologa
+ "AND p.tmp_id not in (99998, 9998, 99999, 9888) "//Que esten en planilla
+ "AND NOT p.horaing > 19 "
+ "AND NOT p.salidaS = '') as tabla WHERE NULLIF( {campo_salida} , '') is NOT null GROUP BY {campo_salida} ";
if (diaSemana >= 1 && diaSemana <= 5) {
query = query.replaceAll("\\{campo_salida\\}", "tabla.salidaLV");
} else if (diaSemana == 6) {
query = query.replaceAll("\\{campo_salida\\}", "tabla.salidaS");
}
jsonArray = EstandarDAO.getInstance().consultar(cn, query);
return jsonArray;
}
private int obtenerDiaSemana() {
int diaSemana;
LocalDate date = LocalDate.now();
diaSemana = date.getDayOfWeek().getValue();
return diaSemana;
}
private String getFechaHoy() {
String fechaHoy;
LocalDate date = LocalDate.now();
int anio = date.getYear();
int mes = date.getMonthValue();
int dia = date.getDayOfMonth();
fechaHoy = String.format("%s-%02d-%02d", anio, mes, dia);
return fechaHoy;
}
private String getFechaAyer() {
String fechaAyer;
LocalDate date = LocalDate.now();
date = date.minusDays(1);
int anio = date.getYear();
int mes = date.getMonthValue();
int dia = date.getDayOfMonth();
fechaAyer = String.format("%s-%02d-%02d", anio, mes, dia);
return fechaAyer;
}
@Override
public JSONArray obtenerAsistencias(String horaProgramada) throws Exception {
Connection cn = MysqlDAOFactory.obtenerConexion("nuevo");
String fechaPartida = "2018-01-01";
String query = "SELECT * from "
+ "(select "
+ " asistencia.codasis, "
+ "asistencia.fecha_asis, "
+ "{campo_salida} as salida "
+ "FROM "
+ " asistencia "
+ "INNER JOIN personal ON asistencia.codper = personal.codper "
+ "WHERE "
+ " asistencia.horasal = '' "
+ "AND asistencia.minsal = '' "
+ "AND ( {campo_salida} <= ? AND asistencia.fecha_asis='{fecha_hoy}' "//Se setea la horaProgramada como parametro en "?"
+ "OR asistencia.fecha_asis BETWEEN '{fecha_partida}' AND '{fecha_ayer}') "
+ "AND {campo_salida} is not NULL "
+ "AND NOT personal.codlocal IN ('L035', 'L053', 'L038') "//Que no sea profesores por horas, pronoe belisario y grupo MH
+ "AND NOT personal.codcargo IN (71, 13, 96, 41) "//Que no sea policia ni de cafeteria ni vigilante ni interna psicologa
+ "AND NOT personal.pronoe = 1 " //Que no sea pronoe
+ "AND (WEEKDAY(asistencia.fecha_asis) + 1) !=7 " //Que no sea domingo
+ "AND NOT ( (WEEKDAY(asistencia.fecha_asis) + 1)=6 and personal.codcargo in ({cod_cargo_primaria}) ) " //Que no sean de primaria los sabados
+ "AND asistencia.estado in (1, 2, 5) "//Que sean asistio, tardanza y no marco
+ "AND personal.tmp_id not in (99998, 9998, 99999, 9888) "//Que esten en planilla
+ "AND personal.codtipo!=3 "//Que si registren asistencia
+ "AND personal.retirado=0) as tabla " //Que no esten retirados
+ "where tabla.salida!=''";
String campoSalida = "("
+ "case "
+ "when (WEEKDAY(asistencia.fecha_asis) + 1)<6 then salidaLV "
+ "when (WEEKDAY(asistencia.fecha_asis) + 1)=6 then salidaS end "
+ ") ";
String codCargoPrimaria = "1, 2, 4, 9, 11, 12, 20, 25, 33, 39, 40, 45, 51";
query = query.replaceAll("\\{campo_salida\\}", campoSalida);
query = query.replaceAll("\\{fecha_hoy\\}", getFechaHoy());
query = query.replaceAll("\\{fecha_partida\\}", fechaPartida);
query = query.replaceAll("\\{fecha_ayer\\}", getFechaAyer());
query = query.replaceAll("\\{cod_cargo_primaria\\}", codCargoPrimaria);
JSONArray parametros = new JSONArray();
parametros.put(horaProgramada);
JSONArray jsonArray = EstandarDAO.getInstance().consultar(cn, query, parametros);
return jsonArray;
}
@Override
public JSONObject actualizarSalida(String horaSalida) throws Exception {
JSONObject resultado = new JSONObject();
Connection cn = MysqlDAOFactory.obtenerConexion("nuevo");
int aleatorioHora = 0, aleatorioMin = 0;
JSONArray listaAsistencias = obtenerAsistencias(horaSalida);
log.info("hora de salida=" +horaSalida+ ", asistencias para actualizar=" + listaAsistencias.length());
Instant inicioEjecucion = Instant.now();
int[] updateCounts = new int[listaAsistencias.length()];
boolean updateAll = false;
int i = 0;
for (Iterator it = listaAsistencias.iterator(); it.hasNext();) {
JSONObject asistencia = (JSONObject) it.next();
String salidaPersonal = asistencia.getString("salida");
if (salidaPersonal == null || salidaPersonal.isEmpty()) {
updateCounts[i] = -1;
continue;
}
int[] aleatorio = generarHoraMinutoAleatorio(salidaPersonal);
aleatorioHora = aleatorio[0];
aleatorioMin = aleatorio[1];
String queryPersonal = "update asistencia set horasal= ?,minsal=? where codasis=? ";
JSONArray parametros = new JSONArray();
parametros
.put(aleatorioHora)
.put(aleatorioMin)
.put(asistencia.getString("codasis"));
resultado = EstandarDAO.getInstance().ejecutar(cn, queryPersonal, parametros);
updateCounts[i] = resultado.getInt("msg");
i++;
}
Instant finEjecucion = Instant.now();
Duration duracionProceso = Duration.between(inicioEjecucion, finEjecucion);
log.info("El proceso ha durado " + duracionProceso);
int cont0=0;
int cont1 =0;
for(int update : updateCounts){
if(update==1)cont1++;
else if(update==0) cont0++;
}
if(cont1==updateCounts.length && cont1!=0){
resultado.put("msg", 1);
log.info("Se actualizaron todas las filas, ["+horaSalida+"]");
}
else if(cont1>0){
resultado.put("msg", 2);
log.info("Se actualizaron algunas filas y otras no, ["+horaSalida+"]");
}
else if(cont0==updateCounts.length){
resultado.put("msg", 0);
log.info("No se ha actualizado ninguna fila, ["+horaSalida+"]");
}
return resultado;
}
private int[] generarHoraMinutoAleatorio(String horaMinuto) {
int[] aleatorio = new int[2];//horaAleatoria index=0, minAleatorio index=1
String[] splitHoraConsulta = horaMinuto.split(":");
int min = Integer.parseInt(splitHoraConsulta[1]);
int hora = Integer.parseInt(splitHoraConsulta[0]);
private static final Logger log = LogManager.getLogger(SalidasMysqlDAO.class);
@Override
public JSONArray obtenerHorariosSalida() throws Exception {
JSONArray jsonArray = new JSONArray();
int diaSemana = obtenerDiaSemana();
if (diaSemana == 7) {
return jsonArray;
}
Connection cn = MysqlDAOFactory.obtenerConexion("nuevo");
String query = "SELECT {campo_salida} as salida FROM ("
+ "SELECT"
+ " p.salidaLV, "
+ " p.salidaS "
+ "FROM "
+ "personal p "
+ "WHERE "
+ "p.codtipo!=3 "//Que registren asistencia
+ "AND p.retirado = 0 "
+ "AND NOT p.codlocal IN ('L035', 'L053', 'L038') "//Que no sea profesores por horas, pronoe belisario y grupo MH
+ "AND NOT p.pronoe = 1 "//Que no sea pronoe
+ "AND NOT p.codcargo IN (71, 13, 96, 41) "//Que no sea policia ni de cafeteria ni vigilante ni interna psicologa
+ "AND p.tmp_id not in (99998, 9998, 99999, 9888) "//Que esten en planilla
+ "AND NOT p.horaing > 19 "
+ "AND NOT p.salidaS = '') as tabla "
+ "WHERE NULLIF( {campo_salida} , '') is NOT null "
+ "AND ({campo_salida}!='24:00' AND {campo_salida}!='00:00')"
+ "GROUP BY {campo_salida} ";
if (diaSemana >= 1 && diaSemana <= 5) {
query = query.replaceAll("\\{campo_salida\\}", "tabla.salidaLV");
} else if (diaSemana == 6) {
query = query.replaceAll("\\{campo_salida\\}", "tabla.salidaS");
}
jsonArray = EstandarDAO.getInstance().consultar(cn, query);
return jsonArray;
}
private int obtenerDiaSemana() {
int diaSemana;
LocalDate date = LocalDate.now();
diaSemana = date.getDayOfWeek().getValue();
return diaSemana;
}
private String getFechaHoy() {
String fechaHoy;
LocalDate date = LocalDate.now();
int anio = date.getYear();
int mes = date.getMonthValue();
int dia = date.getDayOfMonth();
fechaHoy = String.format("%s-%02d-%02d", anio, mes, dia);
return fechaHoy;
}
private String getFechaAyer() {
String fechaAyer;
LocalDate date = LocalDate.now();
date = date.minusDays(1);
int anio = date.getYear();
int mes = date.getMonthValue();
int dia = date.getDayOfMonth();
fechaAyer = String.format("%s-%02d-%02d", anio, mes, dia);
return fechaAyer;
}
@Override
public JSONArray obtenerAsistencias(String horaProgramada) throws Exception {
Connection cn = MysqlDAOFactory.obtenerConexion("nuevo");
String fechaPartida = "2018-01-01";
String query = "SELECT * from "
+ "(select "
+ " asistencia.codasis, "
+ "asistencia.fecha_asis, "
+ "{campo_salida} as salida "
+ "FROM "
+ " asistencia "
+ "INNER JOIN personal ON asistencia.codper = personal.codper "
+ "WHERE "
+ " asistencia.horasal = '' "
+ "AND asistencia.minsal = '' "
+ "AND ( {campo_salida} <= ? AND asistencia.fecha_asis='{fecha_hoy}' "//Se setea la horaProgramada como parametro en "?"
+ "OR asistencia.fecha_asis BETWEEN '{fecha_partida}' AND '{fecha_ayer}') "
+ "AND {campo_salida} is not NULL "
+ "AND NOT personal.codlocal IN ('L035', 'L053', 'L038') "//Que no sea profesores por horas, pronoe belisario y grupo MH
+ "AND NOT personal.codcargo IN (71, 13, 96, 41) "//Que no sea policia ni de cafeteria ni vigilante ni interna psicologa
+ "AND NOT personal.pronoe = 1 " //Que no sea pronoe
+ "AND (WEEKDAY(asistencia.fecha_asis) + 1) !=7 " //Que no sea domingo
+ "AND NOT ( (WEEKDAY(asistencia.fecha_asis) + 1)=6 and personal.codcargo in ({cod_cargo_primaria}) ) " //Que no sean de primaria los sabados
+ "AND asistencia.estado in (1, 2, 5) "//Que sean asistio, tardanza y no marco
+ "AND personal.tmp_id not in (99998, 9998, 99999, 9888) "//Que esten en planilla
+ "AND personal.codtipo!=3 "//Que si registren asistencia
+ "AND personal.retirado=0) as tabla " //Que no esten retirados
+ "where tabla.salida!=''";
String campoSalida = "("
+ "case "
+ "when (WEEKDAY(asistencia.fecha_asis) + 1)<6 then salidaLV "
+ "when (WEEKDAY(asistencia.fecha_asis) + 1)=6 then salidaS end "
+ ") ";
String codCargoPrimaria = "1, 2, 4, 9, 11, 12, 20, 25, 33, 39, 40, 45, 51";
query = query.replaceAll("\\{campo_salida\\}", campoSalida);
query = query.replaceAll("\\{fecha_hoy\\}", getFechaHoy());
query = query.replaceAll("\\{fecha_partida\\}", fechaPartida);
query = query.replaceAll("\\{fecha_ayer\\}", getFechaAyer());
query = query.replaceAll("\\{cod_cargo_primaria\\}", codCargoPrimaria);
JSONArray parametros = new JSONArray();
parametros.put(horaProgramada);
JSONArray jsonArray = EstandarDAO.getInstance().consultar(cn, query, parametros);
return jsonArray;
}
@Override
public JSONObject actualizarSalida(String horaSalida) throws Exception {
JSONObject resultado = new JSONObject();
Connection cn = MysqlDAOFactory.obtenerConexion("nuevo");
int aleatorioHora = 0, aleatorioMin = 0;
JSONArray listaAsistencias = obtenerAsistencias(horaSalida);
log.info("hora de salida=" + horaSalida + ", asistencias para actualizar=" + listaAsistencias.length());
Instant inicioEjecucion = Instant.now();
int[] updateCounts = new int[listaAsistencias.length()];
boolean updateAll = false;
int i = 0;
for (Iterator it = listaAsistencias.iterator(); it.hasNext();) {
JSONObject asistencia = (JSONObject) it.next();
String salidaPersonal = asistencia.getString("salida");
if (salidaPersonal == null || salidaPersonal.isEmpty()) {
updateCounts[i] = -1;
continue;
}
int[] aleatorio = generarHoraMinutoAleatorio(salidaPersonal);
aleatorioHora = aleatorio[0];
aleatorioMin = aleatorio[1];
String queryPersonal = "update asistencia set horasal= ?,minsal=? where codasis=? ";
JSONArray parametros = new JSONArray();
parametros
.put(aleatorioHora)
.put(aleatorioMin)
.put(asistencia.getString("codasis"));
resultado = EstandarDAO.getInstance().ejecutar(cn, queryPersonal, parametros);
updateCounts[i] = resultado.getInt("msg");
i++;
}
Instant finEjecucion = Instant.now();
Duration duracionProceso = Duration.between(inicioEjecucion, finEjecucion);
log.info("El proceso ha durado " + duracionProceso);
int cont0 = 0;
int cont1 = 0;
for (int update : updateCounts) {
if (update == 1) {
cont1++;
} else if (update == 0) {
cont0++;
}
}
if (cont1 == updateCounts.length && cont1 != 0) {
resultado.put("msg", 1);
log.info("Se actualizaron todas las filas, [" + horaSalida + "]");
} else if (cont1 > 0) {
resultado.put("msg", 2);
log.info("Se actualizaron algunas filas y otras no, [" + horaSalida + "]");
} else if (cont0 == updateCounts.length) {
resultado.put("msg", 0);
log.info("No se ha actualizado ninguna fila, [" + horaSalida + "]");
}
return resultado;
}
private int[] generarHoraMinutoAleatorio(String horaMinuto) {
int[] aleatorio = new int[2];//horaAleatoria index=0, minAleatorio index=1
String[] splitHoraConsulta = horaMinuto.split(":");
int min = Integer.parseInt(splitHoraConsulta[1]);
int hora = Integer.parseInt(splitHoraConsulta[0]);
// Actualizacion de salidas
if (min == 0) {
aleatorio[0] = (int) Math.floor(Math.random() * 2 + (hora - 1));
} else {
aleatorio[0] = hora;
}
if (hora == aleatorio[0]) {
if (min == 0) {
aleatorio[1] = (int) Math.floor(Math.random() * (3 - 0 + 1) + 0);
} else {
aleatorio[1] = (int) Math.floor(Math.random() * (33 - 27 + 1) + 27);
}
} else {
aleatorio[1] = (int) Math.floor(Math.random() * 3 + 57);
}
return aleatorio;
}
}
\ No newline at end of file
if (min == 0) {
aleatorio[0] = (int) Math.floor(Math.random() * 2 + (hora - 1));
} else {
aleatorio[0] = hora;
}
if (hora == aleatorio[0]) {
if (min == 0) {
aleatorio[1] = (int) Math.floor(Math.random() * (3 - 0 + 1) + 0);
} else {
aleatorio[1] = (int) Math.floor(Math.random() * (33 - 27 + 1) + 27);
}
} else {
aleatorio[1] = (int) Math.floor(Math.random() * 3 + 57);
}
return aleatorio;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment