1) Visão Geral (Arquitetura Lógica)
flowchart LR
CampoApp[App de Campo] --> API[API]
Portal[Portal do Consumidor] --> API
API --> DB[PostgreSQL]
API --> Storage[Uploads]
API --> QA[Qualidade]
QA --> Rel[Relatorios]
2) Fluxo Operacional (end-to-end)
flowchart TD
Start([Inicio]) --> Planejamento[Planejamento e Treinamento]
Planejamento --> Coleta{Coleta em campo?}
Coleta -->|Sim| Vistoria[Vistoria externa]
Vistoria --> DadosCampo[Finalização]
Coleta -->|Nao| PortalUso[Uso do Portal?]
PortalUso -->|Sim| Auto[Envio de dados e docs]
PortalUso -->|Nao| Pend[Manter pendencia]
DadosCampo --> Integracao[Integracao Campo x Portal]
Auto --> Integracao
Pend --> Integracao
Integracao --> QA[Consolidacao e Qualidade]
QA --> Diverg{Ha divergencias?}
Diverg -->|Sim| Tratar[Tratamento e ajustes]
Tratar --> QA
Diverg -->|Nao| Rel[Relatorios e Exportacoes]
Rel --> End([Base final])
3) Sequência – Coleta em Campo (POST /ligacoes)
sequenceDiagram
autonumber
participant Ag as Agente Campo
participant APP as App Campo
participant API as API PHP
participant DB as PostgreSQL
participant FS as Storage
Ag->>APP: Preenche ligação, coords, atributos
APP->>API: POST /ligacoes {payload}
API->>DB: UPSERT saae.ligacao
API-->>APP: 201 Created / 200 OK
Ag->>APP: Anexa foto (01)
APP->>API: POST /ligacoes/{n}/imagens (multipart)
API->>FS: Salva nnnnn_01.jpg
API->>DB: INSERT saae.imagem(seq=1)
API-->>APP: 201 Created
Ag->>APP: Registrar tentativa
APP->>API: POST /ligacoes/{n}/visitas
API->>DB: INSERT saae.visita
API-->>APP: 201 Created
4) Sequência – Portal (Autoatendimento)
sequenceDiagram
autonumber
participant U as Usuário
participant POR as Portal Web
participant API as API PHP
participant DB as PostgreSQL
participant FS as Storage
U->>POR: Preenche dados pessoais/contato
POR->>API: POST /portal/{ligacao}
API->>DB: UPSERT saae.portal_dados
POR->>API: Upload docs (PDF/JPG)
API->>FS: Salva arquivos
API->>DB: Atualiza paths
API-->>POR: 200 OK
5) Consolidação & Regras
flowchart LR
R1[PK única: numero_ligacao]:::rule
R2[Coords válidas: 6 casas, bounds]:::rule
R3[Imagem ≥1280x960 e naming nnnnn_xx.jpg]:::rule
R4[Match Campo x Portal]:::rule
R5[Divergências: lista e tratamento]:::rule
classDef rule fill:#ecfeff,stroke:#06b6d4,color:#0e7490
R1-->R4
R2-->R5
R3-->R5
6) Modelo de Dados (ER – simplificado)
erDiagram
LIGACAO ||--o{ VISITA : possui
LIGACAO ||--o{ IMAGEM : possui
LIGACAO ||--|| PORTAL_DADOS : complementa
LIGACAO {
string numero_ligacao PK
string endereco
string chave_iptu
float lat
float lng
string categoria
string atividade
int economias
string hidrometro_numero
}
VISITA {
int id PK
string numero_ligacao
int tentativa
date data_hora
string status
bool comunicacao_entregue
date agendamento
}
IMAGEM {
int id PK
string numero_ligacao
int seq
string filename
int width_px
int height_px
}
PORTAL_DADOS {
string numero_ligacao PK
string resp_nome
string resp_cpf
date contrato_validade
string telefone
string celular
string email
string recebimento_conta
float piscina_m3
float reservatorio_m3
string fontes_alternativas
}
7) Pipeline de Relatórios
flowchart LR
X1[DB Views / Materialized Views] --> X2[API /relatorios]
X2 --> X3[Boletim PDF]
X2 --> X4[CSV Export]
X2 --> X5[Dashboard Inconsistências]
Observação: podemos derivar VIEWS para métricas de etapa, cobertura geográfica, status de tentativas e matching Campo×Portal.