speco_suspend

Módulo Speco Suspend

Introdução

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.

Fluxo de Suspensão

O fluxo de suspensão segue os seguintes passos:

  1. 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',
    }])
    
  2. 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',
    }])
    
  3. 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

  4. 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.

Estados do Fluxo

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

Ações de Suspensão

  • 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

Métodos de Suspensão

  • direct: Direto - suspensão aplicada diretamente à entidade

  • cascade: Cascata - suspensão propagada de uma entidade pai

Testes Unitários

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.

Internacionalização

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.

Modelos

SuspendType (Tipo de Suspensão)

class speco_suspend.suspend_type

Tipo de suspensão que define a ação e o período de suspensão.

name(Nome)

Nome do tipo de suspensão (obrigatório).

observation(Observação)

Observações adicionais.

quantity(Quantidade)

Quantidade de tempo da suspensão (obrigatório se período não for Indeterminado).

period(Período)

Tipo de período: Dias, Meses, Anos, Indeterminado (obrigatório).

action(Ação)

Ação de suspensão: Suspenso, Excluído, Desvinculado (obrigatório). Armazenado como tupla no banco de dados.

target(Destino)

Destino da suspensão (obrigatório). Preenchido por módulos que estendem este.

SuspendHistory (Histórico de Suspensão)

class speco_suspend.suspend_history

Histórico de suspensões de uma entidade.

origin(Origem)

Referência à entidade suspensa (obrigatório).

start_date(Data de Início)

Data de início da suspensão.

end_date(Data de Fim)

Data de fim da suspensão.

description(Descrição)

Descrição da suspensão.

suspension_type(Tipo de Suspensão)

Tipo de suspensão (speco_suspend.suspend_type).

action(Ação)

Ação: Ativar, Suspenso, Excluído, Desvinculado.

suspended_by(Suspenso Por)

Método de suspensão: Cascata ou Direto (obrigatório).

suspension_origin(Origem da Suspensão)

Referência à origem da suspensão em cascata.

history_reference(Referência de Histórico)

Referência ao histórico pai.

children(Filhos)

Históricos filhos (suspensões em cascata).

SuspensionRequest (Solicitação de Suspensão)

class speco_suspend.suspension_request

Solicitação de suspensão.

origin(Origem)

Referência à entidade que será suspensa (obrigatório).

state(Estados)

Estado da solicitação: Não Revisado, Aprovado, Recusado.

effective_date(Data Efetiva)

Data efetiva da suspensão.

description(Descrição)

Descrição da solicitação.

suspension_document(Documento de Suspensão)

Documento anexado à solicitação.

history_reference(Referência de Histórico)

Referência ao histórico de suspensão gerado.

quantity(Quantidade)

Quantidade do período de suspensão.

period(Período)

Tipo de período: Dias, Meses, Anos, Indeterminado.

suspension_type(Tipo de Suspensão)

Tipo de suspensão (speco_suspend.suspend_type).

review_comment(Comentário de Revisão)

Comentário sobre a revisão da solicitação.

Wizards

ActivateWizard (Assistente de Ativação)

class speco_suspend.activate.wizard

Wizard para ativar uma entidade suspensa.

origin(Origem)

Referência à entidade a ser ativada (obrigatório).

effective_date(Data Efetiva)

Data efetiva da ativação (obrigatório).

SuspensionRequestWizard (Assistente de Solicitação de Suspensão)

class speco_suspend.suspension_request.wizard

Wizard para criar uma solicitação de suspensão.

origin(Origem)

Referência à entidade a ser suspensa (obrigatório).

action(Ação)

Ação de suspensão: Suspenso, Excluído, Desvinculado (obrigatório).

effective_date(Data Efetiva)

Data efetiva da suspensão (obrigatório).

description(Descrição)

Descrição da solicitação.

Constantes

O módulo define as seguintes constantes em constants.py:

_states_suspend_workflow

Estados do fluxo de suspensão:

  • active: Ativo

  • inactive: Inativo

  • suspended: Suspenso

  • excluded: Excluído

  • detached: Desvinculado

_origin_types_sel

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

Suspend (Mixin de Suspensão)

class speco_suspend.suspend

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.

state(Estado)

Estado atual do fluxo de suspensão.

activated_in(Ativado Em)

Referência ao histórico de ativação.

suspended_in(Suspenso Em)

Referência ao histórico de suspensão.

suspension_requests(Solicitação de Suspensão)

Solicitações de suspensão associadas.

grandparent(Avô)

Referência ao ancestral superior.

parent(Pai)

Referência ao ancestral direto.

children(Filhos)

Entidades descendentes.

SuspensionRequestMixin (Mixin de Solicitação de Suspensão)

class speco_suspend.suspension_mixin

Mixin para funcionalidades comuns de solicitação de suspensão.

effective_date(Data Efetiva)

Data efetiva da suspensão.

description(Descrição)

Descrição da solicitação.

quantity(Quantidade)

Quantidade do período de suspensão.

period(Período)

Tipo de período: Dias, Meses, Anos, Indeterminado.

suspension_type(Tipo de Suspensão)

Tipo de suspensão (speco_suspend.suspend_type).