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
- Controller: expõe REST; recebe/retorna DTOs ou IDs; chama Service.
- Service: regras de negócio; usa Repository (entidades desta lib) e utilitários (ex.:
ChartOfAccountsComparator). - Repository: interfaces Spring Data JPA nos serviços; tipo das entidades vem do ecosif-database.
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 {
// ...
}
@EntityScan("io.ecosif.database")— carrega todas as entidades JPA do JAR.@EnableJpaRepositories— aponta para o pacote onde estão as interfacesJpaRepositorydo serviço (que usam as entidades da lib).
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
- Não expor entidades JPA diretamente na API REST — usar DTOs para controle de campos e versão do contrato.
- Projections (Spring Data) — para listagens e relatórios que não precisam da entidade inteira, reduzindo carga e N+1:
- Interface projection:
interface CompanySummary { Long getId(); String getFiscalName(); } - Class-based (DTO) projection quando precisar de construtor ou lógica.
- ModelMapper / MapStruct — mapear Entidade ↔ DTO nos serviços; a lib já traz
modelmappercomo dependência indireta (usada nos serviços que a consomem).
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
- Entidades:
javax.persistence.*(JPA 2.x), Lombok@Getter,@Setter,@ToString. - Nomes de tabelas: prefixos
gr_*(cadastros gerais),ct_*(contábil). - IDs:
@GeneratedValue(strategy = GenerationType.IDENTITY). - Validação:
@NotNull,@Sizeonde aplicável.
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.