Directory Overview
Layer-by-Layer Breakdown
Presentation Layer
Location:src/main/java/com/jsifen/presentation/rest/
The presentation layer exposes REST endpoints for external clients. Each resource delegates to application layer use cases.
REST Resources (Controllers)
Invoice Endpoints
Invoice Endpoints
Package:
presentation/rest/factura/-
AsyncRecibeResource.java- Endpoint:
POST /factura/async/recibe - Purpose: Receives invoice JSON, processes asynchronously
- Use Case:
RecibirFacturaUseCase
- Endpoint:
-
FacturaXmlGenerarResource.java- Purpose: Generates XML from invoice data
- Use Case:
GenerarXmlFacturaUseCase
dto/FacturaFirmadaResponse.java- Signed invoice response
Query Endpoints
Query Endpoints
Package:
presentation/rest/consulta/Electronic Document Queries (consulta/de/)ConsultaDEResource.java- Purpose: Query electronic document status
- Use Case:
ConsultarDEUseCase
consulta/ruc/)ConsultaRucResource.java- Purpose: Query taxpayer information by RUC
- Use Case:
ConsultarRucUseCase
- DTOs:
dto/request/ConsultaRucRequest.javadto/response/ConsultarRucResponse.javadto/response/DatosRuc.java
consulta/lote/)ConsultaLoteResource.java- Purpose: Query batch processing status
- Use Case:
ConsultaLoteUseCase
- DTOs:
dto/request/ConsultarLoteRequest.javadto/response/ConsultaLoteResponse.java
Event Endpoints
Event Endpoints
Package:
presentation/rest/evento/cancelar/EventoCancelarResource.java- Purpose: Cancel electronic document events
- Use Case:
CancelarEventoUseCase
dto/CancelarRequest.javadto/CancelarResponse.java
Info Endpoints
Info Endpoints
Package:
presentation/rest/info/SifenHealthResource.java- Purpose: Check SIFEN service availability
- Use Case:
SifenHealthUseCase
dto/HealthStatus.java
Application Layer
Location:src/main/java/com/jsifen/application/usecase/
Contains use cases that orchestrate business workflows. Each use case represents a single business operation.
Use Cases by Domain
| Package | Use Case | Purpose |
|---|---|---|
factura/ | RecibirFacturaUseCase.java | Process invoice submission (generate XML, sign, send) |
factura/ | GenerarXmlFacturaUseCase.java | Generate SIFEN-compliant XML from invoice data |
de/ | ConsultarDEUseCase.java | Query electronic document by CDC |
ruc/ | ConsultarRucUseCase.java | Query taxpayer data by RUC number |
lote/ | ConsultaLoteUseCase.java | Check batch processing status |
evento/ | CancelarEventoUseCase.java | Cancel electronic document events |
info/ | SifenHealthUseCase.java | Verify SIFEN service health |
application/usecase/factura/RecibirFacturaUseCase.java
This use case coordinates:
- XML generation from JSON input
- Digital signature application
- QR code addition
- Submission via repository
Domain Layer
Location:src/main/java/com/jsifen/domain/
The domain layer contains pure business logic with no external dependencies.
Domain Models
Package:domain/model/factura/
FacturaElectronica.java- Core invoice entity
- Properties:
cdc(control code),linkQR,json
Repository Interfaces
Package:domain/repository/
Defines contracts for data operations (implemented by infrastructure layer):
-
FacturaRepository.java- Invoice operationsenviarFactura(String xml)- Submit invoice to SIFEN
-
DERepository.java- Electronic document operations- Query and manage electronic documents
-
RucRepository.java- RUC queries- Retrieve taxpayer information
-
LoteRepository.java- Batch operations- Submit and query batches
-
EventoCancelarRepository.java- Event cancellation- Cancel document events
Domain Services
Package:domain/service/
SifenDvCalculator.java- Calculates verification digits for SIFEN identifiers
- Pure business logic, no dependencies
Infrastructure Layer
Location:src/main/java/com/jsifen/infrastructure/
Provides concrete implementations and handles all technical concerns.
Adapters (Repository Implementations)
Package:infrastructure/adapter/
Implements domain repository interfaces:
-
FacturaRepositoryImpl.java- ImplementsFacturaRepository- Uses
LoteClientto send invoices via SOAP
- Uses
-
DERepositoryImpl.java- ImplementsDERepository- Handles electronic document queries
-
RucRepositoryImpl.java- ImplementsRucRepository- Queries taxpayer data from SIFEN
-
LoteRepositoryImpl.java- ImplementsLoteRepository- Manages batch submissions and queries
-
EventoCancelarRepositoryImpl.java- ImplementsEventoCancelarRepository- Handles event cancellations
SOAP Integration
Package:infrastructure/soap/
SOAP Clients (soap/client/)
SOAP Clients (soap/client/)
Communicate with SIFEN web services:
de/DEClient.java- Electronic document querieslote/LoteClient.java- Batch submissionsruc/RucClient.java- RUC queriesevento/CancelarClient.java- Event cancellationsinfo/SifenHealthClient.java- Service health checks
SOAP Requests (soap/request/)
SOAP Requests (soap/request/)
Build SOAP request messages:
DERequest.javaLoteRecibeRequest.javaLoteConsultaRequest.javaRucRequest.javaEventoCancelarSoapRequest.java
SOAP Utilities
SOAP Utilities
soap/signer/SifenXmlSigner.java- XML digital signaturessoap/signer/EventoXmlSigner.java- Event XML signingsoap/processor/SifenResponseProcessor.java- Response processingsoap/parser/EventoCancelarSoapParser.java- Parse cancellation responsessoap/message/SoapBodyExtractor.java- Extract SOAP bodysoap/message/SoapIdGenerator.java- Generate message IDssoap/builder/EventoSoapBuilder.java- Build event SOAP messages
SIFEN XML Generation
Package:infrastructure/sifen/xml/
XML Builders (xml/buiilder/)
XML Builders (xml/buiilder/)
SifenFacturaXmlGenerator.java- Generate invoice XMLDeXmlBuilder.java- Build electronic document XMLQrNodeBuilder.java- Add QR code nodes to XML
XML Generators (xml/gen/)
XML Generators (xml/gen/)
CdcGenerator.java- Generate CDC (Control de Comprobante)DeComplemento.java- Generate document complements
XML Structure (xml/structure/)
XML Structure (xml/structure/)
DeXmlStructure.java- Define DE XML structureDeXmlElement.java- XML element definitionsXmlAttribute.java- XML attribute handling
XML Mapping (xml/mapping/)
XML Mapping (xml/mapping/)
Serializacion.java- Serialize domain objects to XMLFieldMapping.java- Map fields to XML nodes
Configuration
Package:infrastructure/config/
SIFEN Configuration (config/sifen/)
SIFEN Configuration (config/sifen/)
SifenProperties.java- SIFEN credentials and environment settingsSifenCertificateFile.java- Certificate file handlingServerSifen.java- SIFEN server endpoints
Security Configuration (config/security/)
Security Configuration (config/security/)
SSLConfig.java- SSL/TLS configuration for SOAP clients
Other Configuration
Other Configuration
config/context/EmisorContext.java- Issuer context managementconfig/rest/RestApplication.java- REST application configuration
Utilities
Package:infrastructure/util/
XML Utilities (util/xml/)
XML Utilities (util/xml/)
XmlUtils.java- XML manipulation helpersHashUtils.java- Hash generation for XML signingparser/FileXML.java- XML file parsingparser/XmlJsonConverter.java- Convert between XML and JSONsigner/XmlSigner.java- Generic XML signing
Other Utilities
Other Utilities
util/time/ClienteNTP.java- NTP time synchronizationutil/xml/IOUtils.java- I/O operationsutil/xml/StringUtils.java- String manipulation
Configuration Files
Application Configuration
Location:src/main/resources/
-
application.properties- Quarkus application settings
- HTTP port configuration (default: 8000)
- Logging settings
-
sifen.properties- SIFEN credentials (
sifen.id-csc,sifen.csc) - Environment (
sifen.ambiente:prodortest) - Certificate path and password
- Example:
- SIFEN credentials (
Build Output
Location:build/quarkus-app/
Key Takeaways
- Clear Layer Separation: Each layer has a distinct directory and purpose
- Package by Feature: Within layers, code is organized by business domain (factura, ruc, lote)
- Dependency Direction: Outer layers depend on inner layers, never the reverse
- Infrastructure Isolation: All external integrations (SOAP, XML, config) are in infrastructure
- Domain Purity: Domain layer is completely framework-agnostic