Pular para conteĆŗdo

šŸ”„ 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

  • Query Complexa - MĆŗltiplos JOINs para agregar dados
  • Filtro de Dias - Opcional, filtra por intervalo de dias
  • Ordenação - Por dia, documento e lanƧamento
  • Projeção - Apenas campos necessĆ”rios (DTO interface)

šŸ”„ 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