Capítulo 20: Projeto Integrador II: Aplicação Comercial Desktop Completa (CustomTkinter + SQLite + DAO + Auditoria)
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:
- Tipagem Estática e Type Hints Estritos (PEP 484/585/604): Código validado sem alertas no
mypy --strict. - Modelagem de Domínio Rica com DDD Tático: Entidades com
slots=True, Value Objects imutáveis (frozen=True) e enumeraçõesStrEnum. - Persistência Relacional ACID com SQLite3: Padrão DAO, chaves estrangeiras ativas e consultas 100% imunes a SQL Injection.
- Interface Gráfica Desktop com Arquitetura MVC: Desacoplamento entre a janela visual, o orquestrador e a camada de dados.
- 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:
- O serviço captura o instante UTC da operação (
datetime.now(timezone.utc)). - Computa os dados do operador, identificador do registro e o payload antes e depois da modificação.
- Grava atomicamente no diretório
reports/o arquivo no padrão ISO: \(\text{reports/YYYY-MM-DD\_HH-MM-SS\_auditoria.json}\) - 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.