on_created( $event ); return; } if ( $event instanceof BookingRescheduled ) { $this->on_rescheduled( $event ); return; } if ( $event instanceof BookingCancelled ) { $this->on_cancelled( $event ); return; } if ( $event instanceof BookingStatusChanged ) { $this->on_status_changed( $event ); } } /** * Booking created. * * @param BookingCreated $event Event. */ private function on_created( BookingCreated $event ): void { $booking = $this->bookings->find_by_id( $event->booking_id ); if ( null === $booking ) { return; } $keys = match ( $booking->status() ) { BookingStatus::Confirmed, BookingStatus::Approved => [ 'booking.confirmed.customer', 'booking.confirmed.agent', 'booking.confirmed.admin', ], BookingStatus::Pending => [ 'booking.pending.customer' ], default => [], }; if ( [] !== $keys ) { $this->dispatcher->dispatch_for_booking( (int) $booking->id(), $keys ); } $this->reminders->schedule_for_booking( $booking ); } /** * Rescheduled. * * @param BookingRescheduled $event Event. */ private function on_rescheduled( BookingRescheduled $event ): void { $booking = $this->bookings->find_by_id( $event->booking_id ); if ( null === $booking ) { return; } $this->dispatcher->dispatch_for_booking( (int) $booking->id(), [ 'booking.rescheduled.customer', 'booking.rescheduled.agent' ] ); $this->reminders->reschedule_for_booking( $booking ); } /** * Cancelled. * * @param BookingCancelled $event Event. */ private function on_cancelled( BookingCancelled $event ): void { $booking = $this->bookings->find_by_id( $event->booking_id ); if ( null === $booking ) { $this->reminders->cancel_for_booking( $event->booking_id ); return; } if ( $event->notify_customer ) { $this->dispatcher->dispatch_for_booking( (int) $booking->id(), [ 'booking.cancelled.customer', 'booking.cancelled.agent', 'booking.cancelled.admin' ] ); } $this->reminders->cancel_for_booking( (int) $booking->id() ); } /** * Status changed (e.g. pending → approved). * * @param BookingStatusChanged $event Event. */ private function on_status_changed( BookingStatusChanged $event ): void { $booking = $this->bookings->find_by_id( $event->booking_id ); if ( null === $booking ) { return; } if ( BookingStatus::Approved === $booking->status() || BookingStatus::Confirmed === $booking->status() ) { if ( $event->notify_customer ) { $this->dispatcher->dispatch_for_booking( (int) $booking->id(), [ 'booking.approved.customer' ] ); } $this->reminders->schedule_for_booking( $booking ); } } }