🔄 Fluxos - ecosif-querys

📋 Visão Geral

Este documento descreve os principais fluxos de consulta do serviço ecosif-querys.


🔄 Fluxo 1: Consulta de Saldo Detalhado

Descrição

Consulta os detalhes de saldo de uma conta contábil para um período específico, incluindo movimentações mensais e saldo de abertura.

Diagrama de Sequência

sequenceDiagram
    participant Client as Cliente
    participant Controller as BalanceInquiryController
    participant AccessService as AccessValidationService
    participant OptionsRepo as CompanyOptionsRepository
    participant BalanceRepo as MonthlyAccountBalanceRepository
    participant AccountRepo as AccountbalanceRepository
    participant DB as PostgreSQL

    Client->>Controller: POST /balanceInquiryDetails (DTO)
    Controller->>Controller: Valida entrada (@Valid)

    Controller->>AccessService: validateUserAccess(user, empresa, filial)
    AccessService->>AccessService: Busca UserCompanyBranch
    AccessService->>AccessService: Verifica grupos do usuário
    alt Sem acesso
        AccessService-->>Controller: ForbiddenException (403)
        Controller-->>Client: 403 Forbidden
    else Com acesso
        AccessService-->>Controller: OK

        Controller->>OptionsRepo: findByCompanyAndBranch(empresa, filial)
        OptionsRepo->>DB: SELECT * FROM ct_controle
        DB-->>OptionsRepo: CompanyOptions
        OptionsRepo-->>Controller: Options

        Controller->>Controller: Valida formatos de data
        Controller->>Controller: Calcula baseYearMonth

        Controller->>BalanceRepo: findAccountBalanceByYearAndMonthRange(...)
        BalanceRepo->>DB: SELECT * FROM ct_plano_saldo WHERE empresa=? AND filial=? AND conta_id=? AND ano_mes BETWEEN ? AND ?
        DB-->>BalanceRepo: List<MonthlyAccountBalance>
        BalanceRepo-->>Controller: Balances mensais

        alt anomesini == baseYearMonth
            Controller->>AccountRepo: findByCompanyAndBranchAndContaId(...)
            AccountRepo->>DB: SELECT * FROM ct_plsaldos WHERE empresa=? AND filial=? AND conta_id=?
            DB-->>AccountRepo: Accountbalance
            AccountRepo-->>Controller: Saldo inicial de Accountbalance
        else anomesini != baseYearMonth
            Controller->>BalanceRepo: findInitialAccountBalanceByInitialYearMonth(...)
            BalanceRepo->>DB: SELECT accumulated_balance FROM ct_plano_saldo WHERE ano_mes < ?
            DB-->>BalanceRepo: Saldo anterior
            BalanceRepo-->>Controller: Saldo acumulado anterior
        end

        Controller->>Controller: Monta BalanceInquiryResponseDTO para cada mês
        Controller->>Controller: Define openingBalance em todas as respostas
        Controller-->>Client: 200 OK (List<BalanceInquiryResponseDTO>)
    end

Validações Realizadas

  1. Autenticação - Token JWT válido
  2. Validação de Acesso - Usuário tem acesso à empresa/filial
  3. Formato de Data - MM/YYYY
  4. Range de Datas - anomesini <= anomesfim
  5. Empresa/Filial - Existem e têm configurações

🔄 Fluxo 2: Consulta de Razão Geral (Diário)

Descrição

Consulta a razão geral (diário) de uma conta contábil com detalhamento de lançamentos, permitindo filtrar por intervalo de dias.

Diagrama de Sequência

sequenceDiagram
    participant Client as Cliente
    participant Controller as BalanceInquiryController
    participant AccessService as AccessValidationService
    participant InquiryRepo as InquiryRepository
    participant DB as PostgreSQL

    Client->>Controller: POST /generalLedgerQuery (DTO)
    Controller->>Controller: Valida entrada (@Valid)

    Controller->>AccessService: validateUserAccess(user, empresa, filial)
    AccessService-->>Controller: Acesso válido

    Controller->>Controller: Valida range de dias (dayStart <= dayEnd)

    Controller->>InquiryRepo: findAccountBalanceByYearAndMonthRange(contaId, empresa, filial, year, month, dayStart, dayEnd)

    InquiryRepo->>DB: SELECT 
                       l.lancamento, l.debcre, l.diareferencia,
                       d.documento, d.texto,
                       b.lote,
                       p.cdcontabil, p.descricao,
                       l.valor, l.historico
                     FROM ct_lancamento l
                     JOIN ct_documentos d ON l.docto_id = d.docto_id
                     JOIN ct_lote b ON d.lote_id = b.id
                     JOIN ct_plano p ON l.conta_id = p.conta_id
                     WHERE l.conta_id = ?
                       AND b.empresa = ?
                       AND b.filial = ?
                       AND b.ano = ?
                       AND b.mes = ?
                       AND (l.diareferencia BETWEEN ? AND ? OR ? = 0)
                     ORDER BY l.diareferencia, d.documento, l.lancamento

    DB-->>InquiryRepo: ResultSet (dados agregados)
    InquiryRepo->>InquiryRepo: Mapeia para GeneralLedgerQueryResponseDTO
    InquiryRepo-->>Controller: List<GeneralLedgerQueryResponseDTO>

    Controller-->>Client: 200 OK

