🔄 Fluxos - ecosif-moviments

📋 Visão Geral

Este documento descreve os principais fluxos de processamento do serviço ecosif-moviments.


🔄 Fluxo 1: Criar Lançamento Contábil

Descrição

Fluxo completo para criar um lançamento contábil, incluindo validações de partidas dobradas.

Diagrama de Sequência

sequenceDiagram
    participant Client as Cliente
    participant Controller as EntryController
    participant Service as EntryService
    participant DocService as DocumentService
    participant BatchService as BatchService
    participant CalendarService as CalendarService
    participant EntryRepo as EntryRepository
    participant DocRepo as DocumentRepository
    participant BatchRepo as BatchRepository
    participant DB as PostgreSQL

    Client->>Controller: POST /entry (EntryDTO)
    Controller->>Controller: Valida entrada (@Valid)
    Controller->>Service: createEntry(entryDTO)

    Service->>DocRepo: findById(documentId)
    DocRepo->>DB: SELECT * FROM ct_documentos
    DB-->>DocRepo: Document entity
    DocRepo-->>Service: Document

    Service->>BatchRepo: findById(batchId)
    BatchRepo->>DB: SELECT * FROM ct_lote
    DB-->>BatchRepo: Batch entity
    BatchRepo-->>Service: Batch

    Service->>CalendarService: validatePeriodOpen(company, branch, month, year)
    CalendarService-->>Service: Período válido

    Service->>Service: Valida conta contábil
    Service->>Service: Valida partidas dobradas
    Service->>EntryRepo: save(entry)
    EntryRepo->>DB: INSERT INTO ct_lancamento
    DB-->>EntryRepo: Entry salvo
    EntryRepo-->>Service: Entry entity

    Service->>Service: Transforma Entry → EntryDTO
    Service-->>Controller: EntryDTO
    Controller-->>Client: 201 Created

Validações Realizadas

  1. Validação de entrada (JSR-303)
  2. Documento existe
  3. Lote existe e está aberto
  4. Período está aberto (não consolidado)
  5. Conta contábil existe e está ativa
  6. Partidas dobradas (soma débitos = soma créditos)

🔄 Fluxo 2: Importação de Arquivo CSV

Descrição

Fluxo de importação de lançamentos via arquivo CSV.

Diagrama de Sequência

sequenceDiagram
    participant Client as Cliente
    participant Controller as BatchImportController
    participant Service as BatchImportService
    participant Parser as CSV Parser
    participant Validator as Entry Validator
    participant EntryService as EntryService
    participant EntryRepo as EntryRepository
    participant S3Service as S3Service
    participant S3 as AWS S3
    participant DB as PostgreSQL

    Client->>Controller: POST /batch/{id}/import (file)
    Controller->>Service: importEntries(batchId, file, dryRun)

    alt dryRun = false
        Service->>Parser: parseCSV(file)
        Parser-->>Service: List<EntryDTO>

        loop Para cada entrada
            Service->>Validator: validate(entryDTO)
            Validator-->>Service: Validação OK ou erro
        end

        Service->>EntryRepo: saveAll(validEntries)
        EntryRepo->>DB: INSERT múltiplos
        DB-->>EntryRepo: Entries salvos

        Service->>S3Service: uploadFile(file, "imported/")
        S3Service->>S3: PUT object
        S3-->>S3Service: Upload OK

    else dryRun = true
        Service->>Parser: parseCSV(file)
        Parser-->>Service: List<EntryDTO>
        Service->>Service: Apenas valida (não salva)
    end

    Service->>Service: Gera ImportResultDTO
    Service-->>Controller: ImportResultDTO
    Controller-->>Client: 200 OK

Etapas

  1. Upload do arquivo via multipart/form-data
  2. Parse do CSV em objetos EntryDTO
  3. Validação de cada entrada
  4. Persistência (se não for dryRun)
  5. Upload para S3 (pasta imported/)
  6. Retorno com estatísticas

🔄 Fluxo 3: Consolidação Contábil

Descrição

Fluxo assíncrono de consolidação contábil de um período.

