File manager - Edit - /var/www/html/portalHomolog/resources/views/admin/projetosProgramas/relatorio.blade.php
Back
@extends('layouts.admin.theme') @section('content') @php $routeBack = $routeBack ?? 'admin.projetosProgramas.index'; $routeBackQuery = $routeBackQuery ?? null; $routeRelatorio = $routeRelatorio ?? 'admin.projetosProgramas.relatorio'; $titulo = $titulo ?? __('Relatório dinâmico — Projetos e Programas'); $allowedColumns = $allowedColumns ?? []; $allowedGroups = $allowedGroups ?? []; $selectedColumns = $selectedColumns ?? []; $group1 = $group1 ?? null; $group2 = $group2 ?? null; $group3 = $group3 ?? null; $backQuery = $routeBackQuery ?? request()->except(['columns', 'group1', 'group2', 'group3']); $routeImprimir = ($routeRelatorio ?? '') === 'admin.dashboardEstrategico.projetosProgramas.relatorio' ? 'admin.dashboardEstrategico.projetosProgramas.relatorio.imprimir' : 'admin.projetosProgramas.relatorio.imprimir'; // Colunas de dados (exceto denominacao — sempre exibida na 1ª coluna) $colsData = array_filter( $selectedColumns, fn ($c) => $c !== 'denominacao' && isset($allowedColumns[$c]) ); // Total de colunas: 1 (nome) + cols dados + 3 (qtd, previsto, disponível) $totalColCount = 1 + count($colsData) + 3; $presets = [ 'padrao' => [ 'label' => __('Padrão'), 'columns' => ['denominacao', 'secretaria', 'bairro'], 'groups' => ['secretaria', 'bairro', ''], ], 'bairro' => [ 'label' => __('Bairro'), 'columns' => ['denominacao', 'secretaria'], 'groups' => ['bairro', '', ''], ], 'financeiro' => [ 'label' => __('Financeiro'), 'columns' => ['denominacao', 'secretaria', 'orcamento_previsto', 'orcamento_disponivel', 'situacao_cadastro'], 'groups' => ['secretaria', '', ''], ], 'execucao' => [ 'label' => __('Execução'), 'columns' => ['denominacao', 'secretaria', 'etapa', 'andamento', 'prazo'], 'groups' => ['secretaria', 'etapa', ''], ], ]; $depthClasses = ['', 'ps-3', 'ps-4', 'ps-5']; @endphp <div class="container-fluid pb-4"> {{-- Cabeçalho --}} <div class="d-flex justify-content-between align-items-center mb-3 flex-wrap gap-2"> <div> <h4 class="mb-0">{{ $titulo }}</h4> <p class="text-muted small mb-0">{{ __('Monte a visão que você precisa: escolha colunas, agrupe e gere.') }}</p> </div> <div class="d-flex gap-2"> <a href="{{ route($routeBack, $backQuery) }}" class="btn btn-outline-secondary btn-sm"> <i class="fa-solid fa-arrow-left me-1" aria-hidden="true"></i>{{ __('Voltar') }} </a> </div> </div> {{-- Formulário de configuração --}} <div class="card shadow-sm mb-4" data-pp-relatorio-presets data-presets='@json($presets)'> <div class="card-body"> <form method="get" action="{{ route($routeRelatorio) }}" data-pp-relatorio-form> {{-- Seção 0: Visões rápidas --}} <div class="mb-3"> <p class="text-muted small mb-2 fw-semibold text-uppercase"> <i class="fa-solid fa-bolt me-1" aria-hidden="true"></i>{{ __('Visões rápidas') }} </p> <div class="d-flex flex-wrap gap-2"> @foreach($presets as $key => $preset) <button type="button" class="btn btn-outline-primary btn-sm" data-pp-relatorio-preset="{{ $key }}"> {{ $preset['label'] }} </button> @endforeach </div> </div> <hr class="my-3"> {{-- Seções 1 e 2 lado a lado em telas maiores --}} <div class="row g-4"> {{-- Seção 1: Colunas --}} <div class="col-12 col-lg-7"> <p class="fw-semibold mb-2">{{ __('1. Colunas a exibir') }}</p> <div class="row g-2"> @foreach($allowedColumns as $key => $colLabel) <div class="col-6 col-sm-4"> <div class="form-check"> <input class="form-check-input" type="checkbox" id="col_{{ $key }}" name="columns[]" value="{{ $key }}" @checked(in_array($key, $selectedColumns, true))> <label class="form-check-label small" for="col_{{ $key }}"> {{ $colLabel }} </label> </div> </div> @endforeach </div> <div class="alert alert-warning small mb-0 mt-2 d-none" role="alert" data-pp-relatorio-too-many-cols-hint> {{ __('Muitas colunas podem ficar ilegíveis na impressão. Prefira uma visão rápida ou reduza a seleção.') }} </div> <p class="text-muted small mb-0 mt-2"> {{ __('A coluna "Denominação" é sempre exibida como primeiro campo.') }} </p> </div> {{-- Seção 2: Agrupamento --}} <div class="col-12 col-lg-5"> <p class="fw-semibold mb-2">{{ __('2. Agrupar por (opcional)') }}</p> <div class="d-flex flex-column gap-2"> <div> <label class="form-label small mb-1" for="group1">{{ __('1º nível') }}</label> <select name="group1" id="group1" class="form-select form-select-sm"> <option value="">{{ __('— sem agrupamento —') }}</option> @foreach($allowedGroups as $key => $groupLabel) <option value="{{ $key }}" @selected($group1 === $key)>{{ $groupLabel }}</option> @endforeach </select> </div> <div> <label class="form-label small mb-1" for="group2">{{ __('2º nível') }}</label> <select name="group2" id="group2" class="form-select form-select-sm"> <option value="">{{ __('— sem agrupamento —') }}</option> @foreach($allowedGroups as $key => $groupLabel) <option value="{{ $key }}" @selected($group2 === $key)>{{ $groupLabel }}</option> @endforeach </select> </div> <div> <label class="form-label small mb-1" for="group3">{{ __('3º nível') }}</label> <select name="group3" id="group3" class="form-select form-select-sm"> <option value="">{{ __('— sem agrupamento —') }}</option> @foreach($allowedGroups as $key => $groupLabel) <option value="{{ $key }}" @selected($group3 === $key)>{{ $groupLabel }}</option> @endforeach </select> </div> </div> <p class="text-muted small mb-0 mt-2"> {{ __('Subtotais são gerados automaticamente por grupo.') }} </p> </div> </div> <hr class="my-3"> {{-- CTA --}} <div class="d-flex gap-2 align-items-center flex-wrap"> <button type="submit" class="btn btn-primary btn-sm"> <i class="fa-solid fa-chart-column me-1" aria-hidden="true"></i>{{ __('Gerar relatório') }} </button> <button type="button" class="btn btn-outline-secondary btn-sm" data-pp-relatorio-print data-print-base-url="{{ route($routeImprimir) }}"> <i class="fa fa-print me-1" aria-hidden="true"></i>{{ __('Imprimir relatório') }} </button> <button type="button" class="btn btn-outline-secondary btn-sm" data-pp-relatorio-columns-all> {{ __('Selecionar tudo') }} </button> <button type="button" class="btn btn-outline-secondary btn-sm" data-pp-relatorio-clear-all> {{ __('Limpar tudo') }} </button> @if(!empty($reportRows)) <span class="ms-auto badge bg-secondary-subtle text-body small"> {{ __(':n registro(s) encontrado(s)', ['n' => $reportRows[array_key_last($reportRows)]['totals']['count'] ?? '—']) }} </span> @endif </div> </form> </div> </div> {{-- Resultado --}} @if(!empty($reportRows)) <div class="card shadow-sm"> <div class="card-header py-2 d-flex justify-content-between align-items-center flex-wrap gap-2"> <span class="fw-semibold small">{{ __('Resultado') }}</span> </div> <div class="card-body p-0"> <div class="table-responsive"> <table class="table table-sm table-bordered align-middle mb-0 small"> <thead class="table-light"> <tr> <th class="text-start">{{ __('Projeto / Grupo') }}</th> @foreach($colsData as $colKey) <th class="text-center">{{ $allowedColumns[$colKey] }}</th> @endforeach <th class="text-center text-nowrap">{{ __('Qtd.') }}</th> <th class="text-end text-nowrap">{{ __('Prev.') }}</th> <th class="text-end text-nowrap">{{ __('Disp.') }}</th> </tr> </thead> <tbody> @foreach($reportRows as $row) @php $type = (string) ($row['type'] ?? 'data'); $depth = (int) ($row['depth'] ?? 0); $depthClass = $depthClasses[min($depth, 3)]; @endphp @if($type === 'group_header') {{-- Cabeçalho de grupo: label em colspan + totais à direita --}} <tr class="table-primary"> <td colspan="{{ 1 + count($colsData) }}" class="fw-semibold {{ $depthClass }}"> {{ $row['label'] ?? '' }} </td> <td class="text-center fw-semibold text-nowrap"> {{ $row['totals']['count'] ?? '' }} </td> <td class="text-end fw-semibold text-nowrap"> R$ {{ number_format((float)($row['totals']['orcamento_previsto'] ?? 0), 2, ',', '.') }} </td> <td class="text-end fw-semibold text-nowrap"> R$ {{ number_format((float)($row['totals']['orcamento_disponivel'] ?? 0), 2, ',', '.') }} </td> </tr> @elseif($type === 'subtotal') {{-- Subtotal: label alinhado à direita + totais --}} <tr class="table-light text-muted"> <td colspan="{{ 1 + count($colsData) }}" class="text-end fst-italic small {{ $depthClass }}"> {{ __('Subtotal') }} </td> <td class="text-center fw-semibold text-nowrap"> {{ $row['totals']['count'] ?? '' }} </td> <td class="text-end fw-semibold text-nowrap"> R$ {{ number_format((float)($row['totals']['orcamento_previsto'] ?? 0), 2, ',', '.') }} </td> <td class="text-end fw-semibold text-nowrap"> R$ {{ number_format((float)($row['totals']['orcamento_disponivel'] ?? 0), 2, ',', '.') }} </td> </tr> @elseif($type === 'grand_total') {{-- Total geral --}} <tr class="fw-bold table-secondary"> <td colspan="{{ 1 + count($colsData) }}" class="text-end"> {{ __('Total geral') }} </td> <td class="text-center text-nowrap"> {{ $row['totals']['count'] ?? '' }} </td> <td class="text-end text-nowrap"> R$ {{ number_format((float)($row['totals']['orcamento_previsto'] ?? 0), 2, ',', '.') }} </td> <td class="text-end text-nowrap"> R$ {{ number_format((float)($row['totals']['orcamento_disponivel'] ?? 0), 2, ',', '.') }} </td> </tr> @else {{-- Linha de dado --}} <tr> <td class="{{ $depthClass }}">{{ $row['label'] ?? '' }}</td> @foreach($colsData as $colKey) <td class="text-center"> @if($colKey === 'prazo') {!! nl2br(e($row['cols'][$colKey] ?? '')) !!} @else {{ $row['cols'][$colKey] ?? '' }} @endif </td> @endforeach <td class="text-center text-nowrap">1</td> <td class="text-end text-nowrap"> R$ {{ number_format((float)($row['totals']['orcamento_previsto'] ?? 0), 2, ',', '.') }} </td> <td class="text-end text-nowrap"> R$ {{ number_format((float)($row['totals']['orcamento_disponivel'] ?? 0), 2, ',', '.') }} </td> </tr> @endif @endforeach </tbody> </table> </div> </div> </div> @elseif(request()->has('columns') || request()->has('group1')) <div class="alert alert-info"> {{ __('Nenhum projeto encontrado para a configuração selecionada.') }} </div> @endif </div> <script src="{{ asset('pmar/js/projetos-programas-relatorio.js') }}"></script> @endsection
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.01 |
proxy
|
phpinfo
|
Settings