File manager - Edit - /var/www/html/transparencia/app/Http/Controllers/PortalController.php
Back
<?php namespace App\Http\Controllers; use App\Models\AcordoSemTransferenciaFinanceira; use App\Models\BeneficioFiscalImobiliario; use App\Models\BeneficioFiscalMobiliario; use App\Models\DividaAtiva\DividaAtiva; use App\Models\DividaAtiva\DividaAtivaRegistro; use App\Models\EmendaParlamentar; use App\Models\Obra; use App\Models\EmendaPix; use App\Models\IncentivoCultural; use App\Models\Relatorios\RelatorioDeManifestacao; use App\Models\Relatorios\RelatorioPedidoAcessoInformacao; use App\Models\Terceirizado; use App\Models\Unidade; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\BinaryFileResponse; use Symfony\Component\HttpFoundation\StreamedResponse; class PortalController extends Controller { public function incentivosCulturais(Request $request) { $request->validate([ 'q' => 'nullable|string|max:255', 'exercicio' => 'nullable|integer|min:1900|max:2100', ]); $query = IncentivoCultural::query() ->when($request->filled('q'), function ($q) use ($request) { $term = trim((string) $request->q); $q->where(function ($sub) use ($term) { $sub->where('proponente', 'like', "%{$term}%") ->orWhere('projeto', 'like', "%{$term}%") ->orWhere('objeto', 'like', "%{$term}%") ->orWhere('valor_projeto_raw', 'like', "%{$term}%"); }); }) ->when($request->filled('exercicio'), function ($q) use ($request) { $q->where('exercicio', (int) $request->exercicio); }) ->orderByDesc('exercicio') ->orderBy('proponente') ->orderBy('projeto'); $registros = $query->paginate(100)->withQueryString(); $exercicios = IncentivoCultural::query() ->whereNotNull('exercicio') ->distinct() ->orderByDesc('exercicio') ->pluck('exercicio'); return view('pages.incentivos-culturais', [ 'registros' => $registros, 'exercicios' => $exercicios, ]); } public function downloadIncentivosCulturaisPlanilha(): BinaryFileResponse { $path = base_path('temp/incentivos-culturais/Cultura e Esposte.xlsx'); if (! is_file($path)) { abort(404, 'Planilha não encontrada.'); } return response()->download($path, 'Cultura-e-Esposte.xlsx'); } public function dividaAtiva(Request $request) { $request->validate([ 'q' => 'nullable|string|max:255', 'exercicio' => 'nullable|integer|min:1900|max:2100', 'origem' => 'nullable|string|max:255', 'status_divida' => 'nullable|string|max:100', 'tipo_pessoa' => 'nullable|in:pf,pj', ]); $query = DividaAtiva::with('registro') ->whereHas('registro', function ($registroQuery) use ($request) { if ($request->filled('q')) { $q = trim((string) $request->q); $valorReal = $this->__preparaValorReal($q); $qLimpo = $this->clearCpfCnpj($q); $registroQuery->where(function ($query) use ($q, $valorReal, $qLimpo) { $query->where('numInscricao', 'like', "%{$q}%") ->orWhere('numImovel', 'like', "%{$q}%") ->orWhere('cpf', 'like', "%{$qLimpo}%") ->orWhere('cnpj', 'like', "%{$qLimpo}%") ->orWhere('dividaValorTotal', 'like', "%{$valorReal}%") ->orWhere('nome', 'like', "%{$q}%") ->orWhere('origemDivida', 'like', "%{$q}%") ->orWhere('numCertidao', 'like', "%{$q}%"); }); } if ($request->filled('exercicio')) { $registroQuery->where('exercicio', (int) $request->exercicio); } if ($request->filled('origem')) { $registroQuery->where('origemDivida', $request->origem); } if ($request->filled('status_divida')) { $registroQuery->where('dividaStatus', $request->status_divida); } if ($request->filled('tipo_pessoa')) { $registroQuery->where('isPJ', $request->tipo_pessoa === 'pj' ? 1 : 0); } }) ->orderByDesc('created_at'); $dividaAtiva = $query->paginate(100)->withQueryString(); $origens = DividaAtivaRegistro::query() ->whereNotNull('origemDivida') ->where('origemDivida', '!=', '') ->distinct() ->orderBy('origemDivida') ->pluck('origemDivida'); $exercicios = DividaAtivaRegistro::query() ->whereNotNull('exercicio') ->distinct() ->orderByDesc('exercicio') ->pluck('exercicio'); $statusDivida = DividaAtivaRegistro::query() ->whereNotNull('dividaStatus') ->where('dividaStatus', '!=', '') ->distinct() ->orderBy('dividaStatus') ->pluck('dividaStatus'); return view('pages.divida-ativa', [ 'dividas' => $dividaAtiva, 'origens' => $origens, 'exercicios' => $exercicios, 'statusDivida' => $statusDivida, ]); } public function beneficiosFiscaisImobiliario(Request $request) { $request->validate([ 'q' => 'nullable|string|max:255', 'descricao_reducao' => 'nullable|string|max:255', 'ano_inicio' => 'nullable|integer|min:1900|max:2100', 'ano_fim' => 'nullable|integer|min:1900|max:2100', ]); $query = BeneficioFiscalImobiliario::query() ->when($request->filled('q'), function ($query) use ($request) { $q = trim((string) $request->q); $qLimpo = $this->clearCpfCnpj($q); $query->where(function ($subQuery) use ($q, $qLimpo) { $subQuery->where('inscricao_municipal', 'like', "%{$q}%") ->orWhere('cpf_cnpj', 'like', "%{$qLimpo}%") ->orWhere('nome_razao_social', 'like', "%{$q}%") ->orWhere('descricao', 'like', "%{$q}%"); }); }) ->when($request->filled('descricao_reducao'), function ($query) use ($request) { $query->where('descricao_reducao', $request->descricao_reducao); }) ->when($request->filled('ano_inicio'), function ($query) use ($request) { $query->whereYear('data_inicio', (int) $request->ano_inicio); }) ->when($request->filled('ano_fim'), function ($query) use ($request) { $query->whereYear('data_fim', (int) $request->ano_fim); }) ->orderByDesc('data_inicio') ->orderBy('nome_razao_social'); $beneficios = $query->paginate(100)->withQueryString(); $descricoesReducao = BeneficioFiscalImobiliario::query() ->whereNotNull('descricao_reducao') ->where('descricao_reducao', '!=', '') ->distinct() ->orderBy('descricao_reducao') ->pluck('descricao_reducao'); $anosInicio = BeneficioFiscalImobiliario::query() ->whereNotNull('data_inicio') ->orderByDesc('data_inicio') ->get(['data_inicio']) ->pluck('data_inicio') ->map(fn ($d) => $d->year) ->unique() ->sortDesc() ->values(); $anosFim = BeneficioFiscalImobiliario::query() ->whereNotNull('data_fim') ->orderByDesc('data_fim') ->get(['data_fim']) ->pluck('data_fim') ->map(fn ($d) => $d->year) ->unique() ->sortDesc() ->values(); return view('pages.beneficios-fiscais-imobiliario', [ 'beneficios' => $beneficios, 'descricoesReducao' => $descricoesReducao, 'anosInicio' => $anosInicio, 'anosFim' => $anosFim, ]); } public function beneficiosFiscaisMobiliario(Request $request) { $request->validate([ 'q' => 'nullable|string|max:255', 'ano_inicio' => 'nullable|integer|min:1900|max:2100', 'ano_fim' => 'nullable|integer|min:1900|max:2100', ]); $query = BeneficioFiscalMobiliario::query() ->when($request->filled('q'), function ($query) use ($request) { $q = trim((string) $request->q); $qLimpo = $this->clearCpfCnpj($q); $query->where(function ($subQuery) use ($q, $qLimpo) { $subQuery->where('inscricao_mobiliaria', 'like', "%{$q}%") ->orWhere('cpf_cnpj', 'like', "%{$qLimpo}%") ->orWhere('nome_razao_social', 'like', "%{$q}%") ->orWhere('nome_fantasia', 'like', "%{$q}%") ->orWhere('descricao', 'like', "%{$q}%"); }); }) ->when($request->filled('ano_inicio'), function ($query) use ($request) { $query->whereYear('data_inicio', (int) $request->ano_inicio); }) ->when($request->filled('ano_fim'), function ($query) use ($request) { $query->whereYear('data_fim', (int) $request->ano_fim); }) ->orderByDesc('data_inicio') ->orderBy('nome_razao_social'); $beneficios = $query->paginate(100)->withQueryString(); $anosInicio = BeneficioFiscalMobiliario::query() ->whereNotNull('data_inicio') ->orderByDesc('data_inicio') ->get(['data_inicio']) ->pluck('data_inicio') ->map(fn ($d) => $d->year) ->unique() ->sortDesc() ->values(); $anosFim = BeneficioFiscalMobiliario::query() ->whereNotNull('data_fim') ->orderByDesc('data_fim') ->get(['data_fim']) ->pluck('data_fim') ->map(fn ($d) => $d->year) ->unique() ->sortDesc() ->values(); return view('pages.beneficios-fiscais-mobiliario', [ 'beneficios' => $beneficios, 'anosInicio' => $anosInicio, 'anosFim' => $anosFim, ]); } public function downloadDividaAtivaPlanilha(): BinaryFileResponse { $path = base_path('temp/Atualização da Divida Ativa-atualizada(ultimos-5-anos).xlsx'); if (! is_file($path)) { abort(404, 'Planilha não encontrada.'); } return response()->download($path, 'divida-ativa-ultimos-5-anos.xlsx'); } public function terceirizados(Request $request) { $this->validateTerceirizadosFilters($request); $terceirizados = $this->buildTerceirizadosQuery($request) ->orderByDesc('exercicio_ano') ->orderBy('nome_empregado') ->paginate(100) ->withQueryString(); $exercicios = Terceirizado::query() ->whereNotNull('exercicio_ano') ->distinct() ->orderByDesc('exercicio_ano') ->pluck('exercicio_ano'); $empresas = Terceirizado::query() ->whereNotNull('empresa') ->where('empresa', '!=', '') ->distinct() ->orderBy('empresa') ->pluck('empresa'); $lotacoes = Terceirizado::query() ->whereNotNull('lotacao_local_exercicio') ->where('lotacao_local_exercicio', '!=', '') ->distinct() ->orderBy('lotacao_local_exercicio') ->pluck('lotacao_local_exercicio'); return view('pages.terceirizados', [ 'terceirizados' => $terceirizados, 'exercicios' => $exercicios, 'empresas' => $empresas, 'lotacoes' => $lotacoes, ]); } public function acordosNaoEnvolvendoTransferenciaFinanceira(Request $request) { $this->validateAcordosSemTransferenciaFilters($request); $acordos = $this->buildAcordosSemTransferenciaQuery($request) ->orderByDesc('vigencia_inicio') ->orderBy('parceira') ->paginate(100) ->withQueryString(); $instrumentos = AcordoSemTransferenciaFinanceira::query() ->whereNotNull('instrumento_firmado') ->where('instrumento_firmado', '!=', '') ->distinct() ->orderBy('instrumento_firmado') ->pluck('instrumento_firmado'); $anosVigencia = AcordoSemTransferenciaFinanceira::query() ->whereNotNull('vigencia_inicio') ->orderByDesc('vigencia_inicio') ->get(['vigencia_inicio']) ->pluck('vigencia_inicio') ->map(fn ($d) => $d->year) ->unique() ->sortDesc() ->values(); return view('pages.acordos-nao-envolvendo-transferencia-financeira', [ 'acordos' => $acordos, 'instrumentos' => $instrumentos, 'anosVigencia' => $anosVigencia, ]); } public function exportarAcordosSemTransferenciaFinanceiraCsv(Request $request): StreamedResponse { $this->validateAcordosSemTransferenciaFilters($request); $fileName = 'acordos-sem-transferencia-financeira-'.now()->format('Y-m-d-His').'.csv'; $headers = [ 'Content-Type' => 'text/csv; charset=UTF-8', 'Content-Disposition' => "attachment; filename=\"{$fileName}\"", ]; $columns = [ 'Parceira', 'CNPJ/CPF', 'Objeto', 'Processo', 'Instrumento firmado', 'Prazo', 'Vigência início', 'Vigência fim', ]; $query = $this->buildAcordosSemTransferenciaQuery($request) ->orderByDesc('vigencia_inicio') ->orderBy('parceira'); return response()->stream(function () use ($query, $columns) { $output = fopen('php://output', 'w'); fwrite($output, "\xEF\xBB\xBF"); fputcsv($output, $columns, ';'); $query->chunk(500, function ($registros) use ($output) { foreach ($registros as $registro) { fputcsv($output, [ $registro->parceira, $registro->cnpj_cpf_anonimizado, $registro->objeto, $registro->processo, $registro->instrumento_firmado, $registro->prazo_meses_dias, $registro->vigencia_inicio?->format('d/m/Y'), $registro->vigencia_fim?->format('d/m/Y'), ], ';'); } }); fclose($output); }, 200, $headers); } public function exportarTerceirizadosCsv(Request $request): StreamedResponse { $this->validateTerceirizadosFilters($request); $fileName = 'terceirizados-'.now()->format('Y-m-d-His').'.csv'; $headers = [ 'Content-Type' => 'text/csv; charset=UTF-8', 'Content-Disposition' => "attachment; filename=\"{$fileName}\"", ]; $columns = [ 'Exercicio', 'Nome do Empregado', 'Empresa', 'CNPJ', 'Cargo / Atividade', 'Lotacao / Local do Exercicio', ]; $query = $this->buildTerceirizadosQuery($request) ->orderByDesc('exercicio_ano') ->orderBy('nome_empregado'); return response()->stream(function () use ($query, $columns) { $output = fopen('php://output', 'w'); fwrite($output, "\xEF\xBB\xBF"); fputcsv($output, $columns, ';'); $query->chunk(500, function ($registros) use ($output) { foreach ($registros as $registro) { fputcsv($output, [ $registro->exercicio_raw, $registro->nome_empregado, $registro->empresa, $registro->cnpj_anonimizado, $registro->cargo_atividade, $registro->lotacao_local_exercicio, ], ';'); } }); fclose($output); }, 200, $headers); } public function unidadesSaude(Request $request) { $paginate = 20; if (isset($request->q)) { $request->validate([ 'q' => 'nullable|string|max:255', ]); $unidadesSaude = Unidade::select('unidades_saude.*') ->join('enderecos', 'enderecos.owner_id', '=', 'unidades_saude.id') ->where(function ($query) use ($request) { $q = trim($request->q); $query->where('unidades_saude.nome', 'like', "%{$q}%") ->orWhere('unidades_saude.telefone', 'like', "%{$q}%") ->orWhere('unidades_saude.email', 'like', "%{$q}%") ->orWhere('enderecos.cep', 'like', "%{$q}%") ->orWhere('enderecos.logradouro', 'like', "%{$q}%") ->orWhere('enderecos.complemento', 'like', "%{$q}%") ->orWhere('enderecos.bairro', 'like', "%{$q}%"); }) ->orderBy('unidades_saude.nome') ->orderBy('enderecos.bairro') ->paginate($paginate); } else { $unidadesSaude = Unidade::select('unidades_saude.*') ->join('enderecos', 'enderecos.owner_id', '=', 'unidades_saude.id') ->where(function ($query) use ($request) { $q = trim($request->q); $query->where('unidades_saude.nome', '!=', '') ->orWhere('enderecos.bairro', '!=', ''); }) ->orderBy('unidades_saude.nome') ->orderBy('enderecos.bairro') ->paginate($paginate); } return view('pages.unidades-de-saude', [ 'unidadesSaude' => $unidadesSaude, ]); } public function relatoriosDeManifestacoes(Request $request) { $relatorioDeManifestacoes = RelatorioDeManifestacao::orderByDesc('dataDeCadastro') ->paginate(20) ->withQueryString(); return view('pages.ouvidoria-relatorio-de-manifestacoes', [ 'relatorioDeManifestacoes' => $relatorioDeManifestacoes, ]); } public function relatorioEstatisticoOuvidoria(Request $request) { $relatorioPedidosAcessoInformacao = RelatorioPedidoAcessoInformacao::orderByDesc('dataDeCadastro') ->paginate(20) ->withQueryString(); return view('pages.ouvidoria-relatorio-estatistico', [ 'relatorioPedidosAcessoInformacao' => $relatorioPedidosAcessoInformacao, ]); } public function emendasParlamentares(Request $request) { $this->validateEmendasFilters($request); $emendasParlamentares = $this->buildEmendasParlamentaresQuery($request) ->orderByDesc('ano_emenda') ->orderBy('autor') ->orderBy('numero_emenda') ->orderBy('id') ->paginate(20) ->withQueryString(); $anosEmenda = EmendaParlamentar::query() ->select('ano_emenda') ->distinct() ->orderByDesc('ano_emenda') ->pluck('ano_emenda'); $situacoesConvenio = EmendaParlamentar::query() ->select('situacao_convenio') ->distinct() ->orderBy('situacao_convenio') ->pluck('situacao_convenio'); return view('pages.emendas-parlamentares', [ 'emendasParlamentares' => $emendasParlamentares, 'anosEmenda' => $anosEmenda, 'situacoesConvenio' => $situacoesConvenio, ]); } public function exportarEmendasParlamentaresCsv(Request $request): StreamedResponse { $this->validateEmendasFilters($request); $fileName = 'emendas-parlamentares-'.now()->format('Y-m-d-His').'.csv'; $headers = [ 'Content-Type' => 'text/csv; charset=UTF-8', 'Content-Disposition' => "attachment; filename=\"{$fileName}\"", ]; $columns = [ 'Autor', 'Nº Emenda', 'Ano Emenda', 'Nº Convênio', 'Situação do Convênio', 'Objeto', 'Função de Governo', 'Modalidade', 'Valor Previsto', 'Valor Realizado', ]; $query = $this->buildEmendasParlamentaresQuery($request) ->orderByDesc('ano_emenda') ->orderBy('autor') ->orderBy('numero_emenda'); return response()->stream(function () use ($query, $columns) { $output = fopen('php://output', 'w'); fwrite($output, "\xEF\xBB\xBF"); fputcsv($output, $columns, ';'); $query->chunk(500, function ($emendas) use ($output) { foreach ($emendas as $emenda) { fputcsv($output, [ $emenda->autor, $emenda->numero_emenda, $emenda->ano_emenda, $emenda->numero_convenio, $emenda->situacao_convenio, $emenda->objeto, $emenda->funcao_governo, $emenda->modalidade, number_format((float) $emenda->valor_previsto, 2, ',', '.'), number_format((float) $emenda->valor_realizado, 2, ',', '.'), ], ';'); } }); fclose($output); }, 200, $headers); } public function exportarEmendasParlamentaresXls(Request $request): StreamedResponse { $this->validateEmendasFilters($request); $fileName = 'emendas-parlamentares-'.now()->format('Y-m-d-His').'.xls'; $headers = [ 'Content-Type' => 'application/vnd.ms-excel; charset=UTF-8', 'Content-Disposition' => "attachment; filename=\"{$fileName}\"", ]; $query = $this->buildEmendasParlamentaresQuery($request) ->orderByDesc('ano_emenda') ->orderBy('autor') ->orderBy('numero_emenda'); return response()->stream(function () use ($query) { echo "\xEF\xBB\xBF"; echo '<table border="1">'; echo '<tr>'; echo '<th>Autor</th><th>Nº Emenda</th><th>Ano Emenda</th><th>Nº Convênio</th><th>Situação do Convênio</th><th>Objeto</th><th>Função de Governo</th><th>Modalidade</th><th>Valor Previsto</th><th>Valor Realizado</th>'; echo '</tr>'; $query->chunk(500, function ($emendas) { foreach ($emendas as $emenda) { echo '<tr>'; echo '<td>'.e($emenda->autor).'</td>'; echo '<td>'.e($emenda->numero_emenda).'</td>'; echo '<td>'.e((string) $emenda->ano_emenda).'</td>'; echo '<td>'.e($emenda->numero_convenio).'</td>'; echo '<td>'.e($emenda->situacao_convenio).'</td>'; echo '<td>'.e($emenda->objeto).'</td>'; echo '<td>'.e($emenda->funcao_governo).'</td>'; echo '<td>'.e($emenda->modalidade).'</td>'; echo '<td>'.e(number_format((float) $emenda->valor_previsto, 2, ',', '.')).'</td>'; echo '<td>'.e(number_format((float) $emenda->valor_realizado, 2, ',', '.')).'</td>'; echo '</tr>'; } }); echo '</table>'; }, 200, $headers); } public function emendasPix(Request $request) { $this->validateEmendasPixFilters($request); $emendasPix = $this->buildEmendasPixQuery($request) ->orderByDesc('ano') ->orderBy('numero_codigo') ->orderBy('id') ->paginate(20) ->withQueryString(); $anosPix = EmendaPix::query() ->select('ano') ->distinct() ->where('ano', '>', 0) ->orderByDesc('ano') ->pluck('ano'); return view('pages.emendas-pix', [ 'emendasPix' => $emendasPix, 'anosPix' => $anosPix, ]); } public function exportarEmendasPixCsv(Request $request): StreamedResponse { $this->validateEmendasPixFilters($request); $fileName = 'emendas-pix-'.now()->format('Y-m-d-His').'.csv'; $headers = [ 'Content-Type' => 'text/csv; charset=UTF-8', 'Content-Disposition' => "attachment; filename=\"{$fileName}\"", ]; $columns = [ 'Numero/Codigo', 'Valor Repassado', 'Ano', 'Beneficiario', 'Objeto', 'Numero Empenho', 'Empenhado', 'Liquidado', 'Pago', 'Dados do Plano de Acao', ]; $query = $this->buildEmendasPixQuery($request) ->orderByDesc('ano') ->orderBy('numero_codigo'); return response()->stream(function () use ($query, $columns) { $output = fopen('php://output', 'w'); fwrite($output, "\xEF\xBB\xBF"); fputcsv($output, $columns, ';'); $query->chunk(500, function ($registros) use ($output) { foreach ($registros as $registro) { fputcsv($output, [ $registro->numero_codigo, number_format((float) $registro->valor_repassado, 2, ',', '.'), $registro->ano_raw ?: $registro->ano, $registro->beneficiario, $registro->objeto, $registro->numero_empenho, number_format((float) $registro->empenhado, 2, ',', '.'), number_format((float) $registro->liquidado, 2, ',', '.'), number_format((float) $registro->pago, 2, ',', '.'), $registro->dados_plano_acao, ], ';'); } }); fclose($output); }, 200, $headers); } public function exportarEmendasPixXls(Request $request): StreamedResponse { $this->validateEmendasPixFilters($request); $fileName = 'emendas-pix-'.now()->format('Y-m-d-His').'.xls'; $headers = [ 'Content-Type' => 'application/vnd.ms-excel; charset=UTF-8', 'Content-Disposition' => "attachment; filename=\"{$fileName}\"", ]; $query = $this->buildEmendasPixQuery($request) ->orderByDesc('ano') ->orderBy('numero_codigo'); return response()->stream(function () use ($query) { echo "\xEF\xBB\xBF"; echo '<table border="1">'; echo '<tr>'; echo '<th>Numero/Codigo</th><th>Valor Repassado</th><th>Ano</th><th>Beneficiario</th><th>Objeto</th><th>Numero Empenho</th><th>Empenhado</th><th>Liquidado</th><th>Pago</th><th>Dados do Plano de Acao</th>'; echo '</tr>'; $query->chunk(500, function ($registros) { foreach ($registros as $registro) { echo '<tr>'; echo '<td>'.e($registro->numero_codigo).'</td>'; echo '<td>'.e(number_format((float) $registro->valor_repassado, 2, ',', '.')).'</td>'; echo '<td>'.e((string) ($registro->ano_raw ?: $registro->ano)).'</td>'; echo '<td>'.e($registro->beneficiario).'</td>'; echo '<td>'.e($registro->objeto).'</td>'; echo '<td>'.e($registro->numero_empenho).'</td>'; echo '<td>'.e(number_format((float) $registro->empenhado, 2, ',', '.')).'</td>'; echo '<td>'.e(number_format((float) $registro->liquidado, 2, ',', '.')).'</td>'; echo '<td>'.e(number_format((float) $registro->pago, 2, ',', '.')).'</td>'; echo '<td>'.e($registro->dados_plano_acao).'</td>'; echo '</tr>'; } }); echo '</table>'; }, 200, $headers); } private function validateEmendasFilters(Request $request): void { $request->validate([ 'q' => 'nullable|string|max:255', 'autor' => 'nullable|string|max:255', 'numero_emenda' => 'nullable|string|max:30', 'ano_emenda' => 'nullable|integer|min:1900|max:2100', 'situacao_convenio' => 'nullable|string|max:255', ]); } private function buildEmendasParlamentaresQuery(Request $request) { return EmendaParlamentar::query() ->when($request->filled('q'), function ($query) use ($request) { $q = trim((string) $request->q); $query->where(function ($subQuery) use ($q) { $subQuery->where('autor', 'like', "%{$q}%") ->orWhere('numero_emenda', 'like', "%{$q}%") ->orWhere('objeto', 'like', "%{$q}%") ->orWhere('funcao_governo', 'like', "%{$q}%") ->orWhere('modalidade', 'like', "%{$q}%"); }); }) ->when($request->filled('autor'), function ($query) use ($request) { $query->where('autor', 'like', '%'.trim((string) $request->autor).'%'); }) ->when($request->filled('numero_emenda'), function ($query) use ($request) { $query->where('numero_emenda', 'like', '%'.trim((string) $request->numero_emenda).'%'); }) ->when($request->filled('ano_emenda'), function ($query) use ($request) { $query->where('ano_emenda', (int) $request->ano_emenda); }) ->when($request->filled('situacao_convenio'), function ($query) use ($request) { $query->where('situacao_convenio', trim((string) $request->situacao_convenio)); }); } private function validateEmendasPixFilters(Request $request): void { $request->validate([ 'q' => 'nullable|string|max:255', 'numero_codigo' => 'nullable|string|max:60', 'ano' => 'nullable|integer|min:1900|max:2100', 'beneficiario' => 'nullable|string|max:255', ]); } private function buildEmendasPixQuery(Request $request) { return EmendaPix::query() ->when($request->filled('q'), function ($query) use ($request) { $q = trim((string) $request->q); $query->where(function ($subQuery) use ($q) { $subQuery->where('numero_codigo', 'like', "%{$q}%") ->orWhere('beneficiario', 'like', "%{$q}%") ->orWhere('objeto', 'like', "%{$q}%") ->orWhere('numero_empenho', 'like', "%{$q}%") ->orWhere('dados_plano_acao', 'like', "%{$q}%"); }); }) ->when($request->filled('numero_codigo'), function ($query) use ($request) { $query->where('numero_codigo', 'like', '%'.trim((string) $request->numero_codigo).'%'); }) ->when($request->filled('ano'), function ($query) use ($request) { $query->where('ano', (int) $request->ano); }) ->when($request->filled('beneficiario'), function ($query) use ($request) { $query->where('beneficiario', 'like', '%'.trim((string) $request->beneficiario).'%'); }); } private function validateTerceirizadosFilters(Request $request): void { $request->validate([ 'q' => 'nullable|string|max:255', 'exercicio' => 'nullable|integer|min:1900|max:2100', 'empresa' => 'nullable|string|max:255', 'lotacao' => 'nullable|string|max:255', ]); } private function buildTerceirizadosQuery(Request $request) { return Terceirizado::query() ->when($request->filled('q'), function ($query) use ($request) { $q = trim((string) $request->q); $cnpjLimpo = $this->clearCpfCnpj($q); $query->where(function ($subQuery) use ($q, $cnpjLimpo) { $subQuery->where('nome_empregado', 'like', "%{$q}%") ->orWhere('empresa', 'like', "%{$q}%") ->orWhere('cnpj', 'like', "%{$cnpjLimpo}%") ->orWhere('cargo_atividade', 'like', "%{$q}%") ->orWhere('lotacao_local_exercicio', 'like', "%{$q}%") ->orWhere('exercicio_raw', 'like', "%{$q}%"); }); }) ->when($request->filled('exercicio'), function ($query) use ($request) { $query->where('exercicio_ano', (int) $request->exercicio); }) ->when($request->filled('empresa'), function ($query) use ($request) { $query->where('empresa', trim((string) $request->empresa)); }) ->when($request->filled('lotacao'), function ($query) use ($request) { $query->where('lotacao_local_exercicio', trim((string) $request->lotacao)); }); } private function validateAcordosSemTransferenciaFilters(Request $request): void { $request->validate([ 'q' => 'nullable|string|max:255', 'instrumento' => 'nullable|string|max:255', 'ano_vigencia' => 'nullable|integer|min:1900|max:2100', ]); } private function buildAcordosSemTransferenciaQuery(Request $request) { return AcordoSemTransferenciaFinanceira::query() ->when($request->filled('q'), function ($query) use ($request) { $q = trim((string) $request->q); $docLimpo = $this->clearCpfCnpj($q); $query->where(function ($subQuery) use ($q, $docLimpo) { $subQuery->where('parceira', 'like', "%{$q}%") ->orWhere('objeto', 'like', "%{$q}%") ->orWhere('processo', 'like', "%{$q}%") ->orWhere('instrumento_firmado', 'like', "%{$q}%") ->orWhere('prazo_meses_dias', 'like', "%{$q}%") ->orWhere('cnpj_cpf', 'like', "%{$docLimpo}%"); }); }) ->when($request->filled('instrumento'), function ($query) use ($request) { $query->where('instrumento_firmado', trim((string) $request->instrumento)); }) ->when($request->filled('ano_vigencia'), function ($query) use ($request) { $query->whereYear('vigencia_inicio', (int) $request->ano_vigencia); }); } public function obras(Request $request) { $this->validateObrasFilters($request); $obras = $this->buildObrasQuery($request) ->orderByDesc('data_inicio') ->orderBy('id') ->paginate(20) ->withQueryString(); $bairros = Obra::query() ->whereNotNull('bairro') ->where('bairro', '!=', '') ->distinct() ->orderBy('bairro') ->pluck('bairro'); $situacoes = Obra::query() ->whereNotNull('situacao') ->where('situacao', '!=', '') ->distinct() ->orderBy('situacao') ->pluck('situacao'); $anosInicio = Obra::query() ->whereNotNull('ano_inicio') ->distinct() ->orderByDesc('ano_inicio') ->pluck('ano_inicio'); $anosTermino = Obra::query() ->whereNotNull('ano_termino') ->distinct() ->orderByDesc('ano_termino') ->pluck('ano_termino'); return view('pages.obras', [ 'obras' => $obras, 'bairros' => $bairros, 'situacoes' => $situacoes, 'anosInicio' => $anosInicio, 'anosTermino' => $anosTermino, ]); } public function exportarObrasCsv(Request $request): StreamedResponse { $this->validateObrasFilters($request); $fileName = 'obras-relatorio-'.now()->format('Y-m-d-His').'.csv'; $headers = [ 'Content-Type' => 'text/csv; charset=UTF-8', 'Content-Disposition' => "attachment; filename=\"{$fileName}\"", ]; $columns = [ 'Processo', 'Objeto', 'Bairro', 'Situação/Status', 'Início', 'Data Prevista Término', 'Conclusão', 'Empresa', 'Valor Contratado', 'Valor Pago', 'Quantitativo', 'Preço Unitário', 'Totais Contratados', 'Data Paralisação Fundamentação', 'Data para Recomeçar', 'Contrato', ]; $query = $this->buildObrasQuery($request) ->orderByDesc('data_inicio') ->orderBy('id'); return response()->stream(function () use ($query, $columns) { $output = fopen('php://output', 'w'); fwrite($output, "\xEF\xBB\xBF"); fputcsv($output, $columns, ';'); $query->chunk(500, function ($obras) use ($output) { foreach ($obras as $obra) { fputcsv($output, [ $obra->processo, $obra->objeto, $obra->bairro, $obra->situacao, $obra->data_inicio?->format('d/m/Y'), $obra->data_prevista_termino?->format('d/m/Y'), $obra->data_conclusao?->format('d/m/Y'), $obra->empresa, number_format((float) $obra->valor_contratado, 2, ',', '.'), number_format((float) $obra->valor_pago, 2, ',', '.'), $obra->quantitativo, $obra->preco_unitario, $obra->totais_contratados, $obra->data_paralisacao_fundamentacao, $obra->data_recomecar, $obra->contrato, ], ';'); } }); fclose($output); }, 200, $headers); } private function validateObrasFilters(Request $request): void { $request->validate([ 'q' => 'nullable|string|max:255', 'processo' => 'nullable|string|max:100', 'objeto_empresa' => 'nullable|string|max:255', 'situacao' => 'nullable|string|max:100', 'ano_inicio' => 'nullable|integer|min:1900|max:2100', 'ano_termino' => 'nullable|integer|min:1900|max:2100', 'bairro' => 'nullable|string|max:100', ]); } private function buildObrasQuery(Request $request) { return Obra::query() ->when($request->filled('q'), function ($query) use ($request) { $q = trim((string) $request->q); $query->where(function ($subQuery) use ($q) { $subQuery->where('processo', 'like', "%{$q}%") ->orWhere('objeto', 'like', "%{$q}%") ->orWhere('empresa', 'like', "%{$q}%") ->orWhere('bairro', 'like', "%{$q}%") ->orWhere('situacao', 'like', "%{$q}%"); }); }) ->when($request->filled('processo'), function ($query) use ($request) { $query->where('processo', 'like', '%'.trim((string) $request->processo).'%'); }) ->when($request->filled('objeto_empresa'), function ($query) use ($request) { $term = trim((string) $request->objeto_empresa); $query->where(function ($subQuery) use ($term) { $subQuery->where('objeto', 'like', "%{$term}%") ->orWhere('empresa', 'like', "%{$term}%"); }); }) ->when($request->filled('situacao'), function ($query) use ($request) { $query->where('situacao', trim((string) $request->situacao)); }) ->when($request->filled('ano_inicio'), function ($query) use ($request) { $query->where('ano_inicio', (int) $request->ano_inicio); }) ->when($request->filled('ano_termino'), function ($query) use ($request) { $query->where('ano_termino', (int) $request->ano_termino); }) ->when($request->filled('bairro'), function ($query) use ($request) { $query->where('bairro', trim((string) $request->bairro)); }); } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings