prepare("SELECT * FROM installations WHERE id = :id"); $stmt->bindParam(':id', $installation_id, PDO::PARAM_INT); $stmt->execute(); $installation = $stmt->fetch(PDO::FETCH_ASSOC); if (!$installation) { die("Instalação não encontrada."); } // 4. Buscar imagens da instalação $img_stmt = $pdo->prepare("SELECT image_path FROM installation_images WHERE installation_id = :id ORDER BY id ASC"); $img_stmt->bindParam(':id', $installation_id, PDO::PARAM_INT); $img_stmt->execute(); $images = $img_stmt->fetchAll(PDO::FETCH_ASSOC); } catch (Exception $e) { // Em caso de erro, envie um cabeçalho de erro e uma mensagem clara. header("HTTP/1.1 500 Internal Server Error"); die("Erro no servidor: Não foi possível conectar ao banco de dados. Detalhe: " . $e->getMessage()); } // --- Funções Auxiliares --- function xml_escape($string) { return htmlspecialchars($string, ENT_XML1, 'UTF-8'); } // --- Preparar variáveis --- $filename = "instalacao_" . $installation['id'] . ".doc"; // --- Geração do XML --- $xml_template = ' %s '; $xml_content = ''; // Título $xml_content .= 'Relatório de Instalação'; // Função para criar linhas da tabela function create_table_rows($data) { $rows = ''; foreach ($data as $label => $value) { $label = xml_escape($label); $value = xml_escape($value); $rows .= << {$label} {$value} XML; } return $rows; } // Tabela de Informações $info_data = [ "ID da Instalação" => $installation['id'], "Cliente" => $installation['client_name'], "Endereço" => $installation['address'], "Técnico" => $installation['technician_name'], "Data" => date("d/m/Y H:i", strtotime($installation['created_at'])), "Status" => ucfirst($installation['status']) ]; $xml_content .= '' . create_table_rows($info_data) . ''; // Tabela de Dados Elétricos $electric_data = [ "Tensão (V)" => $installation['voltage'] ?? 'N/A', "Fase-Neutro-Terra" => $installation['phase_neutral_ground'] ?? 'N/A', "Saída do Disjuntor" => $installation['breaker_output'] ?? 'N/A' ]; $xml_content .= 'Dados Elétricos'; $xml_content .= '' . create_table_rows($electric_data) . ''; // Observações $observations = xml_escape($installation['observations'] ?? 'Nenhuma observação.'); $xml_content .= 'Observações'; $xml_content .= "{$observations}"; // Imagens if (!empty($images)) { $xml_content .= ''; $xml_content .= 'Imagens da Instalação'; foreach ($images as $image) { $image_path = __DIR__ . '/' . $image['image_path']; if (file_exists($image_path)) { $image_data = base64_encode(file_get_contents($image_path)); list($width_px, $height_px) = getimagesize($image_path); $width_pt = $width_px * 0.75; // Convert pixels to points $height_pt = $height_px * 0.75; $max_width_pt = 450; // Largura máxima de aprox. 6 polegadas if ($width_pt > $max_width_pt) { $ratio = $max_width_pt / $width_pt; $width_pt = $max_width_pt; $height_pt = $height_pt * $ratio; } $shape_id = '_x0000_i' . substr(uniqid(), 5); $image_rid = 'rId' . substr(uniqid(), 5); $xml_content .= ' ' . $image_data . ' '; } } } // --- Enviar para o navegador --- header("Content-Type: application/vnd.ms-word; charset=UTF-8"); header("Content-Disposition: attachment; filename=\"" . $filename . "\""); echo sprintf($xml_template, $xml_content); ob_end_flush(); ?>