| QuoteController | Entry point for quote CRUD & status updates. | REST /api/v1/quotes/** (OpenAPI) | — |
| QuoteService | Implements all quote use-cases; assigns numbers, authorises, validates; coordinates sub-services; fires domain events. | Java/Spring service (called only by the controller) | Repos, Status Service, Number Generator, Mapper, DomainEventPublisher, RequestForQuotationStatusService |
| QuoteRepository | Persistence of Quote aggregate. | Spring-Data JPA | MySQL via JDBC |
| QuoteNumberGenerator | Creates sequential numbers using a per-year QuoteNumberSequence. | Java class | QuoteNumberSequenceRepository |
| QuoteStatusService | Pure domain logic: legal status transitions & side-effects. | Java class | QuoteRepository, RequestForQuotationStatusService |
| QuoteMapper / QuoteMapperResolver | MapStruct mappers + helper to resolve Provider & Truck. | Java interface / component | ProviderService, TruckService |
| DomainEventPublisher | Publishes Spring events (QuoteCreatedEvent, QuoteStatusChangedEvent, QuoteCancelledByEsUserEvent). | Spring ApplicationEventPublisher | — |
| QuoteNotificationListener | Listens to quote events, calls NotificationService (external) to push e-mail + WebSocket. | Spring event listener | Domain events |
| QuoteNumberSequenceRepository | Persists per-year numeric sequence. | Spring-Data JPA | MySQL |
| Entities (Quote, QuoteNumberSequence) | ORM mapping of aggregates and sequence table. | JPA | — |