Especialização em Sistemas com Python & POO com Type Hints • Capítulo 20


🗺️ Mapa Conceitual do Tópico

flowchart TD
    subgraph PRESENTATION_LAYER["1. Apresentação (GUI Desktop MVC)"]
        FORM["Formulário Responsivo Grid (CustomTkinter / Tkinter)"]
        TABLE["Tabela de Listagem (Treeview / CustomTkinter ScrollableFrame)"]
        NOTIF["Feedback Visual & Diálogos de Alerta Não-Bloqueantes"]
    end

    subgraph APPLICATION_LAYER["2. Aplicação & Casos de Uso (Service Layer)"]
        CLIENTE_SVC["ClienteService\nValidações Fiscais de Negócio · Orquestração de Fluxos"]
        AUDITOR["AuditoriaService\nTrilhas Imutáveis em reports/YYYY-MM-DD_HH-MM-SS_auditoria.json"]
    end

    subgraph DOMAIN_LAYER["3. Domínio Rico (DDD Tático)"]
        ENT_CLIENTE["Entidade Cliente (slots=True)"]
        VO_CPF["Value Object CPF (frozen=True com Validação Algorítmica)"]
        ENUM_STATUS["StrEnum: StatusCliente (ATIVO, INADIMPLENTE, BLOQUEADO)"]
    end

    subgraph INFRA_LAYER["4. Infraestrutura & Persistência Relacional"]
        DAO["ClienteSQLiteDAO\nQueries Parametrizadas · WAL Mode · Transações ACID (with conn:)"]
        SQLITE_DB[("banco_comercial.db")]
    end

    PRESENTATION_LAYER --> APPLICATION_LAYER
    APPLICATION_LAYER --> DOMAIN_LAYER
    APPLICATION_LAYER --> INFRA_LAYER
    INFRA_LAYER --> SQLITE_DB

    style PRESENTATION_LAYER fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
    style APPLICATION_LAYER fill:#ede7f6,stroke:#512da8,stroke-width:2px
    style DOMAIN_LAYER fill:#fff3e0,stroke:#ff9800,stroke-width:2px
    style INFRA_LAYER fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px

🏢 1. O Desafio Culminante da Especialização

O Projeto Integrador II representa a consolidação holística da formação de Especialização em Sistemas com Python. O objetivo é a construção autônoma de um sistema desktop corporativo completo (ERP/CRM), integrando:

  1. Tipagem Estática e Type Hints Estritos (PEP 484/585/604): Código validado sem alertas no mypy --strict.
  2. Modelagem de Domínio Rica com DDD Tático: Entidades com slots=True, Value Objects imutáveis (frozen=True) e enumerações StrEnum.
  3. Persistência Relacional ACID com SQLite3: Padrão DAO, chaves estrangeiras ativas e consultas 100% imunes a SQL Injection.
  4. Interface Gráfica Desktop com Arquitetura MVC: Desacoplamento entre a janela visual, o orquestrador e a camada de dados.
  5. Auditoria Contínua Corporativa: Rastreamento determinístico em arquivos JSON datados no diretório reports/.

🏛️ 2. Arquitetura de Software em Quatro Camadas

app_desktop_comercial/
├── domain/                  # Camada de Domínio Puro
│   ├── models.py            # Entidades Cliente, Contrato (Dataclasses)
│   ├── value_objects.py     # CPF, CNPJ, Dinheiro (frozen=True)
│   └── exceptions.py        # Exceções de Domínio (DominioError)
├── services/                # Camada de Aplicação
│   ├── cliente_service.py   # Regras de Negócio e Casos de Uso
│   └── auditoria_service.py # Geração de Trilha JSON de Conformidade
├── infrastructure/          # Camada de Infraestrutura
│   └── cliente_dao.py       # Acesso Relacional com SQLite3
├── presentation/            # Camada de Apresentação
│   ├── views.py             # Telas e Widgets Tkinter/CustomTkinter
│   └── controllers.py       # Controladores MVC
└── main.py                  # Ponto de Entrada da Aplicação

Regra Fundamental de Acoplamento

  • O Domínio não importa nenhum módulo de GUI (tkinter) nem de banco (sqlite3).
  • A Apresentação conhece apenas os DTOs e invoca métodos da camada de Serviços.
  • A Infraestrutura implementa interfaces/protocolos de persistência sem ditar regras de negócio.

🛡️ 3. O Ciclo de Vida da Auditoria Contínua

Toda transação que altera estado no sistema comercial (criação, edição, exclusão ou bloqueio de crédito) aciona o serviço de auditoria:

  1. O serviço captura o instante UTC da operação (datetime.now(timezone.utc)).
  2. Computa os dados do operador, identificador do registro e o payload antes e depois da modificação.
  3. Grava atomicamente no diretório reports/ o arquivo no padrão ISO: \(\text{reports/YYYY-MM-DD\_HH-MM-SS\_auditoria.json}\)
  4. Permite auditorias externas em conformidade com as diretrizes da LGPD e normas de compliance contábil.

📦 4. Empacotamento e Distribuição Desktop no Windows

Para distribuir a aplicação Python final a usuários corporativos sem exigir a instalação manual prévia do interpretador, a engenharia adota o empacotamento com PyInstaller:

# Criação do binário standalone otimizado (.exe no Windows):
pip install pyinstaller
pyinstaller --noconsole --onefile --name "GestorComercial" \
  --add-data "data;data" \
  --icon "assets/app_icon.ico" \
  main.py
  • --noconsole: Oculta a janela de prompt de comando do terminal preto, exibindo apenas a GUI.
  • --onefile: Agrupa o runtime do CPython, as bibliotecas nativas C e os scripts em um executável portátil único.