index.php Landing + paso 1 (correo + aceptación general)
formulario.php Paso 2 (datos, cédula, firma electrónica del mandato)
cleanup.php Script cron: elimina casos vencidos (90 días)
config.php Configuración central
lib/store.php Capa de almacenamiento JSON (requests.json) + textos legales
data/ requests.json + cédulas subidas (NO debe ser público ni indexable)
El problema del borrador original: pedir el correo y marcar un checkbox no constituye un mandato válido para que un tercero solicite la ficha clínica de otra persona. Los propios centros de salud (ej. políticas públicas de registros clínicos consultadas) piden, como mínimo, un "poder simple" + copia de cédula del titular, o poder notarial / firma electrónica avanzada para trámites más formales.
Qué implementa este MVP:
- El titular deja evidencia real de su mandato: nombre, RUN, cédula de identidad adjunta, y una firma electrónica simple (Ley N° 19.799) con IP y timestamp.
- El texto del mandato cita expresamente los artículos 12 y 13 de la Ley N° 20.584.
- Eliminación automática (no solo declarada) de todos los datos y la cédula a los
90 días de cerrado el caso, vía
cleanup.phpejecutado por cron.
Qué falta antes de producción real:
- Revisión por un abogado para confirmar si "poder simple" basta para todos los centros que se quiera contactar (algunos, especialmente públicos, pueden exigir poder notarial o firma electrónica avanzada certificada).
- Cifrado en reposo de
requests.jsony de las cédulas (contienen datos sensibles bajo la Ley 21.719, vigente desde el 1 de diciembre de 2026). - Envío real de correos (hoy el enlace del paso 2 se muestra en pantalla para pruebas).
- Mover
data/fuera del webroot público y bloquear su acceso directo vía servidor web. - Registro de auditoría de accesos al panel de representantes de salud.
php -S localhost:8000
# abrir http://localhost:8000/index.phpCuando un expediente llega a status = "en_gestion", este módulo crea automáticamente
su correo usuario@chiledao.cl en cPanel (vía UAPI, usuario/contraseña), envía las
credenciales al correo real del solicitante, y deja el expediente en correo_creado
(o error_correo con el detalle, si algo falla).
autoload.php Autoloader sin Composer (mapea el namespace)
run_provisioning.php Punto de entrada CLI (para cron)
.env.example Plantilla de variables — copiar a .env
modules/EmailProvisioner/
Config.php Carga .env sin dependencias
CPanelClient.php Llamadas UAPI (Email::add_pop, Email::list_pops)
UsernameGenerator.php mauro -> mauro2 -> mauro3... sin colisiones
PasswordGenerator.php Contraseñas seguras (12+ car., mayús/minús/núm/símbolo)
MailSender.php Envío del correo de credenciales (mail() nativo)
RequestRepository.php Lee/actualiza data/requests.json (con flock)
EmailProvisioner.php Orquesta el flujo completo de un expediente
logs/email-provision.log Log de cada ejecución (nunca contiene contraseñas)
- Copia
.env.examplea.envy completa:CPANEL_HOST: normalmente el hostname del servidor (ej.server123.tuhosting.cl), no siempre el dominio del sitio — confírmalo con tu proveedor de hosting.CPANEL_USER/CPANEL_PASS: las mismas credenciales con las que ya te autenticas hoy contra/execute/Email/add_pop.CPANEL_DOMAIN=chiledao.cl.WEBMAIL_URL: revisa cuál te funciona en tu hosting —https://webmail.chiledao.clsolo sirve si ese subdominio/proxy ya está apuntando al cpsrvd de cPanel (típico con AutoSSL + "Webmail" activado en WHM). Si no, usa el puerto nativo:https://chiledao.cl:2096. Ambos formatos funcionan, prueba cuál responde.
- Asegúrate de que
.envno quede accesible por web (fuera deldocument root, o bloqueado por regla del servidor — igual quedata/). - No se requiere Composer: todo el módulo es PHP puro con autoloader propio.
php run_provisioning.phpRecorre todos los expedientes en_gestion sin bloque correo todavía, y los procesa
uno por uno (un fallo en uno no detiene a los demás).
*/5 * * * * /usr/bin/php /ruta/a/los-inmortales/run_provisioning.php >> /ruta/a/los-inmortales/logs/cron.log 2>&1
- Crea o edita manualmente un registro de prueba en
data/requests.jsoncon"status": "en_gestion"y unemailreal al que tengas acceso. - Corre
php run_provisioning.php. - Revisa:
logs/email-provision.log— debe mostrarCuenta creadayNotificación enviada.- En cPanel → Cuentas de correo, que exista
usuario@chiledao.cl. - Tu bandeja de entrada, el correo con las credenciales.
data/requests.json— el registro debe tenerstatus: "correo_creado"y el bloquecorreocondireccion,password_temporal, etc.
- Corre
php run_provisioning.phpde nuevo sin tocar nada: no debe crear una segunda cuenta ni reenviar el correo (por eso el filtro exigestatus en_gestionsin bloquecorreo— al pasar acorreo_creadoqueda fuera del lote).
password_temporal queda en texto plano dentro de requests.json para que el equipo
pueda hacer soporte si el solicitante no recibe el correo. Antes de producción real,
considera: (a) cifrar ese campo, o (b) purgarlo automáticamente pasadas 24-48h desde
fecha_envio con un script adicional similar a cleanup.php. El log nunca contiene
la contraseña, solo el resultado de la operación.