Diagrama de Sequência

sequenceDiagram
    participant Client as Cliente
    participant Controller as ConsolidationController
    participant Service as ConsolidationService
    participant Async as @Async Executor
    participant EntryRepo as EntryRepository
    participant BalanceService as AccountBalanceService
    participant BalanceRepo as AccountBalanceRepository
    participant CalendarService as CalendarService
    participant CalendarRepo as CalendarRepository
    participant DB as PostgreSQL

    Client->>Controller: POST /runconsolidation
    Controller->>Service: runConsolidation(dto)
    Service->>Async: executeAsync(consolidationTask)
    Service-->>Controller: 200 OK (iniciado)
    Controller-->>Client: 200 OK

    Note over Async,DB: Processamento Assíncrono

    Async->>Service: processConsolidation(dto)
    Service->>EntryRepo: findByBatchPeriod(company, branch, year, month)
    EntryRepo->>DB: SELECT * FROM ct_lancamento WHERE...
    DB-->>EntryRepo: List<Entry>
    EntryRepo-->>Service: Entries

    Service->>Service: Agrupa por conta contábil
    Service->>Service: Calcula saldos (débito - crédito)

    loop Para cada conta
        Service->>BalanceService: updateBalance(contaId, saldo)
        BalanceService->>BalanceRepo: saveOrUpdate(balance)
        BalanceRepo->>DB: INSERT/UPDATE ct_plano_saldo
    end

    Service->>CalendarService: markAsConsolidated(company, branch, month, year)
    CalendarService->>CalendarRepo: updateConsolidated(calendar)
    CalendarRepo->>DB: UPDATE ct_calendario SET consolidated=true

    Service->>Service: Log de conclusão

Características


🔄 Fluxo 4: Cálculo de Cotas Tributárias

Descrição

Fluxo para calcular valor de cotas de fundos de investimento.

Diagrama de Sequência

sequenceDiagram
    participant Client as Cliente
    participant Controller as TaxQuotaCalculationController
    participant Service as TaxQuotaCalculationService
    participant OptionsRepo as CompanyOptionsRepository
    participant CalendarRepo as CalendarRepository
    participant EquityRepo as EquityAccountRepository
    participant QuotaConfigRepo as QuotaCalculationConfigurationRepository
    participant BalanceService as AccountBalanceService
    participant DB as PostgreSQL

    Client->>Controller: GET /taxquotacalculation/{company}/{branch}?confirmed=false
    Controller->>Service: calculateQuota(company, branch, confirmed)

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

    Service->>Service: Valida: usa calendário?
    Service->>CalendarRepo: findByCompanyAndBranchAndMonthAndYear(...)
    CalendarRepo->>DB: SELECT * FROM ct_calendario
    DB-->>Service: Calendar

    Service->>Service: Valida: mês consolidado?
    Service->>Service: Busca dia livre (indicator.indexOf("0"))

    Service->>EquityRepo: findByCompanyAndBranch(company, branch)
    EquitRepo->>DB: SELECT * FROM ct_conta_patrimonio
    DB-->>Service: List<EquityAccount>

    Service->>BalanceService: calculatePatrimonioLiquido(accounts)
    BalanceService-->>Service: Valor do PL

    Service->>QuotaConfigRepo: findByCompanyAndBranch(company, branch)
    QuotaConfigRepo->>DB: SELECT * FROM ct_parametro_fundo
    DB-->>Service: QuotaCalculationConfiguration

    Service->>Service: Calcula número de cotas
    Service->>Service: Calcula valor da cota (PL / número de cotas)

    alt confirmed = false
        Service-->>Controller: Preview (302 Found)
        Controller-->>Client: [data, valorCota, PL, numCotas]
    else confirmed = true
        Service->>QuotaConfigRepo: updateQuotaValue(...)
        Service->>QuotaDetailsService: saveQuotaDetails(...)
        Service-->>Controller: 200 OK
        Controller-->>Client: 200 OK
    end

