File manager - Edit - /var/www/html/portal/app/Http/Controllers/Cultura/ArteSacra/RelatorioController.php
Back
<?php namespace App\Http\Controllers\Cultura\ArteSacra; use App\Http\Controllers\Controller; use App\Models\Cultura\ArteSacra\{ Acervo, AvaliacaoTecnica, ClasseArte, Designacao, Historico, Material, ModoAquisicao, Proprietario, Tecnica, TipoAcervo, Tombamento }; use Illuminate\Http\Request; use Illuminate\Http\RedirectResponse; use Endroid\QrCode\{ QrCode, Writer\PngWriter, Encoding\Encoding, ErrorCorrectionLevel, RoundBlockSizeMode, }; use Illuminate\Support\Str; use Barryvdh\DomPDF\Facade\Pdf; use Illuminate\Support\Facades\Storage; class RelatorioController extends Controller { private $permissao = "GERENCIADOR_DO_CADASTRO_DE_ARTE_SACRA"; private function getUniqueByField($model, $field) { $ids = $model::selectRaw("MIN(id) as id") ->where('status', true) ->groupBy($field) ->pluck('id'); return $model::whereIn('id', $ids) ->orderBy($field, 'asc') ->pluck($field, 'id'); } private function buscarAcervosFiltrados(Request $request, bool $paginar = true) { $query = Acervo::with([ 'tipo', 'modoAquisicao', 'material', 'tecnica', 'proprietario', 'designacao', 'classe', 'tombamento' ]) ->where('status_peca', 0) ->when($request->filled('modo_aquisicao_id'), fn($q) => $q->where('modo_aquisicao_id', $request->modo_aquisicao_id)) ->when($request->filled('tipo_id'), fn($q) => $q->where('tipo_id', $request->tipo_id)) ->when($request->filled('ano_arte'), fn($q) => $q->where('ano_arte', $request->ano_arte)) ->when($request->filled('material_id'), fn($q) => $q->where('material_id', $request->material_id)) ->when($request->filled('tecnica_id'), fn($q) => $q->where('tecnica_id', $request->tecnica_id)) ->when($request->filled('localizacao_id'), fn($q) => $q->where('localizacao_id', $request->localizacao_id)) ->when($request->filled('proprietario_id'), fn($q) => $q->where('proprietario_id', $request->proprietario_id)); return $paginar ? $query->paginate(20)->appends($request->query()) : $query->get(); } public function index(Request $request) { $response = $this->checkPermissao($this->permissao, 'visualizar'); if ($response instanceof RedirectResponse) { return $response; } $acervos = $this->buscarAcervosFiltrados($request); $camposRotulos = [ 'codigo_acervo' => 'Código do Acervo', 'nome_peca' => 'Nome da Peça', 'ano_arte' => 'Ano da Peça', 'tipo_id' => 'Tipo', 'modo_aquisicao_id' => 'Modo de Aquisição', 'material_id' => 'Material', 'proprietario_id' => 'Proprietário', 'localizacao_id' => 'Localização', 'data_recebimento' => 'Data de Recebimento', 'tecnica_id' => 'Técnica', 'designacao_id' => 'Designação', 'classe_id' => 'Classe', 'tombamento_id' => 'Tombamento', 'descricao' => 'Descrição', 'periodo_peca' => 'Período da Peça', 'autoria' => 'Autoria', 'dimensao' => 'Dimensão', 'altura' => 'Altura', 'comprimento' => 'Comprimento', 'largura' => 'Largura', 'diametro' => 'Diâmetro', 'profundidade' => 'Profundidade', 'peso' => 'Peso', 'roca' => 'Roca', 'entregue_por' => 'Entregue por', ]; $excluirCampos = ['id', 'created_at', 'updated_at']; $colecao = collect($acervos->items()); $camposDoModelo = $colecao->isNotEmpty() ? array_diff(array_keys($colecao->first()->getAttributes()), $excluirCampos) : []; $camposTodos = array_values(array_intersect(array_keys($camposRotulos), array_merge($camposDoModelo, array_keys($camposRotulos)))); $camposPadrao = [ 'codigo_acervo', 'nome_peca', 'proprietario_id', 'localizacao_id', 'ano_arte', 'tipo_id', 'modo_aquisicao_id', 'material_id', 'tecnica_id', ]; $camposSelecionados = $request->filled('campos') ? $request->input('campos') : ($request->has('todos') ? $camposTodos : $camposPadrao); return view('admin.cultura.arteSacra.report', [ 'acervos' => $acervos, 'campos' => $camposSelecionados, 'camposTodos' => $camposTodos, 'rotulos' => $camposRotulos, 'historicos' => Historico::all(), 'avaliacoesTecnicas' => AvaliacaoTecnica::all(), 'modosAquisicao' => $this->getUniqueByField(ModoAquisicao::class, 'modo_aquisicao'), 'tipos' => $this->getUniqueByField(TipoAcervo::class, 'tipo'), 'materiais' => $this->getUniqueByField(Material::class, 'material'), 'tecnicas' => $this->getUniqueByField(Tecnica::class, 'tecnica'), 'proprietarios' => $this->getUniqueByField(Proprietario::class, 'proprietario'), 'designacoes' => $this->getUniqueByField(Designacao::class, 'designacao'), 'classes' => $this->getUniqueByField(ClasseArte::class, 'classe'), 'tombamentos' => $this->getUniqueByField(Tombamento::class, 'tombamento'), ]); } public function filtros(Request $request) { $response = $this->checkPermissao($this->permissao, 'visualizar'); if ($response instanceof RedirectResponse) { return $response; } return redirect()->route('admin.cultura.arteSacra.report', $request->only([ 'modo_aquisicao_id', 'tipo_id', 'ano_arte', 'material_id', 'tecnica_id', 'proprietario_id', 'localizacao_id', ])); } public function exportarPDF(Request $request) { $response = $this->checkPermissao($this->permissao, 'visualizar'); if ($response instanceof RedirectResponse) { return $response; } $camposSelecionados = $request->input('campos', []); $acervos = $this->buscarAcervosFiltrados($request, false); if ($acervos->isEmpty()) { return back()->with('error', 'Nenhum registro encontrado para exportação.'); } $camposCompactos = [ 'dimensao', 'altura', 'comprimento', 'largura', 'diametro', 'profundidade', 'peso', 'roca' ]; $maxColunasPorPagina = 8; $colunasDivididas = array_chunk($camposSelecionados, $maxColunasPorPagina); $html = ' <style> @page { margin: 30px 20px; counter-increment: page; } body { font-family: sans-serif; font-size: 10px; margin: 0; } table { width: 100%; border-collapse: collapse; font-size: 10px; table-layout: fixed; } th, td { border: 1px solid #000; padding: 4px; vertical-align: top; word-wrap: break-word; } .descricao-coluna { width: 300px; max-width: 300px; white-space: pre-wrap; } .compacto { width: 40px; max-width: 40px; text-align: center; } .page-footer { position: fixed; bottom: 10px; right: 20px; font-size: 9px; color: #666; } .page-number:after { content: "Página " counter(page); } .page-break { page-break-before: always; } </style> <h2 style="text-align:center;">Relatório de Arte Sacra</h2> <div class="page-footer"><span class="page-number"></span></div> '; foreach ($colunasDivididas as $index => $colunas) { if ($index > 0) { $html .= '<div class="page-break"></div>'; } $html .= '<table><thead><tr>'; foreach ($colunas as $campo) { $classe = ''; if ($campo === 'descricao') { $classe = ' class="descricao-coluna"'; } elseif (in_array($campo, $camposCompactos)) { $classe = ' class="compacto"'; } $html .= '<th' . $classe . '>' . ucfirst(str_replace('_', ' ', $campo)) . '</th>'; } $html .= '</tr></thead><tbody>'; foreach ($acervos as $acervo) { $html .= '<tr>'; foreach ($colunas as $campo) { $valor = match ($campo) { 'tipo_id' => optional($acervo->tipo)->tipo, 'modo_aquisicao_id' => optional($acervo->modoAquisicao)->modo_aquisicao, 'material_id' => optional($acervo->material)->material, 'tecnica_id' => optional($acervo->tecnica)->tecnica, 'proprietario_id' => optional($acervo->proprietario)->proprietario, 'designacao_id' => optional($acervo->designacao)->designacao, 'classe_id' => optional($acervo->classe)->classe, 'localizacao_id' => optional($acervo->localizacao)->proprietario, 'tombamento_id' => optional($acervo->tombamento)->tombamento, 'roca' => $acervo->roca !== null ? ($acervo->roca ? 'Sim' : 'Não') : 'Não informado', default => $acervo->$campo ?? null, }; $valor = trim((string) $valor) !== '' ? $valor : 'Não informado'; $classe = ''; if ($campo === 'descricao') { $classe = ' class="descricao-coluna"'; } elseif (in_array($campo, $camposCompactos)) { $classe = ' class="compacto"'; } $html .= '<td' . $classe . '>' . nl2br(e($valor)) . '</td>'; } $html .= '</tr>'; } $html .= '</tbody></table>'; } $pdf = Pdf::loadHTML($html)->setPaper('a4', 'landscape'); return $pdf->download('relatorio_arte_sacra.pdf'); } public function exportarCSV(Request $request) { $response = $this->checkPermissao($this->permissao, 'visualizar'); if ($response instanceof RedirectResponse) { return $response; } $camposSelecionados = $request->input('campos', []); $acervos = $this->buscarAcervosFiltrados($request, false); $filename = 'relatorio_arte_sacra.csv'; $handle = fopen('php://temp', 'w+b'); // BOM para UTF-8 (importantíssimo p/ Excel reconhecer acentuação) fwrite($handle, "\xEF\xBB\xBF"); // Cabeçalhos fputcsv($handle, $camposSelecionados, ';'); foreach ($acervos as $acervo) { $linha = []; foreach ($camposSelecionados as $campo) { $linha[] = match ($campo) { 'tipo_id' => optional($acervo->tipo)->tipo, 'modo_aquisicao_id' => optional($acervo->modoAquisicao)->modo_aquisicao, 'material_id' => optional($acervo->material)->material, 'tecnica_id' => optional($acervo->tecnica)->tecnica, 'proprietario_id' => optional($acervo->proprietario)->proprietario, 'designacao_id' => optional($acervo->designacao)->designacao, 'classe_id' => optional($acervo->classe)->classe, 'tombamento_id' => optional($acervo->tombamento)->tombamento, 'localizacao_id' => optional($acervo->localizacao)->proprietario, 'roca' => $acervo->roca ? 'Sim' : 'Não', default => $acervo->$campo ?? '', }; } fputcsv($handle, $linha, ';'); } rewind($handle); $content = stream_get_contents($handle); fclose($handle); return response($content) ->header('Content-Type', 'text/csv; charset=UTF-8') ->header('Content-Disposition', "attachment; filename=\"$filename\""); } public function reportCard(Request $request) { $response = $this->checkPermissao($this->permissao, 'visualizar'); if ($response instanceof RedirectResponse) { return $response; } $arte = Acervo::with([ 'tipo', 'modoAquisicao', 'material', 'tecnica', 'proprietario', 'designacao', 'classe', 'tombamento', 'historicos', 'avaliacoesTecnicas' ])->find($request->input('id')); if (!$arte) { return back()->with('error', 'Arte sacra não encontrada.'); } $qrFileName = $arte->codigo_acervo . '.png'; $qrStoragePath = 'arte_sacra/qrcodes/' . $qrFileName; if (Storage::disk('public')->exists($qrStoragePath)) { Storage::disk('public')->delete($qrStoragePath); } $qrContent = route('paginas.cultura.arteSacra.show', Str::slug($arte->nome_peca)); $writer = new PngWriter(); $qrCode = new QrCode( data: $qrContent, encoding: new Encoding('UTF-8'), errorCorrectionLevel: ErrorCorrectionLevel::High, size: 200, margin: 10, roundBlockSizeMode: RoundBlockSizeMode::Margin ); $result = $writer->write($qrCode); Storage::disk('public')->put($qrStoragePath, $result->getString()); $pdf = Pdf::loadView('admin.cultura.arteSacra.relatorios.reportCard', [ 'arte' => $arte, 'qrCodePath' => asset('storage/' . $qrStoragePath), 'qrContent' => $qrContent ])->setPaper('a4', 'portrait'); return $pdf->stream('ficha_acervo_' . $arte->codigo_acervo . '.pdf'); } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.01 |
proxy
|
phpinfo
|
Settings