D7net
Home
Console
Upload
information
Create File
Create Folder
About
Tools
:
/
var
/
www
/
html
/
crsys
/
adm
/
vendor
/
api
/
Filename :
imprimeOrdemMedicao_1.php
back
Copy
<?php include_once "ConectaPdo.php"; /* ========================================================== 1) CARREGAR FPDF ========================================================== */ require($_SERVER['DOCUMENT_ROOT'].'/crsys/adm/app/gre/Views/include/fpdf/fpdf.php'); define('FPDF_FONTPATH','font/'); /* ========================================================== 2) EXTENDER FPDF COM NbLines() ========================================================== */ class PDF extends FPDF { function NbLines($w, $txt) { $cw = &$this->CurrentFont['cw']; if ($w == 0) $w = $this->w - $this->rMargin - $this->x; $wmax = ($w - 2 * $this->cMargin) * 1000 / $this->FontSize; $s = str_replace("\r", '', $txt); $nb = strlen($s); if ($nb > 0 && $s[$nb - 1] == "\n") $nb--; $sep = -1; $i = 0; $j = 0; $l = 0; $nl = 1; while ($i < $nb) { $c = $s[$i]; if ($c == "\n") { $i++; $sep=-1; $j=$i; $l=0; $nl++; continue; } if ($c==' ') $sep=$i; $l+=$cw[$c]; if ($l>$wmax) { if ($sep==-1) { if($i==$j) $i++; } else $i=$sep+1; $sep=-1; $j=$i; $l=0; $nl++; } else $i++; } return $nl; } } /* ========================================================== 3) DADOS DO ORÇAMENTO ========================================================== */ $orca_id = $_GET['orca_id'] ?? ''; $num_rev = $_GET['num_revisao'] ?? ''; $id_user = $_GET['id_user'] ?? ''; if ($orca_id === '' || $num_rev === '') { echo json_encode(["erro"=>"Parâmetros 'orca_id' ou 'num_revisao' não fornecidos."]); exit; } // Consulta dados do orçamento $stmt = $pdo->prepare(" SELECT c.*, u.nome AS vendedor, o.contato AS contato_obra FROM gre_cab_orcamento c LEFT JOIN gre_obras o ON o.id = c.obra_id LEFT JOIN adms_usuarios u ON u.id = c.vend WHERE c.orca_id = :orca_id AND c.num_revisao = :num_rev "); $stmt->execute([':orca_id'=>$orca_id, ':num_rev'=>$num_rev]); $dados = $stmt->fetchAll(PDO::FETCH_ASSOC); if(empty($dados)) { echo "Orçamento não encontrado!"; exit; } // Consulta itens $stmt2 = $pdo->prepare(" SELECT i.*, (i.vlr_total - i.vlr_insumo) AS valorTotal, a.nome AS nome_ambiente FROM gre_item_orcamento i LEFT JOIN gre_ambientes a ON a.id = i.ambiente_id WHERE i.orca_id = :orca_id AND i.num_revisao = :num_rev ORDER BY i.ambiente_id "); $stmt2->execute([':orca_id'=>$orca_id, ':num_rev'=>$num_rev]); $revisoes = $stmt2->fetchAll(PDO::FETCH_ASSOC); if(empty($revisoes)) { echo "Nenhum item encontrado para este orçamento."; exit; } /* ========================================================== 4) CRIAR PDF ========================================================== */ $pdf = new PDF(); $pdf->SetAutoPageBreak(false); $pdf->AddPage('L','A4'); // Logo $pdf->Image($_SERVER['DOCUMENT_ROOT'].'/crsys/adm/assets/imagens/logo_login/'.$id_user.'/logo.png',5,5,45,15,'PNG'); // Fonte título $pdf->SetFont('Arial','B',13); // Define X e Y à direita da logo $xInfo = 55; // logo tem 45 mm + espaçamento $yInicial = 5; // topo da logo // Largura da célula: do ponto X até o final da página (A4 = 210 mm) menos margem direita $larguraCelula = 210 - $xInfo - 10; // 10 mm de margem direita // Título centralizado na célula $pdf->SetXY($xInfo, $yInicial); $pdf->Cell($larguraCelula,6,utf8_decode('ORDEM DE MEDIÇÃO'),0,1,'C'); // Fonte menor, mesma largura de célula e mesma centralização $pdf->SetFont('Arial','',9); $pdf->SetXY($xInfo, $yInicial + 6); $pdf->Cell($larguraCelula,6,utf8_decode('Departamento de Projetos'),0,1,'C'); $pdf->SetXY($xInfo, $yInicial + 14); $pdf->Cell(90,3,'Data: '.date('d/m/Y', strtotime($dados[0]['created'])),0,1,'L'); $pdf->SetXY($xInfo, $yInicial + 12); $pdf->Cell(90,3,utf8_decode('Revisão nº: ').$num_rev,0,1,'L'); $pdf->SetXY($xInfo, $yInicial + 21); //$pdf->Cell(90,6,utf8_decode('Última Revisão: ').($dados[0]['data_ult_rev'] && $dados[0]['data_ult_rev'] != '0000-00-00' ? date('d/m/Y', strtotime($dados[0]['data_ult_rev'])) : '-'),0,1,'L'); $pdf->Ln(15); // espaçamento antes do próximo bloco // Cabeçalho cliente/obra $pdf->SetFont('Arial','',10); $pdf->Cell(20,6,'Cliente:',0,0); $pdf->Cell(100,6,utf8_decode($dados[0]['nome_cliente']),0,0); $pdf->Cell(30,6,'Vendedor:',0,0); $pdf->Cell(40,6,utf8_decode($dados[0]['vendedor']),0,1); $pdf->Cell(20,6,'Obra:',0,0); $pdf->Cell(100,6,utf8_decode($dados[0]['obra']),0,0); $pdf->Cell(30,6,'Telefone:',0,0); $pdf->Cell(40,6,utf8_decode($dados[0]['contato_obra'] ?? ''),0,1); // Linha horizontal $pdf->SetLineWidth(0.1); $pdf->Line(5, $pdf->GetY()+2, 205, $pdf->GetY()+2); $pdf->Ln(5); // Cabeçalho tabela de itens $pdf->SetFont('Arial','B',8); $pdf->SetX(5); $pdf->Cell(10,7,'Item',1,0,'C'); $pdf->Cell(55,7,'Material',1,0,'C'); $pdf->Cell(85,7,utf8_decode('Descrição'),1,0,'C'); $pdf->Cell(15,7,'Qtde',1,0,'C'); $pdf->Cell(15,7,'Unid',1,1,'C'); /* ========================================================== 5) TABELA DE ITENS ========================================================== */ $cont_item = 0; $ambant = 0; $alturaLinha = 5; foreach($revisoes as $itens){ extract($itens); if($ambant != $ambiente_id){ $ambant = $ambiente_id; $pdf->SetFont('Arial','B',9); $pdf->SetX(5); $pdf->Cell(180,7,utf8_decode($nome_ambiente),1,1,'C'); $pdf->SetFont('Arial','',9); } $largItem = 10; $largMaterial = 55; $largDesc = 85; $largQtde = 15; $largUnid = 15; $xInicial = 5; $yInicial = $pdf->GetY(); $materialPdf = utf8_decode(mb_substr(trim($material),0,60,'UTF-8')); $descricaoPdf = utf8_decode($descricao); $alturaMaterial = $pdf->NbLines($largMaterial,$materialPdf)*$alturaLinha; $alturaDescricao = $pdf->NbLines($largDesc,$descricaoPdf)*$alturaLinha; $alturaFinal = max($alturaMaterial,$alturaDescricao); $cont_item++; // Item $pdf->SetXY($xInicial,$yInicial); $pdf->Cell($largItem,$alturaFinal,$cont_item,1,0,'C'); // Material (bordas laterais e topo, sem inferior) $xMat = $xInicial + $largItem; $pdf->SetXY($xMat,$yInicial); $pdf->MultiCell($largMaterial,$alturaLinha,$materialPdf,"LTR",'L'); // Descrição (bordas completas) $xDesc = $xMat + $largMaterial; $pdf->SetXY($xDesc,$yInicial); $pdf->MultiCell($largDesc,$alturaLinha,$descricaoPdf,1,'L'); // Desenha a linha inferior da célula Material para alinhar com a Descrição $pdf->Line($xMat, $yInicial + $alturaFinal, $xMat + $largMaterial, $yInicial + $alturaFinal); // Qtde $xQtde = $xDesc + $largDesc; $pdf->SetXY($xQtde,$yInicial); if($unid_prod == 'ml') $qtdeFormat = number_format($ml ?? 0, 2, ',', '.'); elseif($unid_prod == 'm2') $qtdeFormat = number_format($m2 ?? 0, 2, ',', '.'); else $qtdeFormat = number_format($qtde_pecas ?? 0, 2, ',', '.'); $pdf->Cell($largQtde,$alturaFinal,$qtdeFormat,1,0,'R'); // Unid $xUnid = $xQtde + $largQtde; $pdf->SetXY($xUnid,$yInicial); $pdf->Cell($largUnid,$alturaFinal,utf8_decode($unid_prod),1,1,'C'); } $pdf->Output(); ?>