D7net
Home
Console
Upload
information
Create File
Create Folder
About
Tools
:
/
var
/
www
/
html
/
crsys
/
adm
/
vendor
/
api
/
Filename :
imprimeOrdemMedicao.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, f.nome as medidor_nome, case when length(c.telefone_obra) < 11 then mask(lpad(c.telefone_obra, 10,0), '(##) ####-####') else mask(lpad(c.telefone_obra, 11,0), '(##) #####-####') end telefone_obram, case when c.complemento <> '' then CONCAT(mask(LPAD(c.cep_obra, 8, 0), '#####-###'), ' - ', c.endereco_obra, ', ', c.numero_obra, ', ', c.complemento, ' - ', c.bairro, ' - ', c.municipio_obra,'/',c.uf_obra) else CONCAT(mask(LPAD(c.cep_obra, 8, 0), '#####-###'), ' - ', c.endereco_obra, ', ', c.numero_obra, ' - ', c.bairro, ' - ', c.municipio_obra,'/',c.uf_obra) end AS endereco_obra FROM gre_cab_orcamento c left join gre_funcionario f on f.id = c.medidor_id 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, p.nome prod_nome, date_format(ag.data_inicio, '%d/%m') iniciom, date_format(ag.data_limite_medicao, '%d/%m/%y') data_limite_medicaom, ag.data_limite_medicao FROM gre_item_orcamento i inner join gre_produtos p on i.produto = p.id LEFT JOIN gre_ambientes a ON a.id = i.ambiente_id inner join gre_cab_orcamento cab on cab.orca_id = i.orca_id and cab.num_revisao = i.num_revisao left join gre_agenda ag on ag.orca_id = i.orca_id and ag.num_revisao = i.num_revisao and ag.ambiente_id = i.ambiente_id and cab.status_id in (9,10,11) 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'); // ==================== Cabeçalho com 3 caixas ==================== // Dimensões $xLogo = 5; $yLogo = 5; $larguraLogo = 45; $alturaLogo = 20; $xInfo = $xLogo + $larguraLogo + 1; // caixa "Ordem de Medição" $larguraInfo = 90; $alturaInfo = $alturaLogo; $larguraObra = 50; // caixa "Obra nº" $xObra = $xInfo + $larguraInfo + 1; //var_dump($dados[0]); // --- Caixa da logo --- // --- Caixa da logo --- $pdf->Rect($xLogo, $yLogo, $larguraLogo, $alturaLogo); $pdf->Image($_SERVER['DOCUMENT_ROOT'].'/crsys/adm/assets/imagens/logo_login/'.$id_user.'/logo.png', $xLogo + 1, $yLogo + 1, $larguraLogo - 2, $alturaLogo - 2,'PNG'); // --- Caixa "Ordem de Medição" --- $pdf->Rect($xInfo, $yLogo, $larguraInfo, $alturaInfo); $pdf->SetFont('Arial','B',13); $pdf->SetXY($xInfo, $yLogo + 2); $pdf->Cell($larguraInfo,6,utf8_decode('ORDEM DE MEDIÇÃO'),0,0,'C'); $pdf->SetFont('Arial','',9); $pdf->SetXY($xInfo +145, $yLogo ); $pdf->Cell(40,5,'Vendedor: '.utf8_decode($dados[0]['vendedor']),0,1,'L'); $pdf->SetXY($xInfo +145, $yLogo +4 ); $pdf->Cell(40,5,'Medidor: '.utf8_decode($dados[0]['medidor_nome']),0,0,'L'); $pdf->SetXY($xInfo +145, $yLogo +8 ); $pdf->Cell(40,5,'Contato: '.utf8_decode($dados[0]['contato_obra']),0,0,'L'); $pdf->SetXY($xInfo +145, $yLogo +12 ); $pdf->Cell(40,5,'Telefone: '.utf8_decode($dados[0]['telefone_obram']),0,0,'L'); $pdf->SetXY($xInfo +145, $yLogo +16 ); $pdf->Cell(40,5,'Email: '.utf8_decode($dados[0]['email_obra']),0,0,'L'); $pdf->SetFont('Arial','',9); $pdf->SetXY($xInfo, $yLogo + 8); $pdf->Cell($larguraInfo,5,utf8_decode('Departamento de Projetos'),0,0,'C'); // --- Data e Obra dentro da caixa "Ordem de Medição", na mesma linha --- $pdf->SetFont('Arial','B',9); $yInfo = $yLogo + 15; // altura logo abaixo de Departamento $pdf->SetXY($xInfo + 2, $yInfo); $pdf->Cell(20,5,'Data: '.date('d/m/Y', strtotime($dados[0]['created'])),0,0,'L'); // Obra ao lado direito da Data $pdf->SetXY($xInfo + 30, $yInfo); // ajusta horizontalmente à direita da Data $pdf->Cell(50,5,utf8_decode('Obra: ').utf8_decode($dados[0]['obra']),0,0,'L'); // --- Caixa "Obra nº" ao lado --- $pdf->Rect($xObra, $yLogo, $larguraObra, $alturaInfo); $pdf->SetFont('Arial','B',14); $pdf->SetXY($xObra, $yLogo + 7); // centraliza verticalmente dentro da caixa $pdf->Cell($larguraObra,6,utf8_decode('Obra nº: ').$dados[0]['obra_id'],0,1,'C'); $pdf->Ln(10); // Cabeçalho cliente/obra $pdf->SetFont('Arial','B',10); $pdf->Cell(20,3,utf8_decode('Endereço: '),0,0); $pdf->SetFont('Arial','',10); $pdf->Cell(250,3,utf8_decode($dados[0]['endereco_obra']),0,1); //$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, 293, $pdf->GetY()+2); $pdf->Ln(5); // Cabeçalho tabela de itens $pdf->SetFont('Arial','B',7); $pdf->SetX(3); $pdf->Cell(18,7,'Item',1,0,'C'); $pdf->Cell(30,7,'Material',1,0,'C'); $pdf->Cell(85,7,utf8_decode('Descrição'),1,0,'C'); $pdf->Cell(7,7,'Qtde',1,0,'C'); $pdf->Cell(30,7,'Produto',1,0,'C'); $pdf->Cell(10,7,utf8_decode('M²'),1,0,'C'); $pdf->Cell(8,7,'Med',1,0,'C'); $pdf->Cell(8,7,'Des',1,0,'C'); $pdf->Cell(8,7,'Apr',1,0,'C'); $pdf->Cell(8,7,'O.S',1,0,'C'); $pdf->Cell(8,7,'Ent',1,0,'C'); $x = $pdf->GetX(); $y = $pdf->GetY(); $pdf->MultiCell(7,3.5,"Col.\nInic",1,'C'); $pdf->SetXY($x + 7, $y); // Coluna Final // Salva posição inicial $x = $pdf->GetX(); $y = $pdf->GetY(); // --- Col. Fim com quebra em 2 linhas --- $pdf->MultiCell(7,3.5,"Col.\nFim",1,'C'); // Volta para o lado direito (mesma linha superior) $pdf->SetXY($x + 7, $y); // --- Colocador na linha de baixo (altura total 7) --- $pdf->SetXY($x + 7, $y); $pdf->Cell(27,7,'Colocador',1,0,'C'); $pdf->Cell(15,7,'Pedido',1,0,'C'); $pdf->Cell(15,7,utf8_decode('N.º O.S'),1,1,'C'); $cont_item = 0; $ambant = 0; $alturaLinha = 5; foreach($revisoes as $itens){ extract($itens); if($ambant != $ambiente_id){ $ambant = $ambiente_id; $pdf->SetX(3); $pdf->SetFont('Arial','',9); $pdf->SetFont('Arial','',9); $pdf->Cell(291,7,utf8_decode($nome_ambiente),'LBR',1,'C'); $pdf->SetFont('Arial','',7); } $largItem = 18; $largMaterial = 30; $largDesc = 85; $largQtde = 15; $xInicial = 3; $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,$id,1,0,'C'); // MATERIAL $xMat = $xInicial + $largItem; $pdf->SetXY($xMat,$yInicial); $pdf->MultiCell($largMaterial,$alturaLinha,$materialPdf,"LTR",'L'); $yDepoisMat = $pdf->GetY(); $alturaAtualMat = $yDepoisMat - $yInicial; if ($alturaAtualMat < $alturaFinal) { $pdf->SetXY($xMat, $yDepoisMat); $pdf->Cell($largMaterial, $alturaFinal - $alturaAtualMat, '', 'LR'); } // DESCRIÇÃO (CORRIGIDO ✅) $xDesc = $xMat + $largMaterial; $pdf->SetXY($xDesc,$yInicial); // sem borda automática $pdf->MultiCell($largDesc,$alturaLinha,$descricaoPdf,0,'L'); $yDepoisDesc = $pdf->GetY(); $alturaAtualDesc = $yDepoisDesc - $yInicial; // bordas laterais $pdf->SetXY($xDesc, $yInicial); $pdf->Cell($largDesc, $alturaFinal, '', 'LR'); // completa se necessário if ($alturaAtualDesc < $alturaFinal) { $pdf->SetXY($xDesc, $yDepoisDesc); $pdf->Cell($largDesc, $alturaFinal - $alturaAtualDesc, '', 0); } // LINHAS INFERIORES (AGORA ALINHADAS ✅) $pdf->Line($xMat, $yInicial + $alturaFinal, $xMat + $largMaterial, $yInicial + $alturaFinal); $pdf->Line($xDesc, $yInicial + $alturaFinal, $xDesc + $largDesc, $yInicial + $alturaFinal); // QTDE $xQtde = $xDesc + $largDesc; $pdf->SetXY($xQtde,$yInicial); $qtdeFormat = number_format($qtde_pecas ?? 0, 0, ',', '.'); $pdf->Cell(7,$alturaFinal,$qtdeFormat,1,0,'C'); // PRODUTO + DEMAIS $pdf->Cell(30,$alturaFinal,utf8_decode($prod_nome),1,0,'L'); $pdf->Cell(10,$alturaFinal,number_format($m2 ?? 0, 2, ',', '.'),1,0,'C'); $pdf->Cell(8,$alturaFinal,$iniciom,1,0,'C'); $pdf->Cell(8,$alturaFinal,'',1,0,'C'); $pdf->Cell(8,$alturaFinal,'',1,0,'C'); $pdf->Cell(8,$alturaFinal,'',1,0,'C'); $pdf->Cell(8,$alturaFinal,'',1,0,'C'); $pdf->Cell(8,$alturaFinal,'',1,0,'C'); $pdf->Cell(8,$alturaFinal,'',1,0,'C'); $pdf->Cell(25,$alturaFinal,'',1,0,'L'); $pdf->Cell(15,$alturaFinal,$orca_id.'/'.$num_revisao,1,0,'C'); $pdf->Cell(15,$alturaFinal,'',1,1,'C'); } $pdf->Output(); ?>