ContractPopup

src/layouts/components/contract-popup/ContractPopup.vue
Overlay Medium 1 uso

Popup de aceitação de termos e contrato. Exibido obrigatoriamente (sem botão fechar) quando o usuário não assinou o contrato (contract_signed_at ou contract_subscriber_ip nulos). Renderiza PDFs inline via vue-pdf com paginação. Dois documentos em sequência: Contrato de Prestação de Serviços → Regras. Recusar em qualquer etapa faz logout imediato.

Etapa 1 — Contrato de Prestação de Serviços

Primeira etapa. PDF do Contrato exibido inline. Footer: botão "Recusar" (danger, esquerda) → logout imediato. Botão "Aceitar" (success, direita) → avança para PDF de Regras. O popup não tem botão de fechar — aceite ou logout são as únicas opções.

Termos e Contrato
Leia e aceite para continuar
Página 1 / 4
Contrato de Prestação de Serviços.pdf Renderizado via vue-pdf
Página 1 / 4
Atenção: Sem aceite, o acesso ao sistema permanece bloqueado. "Recusar" encerra a sessão imediatamente.
Real src/layouts/main/Main.vue:78
<notification-popup/>
<contract-popup/>
<update-password-popup/>

Etapa 2 — Regras

Segunda e última etapa. Exibida após "Aceitar" na etapa do Contrato. Botão "Aceitar" chama signContractRule dispatch que fecha o popup definitivamente. Recusar ainda resulta em logout.

Termos e Contrato
Última etapa — Regras de uso
Página 1 / 2
Regras de Uso.pdf Renderizado via vue-pdf
Página 1 / 2
Sintético synthetic
<!-- Fluxo interno sem props configuráveis: -->
<!-- 1. created(): busca contract/contractInfos -->
<!-- 2. Se não assinado → abre popup com PDF do Contrato -->
<!-- 3. Aceitar → muda para PDF de Regras -->
<!-- 4. Aceitar Regras → signContractRule → fecha popup -->
<!-- 5. Recusar → logout (limpa localStorage, redirect /login) -->
<contract-popup/>

Fluxo Completo

Sequência obrigatória — o usuário não pode fechar o popup sem aceitar ou fazer logout.

1
created() — busca contrato
Dispatch contract/contractInfos. Verifica contract_signed_at e contract_subscriber_ip.
2
setData() — abre popup
Se não assinado: isPopupActive=true. pdfList preenchido com 2 PDFs. Tab ativo = "Contrato de Prestação de Serviços".
3
Usuário lê e aceita o Contrato
acceptContract() → muda tabActive para "Regras". PDF de Regras exibido.
4
Usuário aceita as Regras
signContractRule dispatch → closeContractPopup() → isPopupActive=false. Acesso liberado.
Recusar (qualquer etapa) → Logout
Limpa localStorage (accessToken, groupsSelectedFilter, userInfo). Dispatch auth/disconnected. Redirect /login. $acl.change('administrador'). $vs.notify warning.
Real src/layouts/main/Main.vue:78
<!-- ContractPopup é singleton — registrado junto com os outros popups globais -->
<notification-popup/>
<contract-popup/>
<update-password-popup/>

API

<!-- Sem props — componente singleton auto-gerenciado via Vuex. -->
<!-- Abre quando contract_signed_at ou contract_subscriber_ip são nulos. -->
<!-- Sem botão de fechar — aceite ou logout obrigatório. -->
<contract-popup/>
Sem props, sem eventos. ContractPopup é um componente singleton completamente auto-gerenciado via Vuex. Não há configuração via props — toda a lógica vem do módulo contract da store.

Store — Módulo contract

ActionDisparado quando
contract/contractInfos created() — busca dados do contrato. Determina se popup deve abrir.
contract/signContract Usuário aceita o Contrato de Serviços (etapa 1).
auth/disconnected Usuário clica "Recusar" — desconecta e redireciona para /login.

Dependências

vs-popup vs-button $vs.notify vue-pdf (renderização PDF inline) store: contract, auth/disconnected

Navegação de PDF (vue-pdf)

ElementoDescrição
Botões de seleção (topo) Botões flat com ícone description/assignment para alternar entre os 2 PDFs (Contrato / Regras).
Paginação (acima + abaixo) Página X / Total com botões Anterior/Próximo duplicados acima e abaixo do PDF.
PDF inline Renderizado via componente <pdf> da lib vue-pdf. Recebe URL e número de página.

Onde é usado

src/layouts/main/Main.vue:78 (singleton global)