# Tarefas com prazo protegido, score e lembretes automaticos

## Objetivo
Endurecer o compromisso operacional com tarefas registradas no sistema, garantindo que:
- o prazo combinado nao possa ser alterado livremente por quem apenas recebeu a tarefa
- o responsavel seja avisado assim que o prazo for definido ou alterado
- o sistema gere lembretes automaticos antes do vencimento
- o score do usuario reaja de forma mais clara ao cumprimento ou nao do prazo

## Regra de permissao
O controle passou a ser feito por tarefa no backend.

Perfis que podem editar campos estruturais:
- criador da tarefa
- perfis com visao e gestao de tarefas de equipe

Perfis que podem atuar sem mexer no compromisso estrutural:
- responsavel principal
- usuarios atribuidos como colaboradores ou observadores, quando tiverem acesso a tarefa

Campos protegidos para quem apenas recebeu a tarefa:
- `titulo`
- `descricao`
- `prioridade`
- `tipo`
- `data_inicio`
- `data_fim_prevista`
- `responsavel_id`
- `visibilidade`
- `etiquetas`
- `meta_principal_id`
- `peso_meta`
- `id_contrato`

Campos ainda permitidos para execucao:
- `status`
- `progresso`
- `nota_execucao`

## Comportamento de notificacao
Quando uma tarefa passa a ter `data_fim_prevista` ou quando essa data muda:
- o responsavel recebe uma notificacao do tipo `task_due_date_set`
- a mensagem informa quem definiu ou alterou o prazo
- a notificacao aponta para a tela administrativa da tarefa

Esse disparo tambem ocorre quando:
- a tarefa nasce com prazo e responsavel definidos
- o responsavel e trocado para outro usuario ja com prazo existente

## Comportamento de lembretes automaticos
O modulo de tarefas agora reaproveita `app_reminders` para gerar lembretes operacionais do contexto `task`.

Regras entregues:
- criar lembrete para o dia anterior ao vencimento, as `09:00`
- criar lembrete para o proprio dia do vencimento, as `09:00`
- cancelar lembretes automaticos antigos antes de recriar a agenda atual
- nao manter lembrete automatico para tarefa concluida ou cancelada
- cancelar lembretes abertos ao excluir a tarefa

Identificacao dos lembretes automaticos:
- `context_type = task`
- `context_id = id da tarefa`
- `created_by = 0`
- titulos iniciados por `Prazo amanha:` ou `Prazo hoje:`

## Regras de score
Ja existia a penalidade operacional de tarefa vencida sem movimentacao diaria.

Com esta entrega entram mais duas regras:
- `task-complete-on-time`
  aplica `+6` pontos em `execucao` quando a tarefa e concluida com `on_time = 1`
- `task-complete-late`
  aplica `-6` pontos em `disciplina` quando a tarefa e concluida com `on_time = 0`

Script entregue:
- `sql/2026-04-15-perf-rules-tarefas-prazo.sql`

## Logs e rastreabilidade
O fluxo de atualizacao de tarefa agora registra eventos especificos para:
- troca de prazo
- troca de responsavel

Isso ajuda a diferenciar:
- atraso por falta de entrega
- alteracao formal do compromisso

## Consequencias operacionais
O sistema passa a induzir um comportamento mais serio com tarefas registradas:
- prazo deixa de ser um campo frouxo para o executor
- o responsavel recebe cobranca imediata e lembretes antes do vencimento
- a conclusao fora do prazo passa a ter reflexo explicito no score
- gestores mantem governanca sobre renegociacao de compromisso

## Pontos para evolucao
- endurecer tambem endpoints secundarias baseadas em ids de itens internos, se quisermos fechar completamente operacoes derivadas como comentario e checklist por relacao reversa com a tarefa
- criar fluxo formal de pedido de prorrogacao para evitar renegociacao informal por fora do sistema
- exibir na UI um indicativo mais forte de que a tarefa esta em atraso com impacto no score do usuario
