🌿 ATIVIDADE 11: DIAGRAMA DE ATIVIDADES (UML)

📖 Fundamentação Teórica

Para realizar este laboratório com sucesso, certifique-se de ter compreendido os conceitos apresentados no:
👉 CAPÍTULO 11: CASOS DE USO (PRÁTICA E RELAÇÕES)

Bem-vindo ao início do Bloco Avançado de Engenharia de Software. Ao longo das próximas semanas, você sairá da modelagem puramente estática e entrará de cabeça na lógica processual, no design de APIs modernas, no ecossistema corporativo (Java 17, Spring Boot 3.5.x, Thymeleaf, HTMX) e nas práticas de DevOps. Hoje, seu desafio é modelar o fluxo procedural dinâmico usando o Diagrama de Atividades. 🛡️🧩


🎯 Objetivos de Aprendizagem do Laboratório

Ao final deste laboratório prático (estimativa: 4 horas presenciais / autoguiadas), você será capaz de:

  • Modelar a lógica processual e fluxos de negócio usando a sintaxe UML.
  • Representar bifurcações e junções lógicas (decisões lógicas).
  • Representar forks e joins para fluxos de processamento em paralelo.
  • Organizar responsabilidades usando Raias de Natação (Swimlanes / Subgraphs).

🏢 O Cenário Prático (Seu Desafio)

Na TecProExpress, a diretoria de Logística percebeu um grande gargalo: quando um cliente clica em "Confirmar Compra", o sistema antigo esperava o faturamento da Nota Fiscal terminar para somente depois avisar o estoque. Em dias de grande volume, os motoristas ficavam parados esperando a emissão da nota, mesmo com a carga já pronta para carregar!

"Seu desafio como Analista de Processos de TI é desenhar o fluxo de atividades de faturamento e separação de forma paralela. Você deve modelar o processo de ponta a ponta: do clique do usuário, dividindo a ação em duas linhas paralelas (Faturamento e Separação), juntando-as no carregamento e finalizando com a saída do caminhão."


🧠 Fundamentos: A Teoria Traduzida

O Diagrama de Atividades UML é como um super fluxograma. Ele descreve a ordem em que as atividades de um sistema ou processo ocorrem, com excelente suporte para paralelismo.

Elementos Chave:

  1. Nó Inicial (Círculo Preto Sólido): Onde o processo começa.
  2. Ação/Atividade (Retângulo Arredondado): Um passo procedural executado pelo sistema ou humano.
  3. Fork (Barra de Divisão): Divide uma linha em duas ou mais ações que acontecem em paralelo.
  4. Join (Barra de Sincronização): Aguarda todas as linhas paralelas terminarem para continuar o fluxo.
  5. Decisão (Losango): Uma bifurcação baseada em uma pergunta do tipo Sim/Não.
  6. Nó Final (Círculo com Alvo): Onde o processo termina.

📊 Visualizando a Lógica

Dica

Fork vs Decisão: A decisão escolhe apenas um caminho. O Fork aciona todos os caminhos ao mesmo tempo. Nunca confunda as duas coisas!

```mermaid flowchart TD Start(["Início"]) --> Fork{{"Fork (Paralelizar)"}} Fork --> A[Emissão de Nota Fiscal] Fork --> B[Separação Física dos Itens] A --> Join{{"Join (Aguardar Ambos)"}} B --> Join Join --> End(["Pronto para Envio"])
style Start fill:#eceff1,stroke:#607d8b
style Fork fill:#e1f5fe,stroke:#0288d1
style Join fill:#e1f5fe,stroke:#0288d1
style End fill:#e0f2f1,stroke:#004d40

![Diagrama de Atividades TecProExpress (UML)](img/es_atv_11_atividades.svg)

---

## 📖 Exemplo Guiado
Abaixo, veja como detalhar o processamento com raias de natação (separando as responsabilidades entre Cliente, Financeiro e Logística).

| Elemento UML | O que representa? | Ator/Componente Responsável |
| :--- | :--- | :--- |
| Iniciar Compra | Nó Inicial | Cliente |
| Faturar Cartão | Ação | Financeiro (Gateway) |
| Separar Caixas | Ação | Logística (Operador) |
| Despachar Caminhão | Ação | Transportadora |

### 🛠️ Estrutura Visual da Expedição
Para facilitar a leitura profissional, dividimos o fluxo usando **Raias de Natação** (subgraphs no Mermaid):

```mermaid
flowchart TD
    subgraph CLI [Cliente]
        Start(["Compra Efetuada"]) --> Fork{{"Fork"}}
    end

    subgraph FIN [Financeiro]
        Fork --> F1[Emitir Nota Fiscal]
        F1 --> F2[Registrar Impostos]
    end

    subgraph LOG [Logística]
        Fork --> L1[Separar Produtos no Galpão]
        L1 --> L2[Embalar Carga]
    end

    subgraph TRA [Transportadora]
        F2 --> Join{{"Join"}}
        L2 --> Join
        Join --> T1[Carregar Caminhão]
        T1 --> End(["Caminhão Despachado"])
    end

    style Start fill:#eceff1,stroke:#333
    style End fill:#e0f2f1,stroke:#004d40
    style FIN fill:#fffde7,stroke:#fbc02d,stroke-width:1px
    style LOG fill:#e1f5fe,stroke:#0288d1,stroke-width:1px
    style TRA fill:#e8f5e9,stroke:#2e7d32,stroke-width:1px

🔍 Detalhamento do Processo:

  • A raia de natação deixa evidente quem faz o quê. Se o Financeiro falhar ao registrar impostos, o Join bloqueia o carregamento do caminhão na Transportadora, mesmo que a Logística já tenha embalado tudo!

