@startuml
!pragma useIntermediatePackages false
skinparam linetype ortho
show stereotype

interface "FunctionalService" as de.db.vendo.prototype.buchung.reservation.common.bce.boundary.FunctionalService<Input, Output> {
  + {abstract}Output serve(Input)
}
interface "Service" as de.db.vendo.prototype.buchung.reservation.common.bce.boundary.Service<Input> {
  + {abstract}void serve(Input)
}
interface "Component" as de.db.vendo.prototype.buchung.reservation.common.bce.boundary.control.Component<Input> {
  + {abstract}void execute(Input)
}
interface "FunctionalComponent" as de.db.vendo.prototype.buchung.reservation.common.bce.boundary.control.FunctionalComponent<Input, Output> {
  + {abstract}Output execute(Input)
}
interface "FunctionalUseCase" as de.db.vendo.prototype.buchung.reservation.common.usecase.FunctionalUseCase<Input, Output> {
  + {abstract}Output action(Input)
}
interface "UseCase" as de.db.vendo.prototype.buchung.reservation.common.usecase.UseCase<Input> {
  + {abstract}void action(Input)
}
class "ConfirmReservationResourceAdapter" as de.db.vendo.prototype.buchung.reservation.divers.adapters.confirm.boundary.ConfirmReservationResourceAdapter {
  +void serve(UUID)
}
class "ReservationRepositoryAdapter" as de.db.vendo.prototype.buchung.reservation.divers.adapters.persistence.boundary.ReservationRepositoryAdapter {
  +Optional<String> findBy(UUID)
  +String save(String)
  +void submit(UUID)
  +void confirm(UUID)
  +void reset(UUID)
}
interface "ReservationRepositoryAdapterBridge" as de.db.vendo.prototype.buchung.reservation.divers.adapters.persistence.boundary.bridge.ReservationRepositoryAdapterBridge {
  + {abstract}Optional<String> findBy(UUID)
  + {abstract}String save(String)
  + {abstract}void submit(UUID)
  + {abstract}void confirm(UUID)
  + {abstract}void reset(UUID)
}
class "ResetReservationResourceAdapter" as de.db.vendo.prototype.buchung.reservation.divers.adapters.reset.boundary.ResetReservationResourceAdapter {
  +void serve(UUID)
}
class "SubmitReservationResourceAdapter" as de.db.vendo.prototype.buchung.reservation.divers.adapters.submit.boundary.SubmitReservationResourceAdapter {
  +UUID serve(String)
}
class "ConfirmUseCase" as de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.confirm.boundary.ConfirmUseCase {
  +void action(UUID)
}
class "ConfirmReservationService" as de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.confirm.boundary.ConfirmReservationService {
  +void serve(ReservationId)
}
class "ConfirmReservationComponent" as de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.confirm.boundary.control.ConfirmReservationComponent {
  +void execute(ReservationId)
}
interface "ReservationRepository" as de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.boundary.control.ReservationRepository {
  + {abstract}Optional<Reservation> findBy(ReservationId)
  + {abstract}Reservation save(Reservation)
  + {abstract}void submit(ReservationId)
  + {abstract}void confirm(ReservationId)
  + {abstract}void reset(ReservationId)
}
class "Reservation" as de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.boundary.control.entity.Reservation {
  +ReservationId getId()
  +ReservationStatus getStatus()
}
class "ReservationId" as de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.boundary.control.entity.ReservationId {
  +UUID getId()
}
enum "ReservationStatus" as de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.boundary.control.entity.ReservationStatus {
  SUBMIT
  CONFIRM
  RESET
  __
  + {static}EnumEntries<ReservationStatus> getEntries()
}
class "Trip" as de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.trip.boundary.control.entity.Trip {
  +TripId getId()
  +Station getOrigin()
  +Station getDestination()
  +List<Station> getStations()
  +Train getTrain()
  +Seat getSeat()
  +Wagon getWagon()
}
class "TripId" as de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.trip.boundary.control.entity.TripId {
  +UUID getId()
}
class "Station" as de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.trip.station.boundary.control.entity.Station {
  +StationId getId()
  +String getName()
}
class "StationId" as de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.trip.station.boundary.control.entity.StationId {
  +UUID getId()
}
class "Train" as de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.trip.train.boundary.control.entity.Train {
  +Train getId()
  +String getName()
}
class "TrainId" as de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.trip.train.boundary.control.entity.TrainId {
  +UUID getId()
}
class "Wagon" as de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.trip.train.wagon.boundary.control.entity.Wagon {
  +Wagon getId()
  +String getName()
  +String getNumber()
}
class "WagonId" as de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.trip.train.wagon.boundary.control.entity.WagonId {
  +UUID getId()
}
class "Seat" as de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.trip.train.wagon.seat.boundary.control.entity.Seat {
  +Seat getId()
  +String getName()
}
class "SeatId" as de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.trip.train.wagon.seat.boundary.control.entity.SeatId {
  +UUID getId()
}
class "ResetReservationService" as de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reset.boundary.ResetReservationService {
  +void serve(ReservationId)
}
class "ResetReservationComponent" as de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reset.boundary.control.ResetReservationComponent {
  +void execute(ReservationId)
}
class "SubmitReservationService" as de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.submit.boundary.SubmitReservationService {
  +ReservationId serve(String)
}
class "SubmitReservationComponent" as de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.submit.boundary.control.SubmitReservationComponent {
  +ReservationId execute(String)
}
class "ReservationRepositoryUseCase" as de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.persistence.boundary.ReservationRepositoryUseCase {
  +Optional<Reservation> findBy(ReservationId)
  +Reservation save(Reservation)
  +void submit(ReservationId)
  +void confirm(ReservationId)
  +void reset(ReservationId)
}
interface "ReservationRepositoryUseCaseBridge" as de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.persistence.boundary.bridge.ReservationRepositoryUseCaseBridge {
  + {abstract}Optional<String> findBy(UUID)
  + {abstract}String save(String)
  + {abstract}void submit(UUID)
  + {abstract}void confirm(UUID)
  + {abstract}void reset(UUID)
}
class "ResetUseCase" as de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.reset.boundary.ResetUseCase {
  ..
  +ResetReservationService resetReservation
  __
  +ResetReservationService getResetReservation()
  +void setResetReservation(ResetReservationService)
  +void action(UUID)
}
class "SubmitUseCase" as de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.submit.boundary.SubmitUseCase {
  +SubmitReservationService submitReservation
  __
  +SubmitReservationService getSubmitReservation()
  +void setSubmitReservation(SubmitReservationService)
  +UUID action(String)
}
class "ReservationRepositoryDriver" as de.db.vendo.prototype.buchung.reservation.divers.persistence.boundary.ReservationRepositoryDriver {
  +Optional<String> findBy(UUID)
  +String save(String)
  +void submit(UUID)
  +void confirm(UUID)
  +void reset(UUID)
}
class "ConfirmReservationResource" as de.db.vendo.prototype.buchung.reservation.divers.web.confirm.boundary.ConfirmReservationResource {
  +void serve(UUID)
}
class "ResetReservationResource" as de.db.vendo.prototype.buchung.reservation.divers.web.reset.boundary.ResetReservationResource {
  +ResetReservationResourceAdapter resourceAdapter
  __
  +ResetReservationResourceAdapter getResourceAdapter()
  +void setResourceAdapter(ResetReservationResourceAdapter)
  +void serve(UUID)
}
class "SubmitReservationResource" as de.db.vendo.prototype.buchung.reservation.divers.web.submit.boundary.SubmitReservationResource {
  +String serve(String)
}
class "ReservationReq" as de.db.vendo.prototype.buchung.reservation.divers.web.submit.boundary.control.entity.ReservationReq {
  +UUID getId()
  +String getTrainJourneyKey()
  +String getTrainNumber()
  +Optional<Integer> getTariffCode()
}
de.db.vendo.prototype.buchung.reservation.divers.adapters.confirm.boundary.ConfirmReservationResourceAdapter .u.|> de.db.vendo.prototype.buchung.reservation.common.bce.boundary.Service
de.db.vendo.prototype.buchung.reservation.divers.adapters.confirm.boundary.ConfirmReservationResourceAdapter --> de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.confirm.boundary.ConfirmUseCase
de.db.vendo.prototype.buchung.reservation.divers.adapters.persistence.boundary.ReservationRepositoryAdapter .u.|> de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.persistence.boundary.bridge.ReservationRepositoryUseCaseBridge
de.db.vendo.prototype.buchung.reservation.divers.adapters.persistence.boundary.ReservationRepositoryAdapter --> de.db.vendo.prototype.buchung.reservation.divers.adapters.persistence.boundary.bridge.ReservationRepositoryAdapterBridge
de.db.vendo.prototype.buchung.reservation.divers.adapters.reset.boundary.ResetReservationResourceAdapter .u.|> de.db.vendo.prototype.buchung.reservation.common.bce.boundary.Service
de.db.vendo.prototype.buchung.reservation.divers.adapters.reset.boundary.ResetReservationResourceAdapter --> de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.reset.boundary.ResetUseCase
de.db.vendo.prototype.buchung.reservation.divers.adapters.submit.boundary.SubmitReservationResourceAdapter .u.|> de.db.vendo.prototype.buchung.reservation.common.bce.boundary.FunctionalService
de.db.vendo.prototype.buchung.reservation.divers.adapters.submit.boundary.SubmitReservationResourceAdapter --> de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.submit.boundary.SubmitUseCase
de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.confirm.boundary.ConfirmUseCase .u.|> de.db.vendo.prototype.buchung.reservation.common.usecase.UseCase
de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.confirm.boundary.ConfirmUseCase --> de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.confirm.boundary.ConfirmReservationService
de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.confirm.boundary.ConfirmReservationService .u.|> de.db.vendo.prototype.buchung.reservation.common.bce.boundary.Service
de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.confirm.boundary.ConfirmReservationService --> de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.confirm.boundary.control.ConfirmReservationComponent
de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.confirm.boundary.control.ConfirmReservationComponent .u.|> de.db.vendo.prototype.buchung.reservation.common.bce.boundary.control.Component
de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.confirm.boundary.control.ConfirmReservationComponent --> de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.boundary.control.ReservationRepository
de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.boundary.control.entity.Reservation --> de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.boundary.control.entity.ReservationId
de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.boundary.control.entity.Reservation --> de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.boundary.control.entity.ReservationStatus
de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.trip.boundary.control.entity.Trip --> de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.trip.boundary.control.entity.TripId
de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.trip.boundary.control.entity.Trip --> de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.trip.station.boundary.control.entity.Station
de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.trip.boundary.control.entity.Trip --> de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.trip.train.wagon.seat.boundary.control.entity.Seat
de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.trip.boundary.control.entity.Trip --> de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.trip.train.boundary.control.entity.Train
de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.trip.boundary.control.entity.Trip --> de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.trip.train.wagon.boundary.control.entity.Wagon
de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.trip.station.boundary.control.entity.Station --> de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.trip.station.boundary.control.entity.StationId
de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.trip.train.boundary.control.entity.Train --> de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.trip.train.boundary.control.entity.Train
de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.trip.train.wagon.boundary.control.entity.Wagon --> de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.trip.train.wagon.boundary.control.entity.Wagon
de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.trip.train.wagon.seat.boundary.control.entity.Seat --> de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.trip.train.wagon.seat.boundary.control.entity.Seat
de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reset.boundary.ResetReservationService .u.|> de.db.vendo.prototype.buchung.reservation.common.bce.boundary.Service
de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reset.boundary.ResetReservationService --> de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reset.boundary.control.ResetReservationComponent
de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reset.boundary.control.ResetReservationComponent .u.|> de.db.vendo.prototype.buchung.reservation.common.bce.boundary.control.Component
de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reset.boundary.control.ResetReservationComponent --> de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.boundary.control.ReservationRepository
de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.submit.boundary.SubmitReservationService .u.|> de.db.vendo.prototype.buchung.reservation.common.bce.boundary.FunctionalService
de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.submit.boundary.SubmitReservationService --> de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.submit.boundary.control.SubmitReservationComponent
de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.submit.boundary.control.SubmitReservationComponent .u.|> de.db.vendo.prototype.buchung.reservation.common.bce.boundary.control.FunctionalComponent
de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.submit.boundary.control.SubmitReservationComponent --> de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.boundary.control.ReservationRepository
de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.persistence.boundary.ReservationRepositoryUseCase .u.|> de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reservation.boundary.control.ReservationRepository
de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.persistence.boundary.ReservationRepositoryUseCase --> de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.persistence.boundary.bridge.ReservationRepositoryUseCaseBridge
de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.reset.boundary.ResetUseCase .u.|> de.db.vendo.prototype.buchung.reservation.common.usecase.UseCase
de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.reset.boundary.ResetUseCase --> de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.reset.boundary.ResetReservationService
de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.submit.boundary.SubmitUseCase .u.|> de.db.vendo.prototype.buchung.reservation.common.usecase.FunctionalUseCase
de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.submit.boundary.SubmitUseCase --> de.db.vendo.prototype.buchung.reservation.divers.adapters.use_cases.entities.submit.boundary.SubmitReservationService
de.db.vendo.prototype.buchung.reservation.divers.persistence.boundary.ReservationRepositoryDriver .u.|> de.db.vendo.prototype.buchung.reservation.divers.adapters.persistence.boundary.bridge.ReservationRepositoryAdapterBridge
de.db.vendo.prototype.buchung.reservation.divers.web.confirm.boundary.ConfirmReservationResource .u.|> de.db.vendo.prototype.buchung.reservation.common.bce.boundary.Service
de.db.vendo.prototype.buchung.reservation.divers.web.confirm.boundary.ConfirmReservationResource --> de.db.vendo.prototype.buchung.reservation.divers.adapters.confirm.boundary.ConfirmReservationResourceAdapter
de.db.vendo.prototype.buchung.reservation.divers.web.reset.boundary.ResetReservationResource .u.|> de.db.vendo.prototype.buchung.reservation.common.bce.boundary.Service
de.db.vendo.prototype.buchung.reservation.divers.web.reset.boundary.ResetReservationResource --> de.db.vendo.prototype.buchung.reservation.divers.adapters.reset.boundary.ResetReservationResourceAdapter
de.db.vendo.prototype.buchung.reservation.divers.web.submit.boundary.SubmitReservationResource .u.|> de.db.vendo.prototype.buchung.reservation.common.bce.boundary.FunctionalService
de.db.vendo.prototype.buchung.reservation.divers.web.submit.boundary.SubmitReservationResource --> de.db.vendo.prototype.buchung.reservation.divers.adapters.submit.boundary.SubmitReservationResourceAdapter
@enduml
