Overview
sgivu-purchase-sale manages purchase and sale contracts for vehicles. It provides creation, advanced search, reporting (PDF/XLSX/CSV), and lifecycle management of contracts. The service integrates with sgivu-user, sgivu-client, and sgivu-vehicle for data enrichment, and with sgivu-auth for authorization.
Technologies
- Java: 21
- Spring Boot: 4.0.1
- Spring Security: Resource Server (JWT validation)
- Spring Data JPA: PostgreSQL persistence
- Flyway: Database migrations
- Spring Cloud Config Client: Centralized configuration
- Spring Cloud Eureka Client: Service registration
- SpringDoc OpenAPI: Swagger UI documentation
- MapStruct: DTO mapping
- Lombok: Code generation
- OpenPDF: PDF report generation
- Apache POI: Excel (XLSX) report generation
Prerequisites
- JDK 21
- Maven 3.9+
- PostgreSQL database
sgivu-configandsgivu-discoveryservices running- Related services:
sgivu-user,sgivu-client,sgivu-vehicle(for data enrichment)
Running the Service
Development with Docker Compose
Local Execution
Docker Build
Contract Types
Purchase Contract
When: Company purchases a vehicle from a supplier/individual Key Fields:contractType:PURCHASEclientId: Seller/supplier IDvehicleId: Vehicle being purchaseduserId: Employee handling the purchasepurchasePrice: Amount paid to acquire vehiclecontractDate: Date of purchase
Sale Contract
When: Company sells a vehicle to a customer Key Fields:contractType:SALEclientId: Buyer/customer IDvehicleId: Vehicle being solduserId: Sales representativesalePrice: Amount customer payscontractDate: Date of sale
Contract Status Workflow
DRAFT
Initial state when contract is created but not finalizedAllowed Transitions: PENDING, CANCELLED
Security
Authentication
JWT Token Validation:- Tokens issued by
sgivu-auth JwtAuthenticationConvertermapsrolesAndPermissionsclaim to authorities- Resource Server validates signature via JWKS endpoint
Authorization
Required Permissions:purchase-sale:create- Create contractspurchase-sale:read- View contractspurchase-sale:update- Update contractspurchase-sale:delete- Delete contractspurchase-sale:approve- Approve contractspurchase-sale:report- Generate reports
Internal Service Communication
X-Internal-Service-Key Header:- Allows service-to-service calls without JWT
- Used for internal endpoints
- Must be kept secret
Database Schema
Flyway Migrations
Location:src/main/resources/db/migration
V1__initial_schema.sql creates:
purchase_sales table:
id: Primary keycontract_type: ENUM (PURCHASE, SALE)contract_status: ENUM (DRAFT, PENDING, APPROVED, REJECTED, COMPLETED, CANCELLED)contract_date: Transaction dateclient_id: Reference to client (buyer or seller)user_id: Reference to employee handling transactionvehicle_id: Reference to vehiclepurchase_price: Price paid (for purchases)sale_price: Price received (for sales)notes: Additional contract notescreated_at,updated_at: Audit timestamps
idx_purchase_sale_client_idonclient_ididx_purchase_sale_user_idonuser_ididx_purchase_sale_vehicle_idonvehicle_ididx_purchase_sale_statusoncontract_statusidx_purchase_sale_typeoncontract_typeidx_purchase_sale_dateoncreated_at
API Endpoints
Contract Management
List contracts with advanced filteringRequired Permission:
purchase-sale:readQuery Parameters:contractType: Filter by PURCHASE or SALEcontractStatus: Filter by statusclientId: Filter by clientvehicleId: Filter by vehicleuserId: Filter by userstartDate,endDate: Date rangepage,size,sort: Pagination
Get contract by ID with enriched dataRequired Permission:
purchase-sale:readReturns: Contract with client, user, and vehicle detailsCreate new contractRequired Permission:
purchase-sale:createValidations:- Valid contract type
- Client, user, and vehicle exist
- Appropriate price field populated
- Future contract date not allowed
Update existing contractRequired Permission:
purchase-sale:updateRestrictions: Cannot update completed or cancelled contractsUpdate contract statusRequired Permission:
purchase-sale:update or purchase-sale:approveBody: {"status": "APPROVED"}Validations: Status transition must be valid per workflowDelete contract (soft delete)Required Permission:
purchase-sale:deleteRestrictions: Only DRAFT contracts can be deletedReporting
Generate PDF reportRequired Permission:
purchase-sale:reportQuery Parameters: Same as list endpoint for filteringResponse: PDF file downloadGenerate Excel reportRequired Permission:
purchase-sale:reportQuery Parameters: Same as list endpoint for filteringResponse: XLSX file downloadGenerate CSV reportRequired Permission:
purchase-sale:reportQuery Parameters: Same as list endpoint for filteringResponse: CSV file downloadRequest/Response Examples
Create Purchase Contract
Response
Update Contract Status
Service Integration
Data Enrichment
Contract responses include enriched data from related services: Client Information (fromsgivu-client):
- Person: Full name, document number
- Company: Legal name, tax ID
sgivu-user):
- Username, full name
- Role information
sgivu-vehicle):
- VIN, brand, model, year
- Current status
- Primary image
Communication Pattern
Report Generation
PDF Reports
Library: OpenPDF Features:- Company header with logo
- Contract details table
- Client, user, and vehicle information
- Signature section
- Page numbering
Excel Reports
Library: Apache POI Features:- Formatted headers
- Color-coded status cells
- Formula cells for totals
- Auto-sized columns
- Freeze panes
CSV Reports
Format: RFC 4180 compliant Features:- Header row
- Proper escaping
- UTF-8 encoding
- Flat structure (no nested objects)
Observability
Actuator Endpoints
/actuator/health: Service health with database connectivity/actuator/metrics: Custom metrics for contract operations/actuator/info: Application metadata
OpenAPI Documentation
Swagger UI:/swagger-ui/index.html (when enabled)
Distributed Tracing
Brave/Zipkin:- Configured via
sgivu-config - Traces service-to-service calls
- Report generation spans
Testing
- Unit tests for services and mappers
- Repository integration tests
- Status transition validation tests
- Report generation tests
- Security authorization tests
Troubleshooting
401/403 Authorization errors
401/403 Authorization errors
Integration failures
Integration failures
Symptoms: Cannot fetch client/user/vehicle dataSolutions:
- Verify
sgivu-configandsgivu-discoveryare accessible - Check related services are registered in Eureka
- Ensure internal service key is correct
- Review network connectivity between services
- Check for circuit breaker open state
Invalid status transition
Invalid status transition
Symptoms: Status update rejected with validation errorSolutions:
- Review allowed transitions in workflow
- Cannot update terminal states (COMPLETED, REJECTED, CANCELLED)
- Check current status before attempting transition
- Verify user has approval permission for certain transitions
Report generation issues
Report generation issues
Symptoms: PDF/Excel generation fails or times outSolutions:
- Check OpenPDF and Apache POI dependencies
- Review memory limits (reports can be memory-intensive)
- Limit result set size for large reports
- Check file system write permissions
- Review logs for library-specific errors
- Consider async report generation for large datasets
Database constraint violations
Database constraint violations
Symptoms: Contract creation fails with FK constraint errorSolutions:
- Verify client_id exists in client service
- Verify user_id exists in user service
- Verify vehicle_id exists in vehicle service
- Check vehicle isn’t already in active contract
- Ensure referenced entities aren’t soft-deleted
Environment Variables
| Variable | Description | Example |
|---|---|---|
DB_HOST | PostgreSQL host | sgivu-postgres-purchase-sale |
DB_PORT | PostgreSQL port | 5432 |
DB_NAME | Database name | sgivu_purchase_sale |
DB_USERNAME | Database username | sgivu_user |
DB_PASSWORD | Database password | secure_password |
SERVICE_INTERNAL_SECRET_KEY | Internal service key | secret-key-value |
SPRING_SECURITY_OAUTH2_RESOURCESERVER_JWT_ISSUER_URI | Auth server issuer | http://sgivu-auth:9000 |
Best Practices
Status Workflow
Enforce valid status transitions to maintain data integrity
Data Enrichment
Cache frequently accessed reference data to reduce service calls
Async Reports
Generate large reports asynchronously to avoid timeouts
Audit Trail
Log all status changes with user and timestamp
Related Services
Vehicle Service
Provides vehicle data for contracts
Client Service
Provides client (buyer/seller) data
User Service
Provides employee data for contracts
Gateway
Routes purchase-sale API requests