🛠️ Prática Obrigatória 1: O Diagrama de Atividades

Cenário: O projeto de grupo semestral que você está desenvolvendo.

  1. Selecione a funcionalidade principal ou a jornada de maior complexidade do seu sistema (Ex: Devolução de Mercadorias, Cadastro e Aprovação de Motoristas, Compra com Vários Modos de Pagamento).
  2. Identifique pelo menos 3 raias de responsabilidade (Humanos ou Sistemas/Componentes).
  3. Insira pelo menos 1 Fork e 1 Join para representar ações executadas em paralelo.
  4. Insira pelo menos 1 Decisão com caminhos alternativos de erro ou validação.

🏁 Resultado Esperado (Para sua Referência)

Uma imagem (PNG/JPG) do diagrama de atividades estruturado de forma limpa, indicando claramente os caminhos paralelos e as fronteiras de responsabilidade.


💻 Simulação de Processamento Concorrente (Fork & Join) em Python

Para vivenciar a lógica de bifurcação paralela (Fork) e sincronização de término (Join) do seu Diagrama de Atividades UML:

# simulador_atividades_fork_join.py
import time
import threading

def processar_financeiro():
    print("   [FINANCEIRO] 💳 Emitindo Nota Fiscal e registrando tributos...")
    time.sleep(0.1)
    print("   [FINANCEIRO] ✅ Nota Fiscal emitida com sucesso!")

def processar_logistica():
    print("   [LOGÍSTICA] 📦 Separando itens no armazém e gerando etiqueta...")
    time.sleep(0.12)
    print("   [LOGÍSTICA] ✅ Caixa embalada e pronta para despacho!")

if __name__ == "__main__":
    print("=" * 65)
    print("🔀 WORKFLOW PARALELO (UML ACTIVITY FORK & JOIN) - TECPROEXPRESS")
    print("=" * 65)

    print("1. [FORK] Disparando tarefas simultâneas (Financeiro & Logística)...")
    t1 = threading.Thread(target=processar_financeiro)
    t2 = threading.Thread(target=processar_logistica)

    t1.start()
    t2.start()

    # JOIN: O sistema aguarda ambos os fluxos terminarem antes de despachar
    t1.join()
    t2.join()

    print("\n2. [JOIN] Todas as raias sincronizadas com sucesso!")
    print("3. [TRANSPORTADORA] 🚛 Carregando caminhão e iniciando rota de entrega.")
    print("=" * 65)

🖥️ Saída Esperada no Terminal:

=================================================================
🔀 WORKFLOW PARALELO (UML ACTIVITY FORK & JOIN) - TECPROEXPRESS
=================================================================
1. [FORK] Disparando tarefas simultâneas (Financeiro & Logística)...
   [FINANCEIRO] 💳 Emitindo Nota Fiscal e registrando tributos...
   [LOGÍSTICA] 📦 Separando itens no armazém e gerando etiqueta...
   [FINANCEIRO] ✅ Nota Fiscal emitida com sucesso!
   [LOGÍSTICA] ✅ Caixa embalada e pronta para despacho!

2. [JOIN] Todas as raias sincronizadas com sucesso!
3. [TRANSPORTADORA] 🚛 Carregando caminhão e iniciando rota de entrega.
=================================================================

🌐 Exemplo de Payload JSON para Disparo de Workflow (Swagger /docs)

{
  "id_pedido": "PED-88091",
  "cliente_id": "CLI-102",
  "itens": [
    {"sku": "MONITOR-4K", "quantidade": 1, "valor_unitario": 2100.0}
  ],
  "acoes_paralelas": [
    "EMISSAO_NFE",
    "PICKING_SEPARACAO"
  ]
}

📤 Instruções de Entrega (Microsoft Teams)

Após validar suas modelagens técnicas:

  1. Salve o arquivo de justificativa como Atividade_11.md e a imagem do seu diagrama com o nome Atividade_11.png na pasta es-atv-11-atividades/ do seu repositório GitHub.
  2. Certifique-se de fazer o commit e push para o repositório público.
  3. Submeta o link do seu repositório no Microsoft Teams para avaliação do professor.

💡 Checkpoint de Lógica

Importante

Reflexão Profissional: O que acontece com o fluxo de atividades se uma das ramificações que saem de um Fork entrar em um loop infinito ou falhar e nunca alcançar o Join? (Resposta: O Join travará o processo para sempre, pois ele exige por especificação matemática que todas as ramificações paralelas cheguem até ele para liberar o fluxo sequencial subsequente). 🧠🛡️

---

📊 Rubrica Formativa de Avaliação

Critério de Avaliação Insuficiente (0% - 40%) Regular (41% - 70%) Excelente (71% - 100%)
Diagrama de Atividades UML & Raias de Natação Desenha o fluxo sem raias de natação ou sem nós de decisão e paralelismo. Mapeia as raias mas confunde os conceitos de Fork e Join. Diagrama de atividades impecável com ao menos 3 raias, nós de decisão claros e par Fork/Join bem balanceado.
Justificativa de Paralelismo Omite a justificativa de paralelização de tarefas. Justifica superficialmente sem comparar com a execução sequencial procedural. Justificativa de alto nível comparando ganhos de performance e UX em relação à execução estritamente sequencial.
Entrega no GitHub Entrega fora da pasta `es-atv-11-atividades/`. Entrega apenas o texto sem o arquivo `.png` do diagrama. Submete `Atividade_11.md` e `Atividade_11.png` no repositório com formatação validada.