D7net
Home
Console
Upload
information
Create File
Create Folder
About
Tools
:
/
var
/
www
/
html
/
crsys
/
adm
/
app
/
gre
/
Models
/
PreContratoExcluir
/
Filename :
ModGerarPreContrato_1.php
back
Copy
<?php namespace App\gre\Models\PreContrato; use PhpOffice\PhpWord\TemplateProcessor; class ModGerarPreContrato { private $gorca_id; private $gnum_revisao; private $num_contrato; private $Dados = []; public function gerar(array $formData): array { // var_dump($formData); // die; try { if (!isset($_SESSION['id_user'])) { throw new \Exception("Usuário não autenticado."); } if (!isset($formData['listpedido'][0])) { throw new \Exception("Dados do pedido não encontrados."); } $this->gorca_id = $formData['listpedido'][0]['orca_id']; $this->gnum_revisao = $formData['listpedido'][0]['num_revisao']; if (empty($formData['listpedido'][0]['num_contrato'])) { $this->pegaNumContrato($formData['listpedido'][0]['empr_id']); $formData['listpedido'][0]['num_contrato'] = $this->num_contrato[0]['num_contrato']; } $cabecalho = $formData['listpedido'][0]; $num_contrato = $cabecalho['num_contrato']; $user_id = $_SESSION['id_user']; // Sanitiza nome $contratante = iconv('UTF-8', 'ASCII//TRANSLIT', $cabecalho['nome_cliente']); $contratante = preg_replace('/[^A-Za-z0-9]/', '_', $contratante); // Caminho do modelo $path = $_SERVER['DOCUMENT_ROOT'].'/crsys/adm/ContratosCrsys/'. $user_id . '/Contrato.docx'; //var_dump($path); //var_dump(file_exists($path)); //var_dump(is_readable($path)); //die; // $modeloContrato = realpath(__DIR__ . '/../../../../ContratosCrsys/' . $user_id . '/Contrato.docx'); $modeloContrato = $_SERVER['DOCUMENT_ROOT'].'/crsys/adm/ContratosCrsys/'. $user_id . '/Contrato.docx'; //var_dump($modeloContrato); if (!$modeloContrato || !file_exists($modeloContrato)) { throw new \Exception("Modelo de contrato não encontrado: " . $modeloContrato); } // Diretório base $baseDir = $_SERVER['DOCUMENT_ROOT'].'/crsys/adm/Contratos'; if (!$baseDir) { throw new \Exception("Diretório base não encontrado."); } $destinoDir = $baseDir . DIRECTORY_SEPARATOR . $user_id; // var_dump($destinoDir); //die; if (!is_dir($destinoDir)) { if (!mkdir($destinoDir, 0777, true)) { throw new \Exception("Não foi possível criar diretório: " . $destinoDir); } } $saidaDocx = $destinoDir . DIRECTORY_SEPARATOR . "Contrato_{$num_contrato}_{$contratante}.docx"; $saidaPdf = $destinoDir . DIRECTORY_SEPARATOR . "Contrato_{$num_contrato}_{$contratante}.pdf"; // 🔹 Se já existir DOCX antigo, remove if (file_exists($saidaDocx)) { if (!unlink($saidaDocx)) { throw new \Exception("Não foi possível remover DOCX antigo."); } } // 🔹 Se já existir PDF antigo, remove if (file_exists($saidaPdf)) { if (!unlink($saidaPdf)) { throw new \Exception("Não foi possível remover PDF antigo."); } } $anoOrca = (new \DateTime($cabecalho['data_retorno_aceite']))->format("Y"); $dataContrato = new \DateTime($cabecalho['data_contrato']); setlocale(LC_TIME, 'pt_BR.utf8'); $dataFormatada = strftime('%d de %B de %Y', $dataContrato->getTimestamp()); $dadosContrato = [ 'num_orca' => $cabecalho['orca_id'], 'num_contrato' => $cabecalho['num_contrato'], 'ano_contr' => date('Y'), 'ano_orca' => $anoOrca, 'data' => $dataFormatada, 'nome_cliente' => $cabecalho['nome_cliente'], 'ldocto_fat' => $cabecalho['ldocto_fat'], 'num_docto_fat' => $cabecalho['num_docto_fat'], 'lnome_fat' => $cabecalho['lnome_fat'], 'nome_fat' => $cabecalho['nome_fat'], 'cep_fat' => $cabecalho['cep_fat'], 'end_fat' => $cabecalho['end_fat'], 'num_fat' => $cabecalho['num_fat'], 'compl_fat' => $cabecalho['compl_fat'], 'bairro_fat' => $cabecalho['bairro_fat'], 'muni_fat' => $cabecalho['muni_fat'], 'uf_fat' => $cabecalho['uf_fat'], 'cel_fat' => $cabecalho['cel_fat'], 'mun_empr' => $cabecalho['mun_empr'], 'lnome_obra' => $cabecalho['lnome_obra'], 'nome_obra' => $cabecalho['obra'], 'cep_obra' => $cabecalho['cep_obra'], 'end_obra' => $cabecalho['endereco_obra'], 'num_obra' => $cabecalho['numero_obra'], 'compl_obra' => $cabecalho['complemento'], 'bairro_obra' => $cabecalho['bairro'], 'muni_obra' => $cabecalho['municipio_obra'], 'uf_obra' => $cabecalho['uf_obra'], 'dias_med' => 5, 'dias_entr' => 15, 'fone_obra' => $cabecalho['telefone_obra'], 'ldocto' => $cabecalho['ldocto'], 'num_docto' => $cabecalho['docto'], 'cel_obra' => $cabecalho['cel_obra'], 'cel_cobra' => $cabecalho['cel_cobra'], 'cep_cobra' => $cabecalho['cep_cobra'], 'end_cobra' => $cabecalho['endereco_cobra'], 'num_cobra' => $cabecalho['numero_cobra'], 'compl_cobra' => $cabecalho['complemento_cobra'], 'bairro_cobra' => $cabecalho['bairro_cobra'], 'muni_cobra' => $cabecalho['municipio_cobra'], 'uf_cobra' => $cabecalho['uf_cobra'], 'vlr_total' => $cabecalho['valor_total'], ]; // 🔹 Gera DOCX try { $template = new TemplateProcessor($modeloContrato); foreach ($dadosContrato as $chave => $valor) { $template->setValue($chave, $valor ?? ''); } // 🔹 Preenche parcelas + calcula total if (!empty($formData['listparcela'])) { $parcelas = $formData['listparcela']; $template->cloneRow('numero', count($parcelas)); $totalGeral = 0; foreach ($parcelas as $index => $parcela) { $dataVenc = (new \DateTime($parcela['vencimento']))->format('d/m/Y'); $valorFloat = (float)$parcela['valor_parcela']; $valorFormatado = 'R$ ' . number_format($valorFloat, 2, ',', '.'); $forma = $parcela['nome']; $linha = $index + 1; $template->setValue("numero#{$linha}", $linha); $template->setValue("vencimento#{$linha}", $dataVenc); $template->setValue("valor#{$linha}", $valorFormatado); $template->setValue("forma#{$linha}", $forma); // 🔹 Soma no total $totalGeral += $valorFloat; } // 🔹 Atualiza ${total} no DOCX $template->setValue( 'total', 'R$ ' . number_format($totalGeral, 2, ',', '.') ); } $template->saveAs($saidaDocx); } catch (\Throwable $e) { throw new \Exception("Erro ao gerar DOCX: " . $e->getMessage()); } if (!file_exists($saidaDocx)) { throw new \Exception("Falha ao criar DOCX."); } // 🔥 CONVERSÃO PARA PDF USANDO LIBREOFFICE (COM LOG) try { set_time_limit(120); // $soffice = '/usr/bin/libreoffice'; // var_dump(strtoupper(substr(PHP_OS, 0, 3))); // die; if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { $soffice = '"C:\Program Files\LibreOffice\program\soffice.com"'; } else { $soffice = '/usr/bin/libreoffice'; } // var_dump($soffice); // die; // if (!file_exists('C:\Program Files\LibreOffice\program\soffice.com')) { // throw new \Exception("LibreOffice não encontrado no caminho padrão."); // } $cmd = $soffice . ' --headless --convert-to pdf --outdir ' . escapeshellarg($destinoDir) . ' ' . escapeshellarg($saidaDocx); $output = []; $returnCode = 0; exec($cmd . " 2>&1", $output, $returnCode); // 🔹 Log detalhado em C:\temp\log_exec.txt if ($returnCode !== 0) { throw new \Exception("Erro LibreOffice: " . implode("\n", $output)); } } catch (\Throwable $e) { throw new \Exception("Erro ao converter para PDF: " . $e->getMessage()); } // Verifica se o PDF foi criado, com rechecagem $tentativas = 0; while (!file_exists($saidaPdf) && $tentativas < 5) { usleep(1500000); // espera 0,2 segundos clearstatcache(); // limpa cache de status de arquivo $tentativas++; } //if (!file_exists($/saidaPdf)) { // throw new \Exception("PDF não foi gerado."); //} return [ 'docx' => $saidaDocx, 'pdf' => $saidaPdf ]; } catch (\Exception $e) { // Captura qualquer exceção e mostra só a mensagem echo $e->getMessage(); return []; } } private function pegaNumContrato($empr_id) { $listarParametro = new \App\adms\Models\helper\AdmsRead(); $listarParametro->fullRead("SELECT param.ult_contrato +1 num_contrato FROM gre_parametros param where param.empr_id = {$empr_id} limit 1"); $this->num_contrato = $listarParametro->getResultado(); date_default_timezone_set ("America/Sao_Paulo"); $this->num_contrato[0]['data_contrato'] = date("Y-m-d H:i:s"); $this->Dados['ult_contrato'] = $this->num_contrato[0]['num_contrato']; $upAltParametro = new \App\adms\Models\helper\AdmsUpdate(); $upAltParametro->exeUpdate("gre_parametros", $this->Dados, "WHERE empr_id =:empr_id", "empr_id=" . $empr_id); $upAltCab = new \App\adms\Models\helper\AdmsUpdate(); $this->Dados['num_contrato'] = $this->num_contrato[0]['num_contrato']; $this->Dados['data_contrato'] = $this->num_contrato[0]['data_contrato']; $formData['listpedido'][0]['data_contrato'] = $this->num_contrato[0]['data_contrato']; unset($this->Dados['ult_contrato']); $upAltParametro->exeUpdate("gre_cab_orcamento", $this->Dados, "WHERE empr_id =:empr_id and orca_id = :orca_id and num_revisao = :num_revisao", "orca_id=" . $this->gorca_id."&num_revisao=" . $this->gnum_revisao."&empr_id=" . $empr_id ); } }