case class PlaceOrder(id: OrderProcessId) extends OrderProcessCommand case class CancelOrderProcess(id: OrderProcessId) extends OrderProcessCommand } object Events { sealed trait OrderProcessEvent extends DomainEvent case class OrderStarted(orderId: OrderId) extends OrderProcessEvent case class OrderAdded(orderId: OrderId) extends OrderProcessEvent case class ReservationAdded(reservationId: ReservationId, seatId: SeatId) extends OrderProcessEvent case class WaitListAdded(waitListId: WaitListId) extends OrderProcessEvent case class PaymentAdded(paymentId: PaymentId) extends OrderProcessEvent case class OrderConfirmed(orderId: OrderId) extends OrderProcessEvent case class PaymentRemoved(paymentId: PaymentId) extends OrderProcessEvent case class ReservationRemoved(reservationId: ReservationId) extends OrderProcessEvent case class WaitListRemoved(waitListId: WaitListId) extends OrderProcessEvent case class OrderRemoved(orderId: OrderId) extends OrderProcessEvent } object Data { case class OrderProcessData(orderId: Option[OrderId], reservationId: Option[ReservationId], waitListId: Option[WaitListId], paymentId: Option[PaymentId]) { def isAllCanceled = orderId.isEmpty && reservationId.isEmpty && waitListId.isEmpty && paymentId.isEmpty } }