%s
', esc_attr( (string) $m['tipo'] ), esc_html( (string) $m['texto'] ) ); } } /** * Textos de resultado según lo que dejó cada acción en la dirección. * * Método puro, para poder probarlo sin navegador. * * @param array| ' . esc_html__( 'Solicitud', 'cumpleconsent' ) . ' | ' . esc_html__( 'Derecho', 'cumpleconsent' ) . ' | ' . esc_html__( 'Plazo', 'cumpleconsent' ) . ' |
|---|---|---|
| #%d · %s | %s | %s%s |
' . esc_html__( 'Todavía no has ejecutado el diagnóstico. Revisa qué terceros cargan en tu sitio, si el bloqueo está actuando y qué falta declarar.', 'cumpleconsent' ) . '
'; } else { printf( '', esc_html__( 'Última ejecución (UTC)', 'cumpleconsent' ), esc_html( (string) Settings::get( 'diag_last' ) ) ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- badge() y esc_html() ya devuelven HTML escapado. echo '' . $this->badge( 'critico' ) . ' ' . esc_html( (string) $summary['critico'] ) . ' · ' . $this->badge( 'atencion' ) . ' ' . esc_html( (string) $summary['atencion'] ) . ' · ' . $this->badge( 'ok' ) . ' ' . esc_html( (string) $summary['ok'] ) . '
'; echo '| %s | %s %s | %s%s |
%s | %s |
' . esc_html__( 'Todos los campos de todas las pestañas se guardan juntos: cambia de pestaña con el enlace de abajo, no con el navegador, para no perder ediciones.', 'cumpleconsent' ) . '
'; echo '
%6$s
%6$s
%6$s
', esc_attr( $key ), esc_attr( CUMPLECONSENT_OPT ), checked( ! empty( $s[ $key ] ), true, false ), esc_html( $label ), $warn ? ' ccn-check--warn' : '', '' !== $help ? '
';
if ( '' !== $help ) {
echo '
' . esc_html( $help ) . '';
}
echo '
' . esc_html__( 'El art. 12 exige consentimiento específico en cuanto a finalidades: cada finalidad se explica y se decide por separado. Las “necesarias” no se pueden desactivar porque sin ellas el sitio no funciona.', 'cumpleconsent' ) . '
'; foreach ( Purposes::base() as $key => $purpose ) { if ( ! empty( $purpose['required'] ) ) { printf( '
%s
%s
%s %s
', esc_html__( 'Filas actuales en el registro:', 'cumpleconsent' ), esc_html( (string) Plugin::instance()->log->count() ) ); $this->checkbox_field( 'purge_on_uninstall', __( 'Borrar todos los datos del plugin al desinstalarlo', 'cumpleconsent' ), __( 'Desactivado por defecto: el registro de consentimiento y las solicitudes de derechos son prueba de cumplimiento y conviene conservarlos. Actívalo solo si sabes que ya no los necesitas.', 'cumpleconsent' ), true ); } private function fields_rights( array $s ): void { $this->checkbox_field( 'rights_enabled', __( 'Habilitar el canal de solicitudes de derechos', 'cumpleconsent' ), __( 'El formulario se publica con el código corto [cumpleconsent_derechos]. Al registrarse una solicitud, el sistema calcula los plazos y avisa por correo.', 'cumpleconsent' ) ); $this->text_field( 'rights_email', __( 'Correo que recibe las solicitudes', 'cumpleconsent' ), __( 'Si lo dejas vacío, se usa el correo del administrador del sitio.', 'cumpleconsent' ), 'email' ); printf( '
%s
' . esc_html__( 'El art. 14 ter h) obliga a informar quién trata tus datos fuera de Chile, en qué país y con qué garantía. Declara solo lo que tienes suscrito: el diagnóstico cruza esta tabla con los terceros que detecta en el sitio.', 'cumpleconsent' ) . '
'; printf( '%s %s
', esc_url( $this->admin_url( 'cumpleconsent-ajustes', array( 'tab' => 'transferencias', 'prefill' => 1 ) ) ), esc_html__( 'Precargar proveedores frecuentes', 'cumpleconsent' ), esc_html__( 'Precarga el formulario con proveedores habituales para que los revises. No se guarda nada hasta que tú guardes.', 'cumpleconsent' ) ); echo '| ' . esc_html__( 'Proveedor', 'cumpleconsent' ) . ' | ' . esc_html__( 'País', 'cumpleconsent' ) . ' | ' . esc_html__( 'Garantía (art. 27)', 'cumpleconsent' ) . ' | ' . esc_html__( 'Nota', 'cumpleconsent' ) . ' |
|---|---|---|---|
| ', esc_attr( CUMPLECONSENT_OPT ), (int) $i, esc_attr( (string) $row['provider'] ) ); printf( ' | ', esc_attr( CUMPLECONSENT_OPT ), (int) $i, esc_attr( (string) $row['country'] ) ); echo ' | '; printf( ' | ', esc_attr( CUMPLECONSENT_OPT ), (int) $i, esc_attr( (string) $row['note'] ) ); echo ' |
' . esc_html__( 'Registro de actividades de tratamiento del sitio web (art. 3 d) del reglamento D.S. 662). Si dejas la tabla vacía, el plugin propone un registro a partir de tu configuración; revísalo y guárdalo para que quede como registro revisado.', 'cumpleconsent' ) . '
'; $max = max( 8, count( $ops ) + 2 ); for ( $i = 0; $i < $max; $i++ ) { $op = $ops[ $i ] ?? array( 'name' => '', 'finalidad' => '', 'datos' => '', 'titulares' => '', 'base' => '', 'destinos' => '', 'pais' => '', 'plazo' => '', 'fuente' => '', 'transfiere' => 'no', 'perfilado' => 'no', 'sensibles' => 'no', ); /* translators: %d: número de la operación en el registro de actividades de tratamiento. */ echo ''; } } // ── Registro ───────────────────────────────────────────────────────────── public function screen_log(): void { $this->require_view(); $plugin = Plugin::instance(); $event = isset( $_GET['event'] ) ? sanitize_key( (string) $_GET['event'] ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended $paged = isset( $_GET['paged'] ) ? max( 1, (int) $_GET['paged'] ) : 1; // phpcs:ignore WordPress.Security.NonceVerification.Recommended $per = 50; $rows = $plugin->log->rows( array( 'limit' => $per, 'offset' => ( $paged - 1 ) * $per, 'event' => $event, ) ); $stats = $plugin->log->stats(); $this->tabs( 'cumpleconsent-registro' ); echo '' . esc_html__( 'Cada fila guarda la decisión del visitante con la huella del aviso que estaba vigente cuando decidió. El HMAC permite detectar si un registro fue alterado después. No hay nombre, correo ni IP en claro.', 'cumpleconsent' ) . '
'; if ( $stats ) { echo ''; } echo ''; printf( '%s ', esc_url( $this->action_url( 'export_log' ) ), esc_html__( 'Exportar CSV', 'cumpleconsent' ) ); printf( '%s', esc_url( $this->action_url( 'purge_log' ) ), esc_js( __( '¿Borrar todos los registros de consentimiento? Esta acción no se puede deshacer.', 'cumpleconsent' ) ), esc_html__( 'Borrar todo el registro', 'cumpleconsent' ) ); echo '
'; echo '| ' . esc_html( $th ) . ' | '; } echo '||||||
|---|---|---|---|---|---|---|
| %s | ||||||
| %s | %s | %s | %s | %s | %s | %s |
' . esc_html__( 'Cada solicitud ingresa con su fecha y calcula sus plazos: 30 días corridos (prorrogables una sola vez por 30 más) y, si se pidió bloqueo temporal, 2 días hábiles. Guarda aquí la respuesta íntegra: es el respaldo que la ley te exige.', 'cumpleconsent' ) . '
'; printf( '', esc_url( $this->action_url( 'export_rights' ) ), esc_html__( 'Exportar CSV', 'cumpleconsent' ) ); $destino = Rights::notify_email(); if ( ! Rights::notifies_channel() ) { echo ''; echo esc_html( '' !== $destino /* translators: %s: correo que recibe hoy las solicitudes. */ ? sprintf( __( 'Las solicitudes se avisan a %s, no al correo del canal de derechos. Completa “Correo que recibe las solicitudes” para que los avisos lleguen al buzón correcto.', 'cumpleconsent' ), $destino ) : __( 'No hay un correo receptor configurado para el canal de derechos: los avisos internos no se envían y una solicitud nueva puede pasar inadvertida.', 'cumpleconsent' ) ); echo '
' . esc_html__( 'No hay solicitudes registradas.', 'cumpleconsent' ) . '
%s %s
', esc_html__( 'Documento de identidad:', 'cumpleconsent' ), esc_html( (string) ( $row['rut'] ?? '' ) ) ); printf( '%s %s
', esc_html__( 'Correo:', 'cumpleconsent' ), esc_html( (string) $row['email'] ) ); printf( '%s
%s
%s (%s)
%s
%s %s
', esc_url( $this->action_url( 'rights_extend', array( 'id' => (int) $row['id'] ) ) ), esc_html__( 'Aplicar la prórroga única de 30 días', 'cumpleconsent' ), esc_html__( 'El aviso de prórroga se envía por correo al titular y queda registrado.', 'cumpleconsent' ) ); } echo ''; printf( '%s %s
' . esc_html__( 'No hay una política publicada que verificar. Publica o asigna tu política de privacidad —o generala aquí abajo— y vuelve a este punto: entonces sí se revisan los doce contenidos.', 'cumpleconsent' ) . '
'; } else { printf( '%s %d%% — %s
', esc_html__( 'Cobertura detectada de los doce contenidos mínimos:', 'cumpleconsent' ), (int) $policy['score'], /* translators: 1: contenidos completos, 2: parciales, 3: ausentes. */ esc_html( sprintf( __( '%1$d completos · %2$d parciales · %3$d ausentes', 'cumpleconsent' ), (int) $policy['ok'], (int) $policy['partial'], (int) $policy['missing'] ) ) ); } echo '| ' . esc_html__( 'Literal', 'cumpleconsent' ) . ' | ' . esc_html__( 'Contenido exigido', 'cumpleconsent' ) . ' | ' . esc_html__( 'Estado', 'cumpleconsent' ) . ' |
|---|---|---|
%s) | %s%s | %s |
' . esc_html__( 'El verificador detecta contenidos presentes o ausentes en la política publicada (o en la generada, si aún no publicas). No evalúa suficiencia jurídica ni si el tratamiento real coincide con lo declarado: eso se revisa a mano.', 'cumpleconsent' ) . '
'; echo ''; printf( '%s ', esc_url( $this->action_url( 'policy_generate' ) ), esc_html__( 'Generar o actualizar el borrador de política', 'cumpleconsent' ) ); printf( '%s ', esc_url( $this->action_url( 'policy_publish' ) ), esc_html__( 'Generar y publicar', 'cumpleconsent' ) ); if ( '' !== Policy::url() ) { printf( '%s', esc_url( Policy::url() ), esc_html__( 'Ver la política publicada', 'cumpleconsent' ) ); } echo '
' . esc_html__( 'Documento imprimible con: identificación del responsable (art. 3 a) del reglamento), caracterización de las operaciones de tratamiento con sus once contenidos (d), matriz de riesgos graduada según la ley (e), protocolos del sitio (f) y mecanismo de reporte interno e incidentes (g).', 'cumpleconsent' ) . '
'; echo '' . esc_html__( 'No constituye el programa de cumplimiento ni designa delegado: aporta los elementos documentales del sitio web para que el responsable los integre en su modelo.', 'cumpleconsent' ) . '
'; printf( '', esc_url( $this->action_url( 'expediente' ) ), esc_html__( 'Descargar el expediente (HTML imprimible)', 'cumpleconsent' ) ); echo '