@ -1,6 +1,8 @@
package mx.gob.jumapacelaya.services ;
import mx.gob.jumapacelaya.models.* ;
import mx.gob.jumapacelaya.models.encuestas.Pregunta ;
import mx.gob.jumapacelaya.models.encuestas.Respuesta ;
import oracle.jdbc.OracleConnection ;
import oracle.jdbc.OraclePreparedStatement ;
import oracle.sql.CLOB ;
@ -17,6 +19,7 @@ import java.sql.*;
import java.time.LocalDate ;
import java.util.ArrayList ;
import java.util.List ;
import java.util.UUID ;
@Service
public class DatabaseService {
@ -904,4 +907,137 @@ public class DatabaseService {
e . printStackTrace ( ) ;
}
}
/*************************************** ENCUESTAS ******************************************************************************************************/
public List < Pregunta > getPreguntas ( ) {
List < Pregunta > preguntas = new ArrayList < > ( ) ;
String query = "" "
select p . *
from PREGUNTAS p
join ENCUESTAS e on e . ENCUESTAID = p . ENCUESTAID
where e . ENCUESTAID = 1
order by p . ORDEN ASC
"" " ;
try ( Connection conn = getMysqlConnection ( ) ;
Statement stmt = conn . createStatement ( ) ;
ResultSet rs = stmt . executeQuery ( query ) ) {
while ( rs . next ( ) ) {
Pregunta pregunta = new Pregunta (
rs . getInt ( "preguntaid" ) ,
rs . getInt ( "encuestaid" ) ,
rs . getString ( "pregunta" ) ,
rs . getInt ( "orden" )
) ;
preguntas . add ( pregunta ) ;
}
} catch ( SQLException e ) {
e . printStackTrace ( ) ;
}
return preguntas ;
}
public void insertRespuestas ( int manteniminetoId , List < Respuesta > respuestas , int empleadoid , String token ) {
String insertQuery = "" "
insert into RESPUESTAS
( MANTENIMIENTOID , PREGUNTAID , FECHARESPUESTA , RESPUESTA , EMPLEADOID )
values
( ? , ? , ? , ? , ? )
"" " ;
String updateQuery = "" "
update MANTENIMIENTOS
set ENCUESTA = 'S'
where MANTENIMIENTOID = ?
"" " ;
String markTokenUsedQuery = "" "
update ENCUESTATOKENS
set USADO = '1' where TOKEN = ?
"" " ;
try ( Connection conn = getMysqlConnection ( ) ) {
conn . setAutoCommit ( false ) ;
try ( PreparedStatement insertStmt = conn . prepareStatement ( insertQuery ) ;
PreparedStatement updateStmt = conn . prepareStatement ( updateQuery ) ;
PreparedStatement tokenStmt = conn . prepareStatement ( markTokenUsedQuery ) ) {
Timestamp ahora = new Timestamp ( System . currentTimeMillis ( ) ) ;
/ / 1 . Insertar las respuestas en el Batch
for ( Respuesta r : respuestas ) {
insertStmt . setInt ( 1 , manteniminetoId ) ;
insertStmt . setInt ( 2 , r . getPreguntaId ( ) ) ;
insertStmt . setTimestamp ( 3 , ahora ) ;
insertStmt . setBoolean ( 4 , r . getRespuesta ( ) ) ;
insertStmt . setInt ( 5 , empleadoid ) ;
insertStmt . addBatch ( ) ;
}
insertStmt . executeBatch ( ) ;
/ / 2 . Marcar mantenimiento como encuestado
updateStmt . setInt ( 1 , manteniminetoId ) ;
updateStmt . executeUpdate ( ) ;
/ / 3 . Invalidar el token para que no se use de nuevo
tokenStmt . setString ( 1 , token ) ;
tokenStmt . executeUpdate ( ) ;
conn . commit ( ) ;
} catch ( SQLException e ) {
conn . rollback ( ) ;
throw e ;
}
} catch ( Exception e ) {
throw new RuntimeException ( "Error al guardar encuesta y procesar el token" , e ) ;
}
}
public String crearTokenEncuesta ( int mantenimientoid ) {
String token = UUID . randomUUID ( ) . toString ( ) ;
Timestamp expira = new Timestamp ( System . currentTimeMillis ( ) + ( 24 * 60 * 60 * 1000 ) ) ;
String query = "INSERT INTO ENCUESTATOKENS (TOKEN, MANTENIMIENTOID, FECHAEXPIRACION) VALUES (?, ?, ?)" ;
try ( Connection conn = getMysqlConnection ( ) ;
PreparedStatement stmt = conn . prepareStatement ( query ) ) {
stmt . setString ( 1 , token ) ;
stmt . setInt ( 2 , mantenimientoid ) ;
stmt . setTimestamp ( 3 , expira ) ;
stmt . executeUpdate ( ) ;
} catch ( SQLException e ) {
e . printStackTrace ( ) ;
}
return token ;
}
public Integer validarTokenYObtenerId ( String token ) {
String query = "SELECT MANTENIMIENTOID FROM ENCUESTATOKENS " +
"WHERE TOKEN = ? AND FECHAEXPIRACION > NOW() AND USADO = FALSE" ;
try ( Connection conn = getMysqlConnection ( ) ;
PreparedStatement stmt = conn . prepareStatement ( query ) ) {
stmt . setString ( 1 , token ) ;
ResultSet rs = stmt . executeQuery ( ) ;
if ( rs . next ( ) ) {
return rs . getInt ( "MANTENIMIENTOID" ) ;
}
} catch ( SQLException e ) {
e . printStackTrace ( ) ;
}
return null ;
}
/***************************************************************************************************************************************/
}