| 
<?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;
 
 // we use autoload's composer, so we call it here.
 include "../vendor/autoload.php";
 
 $smachine=new StateMachineOne(null);
 $smachine->setDebug(true);
 
 
 // it is specific for this project
 define('INITIAL_STATE',1);
 define('DRIVING_TO_BUY_MILK',2);
 define('CANCEL_DRIVING',3);
 define('PICKING_THE_MILK',4);
 define('PAYING_FOR_THE_MILK',5);
 define('UNABLE_TO_PURCHASE',6);
 define('DRIVE_BACK_HOME',7);
 $smachine->setDefaultInitState(INITIAL_STATE);
 
 $smachine->setStates([
 INITIAL_STATE=>'Initial State',
 DRIVING_TO_BUY_MILK=>'Driving to buy milk',
 CANCEL_DRIVING=>'Cancel driving.',
 PICKING_THE_MILK=>'Picking the milk',
 PAYING_FOR_THE_MILK=>'Paying for the milk',
 UNABLE_TO_PURCHASE=>'Unable to purchase',
 DRIVE_BACK_HOME=>'Drive back home.'
 ]);
 
 $smachine->fieldDefault=[
 'milk'=>0
 ,'money'=>9999
 ,'price'=>null
 ,'stock_milk'=>null
 ,'store_open'=>null
 ,'gas'=>10];
 
 // database configuration
 $smachine->tableJobs="buymilk_jobs";
 $smachine->tableJobLogs="buymilk_logs"; // it is optional
 $smachine->setdb('mysql','localhost',"root","abc.123","statemachinedb");
 
 $smachine->createDbTable(false); // 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, we don't need stopped job every time.
 
 
 // business rules
 $smachine->addTransition(INITIAL_STATE,DRIVING_TO_BUY_MILK
 ,'when milk = 0 and gas > 0');
 $smachine->addTransition(INITIAL_STATE,CANCEL_DRIVING
 ,'when gas = 0','stop'); // null means, no timeout and stop means, the job will stop
 $smachine->addTransition(DRIVING_TO_BUY_MILK,PICKING_THE_MILK
 ,'when store_open = 1 and stock_milk > 0');
 $smachine->addTransition(DRIVING_TO_BUY_MILK,UNABLE_TO_PURCHASE
 ,'when store_open = 0 or stock_milk = 0');
 $smachine->addTransition(PICKING_THE_MILK,PAYING_FOR_THE_MILK
 ,'when money >= price set milk = 1');
 $smachine->addTransition(PICKING_THE_MILK,UNABLE_TO_PURCHASE
 ,'when money < price');
 $smachine->addTransition(UNABLE_TO_PURCHASE,DRIVE_BACK_HOME
 ,'when always','stop');
 $smachine->addTransition(PAYING_FOR_THE_MILK,DRIVE_BACK_HOME
 ,'when always','stop');
 
 $msg=$smachine->fetchUI(); // we show a visual id (it is optional and it's only for debug purpose)
 $smachine->checkAllJobs(); // we check every (active,pause,continue) job available.
 
 $smachine->viewUI(null,$msg); // null means it takes the current job
 
 
 
 |