O módulo speco_suspend fornece funcionalidade de suspensão para entidades
do sistema de certificação participativa (Speco).
Este módulo é a base para o fluxo de suspensão/ativação do Speco. Ele define
modelos e mixins que são estendidos por outros módulos como speco_core,
speco_family, speco_production, etc.
Important
speco_suspend é um módulo mixin/base. Seus modelos e wizards
são projetados para serem estendidos por outros módulos.
O campo origin dos modelos e wizards retorna vazio por padrão
[(None, '')]. Módulos que herdam deste devem sobrescrever
get_origin() para retornar modelos válidos.
O fluxo de suspensão segue os seguintes passos:
Definição de Tipos de Suspensão
Um administrador cria tipos de suspensão em SuspendType que definem:
Ação: Suspenso (suspensão temporária), Excluído (exclusão permanente), Desvinculado (desvinculação)
Período: Dias, Meses, Anos ou Indeterminado
Destino: qual tipo de entidade pode ser suspensa (core, family, etc.)
Exemplo de criação:
SuspendType.create([{
'name': 'Suspensão Temporária',
'period': 'days',
'quantity': 30,
'action': ['suspended'],
'target': 'core',
}])
Registro de Histórico
Quando uma entidade é suspensa através do SuspensionRequestWizard,
o sistema cria um registro em SuspendHistory que documenta:
A origem da suspensão (qual entidade foi suspensa)
O tipo de suspensão aplicado
A ação executada (Suspenso, Excluído, Desvinculado)
O método de suspensão (Direto ou Cascata)
Datas de início e fim
Exemplo de histórico:
SuspendHistory.create([{
'suspension_type': suspend_type.id,
'action': 'suspended',
'suspended_by': 'direct',
}])
Suspensão em Cascata
Quando uma entidade pai é suspensa, suas entidades filhas também podem ser suspensas automaticamente. O sistema registra:
suspended_by='cascade': indica suspensão em cascata
suspension_origin: referência à entidade que originou a cascata
history_reference: referência ao histórico pai
children: listas de históricos filhos
Ativação
Uma entidade suspensa pode ser reativada através do ActivateWizard,
que atualiza seu estado para active e registra a ativação no histórico.
O fluxo de suspensão define os seguintes estados:
active: Ativo - entidade operando normalmente
inactive: Inativo - entidade não operando, mas não suspensa
suspended: Suspenso - entidade suspensa temporariamente
excluded: Excluído - entidade excluída permanentemente
detached: Desvinculado - entidade desvinculada do sistema
suspended: Suspenso - suspensão temporária, a entidade pode ser reativada
excluded: Excluído - exclusão permanente, a entidade não pode ser reativada
detached: Desvinculado - a entidade é removida do grupo/núcleo
activate: Ativar - retorna a entidade ao estado ativo
direct: Direto - suspensão aplicada diretamente à entidade
cascade: Cascata - suspensão propagada de uma entidade pai
Os testes unitários isolados cobrem:
test_0010_suspend_type_creation: Criação de tipo de suspensão com período definido
test_0020_suspend_type_period_indeterminate: Tipo de suspensão com período indeterminado
test_0030_suspend_history_creation: Criação de histórico de suspensão
test_0040_constants_defined: Validação das constantes do módulo
test_0050_suspend_type_all_actions: Teste de todas as ações de suspensão
Executar testes:
docker compose -f compose.test.yml exec -T test.dev bash -c 'cd /app/modules/speco_suspend/tests && python3 -m unittest'
Note
Testes de integração (wizards, SuspensionRequest) devem ser
realizados nos módulos que estendem este.
O módulo inclui traduções em português brasileiro no arquivo locale/pt.po.
Todas as strings visíveis na interface possuem traduções correspondentes.
Tipo de suspensão que define a ação e o período de suspensão.
Nome do tipo de suspensão (obrigatório).
Observações adicionais.
Quantidade de tempo da suspensão (obrigatório se período não for Indeterminado).
Tipo de período: Dias, Meses, Anos, Indeterminado (obrigatório).
Ação de suspensão: Suspenso, Excluído, Desvinculado (obrigatório). Armazenado como tupla no banco de dados.
Destino da suspensão (obrigatório). Preenchido por módulos que estendem este.
Histórico de suspensões de uma entidade.
Referência à entidade suspensa (obrigatório).
Data de início da suspensão.
Data de fim da suspensão.
Descrição da suspensão.
Tipo de suspensão (speco_suspend.suspend_type).
Ação: Ativar, Suspenso, Excluído, Desvinculado.
Método de suspensão: Cascata ou Direto (obrigatório).
Referência à origem da suspensão em cascata.
Referência ao histórico pai.
Históricos filhos (suspensões em cascata).
Solicitação de suspensão.
Referência à entidade que será suspensa (obrigatório).
Estado da solicitação: Não Revisado, Aprovado, Recusado.
Data efetiva da suspensão.
Descrição da solicitação.
Documento anexado à solicitação.
Referência ao histórico de suspensão gerado.
Quantidade do período de suspensão.
Tipo de período: Dias, Meses, Anos, Indeterminado.
Tipo de suspensão (speco_suspend.suspend_type).
Comentário sobre a revisão da solicitação.
Wizard para criar uma solicitação de suspensão.
Referência à entidade a ser suspensa (obrigatório).
Ação de suspensão: Suspenso, Excluído, Desvinculado (obrigatório).
Data efetiva da suspensão (obrigatório).
Descrição da solicitação.
O módulo define as seguintes constantes em constants.py:
Estados do fluxo de suspensão:
active: Ativo
inactive: Inativo
suspended: Suspenso
excluded: Excluído
detached: Desvinculado
Tipos de origem para suspensão:
core: Núcleo
group: Grupo
production_entity: Unidade Produtiva
family: Família
family_members: Integrantes da Família
families: Famílias
certificates: Certificados
dac: DAC
Mixin para adicionar funcionalidade de suspensão a modelos.
Este mixin adiciona os campos de estado de suspensão e histórico a qualquer modelo que o herdar.
Estado atual do fluxo de suspensão.
Referência ao histórico de ativação.
Referência ao histórico de suspensão.
Solicitações de suspensão associadas.
Referência ao ancestral superior.
Referência ao ancestral direto.
Entidades descendentes.
Mixin para funcionalidades comuns de solicitação de suspensão.
Data efetiva da suspensão.
Descrição da solicitação.
Quantidade do período de suspensão.
Tipo de período: Dias, Meses, Anos, Indeterminado.
Tipo de suspensão (speco_suspend.suspend_type).