| 
<?php/**
 * @author   Jorge Patricio Castro Castillo <jcastro arroba eftec dot cl>
 * @link https://github.com/EFTEC/StateMachineOne
 */
 
 use eftec\statemachineone\Job;
 use eftec\statemachineone\StateMachineOne;
 use eftec\statemachineone\Transition;
 
 include "../vendor/autoload.php";
 
 
 // it is specific for this project
 define("STATE_PICK",1);
 define("STATE_CANCEL",2);
 define("STATE_TRANSPORT",3);
 define("STATE_ABORTTRANSPORT",4);
 define("STATE_TODELIVER",5);
 define("STATE_HELP",6);
 define("STATE_DELIVERED",7);
 define("STATE_ABORTED",8);
 
 define("EVENT_ABORT",'ABORT'); // it could be a number too
 define("EVENT_FLIPABORT",'FLIP ABORT'); // it could be a number too
 define("EVENT_CUSTOMER_PRESENT",'CUSTOMER PRESENT'); // it could be a number too
 define("EVENT_CUSTOMER_ABSENT",'CUSTOMER ABSENT'); // it could be a number too
 define("EVENT_ADDRESS_FOUND",'ADDRESS FOUND'); // it could be a number too
 define("EVENT_ADDRESS_NOT_FOUND",'ADDRESS NOT FOUND'); // it could be a number too
 define("EVENT_CUSTOM_METHOD",'CUSTOM METHOD'); // it could be a number too
 
 class ServiceClass {
 public function customMethod($instock) {
 return $instock+1;
 }
 }
 $obj=new ServiceClass();
 
 
 $smachine=new StateMachineOne($obj);
 $smachine->setDebug(true);
 
 $smachine->tableJobs="chopsuey_jobs";
 $smachine->tableJobLogs="chopsuey_logs";
 
 $smachine->setDefaultInitState(STATE_PICK);
 $smachine->setAutoGarbage(false); // we don't want to delete automatically a stopped job.
 $smachine->setStates([STATE_PICK=>'Pick order'
 ,STATE_CANCEL=>'Cancel order'
 ,STATE_TRANSPORT=>'Transport order'
 ,STATE_ABORTTRANSPORT=>'Abort the delivery'
 ,STATE_TODELIVER=>'Pending to deliver'
 ,STATE_HELP=>'Request assistance'
 ,STATE_DELIVERED=>'Delivered'
 ,STATE_ABORTED=>'Aborted']);
 
 $smachine->fieldDefault=[
 'customerpresent'=>-1
 ,'addressnotfound'=>-1
 ,'signeddeliver'=>-1
 ,'abort'=>-1
 ,'instock'=>-1
 ,'picked'=>-1];
 $smachine->setDB('mysql','localhost',"root","abc.123","statemachinedb");
 $smachine->getPdoOne()->logLevel=2;
 if (!$smachine->getPdoOne()->tableExist($smachine->tableJobs)) {
 $smachine->createDbTable(true); // you don't need to create this table every time.
 }
 
 
 $smachine->loadDBAllJob(); // we load all jobs, including finished ones.
 //$smachine->loadDBActiveJobs(); // use this in production!.
 
 
 // business rules
 $smachine->addTransition(STATE_PICK,STATE_CANCEL
 ,'when instock = 0 set abort = 1','stop');
 $smachine->addTransition(STATE_PICK,STATE_TRANSPORT
 ,'when instock = 1','change');
 $smachine->addTransition(STATE_TRANSPORT,STATE_ABORTTRANSPORT
 ,'when abort = 1','stop');
 $smachine->addTransition(STATE_TRANSPORT,STATE_DELIVERED
 ,'when addressnotfound = 0 and customerpresent = 1 and signeddeliver = 1 timeout 3600','stop'); // 1 hour max.
 $smachine->addTransition(STATE_TRANSPORT,STATE_HELP
 ,'when addressnotfound = 1 or customerpresent = 0 timeout 3600','change'); // 1 hour max
 $smachine->addTransition(STATE_HELP,STATE_ABORTED
 ,'when wait timeout 900 fulltimeout 2000','change'); // it waits 15 minutes max.
 $smachine->addTransition(STATE_HELP,STATE_DELIVERED
 ,'when addressnotfound = 0 and customerpresent = 1 and signeddeliver = 1','change');
 
 $smachine->addEvent(EVENT_ABORT,'set abort = 1');
 $smachine->addEvent(EVENT_FLIPABORT,'set abort=flip()');
 $smachine->addEvent(EVENT_CUSTOMER_PRESENT,'set customerpresent = 1');
 $smachine->addEvent(EVENT_CUSTOMER_ABSENT,'set customerpresent = 0');
 $smachine->addEvent(EVENT_ADDRESS_FOUND,'set addressnotfound = 0');
 $smachine->addEvent(EVENT_ADDRESS_NOT_FOUND,'set addressnotfound =1');
 $smachine->addEvent(EVENT_CUSTOM_METHOD,'set instock=customMethod(instock)');
 // $smachine->callEvent(EVENT_ABORT);
 
 $msg=$smachine->fetchUI();
 $smachine->checkAllJobs();
 
 $smachine->viewUI(null,$msg); // null means it takes the current job
 
 
 
 |