Saltearse al contenido

Certificaciones

Certificaciones son dos cosas con un solo módulo: el repositorio de los certificados que emite un sitio y el verificador que consulta un tercero con el número de documento. El nombre del catálogo ya lo dice: «Certificaciones (repositorio + verificación pública)».

  • Repositorio. Certificate e Issuer (la empresa emisora), con CRUD en /api/sites/{site}/certificates e /issuers.
  • Dos tipos de certificado. uploaded es el que entregó un tercero: subes PDF o foto, y la foto se comprime y se guarda como PDF de una página. issued es el que emite el sitio: Merez genera el PDF con la plantilla y los datos de la ficha, en la misma petición.
  • Campos personalizados. El motor de App\Support\CustomFields con entity_type = 'certificate'; la plantilla los pinta con claves planas (custom_, label_, pair_). Los datos legales del negocio y la fecha larga —«20 agosto 2026»— también salen impresos.
  • Verificación. GET /api/certifications/verify?document_number=… devuelve una lista, porque una persona puede tener varios certificados.
  • Aviso de vencimientos. El comando certifications:notify-expirations recorre los sitios con el módulo activo y avisa una sola vez.
  • Bandeja de atención. Aporta dos señales: por vencer y vencidos.
  • El módulo certificaciones encendido. La clave de negocio es española, pero la habilidad de token y las rutas son inglesas (certifications, /api/certifications/*): es la misma puerta con dos nombres, y conviene saberlo al leer un 403.
  • Un token de Sitio con la habilidad certifications, para que la página de verificación de tu sitio consulte desde su propio servidor. Sin ese token el verificador responde 403: no es un endpoint anónimo.
  • El dueño para el CRUD: authorizeOwner exige isOwner, más estricto que en otros módulos. Emitir o borrar queda fuera del alcance de un operador.
  • Para el aviso: la preferencia cert_expiry encendida y un destinatario. Sin buzón propio, el correo sale por la plataforma.

Con el módulo apagado: 403 en el CRUD y en la verificación, la señal desaparece de la bandeja de atención y el sitio queda fuera del digest de vencimientos, sin siquiera entrar al bucle. Si lo que se apaga es cert_expiry, el comando no notifica y tampoco sella; al volver a encenderlo, los pendientes se avisan en vez de perderse en el silencio.

  • No está conectado con Formación. learner_id y course_id están en la tabla desde julio de 2026, pero nunca se cablearon: emitir es manual, no es efecto de graduarse.
  • Sin código no se publica el nombre. La verificación expone curso, emisora y vigencia; recipient_name y la descarga quedan vacíos hasta que el código coincide. Se compara por certificado, con hash_equals.
  • Buscar por documento igual dice en qué cursos está esa persona. Es el mismo trade-off de cualquier verificador público, y no está firmado como política de privacidad.
  • El código de acceso nace del NIT de la emisora; si al editar lo dejas vacío, vuelve al de por defecto y nunca queda sin ninguno.
  • expires_at nulo no es un dato faltante: significa que no vence.
  • Si el motor de PDF falla, el certificado se guarda igual, sin documento, y el panel ofrece «Generar PDF».
  • Emitir consume créditos del sitio por el proceso de emisión; no es la activación del módulo lo que se mide.