From da38830a01cbd03ec475915abcb784b24dce253e Mon Sep 17 00:00:00 2001 From: akirwana Date: Fri, 4 Jul 2025 15:41:52 -0600 Subject: [PATCH] Endpoints predios 11/16 --- .../controlador/PredioControlador.java | 97 ++++- .../gob/mx/predios/dto/PredioDTO.java | 59 ++- .../mx/predios/servicio/PredioServicio.java | 338 ++++++++++++++++++ 3 files changed, 474 insertions(+), 20 deletions(-) diff --git a/src/main/java/jumapacelaya/gob/mx/predios/controlador/PredioControlador.java b/src/main/java/jumapacelaya/gob/mx/predios/controlador/PredioControlador.java index ffca612..91a927b 100644 --- a/src/main/java/jumapacelaya/gob/mx/predios/controlador/PredioControlador.java +++ b/src/main/java/jumapacelaya/gob/mx/predios/controlador/PredioControlador.java @@ -1,10 +1,13 @@ package jumapacelaya.gob.mx.predios.controlador; import java.util.Collections; +import java.util.HashMap; import java.util.Map; import java.util.Optional; import io.micronaut.http.HttpResponse; +import io.micronaut.http.HttpStatus; +import io.micronaut.http.MutableHttpResponse; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Get; import io.micronaut.http.annotation.PathVariable; @@ -36,12 +39,96 @@ public class PredioControlador { } @Get("/atm/{referencia}") - public HttpResponse getPredioATM(@PathVariable String referencia) { + public HttpResponse obtenerPredioATM(@PathVariable String referencia) { return predioServicio.obtenerPredioATM(referencia) - .>map(HttpResponse::ok) - .orElse(HttpResponse.notFound( - Map.of("message", "Predio no encontrado para referencia: " + referencia) - )); + .>map(HttpResponse::ok) + .orElse(HttpResponse.notFound( + Map.of("message", "Predio no encontrado para referencia: " + referencia) + ) + ); + } + + @Get("/apc/{valor}") + public HttpResponse obtenerPredioAPC(String valor) { + Optional resultado = predioServicio.obtenerPredioAPC(valor); + return resultado + .>map(HttpResponse::ok) + .orElse(HttpResponse.notFound(Map.of("message", "Predio no encontrado") + )); + } + + @Get("/appots/{id}") + public HttpResponse obtenerPredioAppOTs(Long id) { + return predioServicio.obtenerPredioAppOTs(id) + .>map(HttpResponse::ok) + .orElseGet(() -> { + Map error = new HashMap<>(); + error.put("message", "Predio AppOTs no encontrado"); + return HttpResponse.status(HttpStatus.NOT_FOUND).body(error); + + } + ); + } + + @Get("/direccion/{predioId}") + public HttpResponse obtenerDireccionPredio(@PathVariable Long predioId) { + return predioServicio.obtenerDireccionPredio(predioId) + .>map(HttpResponse::ok) + .orElse(HttpResponse.notFound( + Map.of("message", "Predio no encontrado") + ) + ); + } + + @Get("/direccion-cooper/{predioId}") + public HttpResponse> obtenerDireccionCooper(@PathVariable Long predioId) { + String mensaje = predioServicio.obtenerDireccionCooper(predioId); + return HttpResponse.ok(Map.of("message", mensaje)); + } + + @Get("/direccion-coopers/{predioId}") + public MutableHttpResponse>> obtenerDireccionCoopers(@PathVariable Long predioId) { + Optional mensaje = predioServicio.obtenerDireccionCoopers(predioId); + return HttpResponse.ok(Map.of("message", mensaje)); + } + + @Get("/coordx/{predioId}") + public HttpResponse obtenerCoordX(@PathVariable Long predioId) { + return predioServicio.obtenerCoordX(predioId) + .map(HttpResponse::ok) + .orElse(HttpResponse.notFound()); + } + + @Get("/coordy/{predioId}") + public HttpResponse obtenerCoordY(@PathVariable Long predioId) { + return predioServicio.obtenerCoordY(predioId) + .map(HttpResponse::ok) + .orElse(HttpResponse.notFound()); + } + + @Get("/cliente/{predioId}") + public HttpResponse obtenerClienteId(@PathVariable Long predioId) { + return predioServicio.obtenerClienteId(predioId) + .map(HttpResponse::ok) + .orElse(HttpResponse.notFound()); + } + + @Get("/ot/{predioId}/{motivoId}") + public HttpResponse obtenerOT(@PathVariable Long predioId, + @PathVariable String motivoId) { + return predioServicio.obtenerOT(predioId, motivoId) + .map(HttpResponse::ok) + .orElse(HttpResponse.notFound() + ); + } + + @Get("/situacion-corte/{predioId}/{tipo}") + public HttpResponse obtenerSituacionCorte(@PathVariable Long predioId, + @PathVariable String tipo) { + return predioServicio.obtenerSituacionCorte(predioId, tipo) + .map(HttpResponse::ok) + .orElse(HttpResponse.noContent() + ); } } diff --git a/src/main/java/jumapacelaya/gob/mx/predios/dto/PredioDTO.java b/src/main/java/jumapacelaya/gob/mx/predios/dto/PredioDTO.java index 717a4f6..8a226e0 100644 --- a/src/main/java/jumapacelaya/gob/mx/predios/dto/PredioDTO.java +++ b/src/main/java/jumapacelaya/gob/mx/predios/dto/PredioDTO.java @@ -26,26 +26,15 @@ public class PredioDTO { private Integer actividadId; private String actividad; private Double adeudoCortes; + private String tarifa; - // Constructor consulta predio + // ✅ Constructor general para todos los campos public PredioDTO(Long predioId, Long clienteId, String contrato, String nombreCliente, String direccion, String direccionMostrar, String direccionCorta, String telefono, Double coordX, Double coordY, String zonaFactId, String serialMedidor, String marcaMedidor, String modeloMedidor, String estadoPredioId, String estadoPredio, String usoId, String uso, Integer actividadId, - String actividad) { - this(predioId, clienteId, contrato, nombreCliente, direccion, direccionMostrar, direccionCorta, - telefono, coordX, coordY, zonaFactId, serialMedidor, marcaMedidor, modeloMedidor, - estadoPredioId, estadoPredio, usoId, uso, actividadId, actividad, null); - } - - // Constructor completo (para restPredioVar) - public PredioDTO(Long predioId, Long clienteId, String contrato, String nombreCliente, - String direccion, String direccionMostrar, String direccionCorta, String telefono, - Double coordX, Double coordY, String zonaFactId, String serialMedidor, - String marcaMedidor, String modeloMedidor, String estadoPredioId, - String estadoPredio, String usoId, String uso, Integer actividadId, - String actividad, Double adeudoCortes) { + String actividad, Double adeudoCortes, String tarifa) { this.predioId = predioId; this.clienteId = clienteId; this.contrato = contrato; @@ -67,9 +56,46 @@ public class PredioDTO { this.actividadId = actividadId; this.actividad = actividad; this.adeudoCortes = adeudoCortes; + this.tarifa = tarifa; + } + + // ✅ Constructor para obtenerPredio + public PredioDTO(Long predioId, Long clienteId, String contrato, String nombreCliente, + String direccion, String direccionMostrar, String direccionCorta, String telefono, + Double coordX, Double coordY, String zonaFactId, String serialMedidor, + String marcaMedidor, String modeloMedidor, String estadoPredioId, + String estadoPredio, String usoId, String uso, Integer actividadId, + String actividad) { + this(predioId, clienteId, contrato, nombreCliente, direccion, direccionMostrar, direccionCorta, + telefono, coordX, coordY, zonaFactId, serialMedidor, marcaMedidor, modeloMedidor, + estadoPredioId, estadoPredio, usoId, uso, actividadId, actividad, null, null); } - // Getters y setters + // ✅ Constructor para obtenerPredioVar + public PredioDTO(Long predioId, Long clienteId, String contrato, String nombreCliente, + String direccion, String direccionMostrar, String direccionCorta, String telefono, + Double coordX, Double coordY, String zonaFactId, String serialMedidor, + String marcaMedidor, String modeloMedidor, String estadoPredioId, + String estadoPredio, String usoId, String uso, Integer actividadId, + String actividad, Double adeudoCortes) { + this(predioId, clienteId, contrato, nombreCliente, direccion, direccionMostrar, direccionCorta, + telefono, coordX, coordY, zonaFactId, serialMedidor, marcaMedidor, modeloMedidor, + estadoPredioId, estadoPredio, usoId, uso, actividadId, actividad, adeudoCortes, null); + } + + // ✅ Constructor para obtenerPredioAppOTs + public PredioDTO(Long predioId, Long clienteId, String contrato, String nombreCliente, + String direccion, String direccionMostrar, String direccionCorta, String telefono, + Double coordX, Double coordY, String zonaFactId, String serialMedidor, + String marcaMedidor, String modeloMedidor, String estadoPredioId, + String estadoPredio, String usoId, String uso, Integer actividadId, + String actividad, String tarifa) { + this(predioId, clienteId, contrato, nombreCliente, direccion, direccionMostrar, direccionCorta, + telefono, coordX, coordY, zonaFactId, serialMedidor, marcaMedidor, modeloMedidor, + estadoPredioId, estadoPredio, usoId, uso, actividadId, actividad, null, tarifa); + } + + // Getters y Setters public Long getPredioId() { return predioId; } public void setPredioId(Long predioId) { this.predioId = predioId; } @@ -132,4 +158,7 @@ public class PredioDTO { public Double getAdeudoCortes() { return adeudoCortes; } public void setAdeudoCortes(Double adeudoCortes) { this.adeudoCortes = adeudoCortes; } + + public String getTarifa() { return tarifa; } + public void setTarifa(String tarifa) { this.tarifa = tarifa; } } 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 09eb511..e88e420 100644 --- a/src/main/java/jumapacelaya/gob/mx/predios/servicio/PredioServicio.java +++ b/src/main/java/jumapacelaya/gob/mx/predios/servicio/PredioServicio.java @@ -229,6 +229,7 @@ public class PredioServicio { rs.getString("uso"), rs.getInt("actividadid"), rs.getString("actividad"), + null, null )); } @@ -240,4 +241,341 @@ public class PredioServicio { return Optional.empty(); } + @ReadOnly + public Optional obtenerPredioAPC(String valor) { + String query = """ + SELECT predioid, contrato, clienteid, c.nombre nomcliente, + fn_getdomicilio(p.direcid) direccion, fn_get_direccion(p.direcid) direccionmostrar, + fn_direccionshort(p.direcid) direccioncorta, + p.coordx, p.coordy, p.zonafactid, p.serialmed, + edopredioid, e.nombre edopredio, usoid, u.nombre uso, + actividadid, a.nombre actividad + 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 ( + (LENGTH(?) = 30 AND predioid = SUBSTR(?, 24, 6)) OR + (LENGTH(?) = 8 AND REGEXP_LIKE(contrato, ?)) OR + (LENGTH(?) <= 6 AND predioid = TO_NUMBER(?)) + ) + """; + + try (Connection connection = dataSource.getConnection(); + PreparedStatement stmt = connection.prepareStatement(query)) { + + for (int i = 1; i <= 6; i++) { + stmt.setString(i, valor); + } + + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + return Optional.of(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.getDouble("coordx"), + rs.getDouble("coordy"), + 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") + )); + } else { + return Optional.empty(); + } + } + } catch (SQLException e) { + throw new RuntimeException("Error al consultar predio APC: " + e.getMessage(), e); + } + } + + @ReadOnly + public Optional obtenerPredioAppOTs(Long predioId) { + String query = """ + SELECT predioid, contrato, clienteid, c.nombre nomcliente, + fn_getdomicilio(p.direcid) direccion, fn_get_direccion(p.direcid) direccionmostrar, + fn_direccionshort(p.direcid) direccioncorta, + p.coordx, p.coordy, p.zonafactid, p.serialmed, + edopredioid, e.nombre edopredio, usoid, u.nombre uso, + actividadid, a.nombre actividad, fn_get_tarifa(p.predioid) 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 predioid = ? + """; + + try (Connection connection = dataSource.getConnection(); + PreparedStatement stmt = connection.prepareStatement(query)) { + + stmt.setLong(1, predioId); + + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + return Optional.of(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.getDouble("coordx"), + rs.getDouble("coordy"), + 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"), + null, + rs.getString("tarifa") + ) + ); + } else { + return Optional.empty(); + } + } + } catch (SQLException e) { + throw new RuntimeException("Error al consultar predio AppOTs: " + e.getMessage(), e); + } + } + + @ReadOnly + public Optional obtenerDireccionPredio(Long predioId) { + String query = """ + SELECT predioid, contrato, clienteid, c.nombre nomcliente, + fn_getdomicilio(p.direcid) direccion, + fn_get_direccion(p.direcid) direccionmostrar, + fn_direccionshort(p.direcid) direccioncorta + FROM predios p + LEFT JOIN clientes c USING (clienteid) + WHERE predioid = ? + """; + + try (Connection connection = dataSource.getConnection(); + PreparedStatement stmt = connection.prepareStatement(query)) { + + stmt.setLong(1, predioId); + + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + return Optional.of(new PredioDTO( + rs.getLong("predioid"), + rs.getLong("clienteid"), + rs.getString("contrato"), + rs.getString("nomcliente"), + rs.getString("direccion"), + rs.getString("direccionmostrar"), + rs.getString("direccioncorta"), + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null + )); + } + } + } catch (SQLException e) { + throw new RuntimeException("Error al obtener dirección del predio: " + e.getMessage(), e); + } + return Optional.empty(); + } + + @ReadOnly + public String obtenerDireccionCooper(Long predioId) { + String query = "SELECT fn_direccionshort(p.direcid) AS direccion FROM predios p WHERE predioid = ?"; + + try (Connection connection = dataSource.getConnection(); + PreparedStatement stmt = connection.prepareStatement(query)) { + + stmt.setLong(1, predioId); + + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + String direccion = rs.getString("direccion"); + if (direccion != null && !direccion.isBlank()) { + return "TU DIRECCIÓN ES: " + direccion; + } + } + } + } catch (SQLException e) { + throw new RuntimeException("Error al obtener la dirección corta del predio: " + e.getMessage(), e); + } + + return "El número de predio: " + predioId + " no existe. Por favor verificalo en tu recibo."; + } + + @ReadOnly + public Optional obtenerDireccionCoopers(Long predioId) { + String query = "SELECT fn_direccionshort(p.direcid) AS direccion FROM predios p WHERE predioid = ?"; + + try (Connection connection = dataSource.getConnection(); + PreparedStatement stmt = connection.prepareStatement(query)) { + + stmt.setLong(1, predioId); + + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + return Optional.ofNullable(rs.getString("direccion")); + } + } + } catch (SQLException e) { + throw new RuntimeException("Error al obtener la dirección corta cruda: " + e.getMessage(), e); + } + + return Optional.empty(); + } + + @ReadOnly + public Optional obtenerCoordX(Long predioId) { + String query = "SELECT coordx FROM predios WHERE predioid = ?"; + + try (Connection connection = dataSource.getConnection(); + PreparedStatement stmt = connection.prepareStatement(query)) { + + stmt.setLong(1, predioId); + + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + return Optional.ofNullable(rs.getDouble("coordx")); + } + } + } catch (SQLException e) { + throw new RuntimeException("Error al obtener coordx: " + e.getMessage(), e); + } + + return Optional.empty(); + } + + @ReadOnly + public Optional obtenerCoordY(Long predioId) { + String query = "SELECT coordy FROM predios WHERE predioid = ?"; + + try (Connection connection = dataSource.getConnection(); + PreparedStatement stmt = connection.prepareStatement(query)) { + + stmt.setLong(1, predioId); + + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + return Optional.ofNullable(rs.getDouble("coordy")); + } + } + } catch (SQLException e) { + throw new RuntimeException("Error al obtener coordy: " + e.getMessage(), e); + } + + return Optional.empty(); + } + + @ReadOnly + public Optional obtenerClienteId(Long predioId) { + String query = "SELECT clienteid FROM predios WHERE predioid = ?"; + + try (Connection connection = dataSource.getConnection(); + PreparedStatement stmt = connection.prepareStatement(query)) { + + stmt.setLong(1, predioId); + + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + return Optional.of(rs.getLong("clienteid")); + } + } + } catch (SQLException e) { + throw new RuntimeException("Error al obtener clienteid: " + e.getMessage(), e); + } + + return Optional.empty(); + } + + @ReadOnly + public Optional obtenerOT(Long predioId, String motivoId) { + String query = """ + SELECT MAX(otid) otid + FROM ordentrabajoenc + WHERE predioid = ? + AND motivoid = ? + AND fechaprecierre IS NULL + AND fechaanulacion IS NULL + """; + + try (Connection connection = dataSource.getConnection(); + PreparedStatement stmt = connection.prepareStatement(query)) { + + stmt.setLong(1, predioId); + stmt.setString(2, motivoId); + + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + long otid = rs.getLong("otid"); + if (!rs.wasNull()) { + return Optional.of(otid); + } + } + } + } catch (SQLException e) { + throw new RuntimeException("Error al obtener OT: " + e.getMessage(), e); + } + + return Optional.empty(); + } + + @ReadOnly + public Optional obtenerSituacionCorte(Long predioId, String tipo) { + String query = "SELECT fn_getsituacioncorte(?, ?) AS situacion FROM dual"; + + try (Connection connection = dataSource.getConnection(); + PreparedStatement stmt = connection.prepareStatement(query)) { + + stmt.setLong(1, predioId); + stmt.setString(2, tipo); + + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + String situacion = rs.getString("situacion"); + if (situacion != null && !situacion.trim().isEmpty() && + !situacion.equalsIgnoreCase("Sin Corte") && + !situacion.equalsIgnoreCase("Reconexion Solicitada")) { + return Optional.of(situacion); + } + } + } + } catch (SQLException e) { + throw new RuntimeException("Error al consultar situación de corte: " + e.getMessage(), e); + } + + return Optional.empty(); + } + }