Fluxos do Sistema - ecosif-masterdata

Visão Geral

Este documento descreve os principais fluxos de execução do sistema ecosif-masterdata.


1. Fluxo de Criação de Empresa

sequenceDiagram
    participant C as Cliente
    participant CC as CompanyController
    participant CS as CompanyService
    participant IS as IntegrationService
    participant CR as CompanyRepository
    participant DB as Database

    C->>CC: POST /company<br/>{name, cnpj, zipCode}

    CC->>CC: Validar DTO (Bean Validation)

    CC->>CS: save(companyDTO)

    CS->>IS: validateCNPJ(cnpj) [opcional]
    IS-->>CS: CNPJ válido

    CS->>CR: existsByCnpj(cnpj)
    CR->>DB: SELECT COUNT(*) WHERE cnpj = ?
    DB-->>CR: count
    CR-->>CS: boolean

    alt CNPJ já existe
        CS-->>CC: Exception (CNPJ duplicado)
        CC-->>C: 409 Conflict
    else CNPJ não existe
        CS->>CS: Criar entidade Company

        CS->>CR: save(company)
        CR->>DB: INSERT INTO gr_empresa ...
        DB-->>CR: Company (com ID)
        CR-->>CS: Company

        CS->>CS: Mapear para DTO

        CS-->>CC: CompanyDTO
        CC-->>C: 201 Created + CompanyDTO
    end

2. Fluxo de Criação de Filial

sequenceDiagram
    participant C as Cliente
    participant BC as BranchController
    participant BS as BranchService
    participant CR as CompanyRepository
    participant BR as BranchRepository
    participant COS as CompanyOptionsService
    participant DB as Database

    C->>BC: POST /branch<br/>{company, branch, name}

    BC->>BS: save(branchDTO)

    BS->>CR: existsById(company)
    CR->>DB: SELECT * WHERE id = ?
    DB-->>CR: Company ou null
    CR-->>BS: boolean

    alt Empresa não existe
        BS-->>BC: Exception
        BC-->>C: 404 Not Found
    else Empresa existe
        BS->>BR: findByCompanyAndBranch(company, branch)
        BR->>DB: SELECT * WHERE company = ? AND branch = ?
        DB-->>BR: Branch ou null
        BR-->>BS: Branch ou null

        alt Código de filial já existe
            BS-->>BC: Exception (Código duplicado)
            BC-->>C: 409 Conflict
        else Código não existe
            BS->>BS: Criar entidade Branch

            BS->>BR: save(branch)
            BR->>DB: INSERT INTO gr_filial ...
            DB-->>BR: Branch (com ID)
            BR-->>BS: Branch

            Note over BS: Criar registros necessários

            BS->>COS: createDefaultOptions(company, branch)
            COS->>DB: INSERT INTO ct_controle ...
            DB-->>COS: CompanyOptions criado

            BS->>BS: Mapear para DTO
            BS-->>BC: BranchDTO
            BC-->>C: 201 Created + BranchDTO
        end
    end

3. Fluxo de Criação de Conta no Plano de Contas

sequenceDiagram
    participant C as Cliente
    participant COAC as ChartOfAccountsController
    participant COAS as ChartOfAccountsService
    participant COAR as ChartOfAccountsRepository
    participant DB as Database

    C->>COAC: POST /chartOfAccounts<br/>{plan, cdAccounting, ...}

    COAC->>COAS: save(chartOfAccountsDTO, confirmed)

    COAS->>COAS: Validar código único

    COAS->>COAR: findByPlanAndCdAccounting(plan, cdAccounting)
    COAR->>DB: SELECT * WHERE plan = ? AND cd_accounting = ?
    DB-->>COAR: ChartOfAccounts ou null
    COAR-->>COAS: ChartOfAccounts ou null

    alt Código já existe
        COAS-->>COAC: Exception
        COAC-->>C: 406 Not Acceptable
    else Código não existe
        COAS->>COAS: Extrair conta pai do código

        alt Tem conta pai
            COAS->>COAR: findByPlanAndCdAccounting(plan, parentAcc)
            COAR->>DB: SELECT * WHERE plan = ? AND cd_accounting = ?
            DB-->>COAR: ChartOfAccounts ou null
            COAR-->>COAS: ChartOfAccounts ou null

            alt Conta pai não existe
                COAS-->>COAC: Exception (Pai não encontrado)
                COAC-->>C: 406 Not Acceptable
            else Conta pai existe
                alt Conta pai tem filhos E não confirmado
                    COAS-->>COAC: Exception (Pai tem filhos)
                    COAC-->>C: 406 Not Acceptable
                else OK
                    COAS->>COAS: Calcular nível e criar conta
                    COAS->>COAR: save(account)
                    COAR->>DB: INSERT INTO ct_plano_contas ...
                    DB-->>COAR: ChartOfAccounts
                    COAR-->>COAS: ChartOfAccounts
                    COAS-->>COAC: ChartOfAccountsDTO
                    COAC-->>C: 201 Created
                end
            end
        else Conta raiz
            COAS->>COAS: Criar conta raiz
            COAS->>COAR: save(account)
            COAR->>DB: INSERT INTO ct_plano_contas ...
            DB-->>COAR: ChartOfAccounts
            COAR-->>COAS: ChartOfAccounts
            COAS-->>COAC: ChartOfAccountsDTO
            COAC-->>C: 201 Created
        end
    end

