using System.Collections.Generic;
public string Name { get { return string.Concat(Current.ToString(), "To", Next.ToString()); } }
public StatusType Current { get; set; }
public StatusType Next { get; set; }
static List<Transition> transitions = new List<Transition>
new Transition{Current = StatusType.None, Next = StatusType.Created},
new Transition{Current = StatusType.Created, Next = StatusType.Pending},
new Transition{Current = StatusType.Created, Next = StatusType.Approved},
new Transition{Current = StatusType.Pending, Next = StatusType.Approved},
new Transition{Current = StatusType.Approved, Next = StatusType.Created}
public static Transition Get(string name)
return transitions.Where(t => t.Name == name).FirstOrDefault();
public class StatusTransition
public OrderType Order { get; set; }
public CommandType Command { get; set; }
ApproverType _approver = ApproverType.None;
public ApproverType Approver { get { return _approver; } set{ _approver = value; } }
ApproverType _secondaryApprover = ApproverType.None;
public ApproverType SecondaryApprover { get { return _secondaryApprover; } set{ _secondaryApprover = value; } }
public Transition Transition { get; set; }
public class StatusManager
static List<StatusTransition> statuses = new List<StatusTransition>
new StatusTransition{Order = OrderType.HCM, Command = CommandType.Submit, Transition = WorkFlow.Get("CreatedToApproved")},
new StatusTransition{Order = OrderType.HCM, Command = CommandType.Submit, Transition = WorkFlow.Get("CreatedToPending")},
new StatusTransition{Order = OrderType.HCM, Command = CommandType.Approved, Transition = WorkFlow.Get("PendingToApproved")},
public static StatusTransition Get(OrderType order, CommandType command, ApproverType approver = ApproverType.None, ApproverType secondaryApprover = ApproverType.None)
return statuses.FirstOrDefault(status => status.Order == order && status.Command == command && status.Approver == approver && status.SecondaryApprover == secondaryApprover);
public static StatusType GetCurrent(OrderType order, CommandType command, ApproverType approver = ApproverType.None, ApproverType secondaryApprover = ApproverType.None)
return Get(order, command, approver, secondaryApprover).Transition.Current;
public static StatusType GetNext(OrderType order, CommandType command, ApproverType approver = ApproverType.None, ApproverType secondaryApprover = ApproverType.None)
return Get(order, command, approver, secondaryApprover).Transition.Next;
public static void Main()
StatusTransition status = StatusManager.Get(OrderType.HCM, CommandType.Submit);
Console.WriteLine(string.Concat(status.Transition.Current.ToString(), "->", status.Transition.Next.ToString()));