| 
<?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
 
 $smachine=new StateMachineOne(null);
 $smachine->setDebug(true);
 $smachine->setDebugAsArray(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->setDocDB('exampledb',"chopsuey",'auto',null);
 
 $smachine->tableJobs="chopsuey_jobs";
 $smachine->tableJobLogs="chopsuey_logs";
 
 $smachine->createDbTable(false); // you don't need to create this table every time.
 
 $smachine->loadDBAllJob(); // we load all jobs, including finished ones.
 
 /*
 $job=$smachine->createJob($smachine->fieldDefault);
 $smachine->saveDBJob($job);
 
 $smachine->loadDBJob($job->idJob);
 
 $job2=$smachine->getJob($job->idJob);
 
 var_dump($job2);
 
 $smachine->loadDBAllJob();
 var_dump($smachine->getJobQueue());
 die(1);
 */
 // 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->callEvent(EVENT_ABORT);
 
 $msg=$smachine->fetchUI();
 $smachine->checkAllJobs();
 
 $smachine->viewUI(null,$msg); // null means it takes the current job
 
 
 
 |