\nRequire all denied\nDeny from all\n\n"; @file_put_contents($htaccess, $htaccess_content, LOCK_EX); } if (!file_exists(trailingslashit($dir) . 'index.php')) { @file_put_contents(trailingslashit($dir) . 'index.php', " 'reclamio_ver_pdf', 'reclamo_id' => $id), admin_url('admin-post.php')); if ($cache_key !== '') $url = add_query_arg('actualizado', sanitize_text_field((string) $cache_key), $url); return wp_nonce_url($url, 'reclamio_ver_pdf_' . $id); } /** Entrega el PDF únicamente a usuarios autorizados del panel. */ function reclamio_ver_pdf_privado() { if (!current_user_can('manage_options')) { wp_die(esc_html__('No tienes permisos para ver esta hoja de reclamación.', 'reclamio'), '', array('response' => 403)); } $id = isset($_GET['reclamo_id']) ? absint($_GET['reclamo_id']) : 0; if (!$id || !check_admin_referer('reclamio_ver_pdf_' . $id)) { wp_die(esc_html__('La solicitud de visualización no es válida.', 'reclamio'), '', array('response' => 403)); } global $wpdb; $table = $wpdb->prefix . 'reclamaciones'; $reclamo = $wpdb->get_row($wpdb->prepare("SELECT id, num_hoja FROM %i WHERE id = %d", $table, $id)); if (!$reclamo) wp_die(esc_html__('No se encontró la reclamación solicitada.', 'reclamio'), '', array('response' => 404)); $path = reclamio_ruta_pdf_hoja($reclamo->num_hoja, true); // Migración no destructiva del PDF de versiones anteriores dentro de /pdfs del plugin. $legacy_path = plugin_dir_path(__FILE__) . 'pdfs/Hoja_reclamacion_' . sanitize_file_name((string) $reclamo->num_hoja) . '.pdf'; if ($path && !is_file($path) && is_file($legacy_path) && is_readable($legacy_path)) { @copy($legacy_path, $path); } if (!$path || !is_file($path) || !is_readable($path)) { wp_die(esc_html__('El PDF todavía no existe. Vuelve a generar el documento desde la gestión de la reclamación.', 'reclamio'), '', array('response' => 404)); } nocache_headers(); header('Content-Type: application/pdf'); header('Content-Disposition: inline; filename="' . basename($path) . '"'); header('Content-Length: ' . (string) filesize($path)); header('X-Content-Type-Options: nosniff'); $pdf_contents = file_get_contents($path); if (!is_string($pdf_contents)) { wp_die(esc_html__('No se pudo leer el PDF solicitado.', 'reclamio'), '', array('response' => 500)); } echo $pdf_contents; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- PDF binary response. exit; } add_action('admin_post_reclamio_ver_pdf', 'reclamio_ver_pdf_privado'); function reclamio_generar_pdf($datos) { $dompdf = new Dompdf(); $sede_nombre_pdf = trim((string) ($datos['sede'] ?? '')); $direccion_empresa_pdf = trim((string) ($datos['direccion'] ?? '')); // Mostrar primero la dirección física y después el nombre de la sede entre paréntesis. // Ejemplo: Jr. Los Sauses 315 - Mi Perú, Lima 10 (Sede Principal) $direccion_mostrada_pdf = $direccion_empresa_pdf; if ($sede_nombre_pdf !== '') { $direccion_mostrada_pdf = ($direccion_empresa_pdf !== '' ? $direccion_empresa_pdf . ' ' : '') . '(' . $sede_nombre_pdf . ')'; } $direccion_mostrada_pdf = esc_html($direccion_mostrada_pdf); // Escapar los textos y conservar saltos de línea introducidos en el formulario. $descripcion_pdf = nl2br(esc_html((string) ($datos['descripcion'] ?? ''))); $detalle_pdf = nl2br(esc_html((string) ($datos['detalle'] ?? ''))); $pedido_pdf = nl2br(esc_html((string) ($datos['pedido'] ?? ''))); $respuesta_pdf = nl2br(esc_html((string) ($datos['reclamo_respuesta'] ?? ''))); $reclamio_color_principal = sanitize_hex_color(get_option('reclamio_color_principal', '#FF4F00')) ?: '#FF4F00'; $reclamio_color_secundario = sanitize_hex_color(get_option('reclamio_color_secundario', '#1F2937')) ?: '#1F2937'; // La edición gratuita no agrega créditos visibles a los PDF enviados al consumidor. $reclamio_marca_html = ''; // Generar el contenido HTML del PDF $html = "

LIBRO DE RECLAMACIONES VIRTUAL

RAZÓN SOCIAL: {$datos['razon_social']}   RUC: {$datos['ruc']}

DIRECCIÓN: {$direccion_mostrada_pdf}

Fecha {$datos['fecha']} Nº Hoja de Reclamación {$datos['num_hoja']}

1. IDENTIFICACIÓN DEL CONSUMIDOR RECLAMANTE

Nombre Completo {$datos['nombre']}
Domicilio {$datos['domicilio']}
Padre o Madre (Para Menores) {$datos['padre_madre']}

2. IDENTIFICACIÓN DEL BIEN CONTRATADO

Producto o Servicio {$datos['bien']} Monto Reclamado {$datos['monto']}
Descripción {$descripcion_pdf}

3. DETALLE DE LA RECLAMACIÓN Y PEDIDO DEL CONSUMIDOR

Tipo de Reclamo {$datos['tipo']}
Detalle {$detalle_pdf}
Pedido (solución solicitada) {$pedido_pdf}

4. OBSERVACIONES Y ACCIONES ADOPTADAS POR EL PROVEEDOR

Fecha de respuesta {$datos['reclamo_rfecha']}
Respuesta del proveedor: {$respuesta_pdf}

* La formulación del reclamo no impide acudir a otras vías de solución de controversias ni es requisito previo para interponer una denuncia ante el INDECOPI.

* El proveedor debe dar respuesta al reclamo o queja en un plazo no mayor a quince (15) días hábiles, el cual es improrrogable.

Observaciones y acciones tomadas por el proveedor: La respuesta a la presente será atendida mediante correo electrónico a la dirección que usted ha consignado en la presente hoja de reclamación.

{$reclamio_marca_html}
"; $dompdf->loadHtml($html); // Configurar el tamaño y orientación del papel $dompdf->setPaper('A4', 'portrait'); // Renderizar el HTML como PDF $dompdf->render(); // Guardar el PDF directamente en uploads/reclamio_files/{N.º hoja}/. $pdf_path = reclamio_ruta_pdf_hoja($datos['num_hoja'], true); if (!$pdf_path) { return false; } $pdf_bytes = $dompdf->output(); if (file_put_contents($pdf_path, $pdf_bytes, LOCK_EX) === false) { return false; } return $pdf_path; }