Documentação Técnica — ecosif-database

Público-alvo: Desenvolvedores
Módulo: ecosif-database (biblioteca JAR)


1. Natureza do Módulo

O ecosif-database não é uma aplicação Spring Boot executável. É uma biblioteca Maven (packaging: jar) que centraliza as entidades JPA e utilitários de domínio compartilhados pelos serviços do ecossistema ds-ecosif.

Aspecto Descrição
Packaging jar (sem spring-boot-maven-plugin)
Conteúdo Entidades JPA, utilitários (ex.: ChartOfAccountsComparator)
Consumidores ecosif-auth, ecosif-masterdata, ecosif-moviments, ecosif-querys, ecosif-reports, ecosif-compliance, etc.

2. Design de Camadas nos Consumidores

Os serviços que dependem desta biblioteca seguem o padrão em camadas. O ecosif-database fornece apenas a camada de modelo (entidades); Controller, Service e Repository ficam nos próprios serviços.

flowchart TB
    subgraph Servico["Serviço consumidor (ex: ecosif-masterdata)"]
        C[Controller]
        S[Service]
        R[Repository]
    end
    subgraph Lib["ecosif-database (JAR)"]
        E[Entidades JPA]
        U[Utilitários]
    end
    C --> S
    S --> R
    R --> E
    S --> U

Esta biblioteca não contém Controller, Service nem Repository — apenas model e util.


3. Como os Módulos Consomem a lib ecosif-database

3.1 Dependência Maven

No pom.xml do serviço:

<dependency>
    <groupId>io.ecosif.database</groupId>
    <artifactId>ecosif-database</artifactId>
    <version>0.7.01.202512010</version>
</dependency>

O JAR pode ser resolvido pelo repositório local (mvn install) ou pelo CodeArtifact (conforme distributionManagement no pom.xml da lib).

3.2 Entity Scan e Repositories

O serviço precisa escanear as entidades desta lib e definir onde estão os repositórios (no pacote do serviço):

@SpringBootApplication
@EntityScan(basePackages = "io.ecosif.database")
@EnableJpaRepositories(basePackages = "io.ecosif.masterdata") // pacote do serviço
public class Application {
    // ...
}

3.3 Fluxo de Uso da Biblioteca

sequenceDiagram
    participant App as Aplicação consumidora
    participant EntityScan as EntityScan
    participant Repo as Repository (no serviço)
    participant DB as PostgreSQL

    App->>EntityScan: Inicialização Spring
    EntityScan->>EntityScan: Carrega io.ecosif.database.*
    App->>Repo: findById(Company, 1L)
    Repo->>DB: SELECT ... FROM gr_empresa
    DB-->>Repo: ResultSet
    Repo-->>App: Company (entidade da lib)

4. DTOs vs Projections

4.1 Papel desta Biblioteca

O ecosif-database expõe apenas entidades JPA (e um utilitário). Não define DTOs nem interfaces de projection.

Abordagem Onde é usada Responsável
Entidades Persistência, mapeamento ORM ecosif-database
DTOs API REST, contratos entre serviços Cada serviço consumidor
Projections Consultas que retornam subconjuntos de campos Cada serviço consumidor

4.2 Boas Práticas nos Serviços Consumidores


5. Estrutura de Pacotes e Entidades

io.ecosif.database
├── company/
│   ├── model/          # Entidades de domínio contábil e cadastral
│   │   ├── Company.java       → gr_empresa
│   │   ├── Branch.java       → gr_filial
│   │   ├── ChartOfAccounts.java → ct_plano
│   │   ├── Entry.java        → ct_lancamento
│   │   ├── Document.java     → ct_documentos
│   │   ├── Batch.java        → ct_lote
│   │   └── ... (50+ entidades)
│   └── util/
│       └── ChartOfAccountsComparator.java
└── user/
    └── model/
        └── User.java   → gr_user

5.1 Diagrama de Entidades Principais (Domínio Contábil)

erDiagram
    Company ||--o{ Branch : "possui"
    Company ||--o{ ChartOfAccounts : "plano de contas"
    Branch ||--o{ Batch : "lotes"
    Batch ||--o{ Document : "documentos"
    Document ||--o{ Entry : "lançamentos"
    ChartOfAccounts ||--o{ Entry : "conta"
    User }o--|| UserCompanyBranch : "acesso"
    Branch ||--o{ UserCompanyBranch : "filial"
    Company ||--o{ UserCompanyBranch : "empresa"

    Company : Long id
    Company : String taxId
    Company : String fiscalName
    Branch : Long id
    Branch : String company
    Branch : String branch
    ChartOfAccounts : Long id
    ChartOfAccounts : String cdAccounting
    Document : Long id
    Document : Long batchId
    Entry : Long id
    Entry : Long documentId
    Entry : Long contaId
    Batch : Long id
    User : Long id

6. Tecnologias e Dependências

Tecnologia Versão Uso na biblioteca
Java 17 Linguagem
Spring Boot (parent) 2.7.18 BOM e convenções
Spring Data JPA 2.7.x Anotações JPA e suporte a entidades
PostgreSQL Driver runtime Compatibilidade com o banco do ecossistema
Lombok 1.18.30 Getters/Setters/ToString nas entidades
Hibernate Validator - Validações JSR-303 (@NotNull, @Size, etc.)
JJWT 0.11.5 Suporte a JWT (usado pelos consumidores que compartilham o classpath)
ModelMapper 3.1.0 Mapeamento (uso nos serviços)
Apache Commons Lang3 3.12.0 Utilitários
AWS (Secrets Manager, etc.) 2.4.2 / 3.0.1 Configuração em serviços que usam a lib

7. Utilitário: ChartOfAccountsComparator

Ordenação numérica de códigos de plano de contas (ex.: 1.1, 1.2.1, 1.10.1), evitando ordenação alfabética incorreta.

Exemplo de uso no serviço:

import io.ecosif.database.company.util.ChartOfAccountsComparator;

List<String> accountCodes = Arrays.asList("1.10.1", "1.1", "1.2.1");
accountCodes.sort(new ChartOfAccountsComparator());
// Resultado: ["1.1", "1.2.1", "1.10.1"]

8. Convenções de Código

Para variáveis de ambiente, requisitos de infra e logs, veja ../deploy/variaveis_e_logs.md. Para visão de negócio e glossário, veja ../user/visao_geral.md.