{{--
Central da Sessão — só apresenta o que já existe em outras telas
(Pauta, Quórum e Votação, Ata, Painel Público). Toda ação sensível
(abrir/encerrar votação, confirmar presença, autorizar fala, gerar
Ata) continua acontecendo nas rotas/Controllers/Services de sempre;
os botões daqui só levam pra lá. wire:poll.5s (não mais rápido que
isso — esta tela é uma visão geral, não a tela de votação em si,
que já tem seu próprio wire:poll mais curto em QuorumVotacao).
--}}
@else
{{-- ===================== Sessão ativa ===================== --}}
@php($materiaAtual = $this->materiaEmVotacao)
@php($bloco = $this->blocoAtivo)
@php($fala = $this->falaEmAndamento)
{{-- ===================== Motor Regimental (Etapa C.2) — banner de fase =====================
"ONDE ESTOU?" — só aparece pra sessão com Perfil Regimental associado;
sessão sem perfil não mostra nada disto (comportamento legado). --}}
@if($this->sessao->temPerfilRegimental())
FASE ATUAL: {{ mb_strtoupper($this->sessao->faseRegimentalAtual->nome ?? '') }}
A sessão está em {{ $this->sessao->faseRegimentalAtual->nome ?? '—' }}.
As ações disponíveis dependem do Perfil Regimental configurado.
Você pode realizar as ações habilitadas abaixo.
@endif
@endif
{{-- ===================== Questão de Ordem (Etapa F) =====================
Só aparece quando há alguma ativa — item 6 do pedido: "sem
bloquear a Central inteira". --}}
@if($this->questoesOrdemAtivas->isNotEmpty())
@foreach($this->questoesOrdemAtivas as $qo)
@endforeach
@endif
@if($this->sessao->isSuspensa())
{{-- Sessao.status continua 'ativa' de propósito (ver Sessao::isSuspensa())
— por isso todo o resto da tela (pauta, presença, fila) continua
aparecendo normalmente abaixo, sem perder nenhum estado. --}}
{{ $this->pedidosPendentesCount }} {{ $this->pedidosPendentesCount === 1 ? 'pedido de fala aguardando' : 'pedidos de fala aguardando' }}
@endif
{{-- ===================== Etapa I — Requerimentos/Incidentes: área
operacional sempre visível quando há algo pendente (homologação
item 1 — antes só aparecia dentro de "Outras ações", o operador
não percebia). Nunca recalcula nada: só exibe $this->requerimentosAtivos
(já existente) e chama os mesmos métodos do Service já usados
no Presidente/Vereador. ===================== --}}
@if($this->requerimentosAtivos->isNotEmpty())
@if(in_array($r->status, ['apresentado', 'em_analise']))
{{-- Homologação item 3 — mesmos três caminhos do Presidente,
disponíveis pro operador registrar em nome da autoridade.
Executor sempre = operador autenticado; autoridade
resolvida automaticamente ou selecionada explicitamente
quando ambígua (nunca escolhida arbitrariamente). --}}
@if(! $this->autoridadePresidencialAutomatica)
@error('requerimentoAutoridadeId')
@endif
{{-- ===================== Etapa N — Subscrições de Matéria: instituto
PRÓPRIO de AUTORIA, independente de Requerimentos/Questão de
Ordem acima. Mesmo padrão visual/de decisão (autoridade
automática × seleção manual). ===================== --}}
@if($this->subscricoesPendentes->isNotEmpty())
{{-- ===================== Microetapa "Central Operacional Completa"
— AÇÕES DA SESSÃO, MOVIDO pra cá (não copiado — o card "Ações
principais" que existia lá embaixo, dentro de cs-secundario,
foi removido de lá; este é o único lugar onde ele existe
agora). Mesmos wire:click, hrefs, permissões e conteúdo de
sempre — nenhuma ação foi reimplementada. $acoesSessaoAberta
é uma propriedade NOVA (item 5 do pedido: $outrasAcoesAberto
continua controlando só o sub-painel "Outras ações" abaixo,
um escopo diferente do card inteiro). ===================== --}}
{{-- Correção cirúrgica preservada: nativo trocado por
estado do Livewire ($outrasAcoesAberto) — este componente tem
wire:poll.5s, e o fechava sozinho a cada poll
porque seu `open` é estado do DOM, não do servidor. --}}
@if($outrasAcoesAberto)
{{-- ===================== Microetapa "Console Operacional Completo"
— CENTRAL OPERACIONAL: UMA matéria corrente (item 2/3/4 do
pedido), nunca uma lista. Cada branch abaixo só reaproveita
computeds já existentes (CentralSessaoService) comparando id
com $materiaCorrente — a REGRA de qual estado é qual nunca é
recalculada aqui, só a decisão de QUAL delas exibir agora.
"Último resultado" continua card próprio, mais abaixo. ===================== --}}
@php($materiaDiscussao = $this->materiaEmDiscussao)
@php($materiaDiscussaoEncerrada = $materiaDiscussao ? null : $this->materiaDiscussaoEncerradaAguardandoVotacao)
{{-- Etapa K — três estados do encaminhamento, mutuamente exclusivos
por construção (ver CentralSessaoService, cada um só retorna
não-null no seu próprio momento do fluxo). --}}
@php($materiaAguardandoEncaminhamento = $materiaDiscussao ? null : $this->materiaAguardandoEncaminhamento)
@php($materiaEmEncaminhamento = $materiaDiscussao ? null : $this->materiaEmEncaminhamento)
@php($materiaEncaminhamentoEncerrado = $materiaDiscussao ? null : $this->materiaEncaminhamentoEncerradoAguardandoVotacao)
@php($materiaAtoNaoImplementado = $materiaDiscussao ? null : $this->materiaAguardandoAtoNaoImplementado)
@php($materiaCorrente = $this->materiaCorrente)
@if($bloco)
{{-- Votação em bloco continua fora do conceito de "matéria
corrente" (item 4 do pedido é sobre UMA matéria) —
mesmo tratamento de sempre, inalterado. --}}
@else
{{-- Navegação Recuar/Avançar (item 5/6 do pedido) — SÓ
seleção visual, nunca escreve nada (item 4). Item
26: opção mais segura adotada — desabilitada por
completo enquanto houver qualquer ato ativo na
sessão (ver CentralSessao::navegacaoBloqueada()),
tornando estruturalmente impossível "ver" outra
matéria enquanto uma está ativa. --}}
{{-- Item 25 do pedido — só informativo, derivado de
materiasPendentesAnteriores() (mesma pautaOrdenada(),
nenhuma consulta nova). Nunca bloqueia, nunca navega
sozinho. --}}
@if($materiaCorrente && $this->materiasPendentesAnteriores > 0)
{{ $this->materiasPendentesAnteriores }} {{ $this->materiasPendentesAnteriores === 1 ? 'matéria anterior ainda pendente' : 'matérias anteriores ainda pendentes' }}
@endif
@if(! $materiaCorrente)
@if($this->materiasPendentesAnteriores > 0)
{{-- Item 18 do pedido — CAUSA DO BUG ORIGINAL: o
avanço automático pós-conclusão procurava a
primeira pendente em TODA a pauta, então
voltava sozinho pra uma matéria pulada.
Corrigido em avancarSelecaoAposConclusao()
(só anda pra frente) — quando não sobra
nenhuma pendente À FRENTE, mostra isto em vez
de fazer wrap-around automático. --}}
FIM DA SEQUÊNCIA ATUAL
{{ $this->materiasPendentesAnteriores }} {{ $this->materiasPendentesAnteriores === 1 ? 'matéria anterior ainda pendente' : 'matérias anteriores ainda pendentes' }}.
@endif
@if($this->adiamentoVotacaoVigenteCorrente)
{{-- Etapa O, item 16/18 — guard já bloqueado no BACKEND
(SessaoRegimentalService::erroEstruturalParaAbrirVotacao());
isto aqui é só o reflexo visual, fonte única
AdiamentoMateriaService. --}}
@endif
@elseif($materiaAtoNaoImplementado && $materiaCorrente->id === $materiaAtoNaoImplementado['sessaoMateria']->id)
{{-- Etapa G.1: o Perfil configurou um ato entre discussão e
votação que este sistema ainda não sabe operar — o
Motor NÃO pula pra "Abrir votação" em silêncio. --}}
Ver matéria
{{-- Parte A da Microetapa Fluxo Operacional — Perfil
Leitura→Votação (sem Discussão/Encaminhamento
configurados): "Abrir votação" coexiste com
"Finalizar leitura" (fonte única
SessaoRegimentalService::votacaoDisponivelDuranteLeitura(),
nunca aparece quando o Perfil exige discussão/
encaminhamento antes). O clique encerra
oficialmente a leitura e abre a votação na MESMA
transação (VotacaoMateriaService::abrirIndividual()). --}}
@if(app(\App\Services\SessaoRegimentalService::class)->votacaoDisponivelDuranteLeitura($materiaCorrente))
@endif
@elseif($materiaCorrente->estaRetirada())
{{-- Item 28 do pedido — matéria retirada: nunca oferece
ação, histórico preservado integralmente. --}}
Esta matéria foi retirada — nenhuma ação disponível.
@elseif($materiaCorrente->status === 'finalizada')
{{-- Item 29 do pedido — RECUAR pode alcançar uma
finalizada, mas só consulta, nunca reabre votação. --}}
@else
{{-- Microcorreção, Problema 1 do pedido — CAUSA DO BUG
ORIGINAL: esta branch usava
`comportamento($sessao,'discussao') !== 'bloquear'`
pra decidir se mostrava "Aguardando discussão".
`comportamento()` devolve 'permitir' tanto quando
o ato está configurado como 'permitir' QUANTO
quando o ato simplesmente NÃO EXISTE no Perfil
(ver SessaoRegimentalService::comportamento(),
doc do método) — por isso um Perfil
LEITURA→VOTAÇÃO (sem Discussão configurada)
ainda caía aqui como "permitido", inventando uma
etapa que o Perfil nunca definiu.
CORREÇÃO: usa materiaProntaParaVotacao() —
mesma fonte ÚNICA que a Pauta usa pra decidir se
oferece "Abrir votação" (Perfil-aware de
verdade: só exige leitura/discussão/
encaminhamento concluídos quando
atoConfiguradoExplicitamente() confirma que
cada um deles REALMENTE faz parte do Perfil) —
e atoConfiguradoExplicitamente() (não
comportamento()) pra decidir se mostra
"Aguardando discussão". Nenhuma regra nova: as
duas fontes já existiam no Motor Regimental,
só não estavam sendo consultadas aqui. --}}
@php($materiaCorrentePronta = app(\App\Services\SessaoRegimentalService::class)->materiaProntaParaVotacao($materiaCorrente))
{{-- Microcorreção "Central Operacional: Iniciar leitura +
Abrir votação simultâneos" — fonte ÚNICA e
INDEPENDENTE de materiaProntaParaVotacao()
(SessaoRegimentalService::podeIniciarLeitura()):
leitura e votação nunca são tratadas como estados
mutuamente exclusivos aqui — cada botão aparece
conforme a SUA PRÓPRIA fonte, nunca a negação da
outra (causa do bug anterior: a Blade só oferecia
"Iniciar leitura" no @else de "pronta pra
votação", escondendo-o sempre que
materiaProntaParaVotacao() já estava true — o que
a Auditoria confirmou acontecer sempre que a
sessão não tem Perfil Regimental associado, ou
tem um Perfil que não configura o ato 'leitura'
explicitamente: nesses dois casos
materiaProntaParaVotacao() já retorna true de
saída, igual sempre fez — comportamento
preservado, ver item 7 do pedido). --}}
@php($podeIniciarLeituraCorrente = app(\App\Services\SessaoRegimentalService::class)->podeIniciarLeitura($materiaCorrente))
@php($fatosLeituraCorrente = $materiaCorrente->fatosLeitura())
@php($podeAbrirDiscussaoCorrente = ! $materiaCorrentePronta && $fatosLeituraCorrente['encerrada_em'] && ! $materiaCorrente->emDiscussao() && ! $materiaCorrente->discussaoEncerrada() && app(\App\Services\SessaoRegimentalService::class)->atoConfiguradoExplicitamente($this->sessao, 'discussao'))
@endif
{{-- Etapa O, item 15/16/18 — adiamento vigente sempre tem
prioridade visual sobre "pronta"/"aguardando
leitura"/"aguardando discussão": o backend já
bloqueia (DiscussaoService::abrir()/
SessaoRegimentalService::erroEstruturalParaAbrirVotacao()),
isto é só o reflexo visual, fonte única
AdiamentoMateriaService. Nunca esconde a leitura em
si (item 27 do pedido original — adiamento nunca
reinicia leitura; "Iniciar leitura" continua
coexistindo com o badge de adiamento quando
aplicável, mesma independência de fontes). --}}
@if($materiaCorrentePronta && $this->adiamentoVotacaoVigenteCorrente)
@endif
@elseif($materiaCorrentePronta || $podeIniciarLeituraCorrente)
{{-- Item 3/4 do pedido — os dois botões são
avaliados e exibidos de forma INDEPENDENTE;
o rótulo do badge usa "Pronta para votação"
quando a votação já está disponível (mesmo
que leitura ainda possa ser iniciada — item
3: "não é necessário criar um novo status
apenas para exibir o botão"), senão
"Aguardando leitura". --}}
@else
{{-- Nenhuma das fontes acima libera uma ação agora
(ex.: encaminhamento configurado ainda pendente,
já tratado por um branch anterior desta mesma
cadeia) — nunca inventa "Iniciar leitura" aqui:
SessaoRegimentalService::podeIniciarLeitura()
já teria liberado o botão acima se fizesse
sentido. --}}
Aguardando
@endif
@endif
@endif
{{-- ===================== Falas (item 16-22 do pedido) — painel
compacto, complementar ao card "Com a palavra" mais abaixo
(que continua existindo, inalterado, com sorteio de ordem e
fila completa — item 21: "não substituição de toda a tela de
gerenciamento"). Mesmos dados já computados
($fala/restanteSegundosFala/proximosNaFila), mesmas ações já
existentes (autorizarFalaCentral/encerrarFalaCentral, espelho
de PainelOperador::autorizarFala()/encerrarFala()). ===================== --}}
@if($fala || $this->proximosNaFila->isNotEmpty())
@endif
{{-- ===================== Último Resultado (item 19/21 do pedido)
— só lê computed property já existente, nenhuma consulta
nova. Ocupa agora sozinho o espaço que antes dividia com
"Fila Operacional" (removida — ver item 20/17 do relatório:
ficou redundante com a lista de pendentes/próximas que a
própria Central Operacional passou a mostrar). ===================== --}}
{{-- ===================== Timeline recolhível (item 10/11/12 do
pedido) — $timelineAberta é propriedade pública comum (não
Computed, não Computed-reset), preservada pelo Livewire entre
os polls de 5s do topo. Mesmo conteúdo/dados de sempre
($this->timeline, já Computed — count() não gera consulta
extra). ===================== --}}
Timeline completa exige uma futura estrutura de auditoria/eventos — esta lista mostra só o que já está registrado.
@endif
{{-- Microetapa "Central Operacional Completa" — só 2 cards restam
aqui ("Ações principais" foi MOVIDO pra "AÇÕES DA SESSÃO" no
topo, não duplicado); cs-secundario-2col ajusta a grade sem
tocar a regra base (ainda usada, com 3 colunas, no estado
"sem sessão ativa" lá em cima). --}}
{{-- Fase atual (Etapa C) agora vive no banner do topo da Central,
sempre visível (item 2 da Etapa C.2) — não repete a informação
aqui pra não duplicar a mesma coisa em dois lugares. --}}
Os votos registrados nesta tentativa serão desconsiderados do resultado oficial
(continuam preservados no histórico, nunca são apagados). O cancelamento ficará
registrado na linha do tempo da sessão.
A leitura foi encerrada. A abertura da discussão exige confirmação, conforme o Perfil Regimental
desta Câmara para a fase atual: {{ $this->sessao->faseRegimentalAtual->nome ?? '—' }}.
@endif
{{-- ===================== Microetapa "Console Operacional Completo"
— modais de abrir discussão/votação diretamente na Central.
Mesmo padrão visual dos modais já existentes acima; mesmas
mensagens/condições de PainelOperador::abrirDiscussao()/
iniciarVotacao(int) — nunca uma regra nova, só a mesma
apresentação bloquear/alertar já usada em toda a Central. ===================== --}}
@if($modalDiscussaoBloqueadaCentral)
Discussão não disponível
A abertura de discussão não está disponível na fase atual, conforme o Perfil Regimental desta sessão.
@endif
@if($modalConfirmarDiscussaoCentral)
Confirmar abertura de discussão
Esta ação exige confirmação nesta fase, conforme o Perfil Regimental desta sessão.
@endif
@if($modalVotacaoBloqueadaCentral)
Votação não disponível
A abertura de votação não está disponível agora — verifique se a leitura/discussão/encaminhamento
exigidos pelo Perfil Regimental desta sessão já foram concluídos.
@endif
@if($modalConfirmarVotacaoCentral)
Confirmar abertura de votação
Esta ação exige confirmação nesta fase, conforme o Perfil Regimental desta sessão.
@endif
{{-- Item 14 do pedido — confirmação obrigatória antes de encerrar
votação, mesmo padrão de "Modal: Cancelar votação" acima. Sem
recalcular votos aqui — mesma $this->contagemMateriaAtual já
usada no card. --}}
@if($modalEncerrarVotacaoCentral && $materiaAtual)
O Perfil Regimental desta Câmara prevê um aviso para verificação de quórum durante a fase atual:
{{ $this->sessao->faseRegimentalAtual->nome ?? '—' }}.
@endif
A verificação registra, de forma permanente, quem está presente agora — {{ $this->presentes }} de {{ $this->totalVereadoresAtivos }}.
@endif
{{-- ===================== Modal: Registrar Questão de Ordem em nome do vereador (complemento) ===================== --}}
@if($modalRegistrarQuestaoOrdem)
Registrar Questão de Ordem
Use isto quando o vereador não registrar pelo próprio painel — ele continua sendo o autor;
fica registrado que você fez o lançamento.
O Perfil Regimental desta Câmara prevê um aviso para Questão de Ordem durante a fase atual:
{{ $this->sessao->faseRegimentalAtual->nome ?? '—' }}.
@endif
@error('questaoOrdemVereadorId')
{{ $message }}
@enderror
@error('questaoOrdemTextoCentral')
{{ $message }}
@enderror
@endif
{{-- ===================== Modal: Questão de Ordem bloqueada nesta fase (informativo) ===================== --}}
@if($modalQuestaoOrdemBloqueada)
Questão de Ordem não disponível nesta fase
Fase atual: {{ $this->sessao->faseRegimentalAtual->nome ?? '—' }}
Conforme a configuração do Perfil Regimental, Questão de Ordem está bloqueada nesta fase.
@endif
{{-- ===================== Modal: Decisão da Presidência, lançada pelo operador (complemento) ===================== --}}
@if($modalDecidirQuestaoOrdemCentral)
Decisão da Presidência
Você está registrando no sistema a decisão da Presidência — a autoridade da decisão
continua sendo atribuída a quem preside a sessão, não a você.
@if($this->autoridadePresidencialAutomatica)
Autoridade da decisão: {{ $this->autoridadePresidencialAutomatica->name }}
@else
Não foi possível determinar automaticamente (nenhum ou mais de um registro de Presidência
encontrado) — selecione pra não atribuir a decisão à pessoa errada.
O Perfil Regimental desta Câmara prevê um aviso para requerimentos durante a fase atual:
{{ $this->sessao->faseRegimentalAtual->nome ?? '—' }}.
@endif
{{-- wire:model.live — Etapa O: os campos de prazo do adiamento
(exigeModalidadeAdiamento) precisam reagir assim que o tipo
muda, sem esperar o submit. --}}
@error('requerimentoSolicitanteId')
{{ $message }}
@enderror
{{-- Etapa O, item 10 — Adiamento da Discussão/Votação sempre
informa modalidade/prazo na apresentação (RequerimentoService
rejeita sem isso pra estes dois tipos). --}}
@if($this->exigeModalidadeAdiamento)
@enderror
{{-- Homologação item 1 — a lista de pendentes com ações passou
a viver numa área sempre visível na Central (ver acima de
"cs-alertas"), não mais escondida aqui dentro de "Outras
ações". Este modal agora é só o formulário de apresentar
um requerimento novo. --}}
@endif
{{-- ===================== Etapa I — Modal: Requerimentos bloqueados nesta fase (informativo) ===================== --}}
@if($modalRequerimentoBloqueado)
Requerimentos não disponíveis nesta fase
Fase atual: {{ $this->sessao->faseRegimentalAtual->nome ?? '—' }}
Conforme a configuração do Perfil Regimental, requerimentos estão bloqueados nesta fase.
@endif
{{-- ===================== Modal: Mensagem no Telão ===================== --}}
@if($modalMensagemTelao)
Mensagem no Telão
A mensagem é só uma camada de apresentação — não altera status, votação, matéria, fala
nem cronômetro. Quando ocultada, o telão volta sozinho ao que estiver acontecendo de verdade.
@error('mensagemTelaoTexto')
{{ $message }}
@enderror
@endif
{{-- ===================== Modal: Uso da Palavra (inscrição formal) =====================
REGRA FUNDAMENTAL: pedidos_fala com momento != NULL (inscrição
formal) são tratados aqui, sempre por id explícito — nunca por
"o pedido do vereador X" de forma genérica. "Chamar"/"Concluir"
reaproveitam autorizarFalaCentral()/encerrarFalaCentral() (os
mesmos já usados pela fila comum, sem nenhuma reimplementação),
que continuam intocados e continuam funcionando exatamente
igual pra pedido comum (momento = NULL) em qualquer outra tela.
"Mostrar inscritos/sorteio na TV" e "Tirar da TV" só ligam/
desligam uso_da_palavra_visivel_telao + uso_da_palavra_modo_telao
(camada de apresentação — as duas colunas vivem na mesma linha
de `sessoes`, então mostrar um modo sempre TROCA o outro, nunca
soma) — nenhuma delas abre/fecha inscrição de nenhum momento
(isso continua só em abrirInscricoes()/fecharInscricoes(),
inalterados), autoriza vereador, inicia cronômetro ou sorteia.
Sortear continua sendo só sortearOrdemUsoDaPalavraCentral(). --}}
@if($modalUsoDaPalavra)
🎙 Inscritos para Uso da Palavra
Inscrição formal (momento definido) é independente de pedido de fala comum — chamar, concluir
ou cancelar aqui nunca afeta pedidos comuns do mesmo vereador, e vice-versa.
Exibição no telão:
@if($usoDaPalavraNaTv && $modoNaTv === 'inscritos')
ATIVA — mostrando lista de inscritos
@elseif($usoDaPalavraNaTv && $modoNaTv === 'sorteio')
ATIVA — mostrando resultado do sorteio
@else
Desligada — inscritos ficam guardados, a TV não muda sozinha
@endif
@if($usoDaPalavraNaTv && $modoNaTv === 'inscritos')
@else
@endif
{{-- Só aparece quando existe sorteio real pra Uso da Palavra
(nunca sorteia ao clicar — só troca o que a TV exibe, ver
CentralSessaoService::mostrarSorteioNaTv()). --}}
@if($this->existeSorteioUsoDaPalavra)
@if($usoDaPalavraNaTv && $modoNaTv === 'sorteio')
@else
@endif
@endif
@forelse($this->momentosFormaisComEstado as $m)
@php($inscritosDoMomento = $this->inscritosUsoDaPalavra->where('momento', $m['chave'])->values())