Características


🔄 Fluxo 3: Listar Plano de Contas

Descrição

Lista o plano de contas completo de uma empresa/filial, ordenado numericamente de forma hierárquica.

Diagrama de Sequência

sequenceDiagram
    participant Client as Cliente
    participant Controller as BalanceInquiryController
    participant AccessService as AccessValidationService
    participant OptionsRepo as CompanyOptionsRepository
    participant ChartRepo as ChartOfAccountsRepository
    participant Comparator as ChartOfAccountsComparator
    participant DB as PostgreSQL

    Client->>Controller: GET /allChartOfAccount/{company}/{branch}

    Controller->>AccessService: validateUserAccess(user, company, branch)
    AccessService-->>Controller: Acesso válido

    Controller->>OptionsRepo: findByCompanyAndBranch(company, branch)
    OptionsRepo->>DB: SELECT * FROM ct_controle
    DB-->>OptionsRepo: CompanyOptions
    OptionsRepo-->>Controller: Options (com chartOfAccount)

    Controller->>Controller: Valida se chartOfAccount está configurado

    Controller->>ChartRepo: findByPlanOrderByCdAccountingAsc(plan)
    ChartRepo->>DB: SELECT * FROM ct_plano WHERE tipo = ? ORDER BY cdcontabil ASC
    DB-->>ChartRepo: List<ChartOfAccounts>
    ChartRepo-->>Controller: Charts

    Controller->>Controller: Transforma em ChartOfAccountsDTO
    Controller->>Comparator: Ordena usando ChartOfAccountsComparator
    Note over Comparator: Ordenação numérica:<br/>1.1 < 1.2 < 1.10
    Comparator-->>Controller: List ordenada numericamente

    Controller-->>Client: 200 OK (List<ChartOfAccountsDTO>)

Ordenação Numérica

O ChartOfAccountsComparator garante ordenação correta: - Divide códigos por ponto (.) - Compara cada parte numericamente - Resultado: "1.1" < "1.2" < "1.10" (não alfabeticamente)


🔐 Fluxo 4: Validação de Acesso

Descrição

Fluxo detalhado de validação de acesso do usuário a uma empresa/filial.

Diagrama de Sequência

sequenceDiagram
    participant Controller
    participant AccessService as AccessValidationService
    participant UserBranchRepo as UserCompanyBranchRepository
    participant UserGroupRepo as UserGroupRepository
    participant BranchRepo as BranchRepository
    participant DB as PostgreSQL

    Controller->>AccessService: validateUserAccess(user, company, branch)

    alt Usuário é ADMIN
        AccessService-->>Controller: OK (admin tem acesso total)
    else Usuário não é ADMIN
        AccessService->>UserBranchRepo: findByUserIdAndCompanyAndBranch(userId, companyId, branchId)
        UserBranchRepo->>DB: SELECT * FROM gr_filial_usuario WHERE user_id=? AND company=? AND branch=?
        DB-->>UserBranchRepo: UserCompanyBranch (se existir)

        alt Tem acesso direto
            AccessService-->>Controller: OK
        else Não tem acesso direto
            AccessService->>UserGroupRepo: findByUserId(userId)
            UserGroupRepo->>DB: SELECT * FROM gr_grupo_usuario WHERE userid=?
            DB-->>UserGroupRepo: List<UserGroup>
            UserGroupRepo-->>AccessService: Groups

            AccessService->>AccessService: Verifica se algum grupo tem acesso
            AccessService->>BranchRepo: Verifica permissões por grupo

            alt Tem acesso via grupo
                AccessService-->>Controller: OK
            else Sem acesso
                AccessService-->>Controller: ForbiddenException (403)
            end
        end
    end

📊 Resumo dos Fluxos

Fluxo Tipo Complexidade Performance
Consulta de Saldo Leitura Média Otimizada
Razão Geral Leitura Alta (JOINs) Otimizada
Plano de Contas Leitura Baixa Muito rápida
Validação de Acesso Leitura Média Cacheável

Última Atualização: 2025-11-27