D7net
Home
Console
Upload
information
Create File
Create Folder
About
Tools
:
/
var
/
www
/
html
/
crsys_ant
/
adm
/
vendor_Ant
/
api
/
Filename :
imprimeOrcamento_1.php
back
Copy
<?php include_once "ConectaPdo.php"; require_once __DIR__ . "/../../vendor/autoload.php"; use App\adms\Models\helper\AdmsPhpMailer; /* ========================================================== 1) CARREGAR FPDF ANTES DE DECLARAR A CLASSE ========================================================== */ require($_SERVER['DOCUMENT_ROOT'].'/crsys/adm/app/gre/Views/include/fpdf/fpdf.php'); define('FPDF_FONTPATH','font/'); /* ========================================================== 2) EXTENDER FPDF COM NbLines() E Footer() ========================================================== */ 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; } // ========================================================== // Rodapé dinâmico com repetição de cabeçalho se necessário // ========================================================== function Footer() { global $dados; // dados do orçamento // var_dump($dados); if (!empty(trim($dados[0]['obs_obra']))) { // Largura total da página $larguraPagina = $this->GetPageWidth() - $this->lMargin - $this->rMargin; // Label "Obs:" em preto $this->SetX(5); $this->SetTextColor(0, 0, 0); $this->Cell(8, 6, 'Obs:', 0, 0, 'L'); // largura fixa só para o label // Texto em vermelho $this->SetTextColor(255, 0, 0); $texto = utf8_decode(trim($dados[0]['obs_obra'])); // MultiCell para o texto, ocupando o restante da largura $this->MultiCell($larguraPagina - 8, 6, $texto, 0, 'L'); // Pula uma linha depois de todo o bloco // $this->Ln(6); // Volta cor padrão $this->SetTextColor(0, 0, 0); } $this->SetFont('Arial','',9); // -------------------------- // Configurações do rodapé // -------------------------- $margem = 5; $largTotal = 210 - 2*$margem; // largura total da página - margens // Proporção: quadro esquerdo maior, direito menor $largDir = 60; // largura fixa quadro direito $largEsq = $largTotal - $largDir; // restante para esquerdo // -------------------------- // Texto fixo esquerda // -------------------------- $textoEsq = "Custo incluso frete e colocação para grande São Paulo;\n Paginação de piso e parede serão definidas de acordo com o melhor aproveitamento das chapas;\n Cubas, serventia, Impermeabilização e material para colocação é de responsabilidade do cliente caso não esteja incluso neste orçamento;\n A disponibilidade do material orçado será verificado no ato do fechamento;\n Em caso de içamento o cliente será responsável pela contratação do serviço;\n Proposta válida por 15 dias, além de sujeito a alteração após medição in loco;\n Cliente reutilizara peça existente e fornecerá complemento de chapa para executar o serviço,\n o mesmo esta ciente sobre a diferença de lote e tambem se responsabiliza, por substituir a chapa em caso de quebra."; // mantém o espaçamento original para o lado direito $linAlt = 5; // define um espaçamento reduzido apenas para o texto da esquerda $linAltEsq = 3; // pode usar 3 ou 4 se quiser ajustar $linhasEsq = substr_count($textoEsq, "\n") + 1; // altura do quadro esquerdo usando o espaçamento reduzido $alturaEsq = $linAltEsq * $linhasEsq; // adiciona 4 linhas extras usando também o espaçamento reduzido $alturaEsq += $linAltEsq * 4; // -------------------------- // Texto variável direita // -------------------------- $valorTotal = $dados[0]['vlr_semdesc'] ?? 0; $frete = $dados[0]['vlr_frete'] ?? 0; $desconto = $dados[0]['vlr_desc'] ?? 0; $totalPagar = $dados[0]['vlr_total'] ?? 0; // var_dump($dados[0]['perc_entrada'].'-'.$dados[0]['num_parcelas']); if($dados[0]['perc_entrada'] == '' && $dados[0]['num_parcelas'] == '' ) { $formaPag = utf8_decode($dados[0]['forma_pgto']); }else{ if($dados[0]['perc_entrada'] == 100.00) { $formaPag = "À Vista"; }else if($dados[0]['perc_entrada'] == 0.00) { $formaPag = "Em ". $dados[0]['num_parcelas']. " parcelas"; }else{ $formaPag = "Entrada de ".number_format($dados[0]['perc_entrada'],2,',','.').'% mais '.$dados[0]['num_parcelas']. " parcelas vencendo a partir de ".date('d/m/Y', strtotime($dados[0]['data_parcela'])); } } $linhasDir = 7; // ajustado para o novo layout // Altura final igual para os dois quadros + padding extra $paddingExtra = 4; // altura extra para caber a linha 8 $alturaFinal = max($alturaEsq, $linAlt * $linhasDir) + $paddingExtra; // -------------------------- // Verifica se cabe na página, senão abre nova página // -------------------------- $espacoRestante = $this->GetPageHeight() - $this->GetY() - $this->bMargin; if ($alturaFinal + 5 > $espacoRestante) { $this->AddPage(); // Repetir cabeçalho do orçamento if (!empty($dados)) { $cab = $dados[0]; $id_user = $cab['id_user'] ?? 0; $this->SetFont('Arial','',10); $this->Image( $_SERVER['DOCUMENT_ROOT'].'/crsys/adm/assets/imagens/logo_login/'.$id_user.'/logo.png', 5, 5, 100, 35, 'PNG' ); $this->SetY(45); $this->SetX(5); $this->Cell(200,6,'Nº do Orçamento: '.$cab['orca_id'].'/'.date('Y', strtotime($cab['created'])),0,1,'R'); $this->Cell(200,6,'Data: '.date('d/m/Y', strtotime($cab['created'])),0,1,'R'); $this->Cell(200,6,'Revisão nº: '.$cab['num_revisao'],0,1,'R'); $this->Cell(200,6,'Última Revisão: '.date('d/m/Y', strtotime($cab['data_ult_rev'])),0,1,'R'); $this->SetY($this->GetY()+5); } } $yRodape = $this->GetY(); // -------------------------- // Coluna esquerda com borda // -------------------------- $this->Rect($margem, $yRodape, $largEsq, $alturaFinal); // contorno $this->SetXY($margem + 1, $yRodape + 1); // $this->MultiCell($largEsq - 2, $linAlt, utf8_decode($textoEsq), 0, 'L'); $this->MultiCell($largEsq - 2, $linAltEsq, utf8_decode($textoEsq), 0, 'L'); // -------------------------- // Coluna direita reformulada com células duplas // -------------------------- $xDir = $margem + $largEsq; $this->Rect($xDir, $yRodape, $largDir, $alturaFinal); // contorno $yLinha = $yRodape; // Linha 1: Cabeçalho "Resumo dos Valores" $this->SetFont('Arial','B',9); $this->SetXY($xDir, $yLinha); $this->Cell($largDir, $linAlt, 'Resumo dos Valores', 1, 0, 'C'); $yLinha += $linAlt; // Definir proporção de largura para coluna de texto e coluna de valor $largTexto = 35; $largValor = $largDir - $largTexto; // Linha 2: Valor total $this->SetFont('Arial','',9); $this->SetXY($xDir, $yLinha); $this->Cell($largTexto, $linAlt, 'Valor', 1, 0, 'L'); $this->Cell($largValor, $linAlt, 'R$ '.number_format($valorTotal,2,',','.'), 1, 0, 'R'); $yLinha += $linAlt; // Linha 3: Frete $this->SetXY($xDir, $yLinha); $this->Cell($largTexto, $linAlt, 'Frete', 1, 0, 'L'); $this->Cell($largValor, $linAlt, 'R$ '.number_format($frete,2,',','.'), 1, 0, 'R'); $yLinha += $linAlt; // Linha 4: Desconto if($desconto > 0.00 ){ $this->SetXY($xDir, $yLinha); $this->Cell($largTexto, $linAlt, 'Desconto (-)', 1, 0, 'L'); $this->Cell($largValor, $linAlt, 'R$ '.number_format($desconto,2,',','.'), 1, 0, 'R'); $yLinha += $linAlt; } // Linha 5: Valor Final (negrito) $this->SetFont('Arial','B',9); $this->SetXY($xDir, $yLinha); $this->Cell($largTexto, $linAlt, 'Valor Final', 1, 0, 'L'); $this->Cell($largValor, $linAlt, 'R$ '.number_format($totalPagar,2,',','.'), 1, 0, 'R'); $yLinha += $linAlt; // Linha 6: Pequeno cabeçalho "Forma de Pagamento" $this->SetFont('Arial','B',8); $this->SetXY($xDir, $yLinha); $this->Cell($largDir, $linAlt, 'Forma de Pagamento', 1, 0, 'C'); $yLinha += $linAlt; // Linha 7: Texto da forma de pagamento (pode quebrar linha) $this->SetFont('Arial','',9); $this->SetXY($xDir, $yLinha); $this->MultiCell($largDir, $linAlt, utf8_decode($formaPag), 'TLR', 'C'); } } /* ========================================================== 3) FUNÇÃO PARA CALCULAR ALTURA SEM IMPRIMIR ========================================================== */ function calculaAltura($pdf, $texto, $largura, $alturaLinha) { $texto = utf8_decode($texto); $nLinhas = $pdf->NbLines($largura, $texto); return $nLinhas * $alturaLinha; } /* ========================================================== 4) DADOS DO ORÇAMENTO ========================================================== */ $orca_id = $_GET['orca_id'] ?? ''; $num_rev = $_GET['num_revisao'] ?? ''; $id_user = $_GET['id_user'] ?? ''; $tipo = $_GET['tipo'] ?? 'N'; $endereco = $_GET['endereco'] ?? ''; $opcao = $_GET['opcao'] ?? ''; $cont_item = 0; /*$debugGet = [ 'orca_id' => $_GET['orca_id'] ?? '', 'num_revisao'=> $_GET['num_revisao'] ?? '', 'id_user' => $_GET['id_user'] ?? '', 'tipo' => $_GET['tipo'] ?? 'N', 'endereco' => $_GET['endereco'] ?? '', 'opcao' => $_GET['opcao'] ?? '' ]; echo '<pre>DEBUG $_GET:' . PHP_EOL; print_r($debugGet); echo '</pre>'; * */ if (!$orca_id) { echo json_encode(["erro" => "Parâmetro 'orca_id' não fornecido."]); exit; } // Consulta cabeçalho // Definir a query base com o join condicional dependendo do valor de $opcao $queryBase = " SELECT c.*, case when c.obra_id is null then concat(c.obra,' - *** NÃO CADASTRADA ***') else c.obra end obra, o.tipo_id, CASE WHEN o.tipo_id = 1 THEN mask(LPAD(o.cnpj, 14, 0), '##.###.###/####-##') ELSE mask(LPAD(o.cpf, 11, 0), '###.###.###-##') END AS docto, u.nome AS vendedor, CASE WHEN CHAR_LENGTH(a.celular) < 11 THEN mask(LPAD(a.celular, 10, 0), '(##) ####-####') ELSE mask(LPAD(a.celular, 11, 0), '(##) #####-####') END AS telefone_obra, CASE WHEN CHAR_LENGTH(c.tel_vend) < 11 THEN mask(LPAD(c.tel_vend, 10, 0), '(##) ####-####') ELSE mask(LPAD(c.tel_vend, 11, 0), '(##) #####-####') END AS cel, mask(LPAD(c.cep_obra, 8, 0), '#####-###') AS cep, DATE_FORMAT(c.data, '%d/%m/%Y') AS data, DATE_FORMAT(c.data_ult_rev, '%d/%m/%Y') AS data_ult_rev, CONCAT('R$ ', FORMAT(vlr_total, 2, 'de_DE')) AS valor_total, c.endereco_obra AS rua, c.numero_obra, c.municipio_obra AS municipio, c.uf_obra AS uf, o.contato AS contato_obra, CASE WHEN CHAR_LENGTH(o.celular) < 11 THEN mask(LPAD(o.celular, 10, 0), '(##) ####-####') ELSE mask(LPAD(o.celular, 11, 0), '(##) #####-####') END AS cel_obra, ( SELECT SUM(i.vlr_total_mo + i.vlr_total_mat) FROM gre_item_orcamento i WHERE i.orca_id = :orca_id_sub AND i.num_revisao = :num_rev_sub ) AS vlr_semdesc FROM gre_cab_orcamento c "; // Condicional INNER JOIN ou LEFT JOIN dependendo do valor de $opcao if ($opcao === 'O') { $queryBase .= " INNER JOIN gre_obras o ON o.id = c.obra_id "; } else { $queryBase .= " LEFT JOIN gre_obras o ON o.id = c.obra_id "; } // Continuar com os LEFT JOINS $queryBase .= " LEFT JOIN adms_usuarios u ON u.id = c.vend LEFT JOIN gre_arquitetos a ON a.id = c.arquiteto_id WHERE c.orca_id = :orca_id AND c.num_revisao = :num_rev "; $params = [ ':orca_id' => $orca_id, ':num_rev' => $num_rev, ':orca_id_sub' => $orca_id, ':num_rev_sub' => $num_rev ]; $stmt = $pdo->prepare($queryBase); $stmt->execute($params); $dados = $stmt->fetchAll(PDO::FETCH_ASSOC); // Consulta itens $stmt2 = $pdo->prepare(" SELECT i.*, (i.vlr_total_mo + i.vlr_total_mat) 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); //var_dump($revisoes); if (empty($dados) || empty($revisoes)) { echo json_encode(["erro" => "ERRO"]); exit; } /* ========================================================== 5) CRIAR PDF ========================================================== */ $pdf = new PDF(); $pdf->SetAutoPageBreak(0); $pdf->SetFont('Arial','',10); $num_linhas = 33; $cont_linha = 9999; $ambant = 0; /* ========================================================== 6) CABEÇALHO COMPLETO ========================================================== */ foreach ($dados as $lcto) { extract($lcto); if ($cont_linha > $num_linhas) { $pdf->AddPage('P','A4'); // LOGO $pdf->Image( $_SERVER['DOCUMENT_ROOT'].'/crsys/adm/assets/imagens/logo_login/'.$id_user.'/logo.png', 5, 5, 100, 35, 'PNG' ); $pdf->Cell(200,10,'',0,1); // Campos do orçamento totalmente à direita $pdf->SetFont('Arial','B',12); $pdf->SetXY(5, 10); $larguraPagina = 210; // A4 $margemDireita = 5; if($opcao == 'O') { $nome_relatorio = "Nº do Orçamento:"; }else{ $nome_relatorio = "Nº do Pedido:";} $pdf->Cell($larguraPagina - 2*$margemDireita, 6, utf8_decode($nome_relatorio.' '.$orca_id.'/'.date('Y', strtotime($created))), 0, 1, 'R'); $pdf->SetX(5); $pdf->Cell($larguraPagina - 2*$margemDireita, 6, utf8_decode('Data: '.date('d/m/Y', strtotime($revisoes[0]['created']))), 0, 1, 'R'); $pdf->SetX(5); $pdf->Cell($larguraPagina - 2*$margemDireita, 6, utf8_decode('Revisão nº: '.$num_rev), 0, 1, 'R'); $pdf->SetX(5); $pdf->Cell($larguraPagina - 2*$margemDireita, 6, utf8_decode('Última Revisão: '.date('d/m/Y', strtotime($revisoes[0]['data_ult_rev']))), 0, 1, 'R'); $pdf->SetDrawColor(0,0,0); $pdf->SetLineWidth(0.1); $y = $pdf->GetY() + 3; $pdf->Line(5, $y, 205, $y); $pdf->Cell(20, 6, '', 0, 1); // Cabeçalho detalhado do cliente/obra $pdf->SetX(5); $pdf->SetFont('Arial','',10); $pdf->Cell(20,6,'Cliente:',0,0); $pdf->Cell(100,6,utf8_decode($nome_cliente),0,0); $pdf->Cell(30,6,'Vendedor:',0,0); $pdf->Cell(40,6,utf8_decode($vendedor),0,1); $pdf->SetX(5); $pdf->Cell(20,6,'Obra:',0,0); $pdf->Cell(100,6,utf8_decode($obra),0,0); $pdf->Cell(30,6,'Telefone:',0,0); $pdf->Cell(40,6,utf8_decode($cel),0,1); $pdf->SetX(5); $pdf->Cell(20,6,'Contato:',0,0); $pdf->Cell(40,6,utf8_decode($contato_obra),0,0); $pdf->Cell(20,6,'Arquiteto:',0,0); $pdf->Cell(40,6,utf8_decode($arquiteto),0,0); $pdf->Cell(30,6,'Email:',0,0); $pdf->Cell(40,6,utf8_decode($email_vend),0,1); $pdf->SetX(5); $pdf->Cell(20,6,'Telefone:',0,0); $pdf->Cell(100,6,utf8_decode($telefone_obra),0,0); $pdf->Cell(30,6,utf8_decode('Orçamentista:'),0,0); $pdf->Cell(40,6,utf8_decode($orcamentista),0,1); $pdf->SetX(5); $pdf->Cell(20,6,'Email:',0,0); $pdf->Cell(40,6,utf8_decode($email_obra),0,1); $pdf->SetX(5); $pdf->Cell(20,6,'End.Obra:',0,0); $pdf->Cell(140,6,utf8_decode($endereco_obra.', '.$numero_obra.' - '.$bairro.' - '.$municipio_obra.'/'.$uf_obra),0,1); // Linha horizontal $pdf->SetDrawColor(0,0,0); $pdf->SetLineWidth(0.1); $y = $pdf->GetY() + 3; $pdf->Line(5, $y, 205, $y); $pdf->Cell(20,6,'',0,1); // Cabeçalho da tabela de itens $pdf->SetX(5); $pdf->SetFont('Arial','B',8); $pdf->Cell(10,7,utf8_decode('Item'),'1',0,'C'); $pdf->Cell(55,7,utf8_decode('Material'),'1',0,'C'); $pdf->Cell(75,7,utf8_decode('Descrição'),'1',0,'C'); $pdf->Cell(10,7,utf8_decode('Qtde'),'1',0,'C'); $pdf->Cell(10,7,utf8_decode('Unid'),'1',0,'C'); $pdf->Cell(20,7,utf8_decode('Vlr Unit'),'1',0,'C'); $pdf->Cell(20,7,utf8_decode('Vlr.Total'),'1',1,'C'); $cont_linha = 0; } } /* ========================================================== 7) TABELA DE ITENS (VERSÃO CORRIGIDA) ========================================================== */ foreach ($revisoes as $itens) { extract($itens); // Título do ambiente if ($ambant <> $ambiente_id) { $ambant = $ambiente_id; $pdf->SetX(5); $pdf->SetFont('Arial','B',9); $pdf->Cell(200,7,utf8_decode($nome_ambiente),1,1,'C'); } $pdf->SetFont('Arial','',9); // Definir larguras e altura base $largItem = 10; $largMaterial = 55; $largDesc = 75; $alturaLinha = 4; // altura de uma linha de texto $xInicial = 5; $yInicial = $pdf->GetY(); // Calcular altura real da célula considerando múltiplas linhas $alturaMaterial = $pdf->NbLines($largMaterial, utf8_decode($material)) * $alturaLinha; $alturaDescricao = $pdf->NbLines($largDesc, utf8_decode($descricao)) * $alturaLinha; $alturaFinal = max($alturaMaterial, $alturaDescricao); // ------------------- // Célula Item // ------------------- $cont_item ++; $pdf->SetXY($xInicial, $yInicial); $pdf->Cell($largItem, $alturaFinal, utf8_decode( $cont_item), 1, 0, 'C'); // ------------------- // Célula Material // ------------------- $pdf->Cell($largMaterial, $alturaFinal, utf8_decode($material), 1, 0, 'L'); // ------------------- // Célula Descrição // ------------------- $pdf->SetXY($xInicial + $largItem + $largMaterial, $yInicial); $pdf->MultiCell($largDesc, $alturaLinha, utf8_decode($descricao), 1, 'L'); // ------------------- // Células de Quantidade, Unidade, Valor Unitário e Total // ------------------- $xPos = $xInicial + $largItem + $largMaterial + $largDesc; $pdf->SetXY($xPos, $yInicial); // Quantidade if ($unid_prod == 'ml') { $valor_Unit = $valorTotal / $ml; $pdf->Cell(10,$alturaFinal,number_format($ml,2,',','.'),1,0,'R'); } elseif ($unid_prod == 'm2') { $valor_Unit = $valorTotal / $m2; $pdf->Cell(10,$alturaFinal,number_format($m2,2,',','.'),1,0,'R'); } else { $pdf->Cell(10,$alturaFinal,number_format($qtde_pecas,2,',','.'),1,0,'R'); $valor_Unit = $valorTotal / max(1, $qtde_pecas); // evita divisão por zero } // Unidade $pdf->Cell(10,$alturaFinal,utf8_decode($unid_prod),1,0,'C'); // Valor Unitário $pdf->Cell(20,$alturaFinal,number_format($valor_Unit,2,',','.'),1,0,'R'); // Valor Total $pdf->Cell(20,$alturaFinal,number_format($valorTotal,2,',','.'),1,1,'R'); } if($tipo == 'N') { $pdf->Output(); }else { // ================================ // BUSCA CONFIGURAÇÃO DE E-MAIL // ================================ $sql = "SELECT * FROM adms_confs_emails WHERE id = :id LIMIT 1"; $param = ['id' => 1]; $stmt = $pdo->prepare($sql); $stmt->execute($param); $dadosEmail = $stmt->fetch(PDO::FETCH_ASSOC); if (!$dadosEmail) { echo " <script> window.opener.postMessage( { status: 'erro', mensagem: 'Configuração de e-mail não encontrada' }, '*' ); window.close(); </script>"; exit; } $sql = "SELECT p.orca_id, p.num_revisao, p.num_parcela, p.qtde_parcela, p.valor_parcela, p.tipo_pagto_id, CASE WHEN p.vencimento IS NULL THEN 'Entrada' ELSE ' ' END AS entrada, DATE_FORMAT(p.vencimento, '%d/%m/%Y') vencimento, t.nome AS nometipo FROM gre_parcelas p INNER JOIN gre_forma_pagamento t ON p.tipo_pagto_id = t.id WHERE p.orca_id = :orca_id AND p.num_revisao = :num_revisao ORDER BY p.num_parcela; "; $params = [ ':orca_id' => $orca_id, ':num_revisao' => $num_revisao ]; $stmt = $pdo->prepare($sql); $stmt->execute($params); $parcelas = $stmt->fetchAll(PDO::FETCH_ASSOC); // ================================ // GERA O PDF // ================================ // ================================ // GERA O PDF // ================================ $diretorio = $_SERVER['DOCUMENT_ROOT'].'/crsys/adm/orcamento'; $nome_arquivo = "orcamento_{$empr_id}_{$orca_id}_{$num_rev}.pdf"; $caminho_completo = $diretorio . '/' . $nome_arquivo; // Se o arquivo já existir, exclui if (file_exists($caminho_completo)) { unlink($caminho_completo); } // Grava o novo PDF $pdf->Output('F', $caminho_completo); // ================================ // LOCALIZA O COMPROVANTE JPG // ================================ $nome_comprovante = "comprovante_{$empr_id}_{$orca_id}_{$num_rev}.jpg"; $caminho_comprovante = $diretorio . '/' . $nome_comprovante; $existeComprovante = file_exists($caminho_comprovante); // ================================ // PREPARA CONTEÚDO DO E-MAIL // ================================ $primeiro_nome = explode(" ", $dados[0]['nome_cliente'])[0] ?? 'Cliente'; $tratamento = "Prezado(a) $primeiro_nome"; $conteudo = utf8_decode("$tratamento,<br><br>"); $conteudo .= utf8_decode("Por favor emitir pedido com os dados abaixo :.<br><br>"); $conteudo .= utf8_decode("<i>Nº do Orçamento: </i><b>$orca_id</b><br>"); $conteudo .= utf8_decode("<i>Revisão: </i><b>$num_rev</b><br>"); $conteudo .= utf8_decode("<i>Data: </i><b>" . date('d/m/Y', strtotime($dados[0]['created'] ?? date('Y-m-d'))) . "</b><br><br>"); $conteudo .= utf8_decode("<b><i>Valor Final </i>$valor_total</b><br><br>"); /* ============================================================ FORMA DE PAGAMENTO ============================================================ */ $conteudo .= "<br><strong>FORMA DE PAGAMENTO</strong><br>"; $conteudo .= "<table border='1' cellspacing='0' cellpadding='5' style='border-collapse:collapse; font-size: 13px;'>"; // Cabeçalho $conteudo .= " <tr style='background-color:#f0f0f0; font-weight:bold;'> <td>Parcela</td> <td>Vencimento</td> <td>Valor</td> <td>Tipo Pagamento</td> </tr> "; // Linhas if (!empty($parcelas)) { foreach ($parcelas as $p) { $valorFormatado = number_format((float)$p['valor_parcela'], 2, ',', '.'); $vencimento = ($p['num_parcela'] == 0) ? "Entrada" : $p['vencimento']; $conteudo .= " <tr> <td>{$p['num_parcela']}</td> <td>{$vencimento}</td> <td>R$ {$valorFormatado}</td> <td>{$p['nometipo']}</td> </tr> "; } } else { $conteudo .= " <tr> <td colspan='4'>Nenhuma parcela cadastrada.</td> </tr> "; } $conteudo .= "</table><br><br>"; $conteudo .= utf8_decode("<i>Nota Fiscal</i>: SIM<br><br>"); $conteudo .= utf8_decode("<i>Comissão Vendedor:</i> 3%<br><br>"); $conteudo .= utf8_decode("<b>Arquitetura</b><br><br>"); $conteudo .= utf8_decode("<i>RT: </i>SIM<br><br>"); $conteudo .= utf8_decode("<b>Medição e Cobrança</b><br><br>"); $conteudo .= utf8_decode("<i>Nome: </i>".utf8_decode($dados[0]['contato_obra']) ."<br>"); $conteudo .= utf8_decode("<i>Tel: </i>".utf8_decode($dados[0]['cel_obra']) ."<br>"); $conteudo .= utf8_decode("<i>e-Mail: </i>".utf8_decode($dados[0]['email_obra']) ."<br><br>"); $conteudo .= utf8_decode("<b>Faturamento /Cobrança e Obra: </b><br><br>"); if ($dados[0]['tipo_id'] == 1) { $conteudo .= utf8_decode("<i>Razão Social: </i>".utf8_decode($dados[0]['obra']) ."<br><br>"); $conteudo .= utf8_decode("<i>CNPJ: </i>".utf8_decode($dados[0]['docto']) ."<br><br>"); } else { $conteudo .= utf8_decode("<i>Nome: </i>".utf8_decode($dados[0]['obra']) ."<br><br>"); $conteudo .= utf8_decode("<i>CPF: </i>".utf8_decode($dados[0]['docto']) ."<br><br>"); } // Endereço da obra if ($dados[0]['complemento'] == '') { $endereco = $dados[0]['endereco_obra'] . ', ' . $dados[0]['numero_obra'] . ', ' . $dados[0]['bairro'] . ', ' . $dados[0]['municipio_obra'] . '/' . $dados[0]['uf_obra'].' cep '.$dados[0]['cep']; } else { $endereco = $dados[0]['endereco_obra'] . ', ' . $dados[0]['numero_obra'] . ', ' . $dados[0]['complemento'] . ', ' . $dados[0]['bairro'] . ', ' . $dados[0]['municipio_obra'] . '/' . $dados[0]['uf_obra'].' cep '.$dados[0]['cep']; } $conteudo .= utf8_decode("<i>Endereço da Obra: </i>" . $endereco . "<br><br>"); // Endereço de cobrança $conteudo .= utf8_decode("<i>Endereço de Cobrança: </i>" . $endereco . "<br><br><br>"); $conteudo .= utf8_decode("Atenciosamente,<br><br>"); $conteudo .= utf8_decode($dados[0]['vendedor'] . "<br>"); $conteudo .= utf8_decode($dados[0]['cel'] . "<br>"); $conteudo .= utf8_decode("Departamento Comercial<br>"); // ================================ // ENVIO DO E-MAIL COM PHPMailer // ================================ require_once $_SERVER['DOCUMENT_ROOT'].'/crsys/adm/vendor/phpmailer/phpmailer/src/Exception.php'; require_once $_SERVER['DOCUMENT_ROOT'].'/crsys/adm/vendor/phpmailer/phpmailer/src/PHPMailer.php'; require_once $_SERVER['DOCUMENT_ROOT'].'/crsys/adm/vendor/phpmailer/phpmailer/src/SMTP.php'; try { $mail = new \PHPMailer\PHPMailer\PHPMailer(true); $mail->isSMTP(); $mail->Host = $dadosEmail['host']; $mail->SMTPAuth = true; $mail->Username = $dadosEmail['usuario']; $mail->Password = $dadosEmail['senha']; $mail->SMTPSecure = $dadosEmail['smtpsecure']; $mail->Port = $dadosEmail['porta']; $mail->setFrom('noreply@crsys.com.br', 'Departamento Comercial'); //$mail->addAddress($dados[0]['email_obra'] ?? '', $primeiro_nome); $mail->addAddress('crmarques@uol.com.br' ?? '', 'Amauri Jr'); if (!empty($dados[0]['email_vend'])) { $mail->addBCC($dados[0]['email_vend'], $dados[0]['vendedor']); } // Anexa o PDF $mail->addAttachment($caminho_completo); // Anexa o COMPROVANTE JPG se existir if ($existeComprovante) { $mail->addAttachment($caminho_comprovante); } $mail->isHTML(true); $mail->Subject = utf8_decode("EMISSAO PEDIDO - ORÇAMENTO Nº {$orca_id}/{$num_revisao} - CLIENTE {$dados[0]['obra']}"); $mail->Body = $conteudo; $mail->AltBody = strip_tags($conteudo); $mail->send(); // ================================ // ATUALIZA STATUS DO ORÇAMENTO // ================================ $sqlUpdate = "UPDATE gre_cab_orcamento SET status_id = :status_id WHERE orca_id = :id "; $stmtUpdate = $pdo->prepare($sqlUpdate); $stmtUpdate->execute([ ':status_id' => 2, // <-- aqui você coloca o status desejado ':id' => $orca_id ]); echo " <script> window.opener.postMessage( { status: 'ok', mensagem: 'Email do Orçamento enviado com sucesso!' }, '*' ); window.close(); </script>"; exit; } catch (\PHPMailer\PHPMailer\Exception $e) { echo " <script> window.opener.postMessage( { status: 'erro', mensagem: 'Erro ao enviar e-mail: ". addslashes($mail->ErrorInfo) ."' }, '*' ); window.close(); </script>"; exit; } }