\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']} |
| DNI / CE |
{$datos['dni']} |
Teléfono |
{$datos['telefono']} |
Correo Electrónico |
{$datos['emailc']} |
| 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']} |
| 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;
}