A design pattern that catches your eye is the "rule"; -)
Or, if you want, a command template
In other words, for such situations, I would create a database table that lists the states and valid transitions, and map the action to each transition (using reflection)
I found this useful for handling cases where the transition action is more complex than just updating statuses to match.
For example, in one system, we had a workflow in which a request document had to go through several committee review stations, each of which could reject or transmit the document to the next stage, and also perform a selective side effect. The organization of the committee, the processing and processing structures changed significantly three times during development and five more times in the first year of deployment.
source share