Validações

  1. Opções da empresa existem
  2. Usa calendário (useCalendar = true)
  3. Mês consolidado (consolidated = true)
  4. Dia livre disponível no calendário
  5. Contas PL configuradas
  6. Patrimônio líquido positivo
  7. Número de cotas > 0

🔄 Fluxo 5: Abertura de Novo Mês

Descrição

Fluxo para abrir um novo período contábil.

Diagrama de Sequência

sequenceDiagram
    participant Client as Cliente
    participant Controller as MonthOpeningController
    participant OptionsRepo as CompanyOptionsRepository
    participant CalendarRepo as CalendarRepository
    participant BatchRepo as BatchRepository
    participant DB as PostgreSQL

    Client->>Controller: POST /monthOpening/{company}/{branch}
    Controller->>OptionsRepo: findByCompanyAndBranch(company, branch)
    OptionsRepo->>DB: SELECT * FROM ct_controle
    DB-->>OptionsRepo: CompanyOptions
    OptionsRepo-->>Controller: Options

    Controller->>Controller: Atualiza currentYearMonth
    Controller->>OptionsRepo: save(options)

    Controller->>Controller: Verifica se calendário existe
    Controller->>CalendarRepo: findByCompanyAndBranchAndMonthAndYear(...)

    alt Calendário não existe
        Controller->>Controller: Cria novo calendário
        Controller->>Controller: Gera indicadores de dias (2=fechado, 0=livre, 1=fds, *=futuro)
        Controller->>CalendarRepo: save(calendar)
        CalendarRepo->>DB: INSERT INTO ct_calendario
    end

    Controller->>BatchRepo: findByCompanyAndBranchOrderByBatchAsc(...)
    BatchRepo->>DB: SELECT * FROM ct_lote ORDER BY...
    DB-->>BatchRepo: List<Batch>
    BatchRepo-->>Controller: Batches

    Controller->>Controller: Calcula primeiro/último lançamento
    Controller->>Controller: Monta MonthOpeningDTO
    Controller-->>Client: 201 Created

🔄 Fluxo 6: Purging de Dados

Descrição

Fluxo para arquivar ou restaurar dados antigos (purge).

Diagrama de Sequência

sequenceDiagram
    participant Client as Cliente
    participant Controller as PurgingController
    participant Service as PurgingService
    participant BranchRepo as BranchRepository
    participant OptionsRepo as CompanyOptionsRepository
    participant CalendarRepo as CalendarRepository
    participant HistoryService as History Service
    participant S3Service as S3Service
    participant S3 as AWS S3
    participant DB as PostgreSQL

    Client->>Controller: POST /purging (PurgingDTO)
    Controller->>BranchRepo: findAllById(selectedBranchIds)
    BranchRepo->>DB: SELECT * FROM gr_filial
    DB-->>BranchRepo: List<Branch>

    loop Para cada empresa/filial
        Controller->>OptionsRepo: findByCompanyAndBranch(...)
        Controller->>Service: purgeData(company, branch, ...)

        alt doSend = true (Enviar para histórico)
            Service->>CalendarRepo: getCalEntryForPurging(...)
            Service->>Service: Valida: todos consolidados?

            Service->>HistoryService: moveToHistory(...)
            HistoryService->>DB: INSERT INTO ct_histo_*
            HistoryService->>DB: DELETE FROM ct_lancamento
            HistoryService->>DB: DELETE FROM ct_documentos

            Service->>S3Service: uploadDump(...)
            S3Service->>S3: PUT dump file
        else doSend = false (Restaurar do histórico)
            Service->>HistoryService: restoreFromHistory(...)
            HistoryService->>DB: INSERT FROM ct_histo_*
            HistoryService->>DB: DELETE FROM ct_histo_*
        end
    end

    Controller-->>Client: 200 OK (List<String> erros)

📊 Resumo dos Fluxos

Fluxo Tipo Assíncrono Complexidade
Criar Lançamento Síncrono Média
Importação CSV Síncrono Alta
Consolidação Assíncrono Alta
Cálculo Cotas Síncrono Alta
Abertura Mês Síncrono Baixa
Purging Síncrono Alta

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