*/ private $transitions = array( 'new' => array( 'in_preparation', 'cancelled' ), 'in_preparation' => array( 'ready', 'new', 'cancelled' ), 'ready' => array( 'completed', 'in_preparation', 'cancelled' ), 'completed' => array( 'ready' ), 'cancelled' => array( 'new', 'ready' ), ); /** * Backward-compatible aliases. * * @var array */ private $aliases = array( 'accepted' => 'in_preparation', 'in_production' => 'in_preparation', 'preparing' => 'in_preparation', 'finished' => 'completed', 'on_route' => 'ready', 'scheduled' => 'new', ); /** * Normalize queue status. * * @param string $status Raw status. * @return string */ public function normalize( $status ) { $status = sanitize_key( (string) $status ); if ( isset( $this->aliases[ $status ] ) ) { $status = $this->aliases[ $status ]; } return isset( $this->transitions[ $status ] ) ? $status : 'new'; } /** * Check transition validity using explicit map. * * @param string $current Current status. * @param string $next Target status. * @param array $options Optional transition options. * @return bool */ public function can_transition( $current, $next, $options = array() ) { $current = $this->normalize( $current ); $next = $this->normalize( $next ); $options = is_array( $options ) ? $options : array(); if ( $current === $next ) { return true; } $allow_reopen = ! empty( $options['allow_reopen'] ); if ( ! $allow_reopen && ( 'completed' === $current || 'cancelled' === $current ) ) { return false; } return isset( $this->transitions[ $current ] ) && in_array( $next, $this->transitions[ $current ], true ); } /** * Return active statuses used by board. * * @return string[] */ public function active_statuses() { return array( 'new', 'in_preparation', 'ready', ); } }