# Arquitetura funcional — V8.1 Kreate4Web

## Fluxo central

```text
Cliente
  ├── Acessos ao portal
  ├── Serviços
  │    ├── Domínios
  │    ├── Alojamentos
  │    ├── Projetos web
  │    ├── Renovações
  │    │    └── Pagamentos
  │    └── Documentos
  └── Tickets
       ├── Mensagens da equipa
       ├── Mensagens do cliente
       ├── Notas internas
       ├── Anexos
       └── Notificações
```

## Apps Django

```text
core            configuração, fornecedores, documentos e paleta semântica
clients         clientes, contactos, notas e acessos ao portal
services        serviço comercial central
domains         domínios
hosting         alojamentos
websites        projetos web
billing         renovações e pagamentos
notifications   modelos, fila, SMTP, bloqueios e auditoria
operations      tarefas internas
support         tickets, mensagens e notificações de suporte
technical       servidores, ativos, bases de dados e backups
imports         análise, simulação, importação e anulação do Excel
dashboard       dashboard, operações, qualidade, relatórios e legenda
client_portal   área privada do cliente
security        login único, perfis, 2FA e auditoria de segurança
maintenance     limpeza seletiva/total, snapshots e auditoria destrutiva
```

## Separação entre backoffice e cliente

```text
/admin/
  Django Admin + Unfold
  Apenas equipa autorizada

/portal/
  Interface própria Kreate4Web
  Apenas dados do cliente autenticado
```

O `ClientPortalAccess` liga um utilizador Django a um único cliente e define:

- perfil funcional;
- estado do acesso;
- acesso financeiro;
- acesso a documentos;
- gestão de tickets;
- datas de convite, aceitação e último acesso.

## Tickets

```text
SupportTicket
  ├── referência K4W
  ├── cliente e serviço
  ├── prioridade e estado
  ├── responsável e prazo
  ├── leitura pelo cliente/equipa
  ├── resolução
  └── SupportMessage[]
       ├── equipa
       ├── cliente
       ├── sistema
       ├── nota interna
       └── anexo
```

Uma mensagem pública da equipa muda o ticket para `waiting_client`. Uma mensagem do cliente muda-o para `waiting_internal`. Um ticket resolvido pode ser reaberto.

## Comunicações

```text
Mensagem pública de suporte
  → sinal post_save
  → NotificationLog
  → modo de teste ou SMTP
  → NotificationAttempt
```

As notas internas não geram email nem são mostradas ao cliente.

## Segurança

- filtragem de todos os objetos pelo cliente autenticado;
- downloads protegidos por vistas Django;
- comprovativos e anexos fora da pasta estática;
- utilizadores de cliente sem acesso ao admin;
- histórico com django-simple-history;
- CSRF, cookies HTTP only e proteção contra frames;
- modo de teste de email fechado por defeito;
- passwords apenas no sistema de autenticação Django;
- sem credenciais de servidor em texto simples.

## Estados

`core/status_palette.py` concentra as cores do backoffice. `client_portal/templatetags/portal_tags.py` reproduz os mesmos significados no portal do cliente. A página `/admin/legenda-estados/` apresenta todos os estados existentes.


## Manutenção da base de dados — V8.1

```text
Superutilizador
  → Centro de manutenção
  → Seleção de módulos ou limpeza total
  → Expansão de dependências
  → Pré-visualização
  → Password + frase de confirmação
  → Snapshot JSON comprimido
  → Transação de eliminação
  → DatabaseCleanupOperation
```

O módulo `maintenance` não é incluído na própria limpeza para preservar a auditoria. A conta administrativa atual e as tabelas técnicas do Django também são protegidas.

# Evolução V9.1

## Segurança

O módulo `security` passou a incluir recuperação de palavra-passe baseada nas vistas e tokens nativos do Django. Os pedidos e conclusões são registados em `SecurityEvent`. O reset não desativa TOTP nem elimina códigos de recuperação.

## Diagnóstico

A app `devtools` contém um serviço de health check reutilizável e duas vistas:

- `health_dashboard`: interface visual e resposta JSON opcional;
- `health_run`: execução POST em tempo real.

Os testes não expõem segredos e apresentam mais detalhe apenas a utilizadores staff autenticados.

## Infraestrutura WordPress

A app `technical` acrescenta:

```text
TechnicalAsset
├── WordPressSite
│   ├── WordPressPlugin
│   └── WordPressTheme
└── SSLCertificate
```

Os novos modelos usam histórico de alterações, índices, filtros administrativos e estados compatíveis com a paleta central do portal.

## Identidade visual

O Unfold utiliza `static/branding/kreate4web-logo-horizontal.png` como logótipo principal. As páginas públicas e de segurança reutilizam a mesma identidade. A manutenção da base de dados possui componentes CSS próprios, responsivos e compatíveis com o modo escuro.


# Evolução V9.3 — Camada visual e pré-visualização administrativa

## Resolução de recursos estáticos

```text
/static/
├── css/admin.css
├── css/client-portal.css
└── unfold/fonts/material-symbols/
```

Os caminhos são absolutos e o CSS do portal é reinjetado no bloco `extrastyle` depois do CSS do Unfold. Esta ordem garante que os componentes personalizados mantêm o seu layout.

## Pré-visualização de clientes

```text
Administrador autenticado
└── sessão Django administrativa
    └── ClientPortalAccess selecionado na sessão
        ├── portal_client
        ├── portal_access
        ├── portal_actor_user
        └── modo readonly / interactive
```

A aplicação não executa `login()` com a conta do cliente. O administrador mantém `request.user`, enquanto o decorador do portal fornece a identidade funcional selecionada. O fim da pré-visualização remove apenas as chaves temporárias da sessão.

## Chaves de sessão

```text
k4w_client_preview_access_id
k4w_client_preview_interactive
k4w_client_preview_return_url
```

## Segurança

- acesso apenas a staff com permissão de consulta dos acessos ao portal;
- teste interativo apenas para superutilizadores;
- alterações bloqueadas no modo só de leitura;
- password do cliente sempre inacessível;
- eventos de início e fim guardados no histórico de segurança.
