private void CreateNewOrder()
 {
     if (InProgressOrder != null)
     {
         MobileDataEntity.AddOrder(InProgressOrder.GetDataEntity());
     }
 }
 private void FireTrigger(Trigger trigger, MobileDataEntity mobileDataEntity, Order inProgressOrder)
 {
     MobileDataEntity = mobileDataEntity;
     InProgressOrder  = inProgressOrder;
     machine.Fire(trigger);
     mobileDataEntity.State     = machine.State.ToString();
     mobileDataEntity.UpdatedAt = dateTimeCreator.Create();
 }
        public MobileBehaviour(IDateTimeCreator dateTimeCreator, MobileDataEntity mobileDataEntity)
        {
            this.dateTimeCreator = dateTimeCreator;
            var enumConverter = new EnumConverter();

            var initialState = MobileState.New;

            if (mobileDataEntity.State != null)
            {
                initialState = enumConverter.ToEnum <MobileState>(mobileDataEntity.State);
            }

            machine = new StateMachine <MobileState, Trigger>(initialState);

            machine.Configure(MobileState.New)
            .Permit(Trigger.Provision, MobileState.ProcessingProvision);
            machine.Configure(MobileState.ProcessingProvision)
            .Permit(Trigger.ProcessingProvisionCompleted, MobileState.WaitingForActivate)
            .OnEntry(() => { CreateNewOrder(); })
            .OnExit(() => { CompleteInProgressOrder(); });
            machine.Configure(MobileState.WaitingForActivate)
            .Permit(Trigger.Activate, MobileState.ProcessingActivate);
            machine.Configure(MobileState.ProcessingActivate)
            .Permit(Trigger.ActivateCompleted, MobileState.Live)
            .Permit(Trigger.ActivateRejected, MobileState.WaitingForActivate)
            .OnEntry(() => { CreateNewOrder(); })
            .OnExit(() =>
            {
                if (isOrderRejected)
                {
                    RejectInProgressOrder();
                }
                else
                {
                    CompleteInProgressOrder();
                }
            });
            machine.Configure(MobileState.Live)
            .Permit(Trigger.Cease, MobileState.ProcessingCease);
            machine.Configure(MobileState.ProcessingCease)
            .Permit(Trigger.CeaseCompleted, MobileState.Ceased)
            .OnEntry(() => { CreateNewOrder(); })
            .OnExit(() => { CompleteInProgressOrder(); });
            machine.Configure(MobileState.Ceased);
            machine.Configure(MobileState.New).Permit(Trigger.PortIn, MobileState.ProcessingPortIn);
            machine.Configure(MobileState.ProcessingPortIn).Permit(Trigger.PortInCompleted, MobileState.Live);
            machine.Configure(MobileState.Live).Permit(Trigger.Suspend, MobileState.Suspended);
            machine.Configure(MobileState.Suspended).Permit(Trigger.Resume, MobileState.Live);
            machine.Configure(MobileState.Live).Permit(Trigger.ReplaceSim, MobileState.Suspended);
            machine.Configure(MobileState.Live).Permit(Trigger.RequestPac, MobileState.ProcessingPortOut);
            machine.Configure(MobileState.ProcessingPortOut).Permit(Trigger.PortOutCompleted, MobileState.PortedOut);
        }
        public Mobile Build()
        {
            var state            = enumConverter.ToName <MobileState>(initialMobileState);
            var mobileDataEntity = new MobileDataEntity()
            {
                Id          = 0,
                GlobalId    = globalId,
                State       = state,
                CustomerId  = customerId,
                PhoneNumber = phoneNumber.ToString(),
                Orders      = orders.Select(x => x.GetDataEntity()).ToList()
            };

            return(new Mobile(dateTimeCreator, mobileDataEntity));
        }
 public void ActivateRejected(MobileDataEntity mobileDataEntity, Order inProgressOrder)
 {
     isOrderRejected = true;
     FireTrigger(Trigger.ActivateRejected, mobileDataEntity, inProgressOrder);
 }
 public void Cease(MobileDataEntity mobileDataEntity, Order inProgressOrder)
 {
     FireTrigger(Trigger.Cease, mobileDataEntity, inProgressOrder);
 }
 public void Activate(MobileDataEntity mobileDataEntity, Order inProgressOrder)
 {
     FireTrigger(Trigger.Activate, mobileDataEntity, inProgressOrder);
 }
 public void Provision(MobileDataEntity mobileDataEntity, Order inProgressOrder)
 {
     FireTrigger(Trigger.Provision, mobileDataEntity, inProgressOrder);
 }
 public void ProcessingProvisionCompleted(MobileDataEntity mobileDataEntity, Order inProgressOrder)
 {
     FireTrigger(Trigger.ProcessingProvisionCompleted, mobileDataEntity, inProgressOrder);
 }
 public Mobile(IDateTimeCreator dateTimeCreator, MobileDataEntity mobileDataEntity)
 {
     this.mobileDataEntity = mobileDataEntity;
     behaviour             = new MobileBehaviour(dateTimeCreator, mobileDataEntity);
 }