diff --git a/src/main/java/jumapacelaya/gob/mx/appmovcom/servicio/AppMovComServicio.java b/src/main/java/jumapacelaya/gob/mx/appmovcom/servicio/AppMovComServicio.java index 5624b7c..3be262a 100644 --- a/src/main/java/jumapacelaya/gob/mx/appmovcom/servicio/AppMovComServicio.java +++ b/src/main/java/jumapacelaya/gob/mx/appmovcom/servicio/AppMovComServicio.java @@ -12,7 +12,7 @@ import jumapacelaya.gob.mx.appmovcom.dto.historialConsumoDTO; import jumapacelaya.gob.mx.appmovcom.dto.mostrarServicioRequest; import jumapacelaya.gob.mx.appmovcom.dto.predioInfoDTO; import jumapacelaya.gob.mx.appmovcom.dto.servicioAsociadoDTO; -import oracle.jdbc.OraclePreparedStatement; +//import oracle.jdbc.OraclePreparedStatement; import javax.sql.DataSource; @@ -510,13 +510,13 @@ public class AppMovComServicio { public Map cambiarPassword(String email, String nuevaPassword) { Map respuesta = new HashMap<>(); - String query = "begin appmovcom.pk_vigilante.sp_cambiapswd(:p_Email, :p_Pswd); end;"; + String query = "begin appmovcom.pk_vigilante.sp_cambiapswd(?, ?); end;"; try (Connection connection = dataSource.getConnection(); - OraclePreparedStatement stmt = (OraclePreparedStatement) connection.prepareStatement(query)) { + CallableStatement stmt = connection.prepareCall(query)) { - stmt.setStringAtName("p_Email", email); - stmt.setStringAtName("p_Pswd", nuevaPassword); + stmt.setString(1, email); + stmt.setString(2, nuevaPassword); stmt.execute(); diff --git a/src/main/java/jumapacelaya/gob/mx/appots/controlador/AppOtsControlador.java b/src/main/java/jumapacelaya/gob/mx/appots/controlador/AppOtsControlador.java new file mode 100644 index 0000000..03a7445 --- /dev/null +++ b/src/main/java/jumapacelaya/gob/mx/appots/controlador/AppOtsControlador.java @@ -0,0 +1,339 @@ +package jumapacelaya.gob.mx.appots.controlador; + +import jumapacelaya.gob.mx.appots.dto.dictamenDTO; +import jumapacelaya.gob.mx.appots.dto.empleadoOrigenDTO; +import jumapacelaya.gob.mx.appots.dto.fotoOTDTO; +import jumapacelaya.gob.mx.appots.dto.motivoPreguntaDTO; +import jumapacelaya.gob.mx.appots.dto.noCommMensajeDTO; +import jumapacelaya.gob.mx.appots.dto.origenDTO; +import jumapacelaya.gob.mx.appots.dto.otDTO; +import jumapacelaya.gob.mx.appots.dto.preguntaDTO; +import jumapacelaya.gob.mx.appots.dto.respuestaOTDTO; +import jumapacelaya.gob.mx.appots.dto.transaccionDTO; +import jumapacelaya.gob.mx.appots.servicio.AppOtsServicio; + +import java.net.URI; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import io.micronaut.http.HttpResponse; +import io.micronaut.http.HttpStatus; +import io.micronaut.http.MediaType; +import io.micronaut.http.annotation.Body; +import io.micronaut.http.annotation.Controller; +import io.micronaut.http.annotation.Get; +import io.micronaut.http.annotation.PathVariable; +import io.micronaut.http.annotation.Put; +import io.micronaut.http.exceptions.HttpStatusException; +import jakarta.inject.Inject; +import jumapacelaya.gob.mx.predios.dto.PredioDTO; +import jumapacelaya.gob.mx.predios.servicio.PredioServicio; + +@Controller("/appots") +public class AppOtsControlador { + + private final AppOtsServicio servicio; + private final PredioServicio pServicio; + + @Inject + public AppOtsControlador(AppOtsServicio servicio, PredioServicio pServicio) { + this.servicio = servicio; + this.pServicio = pServicio; + } + + @Get("/infopredioappots/{vPredContrRefer}") + public HttpResponse obtenerPredioAppOts(@PathVariable String vPredContrRefer) { + PredioDTO dto = pServicio.obtenerPredioAppOts(vPredContrRefer); + if (dto == null) { + return HttpResponse.notFound(); + } + return HttpResponse.ok(dto); + } + + @Get("/infopredio/{predioid}") + public HttpResponse redirigirAConsultaPredio(@PathVariable Long predioid) { + String redirPath = "/predios/appots/{id}" + predioid; + return HttpResponse.redirect(URI.create(redirPath)); + } + + @Get("/ots/predio/{predioid}") + public HttpResponse> obtenerOTsPorPredio(@PathVariable Long predioid) { + List lista = servicio.obtenerOTsPorPredio(predioid); + return HttpResponse.ok(lista); + } + + //Consulta OTs Pendientes ↓ + @Get("/todo/ot/{otid}") + public otDTO obtenerOT(@PathVariable Long otid) { + List lista = servicio.obtenerInfoGralOT(otid); + + if (lista != null && !lista.isEmpty()) { + return lista.get(0); // ✅ Solo devolvemos el primer resultado + } else { + throw new HttpStatusException(HttpStatus.NOT_FOUND, "No se encontró la OT con ID " + otid); + } + } + + //Consulta OTs ↓ + @Get("/todo/prog/cuadrilla/{cuadrillaId}/{motivoId}") + public HttpResponse> obtenerOtsPorCuadrillaYMotivo(@PathVariable String cuadrillaId, + @PathVariable String motivoId) { + List resultado = servicio.obtenerOtsProgramadasPorCuadrillaYMotivo(cuadrillaId, motivoId); + if (resultado.isEmpty()) { + throw new HttpStatusException(HttpStatus.NOT_FOUND, "No se encontraron OTs para los filtros dados."); + } + return HttpResponse.ok(resultado); + } + + @Get("/todo/prog/motivo/{origenid}/{motivoid}") + public HttpResponse obtenerOtsPorOrigenYMotivo(@PathVariable String origenid, + @PathVariable String motivoid) { + try { + List resultado = servicio.obtenerOtsProgramadasPorOrigenYMotivo(origenid, motivoid); + + if (resultado.isEmpty()) { + return HttpResponse.notFound( + Collections.singletonMap("message", "No se encontraron OTs programadas para los parámetros dados") + ); + } + + return HttpResponse.ok(resultado); + + } catch (Exception e) { + return HttpResponse.serverError( + Collections.singletonMap("message", "Error al obtener OTs programadas: " + e.getMessage()) + ); + } + } + + @Get("/todo/prog/areaorigenmotivo/{areaid}/{origenid}/{motivoid}") + public HttpResponse obtenerOtsProgramadasPorAreaOrigenMotivo(@PathVariable String areaid, + @PathVariable String origenid, + @PathVariable String motivoid) { + try { + List resultado = servicio.obtenerOtsProgramadasPorAreaOrigenMotivo(areaid, origenid, motivoid); + if (resultado.isEmpty()) { + return HttpResponse.notFound(Collections.singletonMap("message", "No se encontraron OTs programadas con los parámetros proporcionados")); + } + return HttpResponse.ok(resultado); + } catch (Exception e) { + return HttpResponse.serverError( + Collections.singletonMap("message", "Error al obtener OTs programadas por área, origen y motivo: " + e.getMessage()) + ); + } + } + //Consulta OTs ↑ + //Consulta OTs Pendientes ↑ + + //Consulta Catalogos ↓ + @Get("/catalogos/origenes/{origenid}") + public HttpResponse obtenerOrigenes(@PathVariable String origenid) { + List origenes = servicio.obtenerOrigenes(origenid); + return HttpResponse.ok(origenes); + } + + @Get("/catalogos/motivos/{motivoid}") + public HttpResponse obtenerMotivos(@PathVariable String motivoid) { + try { + List> resultado = servicio.obtenerMotivos(motivoid); + return HttpResponse.ok(resultado); + } catch (Exception e) { + return HttpResponse.serverError( + Collections.singletonMap("message", "Error interno: " + e.getMessage()) + ); + } + } + + @Get("/catalogos/motivosarea/{areaid}/{motivoid}") + public HttpResponse obtenerMotivosPorAreaYMotivo(@PathVariable String areaid, + @PathVariable String motivoid) { + try { + List> resultado = servicio.obtenerMotivosPorAreaYMotivo(areaid, motivoid); + return HttpResponse.ok(resultado); + } catch (Exception e) { + return HttpResponse.serverError(Collections.singletonMap("error", e.getMessage())); + } + } + + @Get("/catalogos/motivossuspen/{motsusid}") + public HttpResponse obtenerMotivoSusp(@PathVariable String motsusid) { + try { + Integer id = "all".equalsIgnoreCase(motsusid) ? null : Integer.valueOf(motsusid); + List> resultado = servicio.obtenerMotivoSusp(id); + return HttpResponse.ok(resultado); + } catch (Exception e) { + return HttpResponse.serverError( + Collections.singletonMap("error", "Error al consultar motivos de suspensión: " + e.getMessage()) + ); + } + } + + @Get("/catalogos/preguntas/{preguntaid}/{dato}") + public HttpResponse obtenerPreguntas(@PathVariable String preguntaid, + @PathVariable Optional dato) { + try { + List resultado = servicio.obtenerPreguntas(preguntaid, dato.orElse("")); + return HttpResponse.ok(resultado); + } catch (Exception e) { + return HttpResponse.serverError(Collections.singletonMap("error", e.getMessage())); + } + } + + @Get("/catalogos/unimed/{umid}") + public HttpResponse obtenerUnidadMedida(@PathVariable String umid) { + try { + List> resultado = servicio.obtenerUnidadesMedida(umid); + return HttpResponse.ok(resultado); + } catch (Exception e) { + return HttpResponse.serverError( + Map.of("message", "Internal Server Error", + "_embedded", Map.of("errors", List.of(Map.of("message", "Error al obtener unidad de medida: " + e.getMessage()))) + ) + ); + } + } + + @Get("/catalogos/motpreg/{motivoid}/{preguntaid}") + public HttpResponse obtenerMotivoPreguntas(@PathVariable String motivoid, + @PathVariable String preguntaid) { + try { + List resultado = servicio.obtenerMotivoPreguntas(motivoid, preguntaid); + + return HttpResponse.ok(resultado.isEmpty() + ? Collections.singletonMap("message", "No se encontraron resultados") + : resultado); + + } catch (Exception e) { + return HttpResponse.serverError(Collections.singletonMap("message", + "Error al consultar motivo-pregunta: " + e.getMessage())); + } + } + + @Get("/catalogos/dictamenes/{motivoid}/{dictamenid}") + public HttpResponse obtenerDictamenes(@PathVariable String motivoid, @PathVariable String dictamenid) { + try { + List data = servicio.obtenerDictamenesPorMotivoYDictamen(motivoid, dictamenid); + return HttpResponse.ok(Collections.singletonMap("data", data)); + } catch (Exception e) { + return HttpResponse.serverError(Collections.singletonMap("message", "Error interno: " + e.getMessage())); + } + } + + @Get("/catalogos/cortesfisicos/{motivoid}") + public HttpResponse>> obtenerCortesFisicos(@PathVariable String motivoid) { + List> data = servicio.obtenerCortesFisicos(motivoid); + return HttpResponse.ok(data); + } + + @Get(uri = "/catalogos/empleadosorigen/{origenid}{/usuarioid}", produces = MediaType.APPLICATION_JSON) + public List obtenerEmpleadosPorOrigenYUsuario(@PathVariable String origenid, + @PathVariable(name = "usuarioid") String usuarioid) { + return servicio.obtenerEmpleadosPorOrigenYUsuario(origenid, usuarioid); + } + //Consulta Catalogos ↑ + + //Status OTs ↓ + @Get("/status/enruta/{otid}") + public HttpResponse marcarEnRuta(@PathVariable Long otid) { + return manejarActualizacion(otid, "R"); + } + + @Get("/status/ensitio/{otid}") + public HttpResponse marcarEnSitio(@PathVariable Long otid) { + return manejarActualizacion(otid, "S"); + } + + @Get("/status/comenzada/{otid}") + public HttpResponse marcarComenzada(@PathVariable Long otid) { + return manejarActualizacion(otid, "C"); + } + + @Get("/status/terminada/{otid}") + public HttpResponse marcarTerminada(@PathVariable Long otid) { + return manejarActualizacion(otid, "T"); + } + + @Get("/status/reprogramada/{otid}") + public HttpResponse marcarReprogramada(@PathVariable Long otid) { + return manejarActualizacion(otid, "D"); + } + + private HttpResponse manejarActualizacion(Long otid, String situacion) { + try { + Map result = servicio.actualizarSituacionOT(otid, situacion); + if ("200".equals(result.get("status"))) { + return HttpResponse.ok(result); + } else { + return HttpResponse.serverError(result); + } + } catch (Exception e) { + return HttpResponse.serverError(Map.of( + "status", "500", + "message", "Error: " + e.getMessage(), + "data", Map.of("OTID", otid) + )); + } + } + //Status OTs ↑ + + @Put("/nocomm/ot/{otid}") + public HttpResponse registrarNoComm(@PathVariable Long otid, @Body List mensajes) { + Map result = servicio.registrarAvisoNoComm(otid, mensajes); + if ("200".equals(result.get("status"))) { + return HttpResponse.ok(result); + } else if ("404".equals(result.get("status"))) { + return HttpResponse.notFound(result); + } else { + return HttpResponse.serverError(result); + } + } + + //Guardar información ↓ + @Put("/guardaresp/ot/{otid}") + public HttpResponse guardarRespuestas(@PathVariable Long otid, @Body List otList) { + try { + servicio.guardarRespuestas(otList); + return HttpResponse.ok(new RespuestaOKDTO( + 200, + "Respuestas guardadas exitosamente.", + otid + )); + } catch (Exception e) { + return HttpResponse.serverError(new RespuestaErrorDTO( + 500, + "Error al guardar respuestas: " + e.getMessage(), + otid + )); + } + } + + public record RespuestaOKDTO(int status, String message, Long otid) {} + public record RespuestaErrorDTO(int status, String message, Long otid) {} + + @Put("/guardaresp/fotos/{otid}") + public HttpResponse guardarFotos(@PathVariable Integer otid, + @Body List fotosOT) { + try { + servicio.guardarFotosOT(otid, fotosOT); + return HttpResponse.ok(Map.of( + "status", "200", + "message", "Fotos guardadas exitosamente", + "data", Map.of("OTID", otid) + )); + } catch (Exception e) { + return HttpResponse.serverError(Map.of( + "status", "500", + "message", "Error al guardar las fotos", + "error", e.getMessage() + )); + } + } + + @Get("/guardaresp/comprueba/{transaccid}") + public List obtenerPorTransaccionId(@PathVariable String transaccid) { + return servicio.obtenerPorTransaccionId(transaccid); + } + //Guardar información ↑ +} diff --git a/src/main/java/jumapacelaya/gob/mx/appots/dto/FotoBase64DTO.java b/src/main/java/jumapacelaya/gob/mx/appots/dto/FotoBase64DTO.java new file mode 100644 index 0000000..03c7831 --- /dev/null +++ b/src/main/java/jumapacelaya/gob/mx/appots/dto/FotoBase64DTO.java @@ -0,0 +1,9 @@ +package jumapacelaya.gob.mx.appots.dto; + +public class FotoBase64DTO { + private String base64; + + public String getBase64() { return base64; } + public void setBase64(String base64) { this.base64 = base64; } + +} diff --git a/src/main/java/jumapacelaya/gob/mx/appots/dto/OTHijaDTO.java b/src/main/java/jumapacelaya/gob/mx/appots/dto/OTHijaDTO.java new file mode 100644 index 0000000..f39e62c --- /dev/null +++ b/src/main/java/jumapacelaya/gob/mx/appots/dto/OTHijaDTO.java @@ -0,0 +1,23 @@ +package jumapacelaya.gob.mx.appots.dto; + +public class OTHijaDTO { + private String motivoid; + private String descripcion; + private String motsusid; + + // Getters y Setters + public String getMotivoId() { return motivoid; } + public void setMotivoId(String motivoid) { + this.motivoid = motivoid; + } + + public String getDescripcion() { return descripcion; } + public void setDescripcion(String descripcion) { + this.descripcion = descripcion; + } + + public String getMotSusId() { return motsusid; } + public void setMotSusId(String motsusid) { + this.motsusid = motsusid; + } +} diff --git a/src/main/java/jumapacelaya/gob/mx/appots/dto/dictamenDTO.java b/src/main/java/jumapacelaya/gob/mx/appots/dto/dictamenDTO.java new file mode 100644 index 0000000..8877422 --- /dev/null +++ b/src/main/java/jumapacelaya/gob/mx/appots/dto/dictamenDTO.java @@ -0,0 +1,46 @@ +package jumapacelaya.gob.mx.appots.dto; + +import io.micronaut.core.annotation.Introspected; + +@Introspected +public class dictamenDTO { + + private String dictamenid; + private String descripcion; + private String activo; + private String norealizacion; + private String motivoid; + private String activoMotivo; + + // Getters y setters + + public String getDictamenid() { return dictamenid; } + public void setDictamenid(String dictamenid) { + this.dictamenid = dictamenid; + } + + public String getDescripcion() { return descripcion; } + public void setDescripcion(String descripcion) { + this.descripcion = descripcion; + } + + public String getActivo() { return activo; } + public void setActivo(String activo) { + this.activo = activo; + } + + public String getNorealizacion() { return norealizacion; } + public void setNorealizacion(String norealizacion) { + this.norealizacion = norealizacion; + } + + public String getMotivoid() { return motivoid; } + public void setMotivoid(String motivoid) { + this.motivoid = motivoid; + } + + public String getActivoMotivo() { return activoMotivo; } + public void setActivoMotivo(String activoMotivo) { + this.activoMotivo = activoMotivo; + } +} diff --git a/src/main/java/jumapacelaya/gob/mx/appots/dto/empleadoOrigenDTO.java b/src/main/java/jumapacelaya/gob/mx/appots/dto/empleadoOrigenDTO.java new file mode 100644 index 0000000..4020452 --- /dev/null +++ b/src/main/java/jumapacelaya/gob/mx/appots/dto/empleadoOrigenDTO.java @@ -0,0 +1,102 @@ +package jumapacelaya.gob.mx.appots.dto; + +import io.micronaut.core.annotation.Introspected; + +@Introspected +public class empleadoOrigenDTO { + + private String empleadoid; + private String usuarioid; + private String nombrecompleto; + private String titulo; + private String fechaalt; + private String fechabaj; + private String lector; + private String inspector; + private String cambio; + private String corte; + private String reconexion; + private String cobro; + private String ordtrab; + private String fotos; + private String serv_catastro; + private String sobrante; + private String dictamenot; + private String prorrogas; + private String anularconv; + private String ordenarpreg; + private String jefeid; + private String uniorgid; + private String uniorg; + + // Getters y setters + + public String getEmpleadoid() { return empleadoid; } + public void setEmpleadoid(String empleadoid) { this.empleadoid = empleadoid; } + + public String getUsuarioid() { return usuarioid; } + public void setUsuarioid(String usuarioid) { this.usuarioid = usuarioid; } + + public String getNombrecompleto() { return nombrecompleto; } + public void setNombrecompleto(String nombrecompleto) { this.nombrecompleto = nombrecompleto; } + + public String getTitulo() { return titulo; } + public void setTitulo(String titulo) { this.titulo = titulo; } + + public String getFechaalt() { return fechaalt; } + public void setFechaalt(String fechaalt) { this.fechaalt = fechaalt; } + + public String getFechabaj() { return fechabaj; } + public void setFechabaj(String fechabaj) { this.fechabaj = fechabaj; } + + public String getLector() { return lector; } + public void setLector(String lector) { this.lector = lector; } + + public String getInspector() { return inspector; } + public void setInspector(String inspector) { this.inspector = inspector; } + + public String getCambio() { return cambio; } + public void setCambio(String cambio) { this.cambio = cambio; } + + public String getCorte() { return corte; } + public void setCorte(String corte) { this.corte = corte; } + + public String getReconexion() { return reconexion; } + public void setReconexion(String reconexion) { this.reconexion = reconexion; } + + public String getCobro() { return cobro; } + public void setCobro(String cobro) { this.cobro = cobro; } + + public String getOrdtrab() { return ordtrab; } + public void setOrdtrab(String ordtrab) { this.ordtrab = ordtrab; } + + public String getFotos() { return fotos; } + public void setFotos(String fotos) { this.fotos = fotos; } + + public String getServ_catastro() { return serv_catastro; } + public void setServ_catastro(String serv_catastro) { this.serv_catastro = serv_catastro; } + + public String getSobrante() { return sobrante; } + public void setSobrante(String sobrante) { this.sobrante = sobrante; } + + public String getDictamenot() { return dictamenot; } + public void setDictamenot(String dictamenot) { this.dictamenot = dictamenot; } + + public String getProrrogas() { return prorrogas; } + public void setProrrogas(String prorrogas) { this.prorrogas = prorrogas; } + + public String getAnularconv() { return anularconv; } + public void setAnularconv(String anularconv) { this.anularconv = anularconv; } + + public String getOrdenarpreg() { return ordenarpreg; } + public void setOrdenarpreg(String ordenarpreg) { this.ordenarpreg = ordenarpreg; } + + public String getJefeid() { return jefeid; } + public void setJefeid(String jefeid) { this.jefeid = jefeid; } + + public String getUniorgid() { return uniorgid; } + public void setUniorgid(String uniorgid) { this.uniorgid = uniorgid; } + + public String getUniorg() { return uniorg; } + public void setUniorg(String uniorg) { this.uniorg = uniorg; } +} diff --git a/src/main/java/jumapacelaya/gob/mx/appots/dto/fotoOTDTO.java b/src/main/java/jumapacelaya/gob/mx/appots/dto/fotoOTDTO.java new file mode 100644 index 0000000..4ea897f --- /dev/null +++ b/src/main/java/jumapacelaya/gob/mx/appots/dto/fotoOTDTO.java @@ -0,0 +1,33 @@ +package jumapacelaya.gob.mx.appots.dto; + +import java.util.List; + +public class fotoOTDTO { + private Integer OTID; + private List FOTOS; + + public Integer getOTID() { return OTID; } + public void setOTID(Integer OTID) { + this.OTID = OTID; + } + + public List getFOTOS() { return FOTOS; } + public void setFOTOS(List FOTOS) { + this.FOTOS = FOTOS; + } + + public static class FotoDTO { + private String base64; + private String nomfoto; + + public String getBase64() { return base64; } + public void setBase64(String base64) { + this.base64 = base64; + } + + public String getNomfoto() { return nomfoto; } + public void setNomfoto(String nomfoto) { + this.nomfoto = nomfoto; + } + } +} diff --git a/src/main/java/jumapacelaya/gob/mx/appots/dto/motivoPreguntaDTO.java b/src/main/java/jumapacelaya/gob/mx/appots/dto/motivoPreguntaDTO.java new file mode 100644 index 0000000..ecf78d4 --- /dev/null +++ b/src/main/java/jumapacelaya/gob/mx/appots/dto/motivoPreguntaDTO.java @@ -0,0 +1,19 @@ +package jumapacelaya.gob.mx.appots.dto; + +import io.micronaut.core.annotation.Introspected; + +@Introspected +public class motivoPreguntaDTO { + private Integer motivoid; + private Integer preguntaid; + private Integer ordenmot; + + public Integer getMotivoid() { return motivoid; } + public void setMotivoid(Integer motivoid) { this.motivoid = motivoid; } + + public Integer getPreguntaid() { return preguntaid; } + public void setPreguntaid(Integer preguntaid) { this.preguntaid = preguntaid; } + + public Integer getOrdenmot() { return ordenmot; } + public void setOrdenmot(Integer ordenmot) { this.ordenmot = ordenmot; } +} diff --git a/src/main/java/jumapacelaya/gob/mx/appots/dto/noCommMensajeDTO.java b/src/main/java/jumapacelaya/gob/mx/appots/dto/noCommMensajeDTO.java new file mode 100644 index 0000000..dffd18d --- /dev/null +++ b/src/main/java/jumapacelaya/gob/mx/appots/dto/noCommMensajeDTO.java @@ -0,0 +1,16 @@ +package jumapacelaya.gob.mx.appots.dto; + +public class noCommMensajeDTO { + private Long OTID; + private String MENSAJE; + + public Long getOTID() { return OTID; } + public void setOTID(Long OTID) { + this.OTID = OTID; + } + + public String getMENSAJE() { return MENSAJE; } + public void setMENSAJE(String MENSAJE) { + this.MENSAJE = MENSAJE; + } +} diff --git a/src/main/java/jumapacelaya/gob/mx/appots/dto/origenDTO.java b/src/main/java/jumapacelaya/gob/mx/appots/dto/origenDTO.java new file mode 100644 index 0000000..8678fb7 --- /dev/null +++ b/src/main/java/jumapacelaya/gob/mx/appots/dto/origenDTO.java @@ -0,0 +1,20 @@ +package jumapacelaya.gob.mx.appots.dto; + +import io.micronaut.core.annotation.Introspected; + +@Introspected +public class origenDTO { + private Integer origenid; + private String descripcion; + + public Integer getOrigenid() { return origenid; } + public void setOrigenid(Integer origenid) { + this.origenid = origenid; + } + + public String getDescripcion() { return descripcion; } + public void setDescripcion(String descripcion) { + this.descripcion = descripcion; + } + +} diff --git a/src/main/java/jumapacelaya/gob/mx/appots/dto/otDTO.java b/src/main/java/jumapacelaya/gob/mx/appots/dto/otDTO.java new file mode 100644 index 0000000..f69b3ad --- /dev/null +++ b/src/main/java/jumapacelaya/gob/mx/appots/dto/otDTO.java @@ -0,0 +1,147 @@ +package jumapacelaya.gob.mx.appots.dto; + +import io.micronaut.core.annotation.Introspected; +import java.math.BigDecimal; + +@Introspected +public class otDTO { + + private Long otid; + private Long predioid; + private Long clienteid; + private String fecha; + private String fechamax; + private String fechaprecierre; + private String fechacierre; + private String fechaanulacion; + private Integer motivoid; + private String motivo; + private Integer origenid; + private String usuarioalta; + private String usuarioprecierre; + private String usuariocierre; + private String usuarioanulacion; + private String descripcion; + private String observacion; + private String horainicio; + private String horaftermino; + private Long otpadre; + private String fechareporte; + private Integer numreportes; + private String fechaasignacion; + private String cuadrillaasignada; + private String fechaprog; + private String nombsuperv; + private String nombintegra; + private String motivoanulacion; + private Integer motsusid; + private String usudictamen; + private String obsdictamen; + private String direccionot; + private BigDecimal coordx; + private BigDecimal coordy; + + // Getters y setters + + public Long getOtid() { return otid; } + public void setOtid(Long otid) { this.otid = otid; } + + public Long getPredioid() { return predioid; } + public void setPredioid(Long predioid) { this.predioid = predioid; } + + public Long getClienteid() { return clienteid; } + public void setClienteid(Long clienteid) { this.clienteid = clienteid; } + + public String getFecha() { return fecha; } + public void setFecha(String fecha) { this.fecha = fecha; } + + public String getFechamax() { return fechamax; } + public void setFechamax(String fechamax) { this.fechamax = fechamax; } + + public String getFechaprecierre() { return fechaprecierre; } + public void setFechaprecierre(String fechaprecierre) { this.fechaprecierre = fechaprecierre; } + + public String getFechacierre() { return fechacierre; } + public void setFechacierre(String fechacierre) { this.fechacierre = fechacierre; } + + public String getFechaanulacion() { return fechaanulacion; } + public void setFechaanulacion(String fechaanulacion) { this.fechaanulacion = fechaanulacion; } + + public Integer getMotivoid() { return motivoid; } + public void setMotivoid(Integer motivoid) { this.motivoid = motivoid; } + + public String getMotivo() { return motivo; } + public void setMotivo(String motivo) { this.motivo = motivo; } + + public Integer getOrigenid() { return origenid; } + public void setOrigenid(Integer origenid) { this.origenid = origenid; } + + public String getUsuarioalta() { return usuarioalta; } + public void setUsuarioalta(String usuarioalta) { this.usuarioalta = usuarioalta; } + + public String getUsuarioprecierre() { return usuarioprecierre; } + public void setUsuarioprecierre(String usuarioprecierre) { this.usuarioprecierre = usuarioprecierre; } + + public String getUsuariocierre() { return usuariocierre; } + public void setUsuariocierre(String usuariocierre) { this.usuariocierre = usuariocierre; } + + public String getUsuarioanulacion() { return usuarioanulacion; } + public void setUsuarioanulacion(String usuarioanulacion) { this.usuarioanulacion = usuarioanulacion; } + + public String getDescripcion() { return descripcion; } + public void setDescripcion(String descripcion) { this.descripcion = descripcion; } + + public String getObservacion() { return observacion; } + public void setObservacion(String observacion) { this.observacion = observacion; } + + public String getHorainicio() { return horainicio; } + public void setHorainicio(String horainicio) { this.horainicio = horainicio; } + + public String getHoraftermino() { return horaftermino; } + public void setHoraftermino(String horaftermino) { this.horaftermino = horaftermino; } + + public Long getOtpadre() { return otpadre; } + public void setOtpadre(Long otpadre) { this.otpadre = otpadre; } + + public String getFechareporte() { return fechareporte; } + public void setFechareporte(String fechareporte) { this.fechareporte = fechareporte; } + + public Integer getNumreportes() { return numreportes; } + public void setNumreportes(Integer numreportes) { this.numreportes = numreportes; } + + public String getFechaasignacion() { return fechaasignacion; } + public void setFechaasignacion(String fechaasignacion) { this.fechaasignacion = fechaasignacion; } + + public String getCuadrillaasignada() { return cuadrillaasignada; } + public void setCuadrillaasignada(String cuadrillaasignada) { this.cuadrillaasignada = cuadrillaasignada; } + + public String getFechaprog() { return fechaprog; } + public void setFechaprog(String fechaprog) { this.fechaprog = fechaprog; } + + public String getNombsuperv() { return nombsuperv; } + public void setNombsuperv(String nombsuperv) { this.nombsuperv = nombsuperv; } + + public String getNombintegra() { return nombintegra; } + public void setNombintegra(String nombintegra) { this.nombintegra = nombintegra; } + + public String getMotivoanulacion() { return motivoanulacion; } + public void setMotivoanulacion(String motivoanulacion) { this.motivoanulacion = motivoanulacion; } + + public Integer getMotsusid() { return motsusid; } + public void setMotsusid(Integer motsusid) { this.motsusid = motsusid; } + + public String getUsudictamen() { return usudictamen; } + public void setUsudictamen(String usudictamen) { this.usudictamen = usudictamen; } + + public String getObsdictamen() { return obsdictamen; } + public void setObsdictamen(String obsdictamen) { this.obsdictamen = obsdictamen; } + + public String getDireccionot() { return direccionot; } + public void setDireccionot(String direccionot) { this.direccionot = direccionot; } + + public BigDecimal getCoordx() { return coordx; } + public void setCoordx(BigDecimal coordx) { this.coordx = coordx; } + + public BigDecimal getCoordy() { return coordy; } + public void setCoordy(BigDecimal coordy) { this.coordy = coordy; } +} diff --git a/src/main/java/jumapacelaya/gob/mx/appots/dto/preguntaDTO.java b/src/main/java/jumapacelaya/gob/mx/appots/dto/preguntaDTO.java new file mode 100644 index 0000000..5303c1f --- /dev/null +++ b/src/main/java/jumapacelaya/gob/mx/appots/dto/preguntaDTO.java @@ -0,0 +1,44 @@ +package jumapacelaya.gob.mx.appots.dto; + +import java.util.List; +import java.util.Map; + +public class preguntaDTO { + private Integer preguntaid; + private String descripcion; + private String sentenciasql; + private String unimed; + private List> sentenciasqlData; + private List> unimedData; + + public Integer getPreguntaid() { return preguntaid; } + public void setPreguntaid(Integer preguntaid) { + this.preguntaid = preguntaid; + } + + public String getDescripcion() { return descripcion; } + public void setDescripcion(String descripcion) { + this.descripcion = descripcion; + } + + public String getSentenciaSQL() { return sentenciasql; } + public void setSentenciaSQL(String sentenciasql) { + this.sentenciasql = sentenciasql; + } + + public String getUnimed() { return unimed; } + public void setUnimed(String unimed) { + this.unimed = unimed; + } + + public List> getSentenciaSQLData() { return sentenciasqlData; } + public void setSentenciaSQLData(List> sentenciasqlData) { + this.sentenciasqlData = sentenciasqlData; + } + + public List> getUnimedData() { return unimedData; } + public void setUnimedData(List> unimedData) { + this.unimedData = unimedData; + } + +} diff --git a/src/main/java/jumapacelaya/gob/mx/appots/dto/respuestaOTDTO.java b/src/main/java/jumapacelaya/gob/mx/appots/dto/respuestaOTDTO.java new file mode 100644 index 0000000..7a0f662 --- /dev/null +++ b/src/main/java/jumapacelaya/gob/mx/appots/dto/respuestaOTDTO.java @@ -0,0 +1,102 @@ +package jumapacelaya.gob.mx.appots.dto; + +import java.util.List; + +public class respuestaOTDTO { + private Long otid; + private String fechaprecierre; + private String usuarioprecierre; + private String horainicio; + private String horatermino; + private String observacion; + private String nombsuperv; + private String nombintegra; + private String dictamenid; + private String obsdictamen; + private String usuariocierree; + private String transaccid; + + private List resppreg; + private List fotos; + private List othijas; + + // Getters y Setters + public Long getOTid() { return otid; } + public void setOtid(Long otid) { + this.otid = otid; + } + + public String getFechaPreCierre() { return fechaprecierre; } + public void setFechaPreCierre(String fechaprecierre) { + this.fechaprecierre = fechaprecierre; + } + + public String getUsuarioPreCierre() { return usuarioprecierre; } + public void setUsuarioPreCierre(String usuarioprecierre) { + this.usuarioprecierre = usuarioprecierre; + } + + public String getHoraInicio() { return horainicio; } + public void setHoraInicio(String horainicio) { + this.horainicio = horainicio; + } + + public String getHoraTermino() { return horatermino; } + public void set(String horatermino) { + this.horatermino = horatermino; + } + + public String getObservacion() { return observacion; } + public void setObservacion(String observacion) { + this.observacion = observacion; + } + + public String getNombSuperv() { return nombsuperv; } + public void setNombSuperv(String nombsuprev) { + this.nombsuperv = nombsuprev; + } + + public String getNombIntegra() { return nombintegra; } + public void setNombIntegra(String nombintegra) { + this.nombintegra = nombintegra; + } + + public String getDictamenId() { return dictamenid; } + public void setDictamenId(String dictamenid) { + this.dictamenid = dictamenid; + } + + public String getObsDictamen() { return obsdictamen; } + public void setObsDictamen(String obsdictamen) { + this.obsdictamen = obsdictamen; + } + + public String getUsuarioCierre() { return usuariocierree; } + public void setUsuarioCierre(String usuariocierree) { + this.usuariocierree = usuariocierree; + } + + public String getTransaccId() { return transaccid; } + public void setTransaccId(String transaccid) { + this.transaccid = transaccid; + } + + public List getResppreg() { return resppreg; } + public void setResppreg(List resppreg) { + this.resppreg = resppreg; + } + + public List getFoto() { return fotos; } + public void setFoto(List fotos) { + this.fotos = fotos; + } + + public List getOThijas() { return othijas; } + public void setOThijas(List othijas) { + this.othijas = othijas; + } + /*public String get() { return ; } + public void set(String ) { + this. = ; + }*/ +} diff --git a/src/main/java/jumapacelaya/gob/mx/appots/dto/respuestaPreguntaDTO.java b/src/main/java/jumapacelaya/gob/mx/appots/dto/respuestaPreguntaDTO.java new file mode 100644 index 0000000..56d46e7 --- /dev/null +++ b/src/main/java/jumapacelaya/gob/mx/appots/dto/respuestaPreguntaDTO.java @@ -0,0 +1,23 @@ +package jumapacelaya.gob.mx.appots.dto; + +public class respuestaPreguntaDTO { + private String preguntaid; + private String respuesta; + private String umid; + + // Getters y Setters + public String getPreguntaId() { return preguntaid; } + public void setPreguntaId(String preguntaid) { + this.preguntaid = preguntaid; + } + + public String getRespuesta() { return respuesta; } + public void setRespuesta(String respuesta) { + this.respuesta = respuesta; + } + + public String getUmId() { return umid; } + public void setUmId(String umid) { + this.umid = umid; + } +} diff --git a/src/main/java/jumapacelaya/gob/mx/appots/dto/transaccionDTO.java b/src/main/java/jumapacelaya/gob/mx/appots/dto/transaccionDTO.java new file mode 100644 index 0000000..fbcd1ab --- /dev/null +++ b/src/main/java/jumapacelaya/gob/mx/appots/dto/transaccionDTO.java @@ -0,0 +1,19 @@ +package jumapacelaya.gob.mx.appots.dto; + +import java.time.LocalDateTime; + +public class transaccionDTO { + private Long otid; + private LocalDateTime transaccdt; + + // Getters y setters + public Long getOtid() { return otid; } + public void setOtid(Long otid) { + this.otid = otid; + } + + public LocalDateTime getTransaccdt() { return transaccdt; } + public void setTransaccdt(LocalDateTime transaccdt) { + this.transaccdt = transaccdt; + } +} diff --git a/src/main/java/jumapacelaya/gob/mx/appots/servicio/AppOtsServicio.java b/src/main/java/jumapacelaya/gob/mx/appots/servicio/AppOtsServicio.java new file mode 100644 index 0000000..8a02aed --- /dev/null +++ b/src/main/java/jumapacelaya/gob/mx/appots/servicio/AppOtsServicio.java @@ -0,0 +1,1208 @@ +package jumapacelaya.gob.mx.appots.servicio; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.sql.SQLException; +import java.sql.Statement; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Base64; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import javax.sql.DataSource; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.micronaut.data.connection.annotation.Connectable; +import jakarta.inject.Inject; +import jakarta.inject.Singleton; +import jakarta.transaction.Transactional; +import jumapacelaya.gob.mx.appots.dto.FotoBase64DTO; +import jumapacelaya.gob.mx.appots.dto.OTHijaDTO; +import jumapacelaya.gob.mx.appots.dto.dictamenDTO; +import jumapacelaya.gob.mx.appots.dto.empleadoOrigenDTO; +import jumapacelaya.gob.mx.appots.dto.fotoOTDTO; +import jumapacelaya.gob.mx.appots.dto.motivoPreguntaDTO; +import jumapacelaya.gob.mx.appots.dto.noCommMensajeDTO; +import jumapacelaya.gob.mx.appots.dto.origenDTO; +import jumapacelaya.gob.mx.appots.dto.otDTO; +import jumapacelaya.gob.mx.appots.dto.preguntaDTO; +import jumapacelaya.gob.mx.appots.dto.respuestaOTDTO; +import jumapacelaya.gob.mx.appots.dto.respuestaPreguntaDTO; +import jumapacelaya.gob.mx.appots.dto.transaccionDTO; + +@Singleton +public class AppOtsServicio { + + @Inject + DataSource dataSource; + + @Connectable + public List obtenerOTsPorPredio(Long predioid) { + List lista = new ArrayList<>(); + + String query = "SELECT * FROM TABLE(pk_rest_ots.FN_GETINFOGRALOTSPREDIO(?))"; + + try (Connection conn = dataSource.getConnection(); + PreparedStatement ps = conn.prepareStatement(query)) { + + ps.setLong(1, predioid); + ResultSet rs = ps.executeQuery(); + + while (rs.next()) { + otDTO dto = new otDTO(); + + dto.setOtid(rs.getLong("otid")); + dto.setPredioid(rs.getLong("predioid")); + dto.setClienteid(rs.getLong("clienteid")); + dto.setFecha(rs.getString("fecha")); + dto.setFechamax(rs.getString("fechamax")); + dto.setFechaprecierre(rs.getString("fechaprecierre")); + dto.setFechacierre(rs.getString("fechacierre")); + dto.setFechaanulacion(rs.getString("fechaanulacion")); + dto.setMotivoid(rs.getInt("motivoid")); + dto.setMotivo(rs.getString("motivo")); + dto.setOrigenid(rs.getInt("origenid")); + dto.setUsuarioalta(rs.getString("usuarioalta")); + dto.setUsuarioprecierre(rs.getString("usuarioprecierre")); + dto.setUsuariocierre(rs.getString("usuariocierre")); + dto.setUsuarioanulacion(rs.getString("usuarioanulacion")); + dto.setDescripcion(rs.getString("descripcion")); + dto.setObservacion(rs.getString("observacion")); + dto.setHorainicio(rs.getString("horainicio")); + dto.setHoraftermino(rs.getString("horaftermino")); + dto.setOtpadre(rs.getLong("otpadre")); + dto.setFechareporte(rs.getString("fechareporte")); + dto.setNumreportes(rs.getInt("numreportes")); + dto.setFechaasignacion(rs.getString("fechaasignacion")); + dto.setCuadrillaasignada(rs.getString("cuadrillaasignada")); + dto.setFechaprog(rs.getString("fechaprog")); + dto.setNombsuperv(rs.getString("nombsuperv")); + dto.setNombintegra(rs.getString("nombintegra")); + dto.setMotivoanulacion(rs.getString("motivoanulacion")); + dto.setMotsusid(rs.getInt("motsusid")); + dto.setUsudictamen(rs.getString("usudictamen")); + dto.setObsdictamen(rs.getString("obsdictamen")); + dto.setDireccionot(rs.getString("direccionot")); + dto.setCoordx(rs.getBigDecimal("coordx")); + dto.setCoordy(rs.getBigDecimal("coordy")); + + lista.add(dto); + } + + } catch (SQLException e) { + throw new RuntimeException("Error al consultar OTs del predio: " + e.getMessage(), e); + } + + return lista; + } + + @Transactional + public List obtenerInfoGralOT(Long otid) { + List lista = new ArrayList<>(); + + String query = "select ote.otid, ote.predioid, ote.clienteid, " + + "ote.fecha, ote.fechamax, ote.fechaprecierre, ote.fechacierre, ote.fechaanulacion, " + + "motivoid, otm.descripcion motivo, otm.origenid, " + + "ote.usuarioalta, ote.usuarioprecierre, ote.usuariocierre, ote.usuarioanula usuarioanulacion, " + + "ote.descripcion, ote.observacion, ote.horainicio, ote.horatermino horaftermino, ote.otipadre otpadre, " + + "ote.fechareporte, ote.noreportes numreportes, ote.fechaasig fechaasignacion, ote.cuadrillaasig cuadrillaasignada, " + + "ote.fechaprog, null nombsuperv, null nombintegra, ote.motanulacion motivoanulacion, " + + "motsusid, ote.usudictamen, ote.obsdictamen, ote.direccion_ot direccionot, " + + "ote.coordx, ote.coordy " + + "from ordentrabajoenc ote " + + "inner join ot_motivos otm using (motivoid) " + + "left join ot_motivo_suspen ots using (motsusid) " + + "where ( ? is null or otid = ? ) " + + "and fechaprecierre is null " + + "and fechaanulacion is null " + + "order by otid"; + + try (Connection connection = dataSource.getConnection(); + PreparedStatement stmt = connection.prepareStatement(query)) { + + stmt.setObject(1, otid); + stmt.setObject(2, otid); + + try (ResultSet rs = stmt.executeQuery()) { + while (rs.next()) { + otDTO dto = new otDTO(); + + dto.setOtid(rs.getLong("otid")); + dto.setPredioid(rs.getLong("predioid")); + dto.setClienteid(rs.getLong("clienteid")); + dto.setFecha(rs.getString("fecha")); + dto.setFechamax(rs.getString("fechamax")); + dto.setFechaprecierre(rs.getString("fechaprecierre")); + dto.setFechacierre(rs.getString("fechacierre")); + dto.setFechaanulacion(rs.getString("fechaanulacion")); + dto.setMotivoid(rs.getInt("motivoid")); + dto.setMotivo(rs.getString("motivo")); + dto.setOrigenid(rs.getInt("origenid")); + dto.setUsuarioalta(rs.getString("usuarioalta")); + dto.setUsuarioprecierre(rs.getString("usuarioprecierre")); + dto.setUsuariocierre(rs.getString("usuariocierre")); + dto.setUsuarioanulacion(rs.getString("usuarioanulacion")); + dto.setDescripcion(rs.getString("descripcion")); + dto.setObservacion(rs.getString("observacion")); + dto.setHorainicio(rs.getString("horainicio")); + dto.setHoraftermino(rs.getString("horaftermino")); + dto.setOtpadre(rs.getLong("otpadre")); + dto.setFechareporte(rs.getString("fechareporte")); + dto.setNumreportes(rs.getInt("numreportes")); + dto.setFechaasignacion(rs.getString("fechaasignacion")); + dto.setCuadrillaasignada(rs.getString("cuadrillaasignada")); + dto.setFechaprog(rs.getString("fechaprog")); + dto.setNombsuperv(rs.getString("nombsuperv")); // puede venir null + dto.setNombintegra(rs.getString("nombintegra")); // puede venir null + dto.setMotivoanulacion(rs.getString("motivoanulacion")); + dto.setMotsusid(rs.getInt("motsusid")); + dto.setUsudictamen(rs.getString("usudictamen")); + dto.setObsdictamen(rs.getString("obsdictamen")); + dto.setDireccionot(rs.getString("direccionot")); + dto.setCoordx(rs.getBigDecimal("coordx")); + dto.setCoordy(rs.getBigDecimal("coordy")); + + lista.add(dto); + } + } + } catch (SQLException e) { + throw new RuntimeException("Error al obtener información general de OT: " + e.getMessage(), e); + } + + return lista; + } + + @Transactional + public List obtenerOtsProgramadasPorCuadrillaYMotivo(String cuadrillaId, String motivoId) { + List lista = new ArrayList<>(); + + String baseQuery = """ + select ote.otid, predioid, ote.clienteid, ote.fecha, ote.fechamax, ote.fechaprecierre, ote.fechacierre, ote.fechaanulacion, motivoid, otm.descripcion motivo, otm.origenid, + ote.usuarioalta, ote.usuarioprecierre, ote.usuariocierre, ote.usuarioanula, ote.descripcion, ote.observacion, ote.horainicio, ote.horatermino, ote.otipadre, + ote.fechareporte, ote.noreportes, ote.fechaasig, ote.cuadrillaasig, ote.fechaprog, ote.motanulacion, motsusid, ots.nombre motsuspen, ote.usudictamen, ote.obsdictamen, + ote.direccion_ot, coalesce(ote.coordx, p.coordx) coordx, coalesce(ote.coordy, p.coordy) coordy, p.ctalocaliza + from + ordentrabajoenc ote + left join predios p using (predioid) + inner join ot_motivos otm using (motivoid) + left join ot_motivo_suspen ots using (motsusid) + where + trunc(fechaprog)=trunc(sysdate) + and fechaprecierre is null + and fechaanulacion is null + """; + + StringBuilder query = new StringBuilder(baseQuery); + + if (!"all".equalsIgnoreCase(cuadrillaId)) { + query.append(" AND cuadrillaasig LIKE ? "); + } + if (!"all".equalsIgnoreCase(motivoId)) { + query.append(" AND motivoid LIKE ? "); + } + + query.append(" ORDER BY otid"); + + try (Connection conn = dataSource.getConnection(); + PreparedStatement stmt = conn.prepareStatement(query.toString())) { + + int index = 1; + if (!"all".equalsIgnoreCase(cuadrillaId)) { + stmt.setString(index++, cuadrillaId); + } + if (!"all".equalsIgnoreCase(motivoId)) { + stmt.setString(index++, motivoId); + } + + try (ResultSet rs = stmt.executeQuery()) { + while (rs.next()) { + otDTO dto = new otDTO(); + + dto.setOtid(rs.getLong("otid")); + dto.setPredioid(rs.getLong("predioid")); + dto.setClienteid(rs.getLong("clienteid")); + dto.setFecha(rs.getString("fecha")); + dto.setFechamax(rs.getString("fechamax")); + dto.setFechaprecierre(rs.getString("fechaprecierre")); + dto.setFechacierre(rs.getString("fechacierre")); + dto.setFechaanulacion(rs.getString("fechaanulacion")); + dto.setMotivoid(rs.getInt("motivoid")); + dto.setMotivo(rs.getString("motivo")); + dto.setOrigenid(rs.getInt("origenid")); + dto.setUsuarioalta(rs.getString("usuarioalta")); + dto.setUsuarioprecierre(rs.getString("usuarioprecierre")); + dto.setUsuariocierre(rs.getString("usuariocierre")); + dto.setUsuarioanulacion(rs.getString("usuarioanula")); + dto.setDescripcion(rs.getString("descripcion")); + dto.setObservacion(rs.getString("observacion")); + dto.setHorainicio(rs.getString("horainicio")); + dto.setHoraftermino(rs.getString("horatermino")); // usa el nombre real del DTO + dto.setOtpadre(rs.getLong("otipadre")); + dto.setFechareporte(rs.getString("fechareporte")); + dto.setNumreportes(rs.getInt("noreportes")); + dto.setFechaasignacion(rs.getString("fechaasig")); + dto.setCuadrillaasignada(rs.getString("cuadrillaasig")); + dto.setFechaprog(rs.getString("fechaprog")); + dto.setMotivoanulacion(rs.getString("motanulacion")); + dto.setMotsusid(rs.getInt("motsusid")); + dto.setUsudictamen(rs.getString("usudictamen")); + dto.setObsdictamen(rs.getString("obsdictamen")); + dto.setDireccionot(rs.getString("direccion_ot")); + dto.setCoordx(rs.getBigDecimal("coordx")); + dto.setCoordy(rs.getBigDecimal("coordy")); + dto.setNombsuperv(rs.getString("nombsuperv")); + dto.setNombintegra(rs.getString("nombintegra")); + + lista.add(dto); + } + } + + } catch (SQLException e) { + throw new RuntimeException("Error al obtener OTs programadas: " + e.getMessage(), e); + } + + return lista; + } + + public List obtenerOtsProgramadasPorOrigenYMotivo(String origenid, String motivoid) { + List resultado = new ArrayList<>(); + + StringBuilder query = new StringBuilder(); + query.append("SELECT ote.otid, predioid, ") + .append("coalesce(decode(ote.clienteid,0,null,ote.clienteid), to_char(p.clienteid)) AS clienteid, ") + .append("ote.fecha, ote.fechamax, ote.fechaprecierre, ote.fechacierre, ote.fechaanulacion, motivoid, ") + .append("otm.descripcion AS motivo, otm.origenid, ote.usuarioalta, ote.usuarioprecierre, ote.usuariocierre, ") + .append("ote.usuarioanula, ote.descripcion, ote.observacion, ote.horainicio, ote.horatermino, ote.otipadre, ") + .append("ote.fechareporte, ote.noreportes, ote.fechaasig, ote.cuadrillaasig, ote.fechaprog, ote.motanulacion, ") + .append("motsusid, ots.nombre AS motsuspen, ote.usudictamen, ote.obsdictamen, ote.direccion_ot, ") + .append("coalesce(ote.coordx, p.coordx) AS coordx, coalesce(ote.coordy, p.coordy) AS coordy, p.ctalocaliza ") + .append("FROM ordentrabajoenc ote ") + .append("LEFT JOIN predios p USING (predioid) ") + .append("INNER JOIN ot_motivos otm USING (motivoid) ") + .append("LEFT JOIN ot_motivo_suspen ots USING (motsusid) ") + .append("WHERE trunc(fechaprog) = trunc(sysdate) ") + .append("AND fechaprecierre IS NULL ") + .append("AND fechaanulacion IS NULL "); + + if (!"all".equalsIgnoreCase(origenid)) { + query.append(" AND origenid LIKE ? "); + } + + if (!"all".equalsIgnoreCase(motivoid)) { + query.append(" AND motivoid LIKE ? "); + } + + query.append(" ORDER BY otid"); + + try (Connection connection = dataSource.getConnection(); + PreparedStatement ps = connection.prepareStatement(query.toString())) { + + int index = 1; + if (!"all".equalsIgnoreCase(origenid)) { + ps.setString(index++, origenid); + } + if (!"all".equalsIgnoreCase(motivoid)) { + ps.setString(index++, motivoid); + } + + try (ResultSet rs = ps.executeQuery()) { + while (rs.next()) { + otDTO dto = new otDTO(); + dto.setOtid(rs.getLong("otid")); + dto.setPredioid(rs.getLong("predioid")); + dto.setClienteid(rs.getLong("clienteid")); + dto.setFecha(rs.getString("fecha")); + dto.setFechamax(rs.getString("fechamax")); + dto.setFechaprecierre(rs.getString("fechaprecierre")); + dto.setFechacierre(rs.getString("fechacierre")); + dto.setFechaanulacion(rs.getString("fechaanulacion")); + dto.setMotivoid(rs.getInt("motivoid")); + dto.setMotivo(rs.getString("motivo")); + dto.setOrigenid(rs.getInt("origenid")); + dto.setUsuarioalta(rs.getString("usuarioalta")); + dto.setUsuarioprecierre(rs.getString("usuarioprecierre")); + dto.setUsuariocierre(rs.getString("usuariocierre")); + dto.setUsuarioanulacion(rs.getString("usuarioanula")); + dto.setDescripcion(rs.getString("descripcion")); + dto.setObservacion(rs.getString("observacion")); + dto.setHorainicio(rs.getString("horainicio")); + dto.setHoraftermino(rs.getString("horatermino")); + dto.setOtpadre(rs.getLong("otipadre")); + dto.setFechareporte(rs.getString("fechareporte")); + dto.setNumreportes(rs.getInt("noreportes")); + dto.setFechaasignacion(rs.getString("fechaasig")); + dto.setCuadrillaasignada(rs.getString("cuadrillaasig")); + dto.setFechaprog(rs.getString("fechaprog")); + dto.setMotivoanulacion(rs.getString("motanulacion")); + dto.setMotsusid(rs.getInt("motsusid")); + dto.setUsudictamen(rs.getString("usudictamen")); + dto.setObsdictamen(rs.getString("obsdictamen")); + dto.setDireccionot(rs.getString("direccion_ot")); + dto.setCoordx(rs.getBigDecimal("coordx")); + dto.setCoordy(rs.getBigDecimal("coordy")); + + resultado.add(dto); + } + } + + } catch (SQLException e) { + throw new RuntimeException("Error al obtener OTs programadas por origen y motivo: " + e.getMessage(), e); + } + + return resultado; + } + + public List obtenerOtsProgramadasPorAreaOrigenMotivo(String areaid, String origenid, String motivoid) { + List lista = new ArrayList<>(); + StringBuilder sql = new StringBuilder(); + + sql.append("SELECT ote.otid, predioid, ") + .append("COALESCE(DECODE(ote.clienteid, 0, NULL, ote.clienteid), TO_CHAR(p.clienteid)) AS clienteid, ") + .append("ote.fecha, ote.fechamax, ote.fechaprecierre, ote.fechacierre, ote.fechaanulacion, ") + .append("motivoid, otm.descripcion AS motivo, otm.origenid, ote.usuarioalta, ote.usuarioprecierre, ") + .append("ote.usuariocierre, ote.usuarioanula AS usuarioanulacion, ote.descripcion, ote.observacion, ") + .append("ote.horainicio, ote.horatermino AS horaftermino, ote.otipadre AS otpadre, ") + .append("ote.fechareporte, ote.noreportes AS numreportes, ote.fechaasig AS fechaasignacion, ") + .append("ote.cuadrillaasig AS cuadrillaasignada, ote.fechaprog, ote.motanulacion AS motivoanulacion, ") + .append("motsusid, ots.nombre AS motsuspen, ote.usudictamen, ote.obsdictamen, ") + .append("ote.direccion_ot AS direccionot, COALESCE(ote.coordx, p.coordx) AS coordx, ") + .append("COALESCE(ote.coordy, p.coordy) AS coordy ") + .append("FROM ordentrabajoenc ote ") + .append("LEFT JOIN predios p USING (predioid) ") + .append("INNER JOIN ot_motivos otm USING (motivoid) ") + .append("LEFT JOIN ot_motivo_suspen ots USING (motsusid) ") + .append("WHERE TRUNC(fechaprog) = TRUNC(SYSDATE) ") + .append("AND fechaprecierre IS NULL ") + .append("AND fechaanulacion IS NULL "); + + if (!"all".equalsIgnoreCase(areaid)) { + sql.append("AND uniorgid IN (SELECT * FROM TABLE(splitvlt(?, '¬'))) "); + } + if (!"all".equalsIgnoreCase(origenid)) { + sql.append("AND origenid IN (SELECT * FROM TABLE(splitvlt(?, '¬'))) "); + } + if (!"all".equalsIgnoreCase(motivoid)) { + sql.append("AND motivoid IN (SELECT * FROM TABLE(splitvlt(?, '¬'))) "); + } + + sql.append("ORDER BY otid"); + + try (Connection connection = dataSource.getConnection(); + PreparedStatement ps = connection.prepareStatement(sql.toString())) { + + int paramIndex = 1; + if (!"all".equalsIgnoreCase(areaid)) { + ps.setString(paramIndex++, areaid); + } + if (!"all".equalsIgnoreCase(origenid)) { + ps.setString(paramIndex++, origenid); + } + if (!"all".equalsIgnoreCase(motivoid)) { + ps.setString(paramIndex++, motivoid); + } + + try (ResultSet rs = ps.executeQuery()) { + while (rs.next()) { + otDTO dto = new otDTO(); + dto.setOtid(rs.getLong("otid")); + dto.setPredioid(rs.getLong("predioid")); + dto.setClienteid(rs.getLong("clienteid")); + dto.setFecha(rs.getString("fecha")); + dto.setFechamax(rs.getString("fechamax")); + dto.setFechaprecierre(rs.getString("fechaprecierre")); + dto.setFechacierre(rs.getString("fechacierre")); + dto.setFechaanulacion(rs.getString("fechaanulacion")); + dto.setMotivoid(rs.getInt("motivoid")); + dto.setMotivo(rs.getString("motivo")); + dto.setOrigenid(rs.getInt("origenid")); + dto.setUsuarioalta(rs.getString("usuarioalta")); + dto.setUsuarioprecierre(rs.getString("usuarioprecierre")); + dto.setUsuariocierre(rs.getString("usuariocierre")); + dto.setUsuarioanulacion(rs.getString("usuarioanulacion")); + dto.setDescripcion(rs.getString("descripcion")); + dto.setObservacion(rs.getString("observacion")); + dto.setHorainicio(rs.getString("horainicio")); + dto.setHoraftermino(rs.getString("horaftermino")); + dto.setOtpadre(rs.getLong("otpadre")); + dto.setFechareporte(rs.getString("fechareporte")); + dto.setNumreportes(rs.getInt("numreportes")); + dto.setFechaasignacion(rs.getString("fechaasignacion")); + dto.setCuadrillaasignada(rs.getString("cuadrillaasignada")); + dto.setFechaprog(rs.getString("fechaprog")); + dto.setMotivoanulacion(rs.getString("motivoanulacion")); + dto.setMotsusid(rs.getInt("motsusid")); + dto.setUsudictamen(rs.getString("usudictamen")); + dto.setObsdictamen(rs.getString("obsdictamen")); + dto.setDireccionot(rs.getString("direccionot")); + dto.setCoordx(rs.getBigDecimal("coordx")); + dto.setCoordy(rs.getBigDecimal("coordy")); + lista.add(dto); + } + } + + } catch (SQLException e) { + throw new RuntimeException("Error al obtener OTs programadas por área-origen-motivo: " + e.getMessage(), e); + } + + return lista; + } + + public List obtenerOrigenes(String origenid) { + List lista = new ArrayList<>(); + String sql = "SELECT * FROM operacion.ot_origenes "; + + if (!"all".equalsIgnoreCase(origenid)) { + sql += "WHERE origenid LIKE ? "; + } + sql += "ORDER BY origenid"; + + try (Connection conn = dataSource.getConnection(); + PreparedStatement ps = conn.prepareStatement(sql)) { + + if (!"all".equalsIgnoreCase(origenid)) { + ps.setString(1, origenid); + } + + ResultSet rs = ps.executeQuery(); + while (rs.next()) { + origenDTO dto = new origenDTO(); + dto.setOrigenid(rs.getInt("origenid")); + dto.setDescripcion(rs.getString("descripcion")); + lista.add(dto); + } + } catch (SQLException e) { + throw new RuntimeException("Error al obtener los origenes: " + e.getMessage(), e); + } + + return lista; + } + + public List> obtenerMotivos(String motivoid) { + List> motivos = new ArrayList<>(); + String query = "SELECT * FROM operacion.ot_motivos "; + + if (!"all".equalsIgnoreCase(motivoid)) { + query += "WHERE motivoid LIKE ? "; + } + + query += "ORDER BY motivoid"; + + try (Connection connection = dataSource.getConnection(); + PreparedStatement stmt = connection.prepareStatement(query)) { + + if (!"all".equalsIgnoreCase(motivoid)) { + stmt.setString(1, motivoid); + } + + try (ResultSet rs = stmt.executeQuery()) { + ResultSetMetaData meta = rs.getMetaData(); + int columns = meta.getColumnCount(); + + while (rs.next()) { + Map row = new HashMap<>(); + for (int i = 1; i <= columns; i++) { + row.put(meta.getColumnLabel(i), rs.getObject(i)); + } + motivos.add(row); + } + } + } catch (SQLException e) { + throw new RuntimeException("Error al obtener motivos: " + e.getMessage(), e); + } + + return motivos; + } + + public List> obtenerMotivosPorAreaYMotivo(String areaid, String motivoid) { + String baseQuery = "SELECT * FROM operacion.ot_motivos"; + String where = ""; + String where2 = ""; + + if ("all".equalsIgnoreCase(areaid)) { + if (!"all".equalsIgnoreCase(motivoid)) { + where2 = " WHERE TRIM(motivoid) = '" + motivoid + "' "; + } + } else { + where = " WHERE TRIM(uniorgid) = '" + areaid + "' "; + if (!"all".equalsIgnoreCase(motivoid)) { + where2 = " AND TRIM(motivoid) = '" + motivoid + "' "; + } + } + + String finalQuery = baseQuery + where + where2 + " ORDER BY uniorgid, motivoid"; + + try (Connection connection = dataSource.getConnection(); + Statement stmt = connection.createStatement(); + ResultSet rs = stmt.executeQuery(finalQuery)) { + + List> resultado = new ArrayList<>(); + ResultSetMetaData meta = rs.getMetaData(); + int columnCount = meta.getColumnCount(); + + while (rs.next()) { + Map fila = new HashMap<>(); + for (int i = 1; i <= columnCount; i++) { + fila.put(meta.getColumnName(i).toLowerCase(), rs.getObject(i)); + } + resultado.add(fila); + } + + return resultado; + + } catch (SQLException e) { + throw new RuntimeException("Error al consultar motivos por área y motivo: " + e.getMessage(), e); + } + } + + public List> obtenerMotivoSusp(Integer motsusid) { + List> resultado = new ArrayList<>(); + String query = "SELECT * FROM operacion.ot_motivo_suspen "; + + if (!"all".equalsIgnoreCase(String.valueOf(motsusid))) { + query += "WHERE motsusid LIKE ? "; + } + + query += "ORDER BY motsusid"; + + try (Connection connection = dataSource.getConnection(); + PreparedStatement ps = connection.prepareStatement(query)) { + + if (!"all".equalsIgnoreCase(String.valueOf(motsusid))) { + ps.setInt(1, motsusid); + } + + try (ResultSet rs = ps.executeQuery()) { + ResultSetMetaData meta = rs.getMetaData(); + int columnCount = meta.getColumnCount(); + + while (rs.next()) { + Map row = new LinkedHashMap<>(); + for (int i = 1; i <= columnCount; i++) { + row.put(meta.getColumnLabel(i).toLowerCase(), rs.getObject(i)); + } + resultado.add(row); + } + } + } catch (SQLException e) { + throw new RuntimeException("Error al obtener motivos de suspensión: " + e.getMessage(), e); + } + + return resultado; + } + + public List obtenerPreguntas(String preguntaid, String dato) { + List preguntas = new ArrayList<>(); + + String query = """ + SELECT p.*, + DECODE((SELECT u.preguntaid + FROM operacion.pregununi u + WHERE u.preguntaid = p.preguntaid AND ROWNUM = 1), NULL, 'No', 'Si') unimed + FROM operacion.ot_preguntas p + """ + + ("all".equalsIgnoreCase(preguntaid) ? "" : " WHERE preguntaid LIKE ? ") + + " ORDER BY preguntaid"; + + try (Connection conn = dataSource.getConnection(); + PreparedStatement ps = conn.prepareStatement(query)) { + + if (!"all".equalsIgnoreCase(preguntaid)) { + ps.setString(1, preguntaid); + } + + try (ResultSet rs = ps.executeQuery()) { + while (rs.next()) { + preguntaDTO dto = new preguntaDTO(); + dto.setPreguntaid(rs.getInt("preguntaid")); + dto.setDescripcion(rs.getString("descripcion")); + dto.setSentenciaSQL(rs.getString("sentenciasql")); + dto.setUnimed(rs.getString("unimed")); + + // Si hay sentencia SQL + if (dto.getSentenciaSQL() != null) { + List> resultadoExtra = new ArrayList<>(); + String innerQuery; + + if ("6007".equals(dto.getPreguntaid().toString())) { + innerQuery = "SELECT MODELOMEDID, MODELOMEDID || ' ' || DESCRIPCION descripcion FROM MODELOSMEDIDOR WHERE TRIM(MARCAMEDID) = ?"; + try (PreparedStatement psInner = conn.prepareStatement(innerQuery)) { + psInner.setString(1, dato); + try (ResultSet rsInner = psInner.executeQuery()) { + while (rsInner.next()) { + Map row = new HashMap<>(); + row.put("MODELOMEDID", rsInner.getString("MODELOMEDID")); + row.put("descripcion", rsInner.getString("descripcion")); + resultadoExtra.add(row); + } + } + } + } else { + try (Statement stmtInner = conn.createStatement(); + ResultSet rsInner = stmtInner.executeQuery(dto.getSentenciaSQL())) { + ResultSetMetaData metaData = rsInner.getMetaData(); + int columnCount = metaData.getColumnCount(); + + while (rsInner.next()) { + Map row = new HashMap<>(); + for (int i = 1; i <= columnCount; i++) { + row.put(metaData.getColumnLabel(i), rsInner.getObject(i)); + } + resultadoExtra.add(row); + } + } + } + dto.setSentenciaSQLData(resultadoExtra); + } + + // Si UNIMED = "Si" + if ("Si".equalsIgnoreCase(dto.getUnimed())) { + List> unimedList = new ArrayList<>(); + String unimedQuery = """ + SELECT * + FROM operacion.unidad_material u + RIGHT JOIN operacion.pregununi p USING (umid) + WHERE preguntaid = ? + ORDER BY umid + """; + try (PreparedStatement psUnimed = conn.prepareStatement(unimedQuery)) { + psUnimed.setInt(1, dto.getPreguntaid()); + try (ResultSet rsUnimed = psUnimed.executeQuery()) { + ResultSetMetaData meta = rsUnimed.getMetaData(); + int colCount = meta.getColumnCount(); + while (rsUnimed.next()) { + Map row = new HashMap<>(); + for (int i = 1; i <= colCount; i++) { + row.put(meta.getColumnLabel(i), rsUnimed.getObject(i)); + } + unimedList.add(row); + } + } + } + dto.setUnimedData(unimedList); + } + + preguntas.add(dto); + } + } + } catch (SQLException e) { + throw new RuntimeException("Error al obtener preguntas: " + e.getMessage(), e); + } + + return preguntas; + } + + @Transactional + public List> obtenerUnidadesMedida(String umid) { + List> resultados = new ArrayList<>(); + String query = "SELECT * FROM operacion.unidad_material"; + + if (!"all".equalsIgnoreCase(umid)) { + query += " WHERE umid LIKE ? "; + } + + query += " ORDER BY umid"; + + try (Connection conn = dataSource.getConnection(); + PreparedStatement ps = conn.prepareStatement(query)) { + + if (!"all".equalsIgnoreCase(umid)) { + ps.setString(1, umid); + } + + try (ResultSet rs = ps.executeQuery()) { + ResultSetMetaData meta = rs.getMetaData(); + int colCount = meta.getColumnCount(); + + while (rs.next()) { + Map fila = new LinkedHashMap<>(); + for (int i = 1; i <= colCount; i++) { + fila.put(meta.getColumnName(i).toLowerCase(), rs.getObject(i)); + } + resultados.add(fila); + } + } + + } catch (SQLException e) { + throw new RuntimeException("Error al obtener unidades de medida: " + e.getMessage(), e); + } + + return resultados; + } + + public List obtenerMotivoPreguntas(String motivoid, String preguntaid) { + List resultado = new ArrayList<>(); + + StringBuilder query = new StringBuilder("SELECT * FROM operacion.ot_motpregdet"); + + boolean tieneCondicion = false; + + if (!"all".equalsIgnoreCase(motivoid)) { + query.append(" WHERE trim(motivoid) = '").append(motivoid).append("'"); + tieneCondicion = true; + } + + if (!"all".equalsIgnoreCase(preguntaid)) { + if (tieneCondicion) { + query.append(" AND"); + } else { + query.append(" WHERE"); + } + query.append(" trim(preguntaid) = '").append(preguntaid).append("'"); + } + + query.append(" ORDER BY motivoid, ordenmot"); + + try (Connection connection = dataSource.getConnection(); + Statement stmt = connection.createStatement(); + ResultSet rs = stmt.executeQuery(query.toString())) { + + while (rs.next()) { + motivoPreguntaDTO dto = new motivoPreguntaDTO(); + dto.setMotivoid(rs.getInt("motivoid")); + dto.setPreguntaid(rs.getInt("preguntaid")); + dto.setOrdenmot(rs.getInt("ordenmot")); + resultado.add(dto); + } + + } catch (SQLException e) { + throw new RuntimeException("Error al consultar motivo-pregunta: " + e.getMessage(), e); + } + + return resultado; + } + + public List obtenerDictamenesPorMotivoYDictamen(String motivoId, String dictamenId) { + List resultados = new ArrayList<>(); + + String baseQuery = """ + SELECT d.dictamenid, d.descripcion, d.activo, d.norealizacion, + m.motivoid, m.activo AS activomotivo + FROM operacion.ot_dictamenes d + LEFT JOIN operacion.ot_motivodictamen m USING (dictamenid) + WHERE NOT REGEXP_LIKE(d.dictamenid, 'ANU|MIG') + AND d.activo = 'S' + AND m.activo = 'S' + AND d.norealizacion = 'N' + """; + + StringBuilder queryBuilder = new StringBuilder(baseQuery); + + if (!"all".equalsIgnoreCase(motivoId)) { + queryBuilder.append(" AND TRIM(m.motivoid) = '").append(motivoId).append("' "); + } + + if (!"all".equalsIgnoreCase(dictamenId)) { + queryBuilder.append(" AND TRIM(d.dictamenid) = '").append(dictamenId).append("' "); + } + + queryBuilder.append(" ORDER BY d.dictamenid"); + + try (Connection conn = dataSource.getConnection(); + Statement stmt = conn.createStatement(); + ResultSet rs = stmt.executeQuery(queryBuilder.toString())) { + + while (rs.next()) { + dictamenDTO dto = new dictamenDTO(); + dto.setDictamenid(rs.getString("dictamenid")); + dto.setDescripcion(rs.getString("descripcion")); + dto.setActivo(rs.getString("activo")); + dto.setNorealizacion(rs.getString("norealizacion")); + dto.setMotivoid(rs.getString("motivoid")); + dto.setActivoMotivo(rs.getString("activomotivo")); + resultados.add(dto); + } + + } catch (SQLException e) { + throw new RuntimeException("Error al obtener dictámenes: " + e.getMessage(), e); + } + + return resultados; + } + + public List> obtenerCortesFisicos(String motivoid) { + List> resultado = new ArrayList<>(); + StringBuilder query = new StringBuilder("SELECT * FROM operacion.ot_cortesfisicos "); + + if (!"all".equalsIgnoreCase(motivoid)) { + query.append("WHERE motivoid LIKE ? "); + } + + query.append("ORDER BY motivoid"); + + try (Connection connection = dataSource.getConnection(); + PreparedStatement ps = connection.prepareStatement(query.toString())) { + + if (!"all".equalsIgnoreCase(motivoid)) { + ps.setString(1, motivoid); + } + + try (ResultSet rs = ps.executeQuery()) { + ResultSetMetaData meta = rs.getMetaData(); + int columnas = meta.getColumnCount(); + + while (rs.next()) { + Map fila = new HashMap<>(); + for (int i = 1; i <= columnas; i++) { + fila.put(meta.getColumnLabel(i).toLowerCase(), rs.getObject(i)); + } + resultado.add(fila); + } + } + } catch (SQLException e) { + throw new RuntimeException("Error al obtener cortes físicos: " + e.getMessage(), e); + } + + return resultado; + } + + public List obtenerEmpleadosPorOrigenYUsuario(String origenid, String usuarioid) { + List empleados = new ArrayList<>(); + + String sql = """ + SELECT DISTINCT empleadoid, usuarioid, nombrecompleto, titulo, fechaalt, fechabaj, + lector, inspector, cambio, corte, reconexion, cobro, ordtrab, fotos, + serv_catastro, sobrante, dictamenot, prorrogas, anularconv, ordenarpreg, + jefeid, uniorgid, uniorg + FROM ( + SELECT empleadoid, usuarioid, nombrecompleto, titulo, fechaalt, fechabaj, + lector, inspector, cambio, corte, reconexion, cobro, ordtrab, fotos, + serv_catastro, sobrante, dictamenot, prorrogas, anularconv, ordenarpreg, + jefeid, admon.fn_getuniorg(usuarioid) uniorgid, + admon.fn_getuniorgdesc(usuarioid) uniorg + FROM empleados e + ) d + LEFT JOIN ot_motivos m USING (uniorgid) + WHERE (:origenid = 'all' OR UPPER(TRIM(origenid)) = UPPER(:origenid)) + AND (:usuarioid = 'all' OR :usuarioid IS NULL OR UPPER(TRIM(usuarioid)) = UPPER(:usuarioid)) + ORDER BY empleadoid + """; + + try (Connection connection = dataSource.getConnection(); + PreparedStatement ps = connection.prepareStatement(sql)) { + + ps.setString(1, origenid); + ps.setString(2, usuarioid); + + try (ResultSet rs = ps.executeQuery()) { + while (rs.next()) { + empleadoOrigenDTO dto = new empleadoOrigenDTO(); + dto.setEmpleadoid(rs.getString("empleadoid")); + dto.setUsuarioid(rs.getString("usuarioid")); + dto.setNombrecompleto(rs.getString("nombrecompleto")); + dto.setTitulo(rs.getString("titulo")); + dto.setFechaalt(rs.getString("fechaalt")); + dto.setFechabaj(rs.getString("fechabaj")); + dto.setLector(rs.getString("lector")); + dto.setInspector(rs.getString("inspector")); + dto.setCambio(rs.getString("cambio")); + dto.setCorte(rs.getString("corte")); + dto.setReconexion(rs.getString("reconexion")); + dto.setCobro(rs.getString("cobro")); + dto.setOrdtrab(rs.getString("ordtrab")); + dto.setFotos(rs.getString("fotos")); + dto.setServ_catastro(rs.getString("serv_catastro")); + dto.setSobrante(rs.getString("sobrante")); + dto.setDictamenot(rs.getString("dictamenot")); + dto.setProrrogas(rs.getString("prorrogas")); + dto.setAnularconv(rs.getString("anularconv")); + dto.setOrdenarpreg(rs.getString("ordenarpreg")); + dto.setJefeid(rs.getString("jefeid")); + dto.setUniorgid(rs.getString("uniorgid")); + dto.setUniorg(rs.getString("uniorg")); + + empleados.add(dto); + } + } + + } catch (SQLException e) { + throw new RuntimeException("Error al obtener empleados por origen y usuario: " + e.getMessage(), e); + } + + return empleados; + } + + public Map actualizarSituacionOT(Long otid, String situacion) { + String query; + + switch (situacion) { + case "T": + query = "UPDATE rest.otsituacion SET situacion = 'T' WHERE otid = ?"; + break; + case "R": + query = "INSERT INTO rest.otsituacion VALUES (?, 'R', SYSDATE, NULL, NULL)"; + break; + case "S": + query = "UPDATE rest.otsituacion SET situacion = 'S', fechorasitio = SYSDATE WHERE otid = ?"; + break; + case "C": + query = "UPDATE rest.otsituacion SET situacion = 'C', fechoracomienza = SYSDATE WHERE otid = ?"; + break; + case "D": + query = "DELETE FROM rest.otsituacion WHERE otid = ?"; + break; + default: + throw new IllegalArgumentException("Situación inválida: " + situacion); + } + + try (Connection connection = dataSource.getConnection(); + PreparedStatement stmt = connection.prepareStatement(query)) { + + stmt.setLong(1, otid); + int rowsAffected = stmt.executeUpdate(); + + Map result = new LinkedHashMap<>(); + if (rowsAffected > 0) { + result.put("status", "200"); + result.put("message", "Estado de OT Actualizado [" + situacion + "]"); + result.put("data", Map.of("OTID", otid)); + } else { + result.put("status", "500"); + result.put("message", "No se pudo actualizar Situación de OT [" + situacion + "]"); + result.put("data", Map.of("OTID", otid)); + } + return result; + + } catch (SQLException e) { + throw new RuntimeException("Error al actualizar situación de OT: " + e.getMessage(), e); + } + } + + public Map registrarAvisoNoComm(Long otid, List mensajes) { + Map respuesta = new HashMap<>(); + String mensaje = null; + + for (noCommMensajeDTO msg : mensajes) { + if (msg.getOTID().equals(otid)) { + mensaje = msg.getMENSAJE(); + break; + } + } + + if (mensaje == null) { + respuesta.put("status", "404"); + respuesta.put("message", "No se encontró mensaje para el OTID " + otid); + return respuesta; + } + + String query = "INSERT INTO rest.otsnocomm (otid, fechora, mensaje) VALUES (?, SYSDATE, ?)"; + try (Connection con = dataSource.getConnection(); + PreparedStatement ps = con.prepareStatement(query)) { + ps.setLong(1, otid); + ps.setString(2, mensaje); + int result = ps.executeUpdate(); + if (result > 0) { + respuesta.put("status", "200"); + respuesta.put("message", "Aviso No Comm Recibido [N].."); + respuesta.put("data", Map.of("OTID", otid)); + } else { + respuesta.put("status", "500"); + respuesta.put("message", "No se pudo insertar Aviso No Comm [N].."); + respuesta.put("data", Map.of("OTID", otid)); + } + } catch (SQLException e) { + respuesta.put("status", "500"); + respuesta.put("message", "Error al insertar aviso No Comm: " + e.getMessage()); + respuesta.put("data", Map.of("OTID", otid)); + } + return respuesta; + } + + public void guardarRespuestas(List respuestas) { + for (respuestaOTDTO ot : respuestas) { + Long otid = ot.getOTid(); + + try (Connection conn = dataSource.getConnection()) { + // 1. Obtener datos del predio, carpeta fotos y motivoid + String cpid = null; + String carpetaFotos = null; + String motivoid = null; + + String query = """ + SELECT COALESCE(TO_CHAR(predioid), 'C' || clienteid) AS cpid, + PATH_FOTOS_OTS AS carpetafotos, + motivoid + FROM ordentrabajoenc, PARAM_LECT_FACT + WHERE otid = ? + """; + + try (PreparedStatement ps = conn.prepareStatement(query)) { + ps.setLong(1, otid); + ResultSet rs = ps.executeQuery(); + if (rs.next()) { + cpid = rs.getString("cpid"); + carpetaFotos = rs.getString("carpetafotos"); + motivoid = rs.getString("motivoid"); + } + } + + if (cpid == null || carpetaFotos == null) { + throw new RuntimeException("Datos de OT no encontrados"); + } + + // 2. Crear carpetas + String localPath = "AppOTs/" + cpid + "/" + otid; + String nasPath = carpetaFotos.replace("\\", "/") + cpid + "/" + otid; + + new File(localPath + "/fotos").mkdirs(); + new File(nasPath).mkdirs(); + + // 3. Guardar archivo JSON + String jsonPath = localPath + "/Data_" + otid + ".json"; + try (OutputStream out = new FileOutputStream(jsonPath)) { + out.write(new ObjectMapper().writeValueAsBytes(List.of(ot))); + } + + // 4. Guardar fotos + int nfoto = 1; + for (FotoBase64DTO foto : ot.getFoto()) { + byte[] imageBytes = Base64.getDecoder().decode(foto.getBase64()); + + try (OutputStream out1 = new FileOutputStream(localPath + "/fotos/" + otid + "_foto" + nfoto + ".jpg"); + OutputStream out2 = new FileOutputStream(nasPath + "/" + otid + "_foto" + nfoto + ".jpg")) { + + out1.write(imageBytes); + out2.write(imageBytes); + } + nfoto++; + } + + // 5. Preparar registros de respuestas (tipo PL/SQL Table) + StringBuilder respPregBuilder = new StringBuilder("REST.TBOTDET("); + boolean first = true; + for (respuestaPreguntaDTO resp : ot.getResppreg()) { + if (!first) respPregBuilder.append(", "); + respPregBuilder.append("REST.TOTDET(") + .append(otid).append(", ") + .append("'").append(resp.getPreguntaId()).append("', ") + .append("'").append(resp.getRespuesta()).append("', ") + .append("'").append(resp.getUmId()).append("')"); + first = false; + } + respPregBuilder.append(")"); + + String respPregSQL = ot.getResppreg().isEmpty() ? "null" : respPregBuilder.toString(); + + // 6. Preparar registros de otras hijas + StringBuilder othijasBuilder = new StringBuilder("REST.TBOTHIJAS("); + first = true; + for (OTHijaDTO hija : ot.getOThijas()) { + if (List.of("300", "304", "311", "317", "321").contains(hija.getMotivoId())) + continue; + + if (!first) othijasBuilder.append(", "); + othijasBuilder.append("REST.TOTHIJA('") + .append(hija.getMotivoId()).append("', '") + .append(hija.getDescripcion()).append("', '") + .append(hija.getMotSusId()).append("')"); + first = false; + } + othijasBuilder.append(")"); + String othijasSQL = ot.getOThijas().isEmpty() ? "null" : othijasBuilder.toString(); + + // 7. Insertar en DB + String insertSQL = """ + INSERT INTO rest.otresp ( + otid, fechaprecierre, usuarioprecierre, + horainicio, horatermino, observacion, + nombsuperv, nombintegra, dictamenid, + obsdictamen, usudictamen, transaccid, + transaccdt, respreg, othijas + ) VALUES ( + ?, TO_DATE(? || ' ' || ?, 'dd/mm/yyyy hh24:mi:ss'), + ?, TO_DATE(? || ' ' || ?, 'dd/mm/yyyy hh24:mi:ss'), + ?, ?, ?, ?, ?, utl_raw.cast_to_raw(?), SYSTIMESTAMP, + %s, %s + ) + """.formatted(respPregSQL, othijasSQL); + + try (PreparedStatement ps = conn.prepareStatement(insertSQL)) { + ps.setLong(1, otid); + ps.setString(2, ot.getFechaPreCierre()); + ps.setString(3, ot.getHoraInicio()); + ps.setString(4, ot.getUsuarioPreCierre()); + ps.setString(5, ot.getFechaPreCierre()); + ps.setString(6, ot.getHoraTermino()); + ps.setString(7, ot.getObservacion()); + ps.setString(8, ot.getNombSuperv()); + ps.setString(9, ot.getNombIntegra()); + ps.setString(10, ot.getDictamenId()); + ps.setString(11, ot.getObsDictamen()); + ps.setString(12, ot.getTransaccId()); + + ps.executeUpdate(); + } + + } catch (Exception e) { + throw new RuntimeException("Error al guardar respuestas para OT " + otid + ": " + e.getMessage(), e); + } + } + } + + public void guardarFotosOT(Integer otid, List fotosOTList) { + for (fotoOTDTO ot : fotosOTList) { + if (!otid.equals(ot.getOTID())) { + continue; + } + + String rutaBase = "AppOTs/" + otid; + File carpeta = new File(rutaBase + "/fotos/"); + if (!carpeta.exists()) { + carpeta.mkdirs(); + } + + int contador = 1; + for (fotoOTDTO.FotoDTO foto : ot.getFOTOS()) { + String nombreArchivo = rutaBase + "/fotos/" + otid + "_foto" + contador + ".jpg"; + guardarImagenDesdeBase64(foto.getBase64(), nombreArchivo); + contador++; + } + } + } + + private void guardarImagenDesdeBase64(String base64, String rutaArchivo) { + try (FileOutputStream fos = new FileOutputStream(rutaArchivo)) { + byte[] imagenBytes = Base64.getDecoder().decode(base64); + fos.write(imagenBytes); + } catch (IOException e) { + throw new RuntimeException("Error al guardar imagen: " + rutaArchivo, e); + } + } + + public List obtenerPorTransaccionId(String transaccid) { + List resultados = new ArrayList<>(); + String query = "SELECT otid, transaccdt " + + "FROM rest.otresp " + + "WHERE regexp_like(utl_raw.cast_to_varchar2(transaccid), ?)"; + + try (Connection conn = dataSource.getConnection(); + PreparedStatement ps = conn.prepareStatement(query)) { + + ps.setString(1, transaccid); + + try (ResultSet rs = ps.executeQuery()) { + while (rs.next()) { + transaccionDTO dto = new transaccionDTO(); + dto.setOtid(rs.getLong("otid")); + Timestamp ts = rs.getTimestamp("transaccdt"); + dto.setTransaccdt(ts != null ? ts.toLocalDateTime() : null); + resultados.add(dto); + } + } + + } catch (SQLException e) { + throw new RuntimeException("Error al consultar transacción: " + e.getMessage(), e); + } + + return resultados; + } +} diff --git a/src/main/java/jumapacelaya/gob/mx/predios/servicio/PredioServicio.java b/src/main/java/jumapacelaya/gob/mx/predios/servicio/PredioServicio.java index e88e420..daee807 100644 --- a/src/main/java/jumapacelaya/gob/mx/predios/servicio/PredioServicio.java +++ b/src/main/java/jumapacelaya/gob/mx/predios/servicio/PredioServicio.java @@ -578,4 +578,78 @@ public class PredioServicio { return Optional.empty(); } + @Transactional + public PredioDTO obtenerPredioAppOts(String vPredContrRefer) { + String query = """ + SELECT predioid, contrato, clienteid, c.nombre AS nomcliente, + fn_getdomicilio(p.direcid) AS direccion, + fn_get_direccion(p.direcid) AS direccionmostrar, + fn_direccionshort(p.direcid) AS direccioncorta, + p.coordx, p.coordy, p.zonafactid, p.serialmed, + edopredioid, e.nombre AS edopredio, + usoid, u.nombre AS uso, + actividadid, a.nombre AS actividad, + fn_get_tarifa(p.predioid) AS tarifa + FROM predios p + LEFT JOIN clientes c USING (clienteid) + LEFT JOIN estadospredio e USING (edopredioid) + LEFT JOIN usos u USING (usoid) + LEFT JOIN actividades a USING (usoid, actividadid) + WHERE ( + CASE + WHEN LENGTH(?) = 30 AND predioid = SUBSTR(?, 24, 6) THEN 1 + WHEN LENGTH(?) = 8 AND REGEXP_LIKE(contrato, ?) THEN 1 + WHEN LENGTH(?) <= 6 AND predioid = TO_NUMBER(?) THEN 1 + ELSE 0 + END + ) = 1 + """; + + try (Connection conn = dataSource.getConnection(); + PreparedStatement ps = conn.prepareStatement(query)) { + + ps.setString(1, vPredContrRefer); + ps.setString(2, vPredContrRefer); + ps.setString(3, vPredContrRefer); + ps.setString(4, vPredContrRefer); + ps.setString(5, vPredContrRefer); + ps.setString(6, vPredContrRefer); + + ResultSet rs = ps.executeQuery(); + if (rs.next()) { + PredioDTO dto = new PredioDTO( + rs.getLong("predioid"), + rs.getLong("clienteid"), + rs.getString("contrato"), + rs.getString("nomcliente"), + rs.getString("direccion"), + rs.getString("direccionmostrar"), + rs.getString("direccioncorta"), + null, + rs.getBigDecimal("coordx") != null ? rs.getBigDecimal("coordx").doubleValue() : null, + rs.getBigDecimal("coordy") != null ? rs.getBigDecimal("coordy").doubleValue() : null, + rs.getString("zonafactid"), + rs.getString("serialmed"), + null, + null, + rs.getString("edopredioid"), + rs.getString("edopredio"), + rs.getString("usoid"), + rs.getString("uso"), + rs.getInt("actividadid"), + rs.getString("actividad"), + rs.getString("tarifa") + ); + + return dto; + } else { + return null; + } + + } catch (SQLException e) { + throw new RuntimeException("Error al obtener predio para AppOTs: " + e.getMessage(), e); + } + } + + }