# Clientflow backend v4928.1.5.17 — Follow-ups semi-automáticos

Base: `clientflow_backend_v4928_1_5_16_reply_revision_workflow.zip`.

## Objetivo

Implementar follow-up de oportunidades como fluxo semi-automático:

- o sistema agenda e sugere;
- o operador valida, contacta e conclui;
- nenhum email é enviado automaticamente por esta alteração.

## Principais alterações

### 1. Novo serviço de follow-up

Ficheiro novo: `app/followup_service.py`.

Adiciona ações internas:

- `FOLLOW_UP_QUOTE`
- `FOLLOW_UP_PROFORMA`
- `FOLLOW_UP_PAYMENT`
- `FOLLOW_UP_CUSTOMER_REVIEW`
- `FOLLOW_UP_GENERIC`

Estas ações são tarefas internas, com `safe_to_post = false`.

### 2. Criação automática de tarefas de follow-up

Quando uma tarefa comercial é concluída, o sistema pode criar automaticamente uma tarefa de follow-up:

- `SEND_QUOTE` → follow-up de orçamento em D+3;
- `SEND_PROFORMA` → follow-up de pró-forma em D+2;
- `SEND_INVOICE` → follow-up de pagamento/fatura em D+3;
- `SEND_INFO` → follow-up de análise do cliente em D+5.

### 3. Criação manual pela oportunidade

Na página de detalhe da oportunidade foi adicionado um bloco para criar follow-up manual, com:

- tipo de follow-up;
- prazo em dias;
- nota opcional.

### 4. Fecho e cancelamento automático

O sistema agora:

- fecha follow-ups pendentes quando há nova atividade do cliente associada à oportunidade;
- cancela follow-ups pendentes quando a oportunidade é marcada como ganha, perdida ou sem interesse;
- evita criar follow-ups duplicados com a mesma razão/ação na mesma oportunidade.

### 5. UI de tarefas

A página de tarefas passa a incluir:

- separador `Follow-ups`;
- separador `Follow-ups vencidos`;
- chips de vencimento baseados em `due_at`;
- cartão de detalhe com mensagem sugerida;
- botões para adiar 2 ou 7 dias;
- opção de concluir normalmente após contacto humano.

### 6. Compatibilidade de schema

`ensure_core_schema()` passa a garantir as colunas:

- `tasks.priority`;
- `tasks.assigned_to`.

## Segurança operacional

A alteração não cria envio automático de email. A comunicação continua dependente do operador.

## Validação feita

- `python -m compileall -q app` executado com sucesso.
- O arranque real com base de dados não foi validado neste ambiente por falta das dependências/runtime de PostgreSQL no container local.
