Arquitetura

🏗️ Arquitetura do C-Suite - Diagrama Completo

Este documento apresenta a arquitetura visual completa do ecossistema C-Suite, mostrando todos os 5 apps, suas relações, fluxos de dados e schemas de banco.


Diagrama de Arquitetura Geral

graph TB
    subgraph "Nível Cliente (Micro)"
        APP_4C[4c App<br/>Córtex Comercial<br/>Porta: 8080-8085]

        subgraph "Serviços 4C"
            FS["Feature Service<br/>/features/customer"]
            SS["Scoring Service<br/>/score/*"]
            DA["Decision API<br/>/decide"]
            EX["Executor<br/>WhatsApp/Email/CRM"]
            FW[Feedback Worker]
        end

        APP_4C --> FS
        FS --> SS
        SS --> DA
        DA --> EX
        EX --> FW
    end

    subgraph "Nível Organização (Macro)"
        APP_CSUITE[csuite-executive<br/>Córtex Executivo<br/>Porta: 8000<br/>csuite.internut.com.br]

        subgraph "Componentes C-Suite"
            CAPI["CSuite API<br/>/agents/*"]
            AGENTS["Agentes: CFO/CEO/COO/CMO/CAIO"]
            SCHED[Scheduler]
            DASH[Dashboard Web]
        end

        APP_CSUITE --> CAPI
        CAPI --> AGENTS
        AGENTS --> SCHED
        CAPI --> DASH
    end

    subgraph "Orquestração"
        APP_4CSUITE[4c-suite<br/>Orquestrador<br/>Porta: 8000<br/>/organismo/*]
    end

    subgraph "Contexto e Análise"
        APP_CONTEXT[csuite-context<br/>API de Contexto<br/>Porta: 8000<br/>csuite-context.internut.com.br]

        subgraph "Endpoints Context"
            EVENTS["/api/csuite/events"]
            TRENDS["/api/csuite/trends"]
            SHIFTS["/api/csuite/shifts"]
        end

        APP_CONTEXT --> EVENTS
        APP_CONTEXT --> TRENDS
        APP_CONTEXT --> SHIFTS
    end

    subgraph "Gestão de Vendas"
        APP_SALES[csuite-sales-manager<br/>Gerente de Vendas B2B<br/>Porta: 8001/8002]

        subgraph "Componentes Sales Manager"
            MAPI["Manager API<br/>/manager/today"]
            DAPI["Decision API<br/>/4c/decide"]
            JOB["Context Jobs<br/>refresh-radar"]
        end

        APP_SALES --> MAPI
        APP_SALES --> DAPI
        APP_SALES --> JOB
    end

    subgraph "Bancos de Dados"
        subgraph "MySQL RDS"
            DB_STAGING[(staging<br/>Ingestão bruta 4C)]
            DB_CORE[(core<br/>Modelo unificado 4C)]
            DB_CSUITE_STAGING[(csuite_staging<br/>Ingestão bruta)]
            DB_CSUITE[(csuite<br/>Modelo executivo)]
            DB_RADAR[(context_radar<br/>Features e tasks)]
        end

        DB_REDIS[(Redis<br/>Cache de features)]
        DB_CLICKHOUSE[(ClickHouse<br/>telemetry.events)]
        DB_KAFKA[(Kafka/Debezium<br/>Eventos CDC)]
    end

    %% Fluxos de dados 4C
    FS --> DB_REDIS
    FS --> DB_CORE
    SS --> DB_CORE
    DA --> DB_CORE
    EX --> DB_CORE
    FW --> DB_CLICKHOUSE
    FW --> DB_KAFKA

    %% Fluxos C-Suite
    CAPI --> DB_CSUITE
    AGENTS --> DB_CSUITE
    SCHED --> DB_CSUITE

    %% Fluxos Context
    APP_CONTEXT --> DB_CSUITE

    %% Fluxos Sales Manager
    MAPI --> DB_CSUITE
    MAPI --> DB_RADAR
    DAPI --> DB_CSUITE
    DAPI --> DB_RADAR
    JOB --> DB_CSUITE
    JOB --> DB_RADAR

    %% Orquestração
    APP_4CSUITE --> APP_4C
    APP_4CSUITE --> APP_CSUITE

    %% Sincronização 4C → C-Suite
    DB_CORE -.->|outbox_events| DB_CSUITE
    DB_CORE -.->|core_orders| DB_CSUITE
    DB_CORE -.->|core_feedback| DB_CSUITE

    %% Políticas C-Suite → 4C
    DB_CSUITE -.->|policy_rules| DA

    %% Estilo
    classDef appStyle fill:#4A90E2,stroke:#2E5C8A,stroke-width:3px,color:#fff
    classDef dbStyle fill:#50C878,stroke:#2D8659,stroke-width:2px,color:#fff
    classDef serviceStyle fill:#FFB84D,stroke:#CC8A3D,stroke-width:2px,color:#000

    class APP_4C,APP_CSUITE,APP_4CSUITE,APP_CONTEXT,APP_SALES appStyle
    class DB_STAGING,DB_CORE,DB_CSUITE_STAGING,DB_CSUITE,DB_RADAR,DB_REDIS,DB_CLICKHOUSE,DB_KAFKA dbStyle
    class FS,SS,DA,EX,FW,CAPI,AGENTS,MAPI,DAPI serviceStyle

Diagrama de Fluxo de Dados Detalhado

📊 Para diagramas de sequência mais detalhados, consulte DIAGRAMAS_SEQUENCIA.md

sequenceDiagram
    participant User as Usuário/Vendedor
    participant Sales as Sales Manager
    participant 4C as 4C Decision API
    participant Exec as Executor
    participant CSuite as C-Suite Executive
    participant Org as 4c-suite
    participant DB as MySQL RDS

    Note over Sales,DB: Fluxo: Geração de Task e Decisão

    Sales->>DB: Job refresh-radar executa<br/>sp_refresh_revenda_radar()
    DB-->>Sales: Features calculadas<br/>Tasks geradas

    User->>Sales: "GET /seller/{id}/today"
    Sales->>DB: Busca tasks do vendedor
    DB-->>Sales: Lista de tasks

    alt Task precisa de decisão 4C
        Sales->>4C: POST /4c/decide<br/>{revenda_id}
        4C->>DB: Busca features do cliente
        DB-->>4C: Features RFR
        4C->>4C: Calcula scores ML
        4C-->>Sales: Decisão (oferta, canal, mensagem)
        Sales->>DB: Atualiza task com decision_payload
    end

    Sales-->>User: Tasks com decisões

    Note over User,Exec: Fluxo: Execução de Ação

    User->>Exec: Executa ação (WhatsApp)
    Exec->>DB: Registra interação
    Exec->>DB: Cria evento outbox

    Note over DB,CSuite: Fluxo: Sincronização 4C  C-Suite

    DB->>CSuite: Script sync  outbox_events
    CSuite->>DB: Insere em metric_samples
    CSuite->>DB: Insere em financial_transactions

    Note over CSuite,Org: Fluxo: Orquestração

    Org->>4C: "GET /4c-suite/decisions/summary"
    4C-->>Org: Métricas de decisões

    Org->>CSuite: "GET /dashboard/summary/{org_id}"
    CSuite-->>Org: Dashboard consolidado

    Org-->>User: Status do organismo

Diagrama de Schemas de Banco de Dados

erDiagram
    %% Schema: staging (4C)
    staging_customers ||--o{ staging_orders : "tem"
    staging_orders ||--o{ staging_order_items : "contém"

    %% Schema: core (4C)
    core_customers ||--o{ core_orders : "tem"
    core_orders ||--o{ core_order_items : "contém"
    core_customers ||--o{ core_interactions : "tem"
    core_customers ||--o{ core_feedback : "tem"
    core_customers ||--o{ core_signals : "gera"
    core_orders ||--o{ core_outbox_events : "gera"
    core_interactions ||--o{ core_outbox_events : "gera"

    %% Schema: csuite_staging
    csuite_staging_companies_raw ||--|| csuite_staging_companies_ready : "processa"

    %% Schema: csuite
    csuite_organizations ||--o{ csuite_agents : "tem"
    csuite_organizations ||--o{ csuite_metric_samples : "gera"
    csuite_organizations ||--o{ csuite_financial_transactions : "tem"
    csuite_organizations ||--o{ csuite_policy_rules : "define"
    csuite_agents ||--o{ csuite_agent_runs : "executa"
    csuite_agent_runs ||--o{ csuite_alerts : "gera"
    csuite_agent_runs ||--o{ csuite_action_items : "cria"

    %% Schema: csuite (Sales Manager)
    csuite_core_sellers ||--o{ csuite_core_revendas : "gerencia"
    csuite_core_revendas ||--o{ csuite_core_orders : "tem"
    csuite_core_revendas ||--o{ csuite_core_interactions : "tem"

    %% Schema: context_radar
    context_radar_features_revenda_rfr ||--o{ context_radar_tasks_seller_day : "gera"
    csuite_core_sellers ||--o{ context_radar_tasks_seller_day : "atribui"
    csuite_core_revendas ||--o{ context_radar_tasks_seller_day : "referencia"

    %% Relações entre schemas
    core_orders ||--|| csuite_financial_transactions : "sincroniza"
    core_outbox_events ||--|| csuite_metric_samples : "alimenta"
    csuite_policy_rules ||--|| core_customers : "aplica"

    %% Entidades principais
    core_customers {
        int customer_id PK
        string name
        string phone
        datetime created_at
    }

    core_orders {
        int order_id PK
        int customer_id FK
        decimal total_value
        datetime order_date
    }

    core_outbox_events {
        int event_id PK
        string event_type
        json payload_json
        datetime created_at
    }

    csuite_organizations {
        int org_id PK
        string name
        datetime created_at
    }

    csuite_agents {
        int agent_id PK
        int org_id FK
        string agent_type
        string name
    }

    csuite_metric_samples {
        int sample_id PK
        int org_id FK
        string metric_key
        decimal metric_value
        datetime sampled_at
    }

    csuite_policy_rules {
        int rule_id PK
        int org_id FK
        string rule_type
        string rule_key
        json rule_value
        boolean enabled
    }

    csuite_core_sellers {
        int seller_id PK
        string name
        string email
    }

    csuite_core_revendas {
        int revenda_id PK
        int seller_id FK
        string nome
        string cidade
        string estado
    }

    context_radar_features_revenda_rfr {
        int revenda_id PK
        int recency_days
        int freq_90d
        decimal revenue_90d
        decimal score_rfr
        string class_risco
        string class_valor
    }

    context_radar_tasks_seller_day {
        int task_id PK
        date ref_date
        int seller_id FK
        int revenda_id FK
        string prioridade
        string tipo_acao
        string motivo
        string status
        json decision_payload
    }

Diagrama de Comunicação entre Apps

graph LR
    subgraph "Apps Principais"
        A[4c]
        B[csuite-executive]
        C[4c-suite]
        D[csuite-context]
        E[csuite-sales-manager]
    end

    subgraph "Comunicação HTTP"
        C -->|"GET /4c-suite/decisions/summary"| A
        C -->|"GET /dashboard/summary"| B
        C -->|"GET /monitoring/summary"| B
        E -->|"POST /4c/decide"| A
    end

    subgraph "Comunicação via Banco"
        A -.->|outbox_events| B
        A -.->|core_orders| B
        B -.->|policy_rules| A
        A -.->|core_*| D
        B -.->|csuite.*| D
        E -.->|csuite.*| B
        E -.->|context_radar.*| B
    end

    subgraph "Comunicação via Eventos"
        A -->|Kafka events| B
        A -->|Kafka events| D
    end

    style A fill:#4A90E2
    style B fill:#50C878
    style C fill:#FFB84D
    style D fill:#9B59B6
    style E fill:#E74C3C

Diagrama de Portas e Domínios

graph TB
    subgraph "Desenvolvimento Local"
        L4C[4c<br/>localhost:8080-8085]
        LCS[csuite-executive<br/>localhost:8000]
        L4CS[4c-suite<br/>localhost:8000]
        LCTX[csuite-context<br/>localhost:8000]
        LSALES[csuite-sales-manager<br/>localhost:8001/8002]
    end

    subgraph "Produção (Traefik)"
        PCS[csuite.internut.com.br<br/>:443]
        PCTX[csuite-context.internut.com.br<br/>:443]
        PSALES1[sales-manager.internut.com.br<br/>:443]
        PSALES2[sales-decision.internut.com.br<br/>:443]
    end

    subgraph "Rede Interna Docker Swarm"
        DCS[csuite-api:8000]
        DCTX[csuite-context-api:8000]
        DSALES1[sales-manager-api:8000]
        DSALES2[sales-decision-api:8000]
    end

    PCS --> DCS
    PCTX --> DCTX
    PSALES1 --> DSALES1
    PSALES2 --> DSALES2

    style L4C fill:#E8F4F8
    style LCS fill:#E8F4F8
    style L4CS fill:#E8F4F8
    style LCTX fill:#E8F4F8
    style LSALES fill:#E8F4F8
    style PCS fill:#D4EDDA
    style PCTX fill:#D4EDDA
    style PSALES1 fill:#D4EDDA
    style PSALES2 fill:#D4EDDA

Legenda e Convenções

Cores dos Apps

Tipos de Comunicação

Schemas de Banco


Notas de Arquitetura

Princípios de Design

  1. Separação de Responsabilidades
  2. 4c: Decisões no nível cliente (micro)
  3. csuite-executive: Decisões no nível organização (macro)
  4. 4c-suite: Orquestração e visão consolidada

  5. Comunicação Assíncrona

  6. Eventos via Kafka/Debezium para desacoplamento
  7. Outbox pattern para garantia de entrega

  8. Banco de Dados Compartilhado

  9. Todos os apps usam a mesma instância RDS
  10. Schemas separados por domínio
  11. Sincronização via scripts/jobs

  12. API Gateway (Traefik)

  13. Roteamento baseado em host
  14. SSL/TLS automático (Let's Encrypt)
  15. Load balancing

Pontos de Atenção

⚠️ Sincronização 4C → C-Suite: Script sync_4c_to_csuite.py ainda não implementado

⚠️ Policy Engine: Políticas do C-Suite não estão sendo aplicadas no 4C

⚠️ Service Discovery: URLs hardcoded em alguns lugares


Última atualização: 2025-12-01

🔊 Text-to-Speech

1.0x
1.0
Pronto para reproduzir