Author: Oliver Tischlinger
Inheritance: extends Metabor\Named, implements MetaborStd\Statemachine\ProcessInterface, implements MetaborStd\MergeableInterface
 /**
  *
  */
 public function testTriggerEventIfStatusIsChangedAndNewStateHasRegisteredEvent()
 {
     $process = new Process('process_name', new State('initinal'));
     $collection = new StateCollection();
     $helper = new SetupHelper($collection);
     $helper->findOrCreateTransition('initinal', 'second', 'go');
     $helper->findOrCreateTransition('second', 'error', 'error');
     $eventName = 'eventName';
     $helper->findOrCreateTransition('second', 'final', $eventName);
     $process->merge($collection);
     $subject = new \stdClass();
     $statemachine = new Statemachine($subject, $process);
     $statemachine->attach(new OnEnterObserver($eventName));
     $statemachine->triggerEvent('go');
     $this->assertEquals($process->getState('final'), $statemachine->getCurrentState());
 }
 public function __construct()
 {
     $new = new State(self::STATE_NEW);
     $paymentFailed = new State(self::STATE_PAYMENT_FAILED);
     $paymentPending = new State(self::STATE_PAYMENT_PENDING);
     $shippable = new State(self::STATE_SHIPPABLE);
     $shipped = new State(self::STATE_SHIPPED);
     $closed = new State(self::STATE_CLOSED);
     $returned = new State(self::STATE_RETURNED);
     $returnedAndClosed = new State(self::STATE_RETURNED_AND_CLOSED);
     $event = $new->getEvent(self::EVENT_AUTHORIZE);
     $command = new Authorize();
     $event->attach($command);
     $event = $shippable->getEvent(self::EVENT_SHIPPING);
     $command = function (EventInterface $event) {
         list($order, $context) = $event->getInvokeArgs();
         echo 'Command: ' . $order . ' is shipped!' . PHP_EOL;
     };
     $this->addCommand($event, $command);
     $shippingDateGreater14Days = new ShippingDateGreater14Days();
     $authorizeSuccessful = new AuthorizedSuccessful();
     $authorizeFailed = new Not($authorizeSuccessful);
     $new->addTransition(new Transition($paymentFailed, self::EVENT_AUTHORIZE, $authorizeFailed));
     $new->addTransition(new Transition($paymentPending, self::EVENT_AUTHORIZE, $authorizeSuccessful));
     $paymentPending->addTransition(new Transition($shippable, self::EVENT_PAID));
     $shippable->addTransition(new Transition($shipped, self::EVENT_SHIPPING));
     $shipped->addTransition(new Transition($closed, null, $shippingDateGreater14Days));
     $shipped->addTransition(new Transition($returned, self::EVENT_RETURNED));
     $closed->addTransition(new Transition($returned, self::EVENT_RETURNED));
     $returned->addTransition(new Transition($returnedAndClosed, self::EVENT_REFUND));
     parent::__construct(self::PROCESS_PREPAYMENT, $new);
 }
 public function __construct()
 {
     $new = new State(self::STATE_NEW);
     $shipped = new State(self::STATE_SHIPPED);
     $dunning = new State(self::STATE_DUNNING);
     $paid = new State(self::STATE_PAID);
     $closed = new State(self::STATE_CLOSED);
     $returned = new State(self::STATE_RETURNED);
     $returnedAndClosed = new State(self::STATE_RETURNED_AND_CLOSED);
     $event = $new->getEvent(self::EVENT_SHIPPING);
     $command = function (EventInterface $event) {
         list($order, $context) = $event->getInvokeArgs();
         echo 'Command: ' . $order . ' is shipped!' . PHP_EOL;
     };
     $this->addCommand($event, $command);
     $shippingDateGreater14Days = new ShippingDateGreater14Days();
     $new->addTransition(new Transition($shipped, self::EVENT_SHIPPING));
     $shipped->addTransition(new Transition($dunning, null, $shippingDateGreater14Days));
     $shipped->addTransition(new Transition($paid, self::EVENT_PAID));
     $shipped->addTransition(new Transition($returnedAndClosed, self::EVENT_RETURNED));
     $dunning->addTransition(new Transition($returnedAndClosed, self::EVENT_RETURNED));
     $dunning->addTransition(new Transition($closed, self::EVENT_PAID));
     $paid->addTransition(new Transition($closed, null, $shippingDateGreater14Days));
     $paid->addTransition(new Transition($returned, self::EVENT_RETURNED));
     $closed->addTransition(new Transition($returned, self::EVENT_RETURNED));
     $returned->addTransition(new Transition($returnedAndClosed, self::EVENT_REFUND));
     parent::__construct(self::PROCESS_POSTPAYMENT, $new);
 }