automatizar nuevas convocatorias
This commit is contained in:
parent
bfdf57941c
commit
c34b46624c
|
|
@ -0,0 +1,21 @@
|
||||||
|
package es.tatvil.taiageweb.empleo;
|
||||||
|
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/api/empleo")
|
||||||
|
public class EmpleoController {
|
||||||
|
private final HistoricoRepository historicoRepository;
|
||||||
|
|
||||||
|
public EmpleoController(HistoricoRepository historicoRepository) {
|
||||||
|
this.historicoRepository = historicoRepository;
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/publicaciones")
|
||||||
|
public List<PublicacionEmpleo> getPublicaciones() {
|
||||||
|
return historicoRepository.obtenerTodas();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,31 @@
|
||||||
|
package es.tatvil.taiageweb.empleo;
|
||||||
|
|
||||||
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class EmpleoMonitorService {
|
||||||
|
private final List<FuenteEmpleo> fuentes;
|
||||||
|
private final HistoricoRepository historicoRepository;
|
||||||
|
private final NotificadorService notificadorService;
|
||||||
|
|
||||||
|
public EmpleoMonitorService(List<FuenteEmpleo> fuentes, HistoricoRepository historicoRepository, NotificadorService notificadorService) {
|
||||||
|
this.fuentes = fuentes;
|
||||||
|
this.historicoRepository = historicoRepository;
|
||||||
|
this.notificadorService = notificadorService;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Scheduled(cron = "0 0 8 * * *") // Cada día a las 8:00
|
||||||
|
public void monitorizar() {
|
||||||
|
for (FuenteEmpleo fuente : fuentes) {
|
||||||
|
List<PublicacionEmpleo> nuevas = fuente.obtenerNuevasPublicaciones();
|
||||||
|
for (PublicacionEmpleo pub : nuevas) {
|
||||||
|
if (!historicoRepository.existe(pub)) {
|
||||||
|
historicoRepository.guardar(pub);
|
||||||
|
notificadorService.notificar(pub);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
package es.tatvil.taiageweb.empleo;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface FuenteEmpleo {
|
||||||
|
List<PublicacionEmpleo> obtenerNuevasPublicaciones();
|
||||||
|
String getNombre();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
package es.tatvil.taiageweb.empleo;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface HistoricoRepository {
|
||||||
|
boolean existe(PublicacionEmpleo publicacion);
|
||||||
|
void guardar(PublicacionEmpleo publicacion);
|
||||||
|
List<PublicacionEmpleo> obtenerTodas();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,73 @@
|
||||||
|
package es.tatvil.taiageweb.empleo;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
import java.sql.*;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Repository
|
||||||
|
public class HistoricoSQLiteRepository implements HistoricoRepository {
|
||||||
|
private static final String DB_URL = "jdbc:sqlite:empleo_historico.db";
|
||||||
|
|
||||||
|
public HistoricoSQLiteRepository() {
|
||||||
|
try (Connection conn = DriverManager.getConnection(DB_URL)) {
|
||||||
|
String sql = "CREATE TABLE IF NOT EXISTS publicaciones (organismo TEXT, fecha TEXT, titulo TEXT, enlace TEXT, PRIMARY KEY (organismo, fecha, titulo, enlace))";
|
||||||
|
conn.createStatement().execute(sql);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
// Manejar error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean existe(PublicacionEmpleo publicacion) {
|
||||||
|
String sql = "SELECT 1 FROM publicaciones WHERE organismo=? AND fecha=? AND titulo=? AND enlace=?";
|
||||||
|
try (Connection conn = DriverManager.getConnection(DB_URL);
|
||||||
|
PreparedStatement ps = conn.prepareStatement(sql)) {
|
||||||
|
ps.setString(1, publicacion.getOrganismo());
|
||||||
|
ps.setString(2, publicacion.getFecha().toString());
|
||||||
|
ps.setString(3, publicacion.getTitulo());
|
||||||
|
ps.setString(4, publicacion.getEnlace());
|
||||||
|
ResultSet rs = ps.executeQuery();
|
||||||
|
return rs.next();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void guardar(PublicacionEmpleo publicacion) {
|
||||||
|
String sql = "INSERT OR IGNORE INTO publicaciones (organismo, fecha, titulo, enlace) VALUES (?, ?, ?, ?)";
|
||||||
|
try (Connection conn = DriverManager.getConnection(DB_URL);
|
||||||
|
PreparedStatement ps = conn.prepareStatement(sql)) {
|
||||||
|
ps.setString(1, publicacion.getOrganismo());
|
||||||
|
ps.setString(2, publicacion.getFecha().toString());
|
||||||
|
ps.setString(3, publicacion.getTitulo());
|
||||||
|
ps.setString(4, publicacion.getEnlace());
|
||||||
|
ps.executeUpdate();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
// Manejar error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<PublicacionEmpleo> obtenerTodas() {
|
||||||
|
List<PublicacionEmpleo> lista = new ArrayList<>();
|
||||||
|
String sql = "SELECT organismo, fecha, titulo, enlace FROM publicaciones";
|
||||||
|
try (Connection conn = DriverManager.getConnection(DB_URL);
|
||||||
|
Statement st = conn.createStatement();
|
||||||
|
ResultSet rs = st.executeQuery(sql)) {
|
||||||
|
while (rs.next()) {
|
||||||
|
PublicacionEmpleo pub = new PublicacionEmpleo();
|
||||||
|
pub.setOrganismo(rs.getString("organismo"));
|
||||||
|
pub.setFecha(LocalDate.parse(rs.getString("fecha")));
|
||||||
|
pub.setTitulo(rs.getString("titulo"));
|
||||||
|
pub.setEnlace(rs.getString("enlace"));
|
||||||
|
lista.add(pub);
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
// Manejar error
|
||||||
|
}
|
||||||
|
return lista;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
package es.tatvil.taiageweb.empleo;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class NotificadorEmailService {
|
||||||
|
public void notificarPorEmail(PublicacionEmpleo publicacion) {
|
||||||
|
// TODO: Implementar envío de email (JavaMail)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
package es.tatvil.taiageweb.empleo;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class NotificadorService {
|
||||||
|
public void notificar(PublicacionEmpleo publicacion) {
|
||||||
|
// TODO: Implementar notificación por email, Telegram y web
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
package es.tatvil.taiageweb.empleo;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class NotificadorTelegramService {
|
||||||
|
public void notificarPorTelegram(PublicacionEmpleo publicacion) {
|
||||||
|
// TODO: Implementar integración con Telegram Bot API
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
package es.tatvil.taiageweb.empleo;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class NotificadorWebService {
|
||||||
|
public void notificarEnWeb(PublicacionEmpleo publicacion) {
|
||||||
|
// TODO: Integrar con la sección de noticias.html
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
package es.tatvil.taiageweb.empleo;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public class PublicacionEmpleo {
|
||||||
|
private String organismo;
|
||||||
|
private LocalDate fecha;
|
||||||
|
private String titulo;
|
||||||
|
private String enlace;
|
||||||
|
|
||||||
|
// Getters, setters, equals, hashCode
|
||||||
|
public String getOrganismo() { return organismo; }
|
||||||
|
public void setOrganismo(String organismo) { this.organismo = organismo; }
|
||||||
|
public LocalDate getFecha() { return fecha; }
|
||||||
|
public void setFecha(LocalDate fecha) { this.fecha = fecha; }
|
||||||
|
public String getTitulo() { return titulo; }
|
||||||
|
public void setTitulo(String titulo) { this.titulo = titulo; }
|
||||||
|
public String getEnlace() { return enlace; }
|
||||||
|
public void setEnlace(String enlace) { this.enlace = enlace; }
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (o == null || getClass() != o.getClass()) return false;
|
||||||
|
PublicacionEmpleo that = (PublicacionEmpleo) o;
|
||||||
|
return Objects.equals(organismo, that.organismo) &&
|
||||||
|
Objects.equals(fecha, that.fecha) &&
|
||||||
|
Objects.equals(titulo, that.titulo) &&
|
||||||
|
Objects.equals(enlace, that.enlace);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(organismo, fecha, titulo, enlace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
package es.tatvil.taiageweb.empleo;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class ResumenDiarioService {
|
||||||
|
public void generarResumenDiario() {
|
||||||
|
// TODO: Generar resumen diario de publicaciones
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,60 @@
|
||||||
|
package es.tatvil.taiageweb.empleo.fuentes;
|
||||||
|
|
||||||
|
import es.tatvil.taiageweb.empleo.FuenteEmpleo;
|
||||||
|
import es.tatvil.taiageweb.empleo.PublicacionEmpleo;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import com.rometools.rome.io.SyndFeedInput;
|
||||||
|
import com.rometools.rome.io.XmlReader;
|
||||||
|
import com.rometools.rome.feed.synd.SyndEntry;
|
||||||
|
import com.rometools.rome.feed.synd.SyndFeed;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class FuenteBOERSS implements FuenteEmpleo {
|
||||||
|
private static final String RSS_URL = "https://www.boe.es/rss/BOE-S-atom.xml";
|
||||||
|
private static final String[] KEYWORDS = {
|
||||||
|
"informática", "TIC", "técnico auxiliar informática", "técnico especialista", "sistemas", "desarrollo", "soporte", "microinformática", "administración electrónica", "programación", "DAM", "ASIR", "C1 informática", "bolsa", "interino"
|
||||||
|
};
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<PublicacionEmpleo> obtenerNuevasPublicaciones() {
|
||||||
|
List<PublicacionEmpleo> resultados = new ArrayList<>();
|
||||||
|
try {
|
||||||
|
URL feedSource = new URL(RSS_URL);
|
||||||
|
SyndFeedInput input = new SyndFeedInput();
|
||||||
|
SyndFeed feed = input.build(new XmlReader(feedSource));
|
||||||
|
for (SyndEntry entry : feed.getEntries()) {
|
||||||
|
String titulo = entry.getTitle();
|
||||||
|
String resumen = entry.getDescription() != null ? entry.getDescription().getValue() : "";
|
||||||
|
if (contienePalabraClave(titulo) || contienePalabraClave(resumen)) {
|
||||||
|
PublicacionEmpleo pub = new PublicacionEmpleo();
|
||||||
|
pub.setOrganismo("BOE");
|
||||||
|
pub.setFecha(entry.getPublishedDate() != null ? entry.getPublishedDate().toInstant().atZone(java.time.ZoneId.systemDefault()).toLocalDate() : LocalDate.now());
|
||||||
|
pub.setTitulo(titulo);
|
||||||
|
pub.setEnlace(entry.getLink());
|
||||||
|
resultados.add(pub);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
// Manejar error de lectura del feed
|
||||||
|
}
|
||||||
|
return resultados;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean contienePalabraClave(String texto) {
|
||||||
|
if (texto == null) return false;
|
||||||
|
String lower = texto.toLowerCase();
|
||||||
|
for (String kw : KEYWORDS) {
|
||||||
|
if (lower.contains(kw.toLowerCase())) return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getNombre() {
|
||||||
|
return "BOE RSS";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,315 @@
|
||||||
|
# Modelo A TAI 2025
|
||||||
|
## Primera parte — preguntas 1–80
|
||||||
|
1. En la Constitución Española de 1978, en relación con la sucesión al trono se prefiere siempre:
|
||||||
|
|
||||||
|
a) En la misma línea, el grado más lejano al más próximo.
|
||||||
|
b) En el mismo grado, la línea anterior a las posteriores.
|
||||||
|
c) En la misma línea, el grado más próximo al más remoto.
|
||||||
|
d) En el mismo grado, la línea posterior a las anteriores.
|
||||||
|
|
||||||
|
2. Indique cuál de los siguientes principios se garantiza en el artículo 9 de la Constitución Española de 1978:
|
||||||
|
|
||||||
|
a) La retroactividad de disposiciones sancionadoras no favorables o restrictivas de derechos individuales.
|
||||||
|
b) La retroactividad de disposiciones sancionadoras favorables.
|
||||||
|
c) La interdicción de la arbitrariedad de los poderes públicos.
|
||||||
|
d) La irretroactividad de disposiciones sancionadoras favorables o restrictivas de derechos colectivos.
|
||||||
|
|
||||||
|
3. ¿Cuál de las siguientes afirmaciones sobre la Diputación Permanente es correcta, según el artículo 78 de la Constitución Española de 1978?
|
||||||
|
|
||||||
|
a) Cada Cámara contará con una Diputación Permanente de al menos quince miembros, elegidos por sufragio directo de entre los parlamentarios de cada grupo.
|
||||||
|
b) La Diputación Permanente del Congreso será presidida por el Presidente del Senado, y la del Senado por el Presidente del Congreso.
|
||||||
|
c) En cada Cámara habrá una Diputación Permanente compuesta por un mínimo de veintiún miembros, que representarán a los grupos parlamentarios en proporción a su importancia numérica.
|
||||||
|
d) La Diputación Permanente solo puede ejercer sus funciones durante los períodos entre sesiones ordinarias, quedando suspendidas en caso de disolución de las Cámaras.
|
||||||
|
|
||||||
|
4. ¿Cuáles son las funciones que el artículo 66 de la Constitución Española de 1978 atribuye directamente a las Cortes Generales?
|
||||||
|
|
||||||
|
a) Ejercer la potestad legislativa del Estado, aprobar los Presupuestos y controlar la acción del Gobierno.
|
||||||
|
b) Elegir al Presidente del Gobierno, aprobar los Presupuestos y ratificar los tratados internacionales.
|
||||||
|
c) Dictar decretos-leyes, aprobar los Presupuestos y controlar la acción del Gobierno.
|
||||||
|
d) Ejercer la potestad legislativa del Estado, nombrar al Defensor del Pueblo y elegir a los magistrados del Tribunal Supremo.
|
||||||
|
|
||||||
|
5. Conforme al artículo 21 de la Ley 50/1997, de 27 de noviembre, del Gobierno, ¿cuál de las siguientes opciones es una función del Gobierno en funciones?
|
||||||
|
|
||||||
|
a) Aprobar el Proyecto de Ley de Presupuestos Generales del Estado.
|
||||||
|
b) Presentar Proyectos de Ley al Congreso de los Diputados.
|
||||||
|
c) Proponer al Rey la disolución del Congreso de los Diputados.
|
||||||
|
d) Limitar su gestión al despacho ordinario de los asuntos públicos.
|
||||||
|
|
||||||
|
6. Según establece el artículo 99 de la Constitución Española de 1978 que regula el proceso de investidura del Presidente del Gobierno, ¿qué mayoría se exige en la primera votación?
|
||||||
|
|
||||||
|
a) Mayoría simple del Congreso de los Diputados.
|
||||||
|
b) Mayoría absoluta del Congreso de los Diputados.
|
||||||
|
c) Mayoría absoluta del Senado.
|
||||||
|
d) Mayoría de dos tercios del Congreso de los Diputados.
|
||||||
|
|
||||||
|
7. Dentro del marco de la Agenda 2030, señale cuál de los siguientes es el Objetivo de Desarrollo Sostenible número 1:
|
||||||
|
|
||||||
|
a) Lucha contra el hambre.
|
||||||
|
b) Consumo responsable.
|
||||||
|
c) Paz y justicia.
|
||||||
|
d) Erradicación de la pobreza.
|
||||||
|
|
||||||
|
8. Según establece el artículo 78 del Real Decreto Legislativo 5/2015, de 30 de octubre, por el que se aprueba el texto refundido de la Ley del Estatuto Básico del Empleado Público, señale cuál de los siguientes NO es uno de los principios de provisión de puestos de trabajo del personal funcionario de carrera:
|
||||||
|
|
||||||
|
a) Mérito.
|
||||||
|
b) Conocimiento.
|
||||||
|
c) Igualdad.
|
||||||
|
d) Publicidad.
|
||||||
|
|
||||||
|
9. Según establece la Ley 19/2013, de 9 de diciembre, de transparencia, acceso a la información pública y buen gobierno, señale cuál de los siguientes es miembro de la Comisión de Transparencia y Buen Gobierno:
|
||||||
|
|
||||||
|
a) Un representante del Defensor del Pueblo.
|
||||||
|
b) Un representante de la Subsecretaría de Estado del Ministerio de Hacienda.
|
||||||
|
c) Un representante del Tribunal Constitucional.
|
||||||
|
d) Un representante de la Agencia Estatal de Administración Tributaria.
|
||||||
|
|
||||||
|
10. De conformidad con el artículo 4 de la Ley Orgánica 1/2004, de 28 de diciembre, de Medidas de Protección Integral contra la Violencia de Género, indique cuál de las siguientes opciones es correcta en relación con los principios y valores del sistema educativo:
|
||||||
|
|
||||||
|
a) La Educación Infantil contribuirá a desarrollar en el alumnado su capacidad para adquirir habilidades en la resolución pacífica de conflictos y para comprender y respetar la igualdad entre sexos.
|
||||||
|
b) La Educación Primaria contribuirá a desarrollar en el alumnado la capacidad para relacionarse con los demás de forma pacífica y para conocer, valorar y respetar la igualdad de oportunidades de hombres y mujeres.
|
||||||
|
c) La Educación Secundaria Obligatoria contribuirá a desarrollar en el alumnado la capacidad para consolidar su madurez personal, social y moral...
|
||||||
|
d) Las Universidades incluirán y fomentarán en todos los ámbitos académicos la formación, docencia e investigación en igualdad de género y no discriminación de forma transversal.
|
||||||
|
|
||||||
|
11.
|
||||||
|
|
||||||
|
De conformidad con el artículo 4.2 del Real Decreto Legislativo 1/2013, de 29 de noviembre, por el que se aprueba el Texto Refundido de la Ley General de derechos de las personas con discapacidad y de su inclusión social, a los efectos de esta ley, ¿cuál es el grado mínimo reconocido a partir del cual se tiene la consideración de persona con discapacidad?
|
||||||
|
|
||||||
|
a) 30 por ciento.
|
||||||
|
b) 33 por ciento.
|
||||||
|
c) 35 por ciento.
|
||||||
|
d) 38 por ciento.
|
||||||
|
|
||||||
|
12.
|
||||||
|
|
||||||
|
¿Qué información está almacenada en la zona de seguridad del DNI electrónico, accesible en lectura por el ciudadano en los Puntos de Actualización del DNIe?
|
||||||
|
|
||||||
|
a) El certificado de Firma (No Repudio).
|
||||||
|
b) El certificado de Autenticación (Digital Signature).
|
||||||
|
c) El certificado CA intermedia emisora.
|
||||||
|
d) La imagen de la fotografía.
|
||||||
|
|
||||||
|
13.
|
||||||
|
|
||||||
|
De conformidad con el Anexo III del Reglamento 910/2014 del Parlamento Europeo y del Consejo de 23 de julio de 2014 relativo a la identificación electrónica y los servicios de confianza para las transacciones electrónicas en el mercado interior y por la que se deroga la Directiva 1999/93/CE, los certificados cualificados de sello electrónico contendrán:
|
||||||
|
|
||||||
|
a) El nombre o los nombres de dominio explotados por la persona física o jurídica a la que se expida el certificado.
|
||||||
|
b) Al menos, el nombre del creador del sello y, cuando proceda, el número de registro, tal como se recojan en los registros oficiales.
|
||||||
|
c) Los elementos de la dirección, incluyendo al menos la ciudad y el Estado de la persona física o jurídica a quien se expida el certificado, y cuando proceda, según figure en los registros oficiales.
|
||||||
|
d) Para personas físicas: al menos el nombre de la persona a la que se expida el certificado, o un seudónimo; si se usara un seudónimo, se indicará claramente.
|
||||||
|
|
||||||
|
14.
|
||||||
|
|
||||||
|
En relación con el uso de seudónimos en los certificados cualificados, la Ley 6/2020, de 11 de noviembre, reguladora de determinados aspectos de los servicios electrónicos de confianza, establece que:
|
||||||
|
|
||||||
|
a) Está prohibido el uso de seudónimos para garantizar la transparencia y la gestión del proceso administrativo.
|
||||||
|
b) El prestador debe revelar la identidad real del titular únicamente si este lo autoriza expresamente.
|
||||||
|
c) El prestador está obligado a revelar la identidad real a solicitud de los órganos judiciales y otras autoridades públicas en el ejercicio de sus funciones.
|
||||||
|
d) Solo los certificados de sello electrónico de persona jurídica admiten seudónimo.
|
||||||
|
|
||||||
|
15.
|
||||||
|
|
||||||
|
De conformidad con el artículo 96 de la Ley Orgánica 3/2018, de 5 de diciembre, de Protección de Datos Personales y garantía de los derechos digitales, ¿a qué hace referencia el derecho al testamento digital?
|
||||||
|
|
||||||
|
a) A la transmisión automática de activos financieros digitales de personas fallecidas.
|
||||||
|
b) Al acceso a contenidos gestionados por prestadores de servicios de la sociedad de la información sobre personas fallecidas.
|
||||||
|
c) A la herencia de dispositivos digitales físicos del fallecido.
|
||||||
|
d) A la supresión automática y obligatoria de los datos personales del fallecido.
|
||||||
|
|
||||||
|
16.
|
||||||
|
|
||||||
|
Según el artículo 79 de la Ley Orgánica 3/2018, de 5 de diciembre, de Protección de Datos Personales y garantía de los derechos digitales, indique cuándo son aplicables los derechos y libertades consagrados en la Constitución y en los Tratados y Convenios Internacionales:
|
||||||
|
|
||||||
|
a) Solo son aplicables fuera de Internet.
|
||||||
|
b) Son aplicables en Internet únicamente cuando exista tratamiento de datos personales.
|
||||||
|
c) Son plenamente aplicables en Internet, con la colaboración de los prestadores de servicios de la sociedad de la información.
|
||||||
|
d) Se aplican en Internet solo si así lo establece un desarrollo reglamentario posterior.
|
||||||
|
|
||||||
|
17.
|
||||||
|
|
||||||
|
¿Cuál de las siguientes opciones NO está considerada una norma técnica de interoperabilidad de obligado cumplimiento por parte de las Administraciones Públicas, según el Real Decreto 4/2010, de 8 de enero, por el que se regula el Esquema Nacional de Interoperabilidad en el ámbito de la Administración Electrónica?
|
||||||
|
|
||||||
|
a) Norma Técnica de Interoperabilidad de Reutilización de Activos en modo producto y en modo servicio.
|
||||||
|
b) Norma Técnica de Interoperabilidad de Plan de Seguridad para gestión de ciberataques.
|
||||||
|
c) Norma Técnica de Interoperabilidad de Plan de Direccionamiento.
|
||||||
|
d) Norma Técnica de Interoperabilidad de Sistema de Referencia de documentos y repositorios de confianza.
|
||||||
|
|
||||||
|
18.
|
||||||
|
|
||||||
|
Con base en el Real Decreto 311/2022, de 3 de mayo, por el que se regula el Esquema Nacional de Seguridad, indique qué se define como un incidente de seguridad en el que, debido a una violación de las medidas técnicas u organizativas de seguridad, una información o un servicio quedan expuestos, o potencialmente expuestos, a un acceso no autorizado.
|
||||||
|
|
||||||
|
a) Ciberincidente.
|
||||||
|
b) Ciberataque.
|
||||||
|
c) Compromiso de la seguridad.
|
||||||
|
d) Categoría de seguridad de un sistema.
|
||||||
|
|
||||||
|
19.
|
||||||
|
|
||||||
|
De conformidad con el artículo 13 del Real Decreto 311/2022, de 3 de mayo, por el que se regula el Esquema Nacional de Seguridad, ¿a quién le corresponde, por sí mismo o a través de recursos propios o contratados, encargarse de desarrollar la forma concreta de implementar la seguridad en el sistema y la supervisión de la operación diaria del mismo?
|
||||||
|
|
||||||
|
a) Al responsable del sistema.
|
||||||
|
b) Al responsable del servicio del sistema.
|
||||||
|
c) Al responsable de la Inspección Técnica de Seguridad.
|
||||||
|
d) Al responsable de la seguridad.
|
||||||
|
|
||||||
|
20. De conformidad con el artículo 18 del Real Decreto 209/2003, de 21 de febrero, por el que se regulan los registros y las notificaciones telemáticas, así como la utilización de medios telemáticos para la sustitución de la aportación de certificados por los ciudadanos, indique la sentencia INCORRECTA:
|
||||||
|
|
||||||
|
a) En los registros telemáticos serán considerados días inhábiles los así declarados para todo el territorio nacional en el calendario anual de días inhábiles.
|
||||||
|
b) La entrada de las solicitudes, escritos y comunicaciones recibidas en un día inhábil para el registro telemático se entenderá efectuada en la primera hora del primer día hábil siguiente.
|
||||||
|
c) Los registros telemáticos realizarán y anotarán entradas y salidas de escritos y comunicaciones en días inhábiles, aunque no compute a efectos de los plazos.
|
||||||
|
d) En lo que respecta a registros telemáticos referentes a trámites cuya instrucción y resolución corresponda a órganos cuya competencia esté territorialmente delimitada a una comunidad autónoma, provincia o municipio, serán días inhábiles los así declarados en el ámbito territorial correspondiente.
|
||||||
|
|
||||||
|
21.
|
||||||
|
|
||||||
|
¿Cuál de los siguientes NO es uno de los servicios de la Plataforma de Intermediación de Datos?
|
||||||
|
|
||||||
|
a) Consulta de datos de identidad.
|
||||||
|
b) Consulta de situación actual de prestaciones por desempleo.
|
||||||
|
c) Consulta de datos de patrimonio.
|
||||||
|
d) Consulta de títulos no universitarios por documentación.
|
||||||
|
|
||||||
|
22.
|
||||||
|
|
||||||
|
Según el artículo 2 del Real Decreto 203/2021, de 30 de marzo, por el que se aprueba el Reglamento de actuación y funcionamiento del sector público por medios electrónicos, el principio de personalización y proactividad se entiende como la capacidad de las Administraciones Públicas para:
|
||||||
|
|
||||||
|
a) Proporcionar servicios pre cumplimentados y anticiparse a las posibles necesidades del usuario final, partiendo del conocimiento adquirido de este último.
|
||||||
|
b) Personalizar la imagen y el diseño de la sede electrónica según las preferencias de cada interesado.
|
||||||
|
c) Compartir datos y posibilitar el intercambio personalizado de información.
|
||||||
|
d) Verificar la identidad del usuario mediante múltiples factores de autenticación personalizados en función del riesgo del trámite.
|
||||||
|
|
||||||
|
23.
|
||||||
|
|
||||||
|
¿Qué nivel de caché está integrado físicamente dentro del núcleo del procesador, es el más rápido y tiene la menor capacidad de almacenamiento?
|
||||||
|
|
||||||
|
a) Caché L1.
|
||||||
|
b) Caché L2.
|
||||||
|
c) Caché L3.
|
||||||
|
d) Caché L4.
|
||||||
|
|
||||||
|
24.
|
||||||
|
|
||||||
|
En relación con los componentes de un ordenador, ¿cuál es la función principal del bus del sistema?
|
||||||
|
|
||||||
|
a) Ejecutar las instrucciones del sistema almacenadas en memoria.
|
||||||
|
b) Suministrar energía eléctrica del sistema a todos los componentes del ordenador.
|
||||||
|
c) Almacenar de forma permanente el sistema operativo y los datos del usuario.
|
||||||
|
d) Transferir datos, direcciones y señales de control entre la CPU, la memoria y los periféricos.
|
||||||
|
|
||||||
|
25.
|
||||||
|
|
||||||
|
¿Cuál de las siguientes características describe correctamente una unidad de estado sólido (SSD)?
|
||||||
|
|
||||||
|
a) Almacena datos en discos magnéticos giratorios de alta densidad.
|
||||||
|
b) Utiliza memoria RAM volátil para el almacenamiento persistente de datos.
|
||||||
|
c) Es un dispositivo para almacenar datos en memoria no volátil sin partes móviles.
|
||||||
|
d) Requiere cabezales de lectura mecánicos para acceder a los datos almacenados.
|
||||||
|
|
||||||
|
26.
|
||||||
|
|
||||||
|
¿Cuál es el ancho de banda máximo de la especificación HDMI 2.1?
|
||||||
|
|
||||||
|
a) 10 Gbps.
|
||||||
|
b) 18 Gbps.
|
||||||
|
c) 32 Gbps.
|
||||||
|
d) 48 Gbps.
|
||||||
|
|
||||||
|
27.
|
||||||
|
|
||||||
|
¿Cuántos fallos de dispositivo puede tolerar un conjunto RAID 5 sin pérdida de datos?
|
||||||
|
|
||||||
|
a) Ningún fallo de dispositivo.
|
||||||
|
b) Un fallo de dispositivo.
|
||||||
|
c) Dos fallos de dispositivo.
|
||||||
|
d) Tres fallos de dispositivo.
|
||||||
|
|
||||||
|
28.
|
||||||
|
|
||||||
|
¿Qué es el Internet Printing Protocol (IPP)?
|
||||||
|
|
||||||
|
a) Una colección de estándares abiertos que define un protocolo de impresión en red de alto nivel.
|
||||||
|
b) Un protocolo de compresión de datos orientado a la transmisión de documentos a impresoras.
|
||||||
|
c) Un formato de archivo para documentos imprimibles de tipo vectorial.
|
||||||
|
d) Un estándar de conexión física para impresoras mediante cable USB.
|
||||||
|
|
||||||
|
29. En el formato de ficheros CSV, descrito en RFC 4180, ¿qué regla es correcta?
|
||||||
|
|
||||||
|
a) Las comillas dobles están prohibidas, solo se permiten comillas simples.
|
||||||
|
b) Cada registro va en una línea separada por CRLF; y los campos que contengan caracteres coma, comillas o saltos de línea deben ir con comillas dobles.
|
||||||
|
c) Los campos nunca pueden contener comas, aunque estén delimitados por comillas dobles.
|
||||||
|
d) El tipo MIME registrado para CSV es “application/csv”.
|
||||||
|
|
||||||
|
30. Según la definición estándar de JSON, RFC 8259, un valor JSON debe pertenecer a uno de estos tipos o literales. ¿Cuál es el conjunto correcto?
|
||||||
|
|
||||||
|
a) object, array, number, string, date y undefined.
|
||||||
|
b) object, array, number, string, boolean y function.
|
||||||
|
c) object, array, number, string, true, false y null.
|
||||||
|
d) object, array, number, string, boolean y NaN.
|
||||||
|
|
||||||
|
31. ¿Qué característica describe correctamente el funcionamiento de la arquitectura ARM big.LITTLE?
|
||||||
|
|
||||||
|
a) Combina memoria RAM y memoria flash en un mismo encapsulado.
|
||||||
|
b) Utiliza únicamente núcleos de alto rendimiento para maximizar la velocidad.
|
||||||
|
c) Combina núcleos de alto rendimiento y núcleos de bajo consumo energético en un mismo procesador.
|
||||||
|
d) Duplica automáticamente los procesos críticos en dos núcleos idénticos.
|
||||||
|
|
||||||
|
32. ¿Cuál de las siguientes afirmaciones sobre Android es correcta?
|
||||||
|
|
||||||
|
a) Android utiliza el kernel Linux como núcleo del sistema operativo.
|
||||||
|
b) Android está basado directamente en Windows CE.
|
||||||
|
c) Android solo puede ejecutarse en procesadores ARM.
|
||||||
|
d) Android no permite multitarea real.
|
||||||
|
|
||||||
|
33. ¿Cuál de las siguientes opciones describe correctamente el mecanismo de sandboxing en iOS?
|
||||||
|
|
||||||
|
a) Todas las aplicaciones comparten libremente el mismo espacio de memoria y almacenamiento.
|
||||||
|
b) Las aplicaciones pueden acceder directamente al sistema de archivos completo del dispositivo.
|
||||||
|
c) El sandboxing permite que las aplicaciones se ejecuten sin restricciones para mejorar el rendimiento.
|
||||||
|
d) Cada aplicación se ejecuta en un entorno aislado con acceso restringido a recursos y datos del sistema.
|
||||||
|
|
||||||
|
34. En relación con bases de datos NoSQL, ¿qué característica define principalmente a una base de datos orientada a grafos?
|
||||||
|
|
||||||
|
a) Organiza los datos en tablas relacionadas mediante claves externas.
|
||||||
|
b) Almacena la información exclusivamente en documentos JSON.
|
||||||
|
c) Representa los datos mediante nodos y relaciones entre ellos.
|
||||||
|
d) Utiliza exclusivamente almacenamiento en memoria RAM.
|
||||||
|
|
||||||
|
35. ¿Cuál de los siguientes lenguajes se utiliza habitualmente para consultar bases de datos Neo4j?
|
||||||
|
|
||||||
|
a) PL/SQL.
|
||||||
|
b) GraphQL.
|
||||||
|
c) Cypher.
|
||||||
|
d) SPARQL.
|
||||||
|
|
||||||
|
36. En SQL, ¿qué efecto tiene la sentencia ROLLBACK?
|
||||||
|
|
||||||
|
a) Guarda permanentemente todos los cambios realizados en la transacción actual.
|
||||||
|
b) Elimina una tabla completa y sus registros asociados.
|
||||||
|
c) Revierte los cambios realizados en la transacción actual no confirmados con COMMIT.
|
||||||
|
d) Reinicia automáticamente el servidor de base de datos.
|
||||||
|
|
||||||
|
37. ¿Qué patrón de diseño se caracteriza por definir una dependencia uno-a-muchos entre objetos, de manera que cuando un objeto cambia de estado, todos sus dependientes son notificados y actualizados automáticamente?
|
||||||
|
|
||||||
|
a) Singleton.
|
||||||
|
b) Observer.
|
||||||
|
c) Factory Method.
|
||||||
|
d) Decorator.
|
||||||
|
|
||||||
|
38. En programación orientada a objetos, ¿qué es overriding?
|
||||||
|
|
||||||
|
a) La redefinición de un método heredado en una subclase.
|
||||||
|
b) La creación de múltiples métodos con el mismo nombre pero distinta firma.
|
||||||
|
c) La ocultación de atributos privados mediante encapsulación.
|
||||||
|
d) La conversión automática de tipos entre clases relacionadas.
|
||||||
|
|
||||||
|
39. ¿Cuál es la función principal del Common Language Runtime (CLR) en .NET?
|
||||||
|
|
||||||
|
a) Traducir código Java a lenguaje máquina.
|
||||||
|
b) Gestionar exclusivamente la interfaz gráfica de usuario.
|
||||||
|
c) Ejecutar y administrar programas .NET proporcionando servicios como gestión de memoria y seguridad.
|
||||||
|
d) Sustituir al sistema operativo en tiempo de ejecución.
|
||||||
|
|
||||||
|
40. ¿Qué es WSDL (Web Services Description Language)?
|
||||||
|
|
||||||
|
a) Un protocolo de transporte de servicios web basado en TCP.
|
||||||
|
b) Un lenguaje basado en XML utilizado para describir servicios web.
|
||||||
|
c) Un sistema de autenticación para servicios SOAP.
|
||||||
|
d) Un lenguaje de programación para crear APIs REST.
|
||||||
|
|
@ -1,72 +1,58 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
// ── Configuración ──────────────────────────────────────────────
|
// ── Carga de ofertas TIC monitorizadas ─────────────────────────
|
||||||
// BOE Sección II-B: Oposiciones, concursos y vacantes
|
async function cargarEmpleoTIC() {
|
||||||
const BOE_RSS = 'https://www.boe.es/rss/boe_dias.php?s=2B';
|
const panel = document.getElementById('empleo-items');
|
||||||
// Proxy CORS gratuito que convierte RSS a JSON
|
const badge = document.getElementById('empleo-fecha');
|
||||||
const RSS2JSON = 'https://api.rss2json.com/v1/api.json?rss_url=';
|
|
||||||
// Palabras clave para resaltar entradas de interés informático/TAI
|
|
||||||
const KW_TAI = /\b(TAI|T\.A\.I|técnico[a]? (de )?administración (general |de la )?inform|inform[aá]tic|sistemas?\s+de\s+información|AGE\b)/i;
|
|
||||||
|
|
||||||
// ── Carga del feed BOE ─────────────────────────────────────────
|
|
||||||
async function cargarBOE() {
|
|
||||||
const panel = document.getElementById('boe-items');
|
|
||||||
const badge = document.getElementById('boe-fecha');
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const resp = await fetch(RSS2JSON + encodeURIComponent(BOE_RSS));
|
const resp = await fetch('/api/empleo/publicaciones');
|
||||||
if (!resp.ok) throw new Error('HTTP ' + resp.status);
|
if (!resp.ok) throw new Error('HTTP ' + resp.status);
|
||||||
const data = await resp.json();
|
const items = await resp.json();
|
||||||
if (data.status !== 'ok') throw new Error('Feed error: ' + data.message);
|
if (!Array.isArray(items) || items.length === 0) {
|
||||||
|
panel.innerHTML = '<p class="news-empty">No hay ofertas TIC recientes.</p>';
|
||||||
const items = data.items || [];
|
|
||||||
if (items.length === 0) {
|
|
||||||
panel.innerHTML = '<p class="news-empty">No hay publicaciones recientes en esta sección.</p>';
|
|
||||||
badge.textContent = 'Sin datos';
|
badge.textContent = 'Sin datos';
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Separar: primero los que coincidan con TAI/informática, luego el resto
|
// Separar: primero los que coincidan con informática, luego el resto
|
||||||
const importantes = items.filter(it => KW_TAI.test(it.title + ' ' + (it.description || '')));
|
const KW_TIC = /inform[aá]tica|TIC|técnico[a]? auxiliar informática|técnico especialista|sistemas|desarrollo|soporte|microinformática|administración electrónica|programación|DAM|ASIR|C1 informática|bolsa|interino/i;
|
||||||
const resto = items.filter(it => !KW_TAI.test(it.title + ' ' + (it.description || '')));
|
const importantes = items.filter(it => KW_TIC.test(it.titulo));
|
||||||
const ordenados = [...importantes, ...resto].slice(0, 25);
|
const resto = items.filter(it => !KW_TIC.test(it.titulo));
|
||||||
|
const ordenados = [...importantes, ...resto].slice(0, 30);
|
||||||
|
|
||||||
// Fecha de la última actualización del feed
|
// Fecha de la última publicación
|
||||||
const fechaFeed = data.feed?.lastBuildDate
|
const fechas = ordenados.map(it => it.fecha).filter(Boolean);
|
||||||
? new Date(data.feed.lastBuildDate).toLocaleDateString('es-ES', { day:'2-digit', month:'short', year:'numeric' })
|
const fechaMax = fechas.length ? fechas.sort().reverse()[0] : null;
|
||||||
: 'hoy';
|
badge.textContent = fechaMax ? 'Última: ' + fechaMax : 'Actualizado';
|
||||||
badge.textContent = 'Act. ' + fechaFeed;
|
|
||||||
|
|
||||||
panel.innerHTML = ordenados.map(item => {
|
panel.innerHTML = ordenados.map(item => {
|
||||||
const esTAI = KW_TAI.test(item.title + ' ' + (item.description || ''));
|
const esTIC = KW_TIC.test(item.titulo);
|
||||||
const fecha = item.pubDate
|
const fecha = item.fecha || '';
|
||||||
? new Date(item.pubDate).toLocaleDateString('es-ES', { day:'2-digit', month:'short', year:'numeric' })
|
const titulo = escHtml(truncar(item.titulo || 'Sin título', 120));
|
||||||
: '';
|
const organismo = escHtml(item.organismo || '');
|
||||||
const titulo = escHtml(truncar(item.title || 'Sin título', 120));
|
|
||||||
|
|
||||||
return `
|
return `
|
||||||
<a href="${escHtml(item.link || '#')}" target="_blank" rel="noopener"
|
<a href="${escHtml(item.enlace || '#')}" target="_blank" rel="noopener"
|
||||||
class="news-item${esTAI ? ' news-item--tai' : ''}">
|
class="news-item${esTIC ? ' news-item--tai' : ''}">
|
||||||
<div class="news-item-meta">
|
<div class="news-item-meta">
|
||||||
${esTAI
|
${esTIC
|
||||||
? '<span class="news-tag-tai"><i class="fas fa-star"></i> TAI / Informática</span>'
|
? '<span class="news-tag-tai"><i class="fas fa-star"></i> TIC / Informática</span>'
|
||||||
: ''}
|
: ''}
|
||||||
<span class="news-date">${fecha}</span>
|
<span class="news-date">${fecha}</span>
|
||||||
|
<span class="news-org">${organismo}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="news-title">${titulo}</div>
|
<div class="news-title">${titulo}</div>
|
||||||
</a>`;
|
</a>`;
|
||||||
}).join('');
|
}).join('');
|
||||||
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.warn('[noticias.js] Error cargando BOE:', err.message);
|
console.warn('[noticias.js] Error cargando ofertas TIC:', err.message);
|
||||||
badge.textContent = 'Error';
|
badge.textContent = 'Error';
|
||||||
panel.innerHTML = `
|
panel.innerHTML = `
|
||||||
<div class="news-error">
|
<div class="news-error">
|
||||||
<i class="fas fa-exclamation-triangle"></i>
|
<i class="fas fa-exclamation-triangle"></i>
|
||||||
No se pudo cargar el feed automáticamente. Consulta el BOE directamente:
|
No se pudo cargar la información automáticamente.
|
||||||
<a href="https://www.boe.es/diario_boe/ultimos_dias.php" target="_blank" rel="noopener">
|
|
||||||
Últimas publicaciones BOE <i class="fas fa-external-link-alt"></i>
|
|
||||||
</a>
|
|
||||||
</div>`;
|
</div>`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -81,4 +67,4 @@ function truncar(s, max) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// ── Arranque ───────────────────────────────────────────────────
|
// ── Arranque ───────────────────────────────────────────────────
|
||||||
cargarBOE();
|
cargarEmpleoTIC();
|
||||||
|
|
|
||||||
|
|
@ -69,21 +69,17 @@
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<!-- ── BOE – Oposiciones y concursos ──────────────── -->
|
<!-- ── Ofertas TIC monitorizadas ──────────────── -->
|
||||||
<section class="noticias-section">
|
<section class="noticias-section">
|
||||||
<div class="noticias-section-hdr">
|
<div class="noticias-section-hdr">
|
||||||
<h2><i class="fas fa-newspaper"></i> BOE – Oposiciones y Concursos (AGE)</h2>
|
<h2><i class="fas fa-laptop-code"></i> Ofertas públicas TIC monitorizadas</h2>
|
||||||
<span id="boe-fecha" class="noticias-src-badge">Cargando…</span>
|
<span id="empleo-fecha" class="noticias-src-badge">Cargando…</span>
|
||||||
</div>
|
</div>
|
||||||
<p class="noticias-section-desc">Últimas publicaciones de la Sección II-B del BOE (Oposiciones, concursos y vacantes). Las entradas relacionadas con TAI / informática se marcan en verde.</p>
|
<p class="noticias-section-desc">Últimas ofertas y bolsas de empleo TIC detectadas automáticamente en BOE, BOCM y otros portales públicos. Las entradas relacionadas con informática se marcan en verde.</p>
|
||||||
|
|
||||||
<div id="boe-items" class="news-list">
|
<div id="empleo-items" class="news-list">
|
||||||
<div class="news-loading"><i class="fas fa-spinner fa-spin"></i> Cargando noticias del BOE…</div>
|
<div class="news-loading"><i class="fas fa-spinner fa-spin"></i> Cargando ofertas TIC…</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<a href="https://www.boe.es/diario_boe/ultimos_dias.php" target="_blank" rel="noopener" class="btn btn-outline" style="margin-top:1rem;font-size:.85rem">
|
|
||||||
<i class="fas fa-external-link-alt"></i> Ver BOE completo
|
|
||||||
</a>
|
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<!-- ── Boletines CCAA ──────────────────────────────── -->
|
<!-- ── Boletines CCAA ──────────────────────────────── -->
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,52 @@
|
||||||
|
Quiero un nuevo modulo para monitorizar ofertas públicas de empleo y bolsas de trabajo de informática en España, especialmente en Madrid.
|
||||||
|
Objetivo:
|
||||||
|
- Revisar automáticamente boletines oficiales y portales de empleo público.
|
||||||
|
- Detectar nuevas convocatorias relacionadas con informática/TIC.
|
||||||
|
- Evitar tener que revisar manualmente decenas de páginas.
|
||||||
|
Fuentes a monitorizar:
|
||||||
|
- BOE
|
||||||
|
- BOCM
|
||||||
|
- Comunidad de Madrid
|
||||||
|
- Ayuntamiento de Madrid
|
||||||
|
- Ayuntamiento de Las Rozas
|
||||||
|
- Ayuntamiento de Majadahonda
|
||||||
|
- Ayuntamiento de Pozuelo
|
||||||
|
- Ayuntamiento de Torrelodones
|
||||||
|
- Universidades públicas de Madrid
|
||||||
|
- SERMAS
|
||||||
|
- Diputaciones
|
||||||
|
- Generalitat Valenciana (Alicante)
|
||||||
|
- Generalitat de Catalunya (Tarragona)
|
||||||
|
Palabras clave:
|
||||||
|
- informática
|
||||||
|
- TIC
|
||||||
|
- técnico auxiliar informática
|
||||||
|
- técnico especialista
|
||||||
|
- sistemas
|
||||||
|
- desarrollo
|
||||||
|
- soporte
|
||||||
|
- microinformática
|
||||||
|
- administración electrónica
|
||||||
|
- programación
|
||||||
|
- DAM
|
||||||
|
- ASIR
|
||||||
|
- C1 informática
|
||||||
|
- bolsa
|
||||||
|
- interino
|
||||||
|
Quiero que:
|
||||||
|
- Descargue y analice RSS, HTML o PDFs.
|
||||||
|
- Detecte nuevas publicaciones.
|
||||||
|
- Ignore duplicados ya vistos.
|
||||||
|
- Guarde histórico en SQLite o JSON.
|
||||||
|
Me envíe avisos por:
|
||||||
|
- email
|
||||||
|
- Telegram
|
||||||
|
- que aparezcan en la pantalla inicial de la web.
|
||||||
|
Genere un resumen diario:
|
||||||
|
- organismo
|
||||||
|
- fecha
|
||||||
|
- título
|
||||||
|
- enlace
|
||||||
|
- Funcione automáticamente con cron o scheduler.
|
||||||
|
- Sea fácil añadir nuevas fuentes.
|
||||||
|
- Use buenas prácticas y estructura modular.
|
||||||
Loading…
Reference in New Issue