The Four Layers
Domain Layer (Core Business Logic)
Domain Layer (Core Business Logic)
The innermost layer contains pure business logic with no external dependencies.Location:
src/main/java/com/jsifen/domain/Components:- Models: Pure business entities like
FacturaElectronica - Repository Interfaces: Contracts defining data operations (e.g.,
FacturaRepository,RucRepository) - Domain Services: Business logic utilities (e.g.,
SifenDvCalculator)
domain/model/factura/FacturaElectronica.java- Electronic invoice domain modeldomain/repository/FacturaRepository.java- Invoice repository contractdomain/repository/DERepository.java- Electronic document repository contractdomain/repository/RucRepository.java- RUC query repository contractdomain/service/SifenDvCalculator.java- Verification digit calculator
- No dependencies on frameworks or external libraries
- Contains only business rules and entities
- Defines interfaces (ports) for external implementations
Application Layer (Use Cases)
Application Layer (Use Cases)
Orchestrates business workflows by coordinating domain objects and repository interactions.Location:
src/main/java/com/jsifen/application/usecase/Purpose: Each use case represents a single business operation and coordinates the flow between layers.Key Use Cases:factura/RecibirFacturaUseCase.java- Processes invoice submissionfactura/GenerarXmlFacturaUseCase.java- Generates invoice XMLde/ConsultarDEUseCase.java- Queries electronic documentsruc/ConsultarRucUseCase.java- Queries taxpayer RUC informationlote/ConsultaLoteUseCase.java- Queries batch statusevento/CancelarEventoUseCase.java- Cancels eventsinfo/SifenHealthUseCase.java- Checks SIFEN service health
- Depends only on domain layer
- Contains application-specific business rules
- No knowledge of HTTP, databases, or UI
Infrastructure Layer (Technical Implementation)
Infrastructure Layer (Technical Implementation)
Provides concrete implementations of domain contracts and handles all external integrations.Location:
src/main/java/com/jsifen/infrastructure/Sub-packages:Adapters (infrastructure/adapter/)FacturaRepositoryImpl.java- Implements invoice repositoryDERepositoryImpl.java- Implements DE repositoryRucRepositoryImpl.java- Implements RUC repositoryLoteRepositoryImpl.java- Implements batch repositoryEventoCancelarRepositoryImpl.java- Implements event cancellation repository
infrastructure/soap/)soap/client/lote/LoteClient.java- SOAP client for batch operationssoap/client/de/DEClient.java- SOAP client for DE queriessoap/client/ruc/RucClient.java- SOAP client for RUC queriessoap/signer/SifenXmlSigner.java- XML digital signaturesoap/processor/SifenResponseProcessor.java- SOAP response processing
infrastructure/sifen/xml/)xml/buiilder/SifenFacturaXmlGenerator.java- XML generation for invoicesxml/buiilder/QrNodeBuilder.java- QR code node builderxml/gen/CdcGenerator.java- CDC (control code) generator
infrastructure/config/)config/sifen/SifenProperties.java- SIFEN credentials and settingsconfig/security/SSLConfig.java- SSL/TLS configurationconfig/context/EmisorContext.java- Issuer context management
infrastructure/util/)util/xml/XmlUtils.java- XML manipulation utilitiesutil/time/ClienteNTP.java- NTP time synchronization
- Implements domain repository interfaces
- Handles external communication (SOAP, HTTP)
- Manages technical concerns (XML, encryption, configuration)
Presentation Layer (API Controllers)
Presentation Layer (API Controllers)
Exposes REST endpoints and handles HTTP request/response mapping.Location:
src/main/java/com/jsifen/presentation/rest/REST Resources:factura/AsyncRecibeResource.java- POST/factura/async/recibefactura/FacturaXmlGenerarResource.java- Invoice XML generation endpointconsulta/de/ConsultaDEResource.java- DE query endpointconsulta/ruc/ConsultaRucResource.java- RUC query endpointconsulta/lote/ConsultaLoteResource.java- Batch query endpointevento/cancelar/EventoCancelarResource.java- Event cancellation endpointinfo/SifenHealthResource.java- Health check endpoint
consulta/ruc/dto/request/ConsultaRucRequest.javaconsulta/ruc/dto/response/ConsultarRucResponse.javaevento/cancelar/dto/CancelarRequest.javaevento/cancelar/dto/CancelarResponse.java
- Depends only on application layer
- Handles HTTP concerns (routing, serialization)
- Maps between DTOs and domain models
Data Flow Example: Receiving an Invoice
Let’s trace how JSIFEN processes an invoice submission through all four layers:Step-by-Step Flow
1. Presentation Layer (AsyncRecibeResource)
RecibirFacturaUseCase)
FacturaRepository interface)
FacturaRepositoryImpl)
Benefits of This Architecture
1. Testability
- Domain logic can be tested without frameworks
- Use cases can be tested with mock repositories
- Infrastructure can be tested independently
2. Maintainability
- Clear separation of concerns
- Changes to external APIs only affect infrastructure layer
- Business rules isolated in domain layer
3. Flexibility
- Easy to swap SOAP for REST without touching business logic
- Domain and application layers remain stable
- Can add new presentation layers (CLI, gRPC) without duplicating logic
4. Independence from Frameworks
- Core business logic (domain) doesn’t depend on Quarkus
- Can migrate to different frameworks with minimal changes
- Business rules survive technology changes
Dependency Rule
Dependencies always point inward:- Presentation depends on Application
- Application depends on Domain
- Infrastructure depends on Domain (implements its interfaces)
- Domain depends on nothing