4. Fluxo de Criação de Lançamento

sequenceDiagram
    participant C as Cliente
    participant EC as EntryController
    participant ES as EntryService
    participant DS as DocumentService
    participant CS as CalendarService
    participant COAS as ChartOfAccountsService
    participant ER as EntryRepository
    participant DB as Database

    C->>EC: POST /entry<br/>{documentId, account, history, debit, credit}

    EC->>ES: save(entryDTO)

    ES->>DS: findById(documentId)
    DS->>DB: SELECT * FROM ct_documento WHERE id = ?
    DB-->>DS: Document
    DS-->>ES: Document

    alt Documento não existe
        ES-->>EC: Exception
        EC-->>C: 404 Not Found
    else Documento existe
        ES->>ES: Obter Batch do Documento

        ES->>CS: validateDay(company, branch, day, month, year)
        CS->>DB: SELECT * FROM ct_calendario WHERE ...
        DB-->>CS: Calendar
        CS-->>ES: boolean (dia disponível)

        alt Dia não disponível
            ES-->>EC: Exception
            EC-->>C: 417 Expectation Failed
        else Dia disponível
            ES->>COAS: findByPlanAndCdAccounting(plan, account)
            COAS->>DB: SELECT * FROM ct_plano_contas WHERE ...
            DB-->>COAS: ChartOfAccounts
            COAS-->>ES: ChartOfAccounts

            alt Conta não existe
                ES-->>EC: Exception
                EC-->>C: 400 Bad Request
            else Conta existe
                ES->>ES: Criar entidade Entry

                ES->>ER: save(entry)
                ER->>DB: INSERT INTO ct_lancamento ...
                DB-->>ER: Entry (com ID)
                ER-->>ES: Entry

                ES->>ES: Mapear para DTO
                ES-->>EC: EntryDTO
                EC-->>C: 201 Created + EntryDTO
            end
        end
    end

5. Fluxo de Consolidação Contábil

sequenceDiagram
    participant C as Cliente
    participant CC as ConsolidationController
    participant CS as ConsolidationService
    participant ES as EntryService
    participant ABS as AccountBalanceService
    participant DB as Database

    C->>CC: POST /runconsolidation<br/>{company, branch, month, year}

    CC->>CS: runConsolidation(dto)

    CS->>CS: Validar período fechado

    alt Período não fechado
        CS-->>CC: Exception
        CC-->>C: 400 Bad Request
    else Período fechado
        CS->>CS: Iniciar processamento assíncrono

        CS-->>CC: GenericResponse (sucesso)
        CC-->>C: 200 OK

        Note over CS,DB: Processamento em background

        CS->>ES: findAllByCompanyAndBranchAndMonthAndYear(...)
        ES->>DB: SELECT * FROM ct_lancamento WHERE ...
        DB-->>ES: List<Entry>
        ES-->>CS: List<Entry>

        loop Para cada entrada
            CS->>ABS: calculateBalance(entry)
            ABS->>DB: UPDATE ct_saldos SET ...
            DB-->>ABS: Balance atualizado
        end

        CS->>CS: Atualizar saldos consolidados
        CS->>DB: UPDATE ct_saldos_mensais ...
        DB-->>CS: Consolidado
    end

6. Fluxo de Validação de Token JWT

sequenceDiagram
    participant C as Cliente
    participant TAF as TokenAuthenticationFilter
    participant TP as TokenProvider
    participant US as UserService
    participant UR as UserRepository
    participant DB as Database
    participant SC as SecurityContext
    participant E as Endpoint

    C->>TAF: GET /companies<br/>Authorization: Bearer <token>

    TAF->>TAF: Extrair token do header

    alt Token não encontrado
        TAF-->>C: 401 Unauthorized
    else Token encontrado
        TAF->>TP: validateToken(token)

        alt Token inválido
            TP-->>TAF: false
            TAF-->>C: 401 Unauthorized
        else Token válido
            TP-->>TAF: true

            TAF->>TP: getUserIdFromToken(token)
            TP-->>TAF: username

            TAF->>US: findUserByUsername(username)
            US->>UR: findByUsername(username)
            UR->>DB: SELECT * FROM gr_user WHERE username = ?
            DB-->>UR: User
            UR-->>US: User
            US-->>TAF: User

            TAF->>TAF: Criar Authentication

            TAF->>SC: setAuthentication(authentication)

            TAF->>E: Continua para endpoint

            E->>E: Processa requisição
            E-->>C: 200 OK + Response
        end
    end

Resumo dos Fluxos

Fluxo Endpoint Descrição
Criação de Empresa POST /company Cria empresa com validação de CNPJ
Criação de Filial POST /branch Cria filial e registros dependentes
Criação de Conta POST /chartOfAccounts Cria conta no plano com validação de hierarquia
Criação de Lançamento POST /entry Cria lançamento com validações
Consolidação POST /runconsolidation Processa consolidação contábil
Validação Token Todos os endpoints protegidos Validação automática de JWT