vendor/cic/cssc/lib/CSSC.php line 29

Open in your IDE?
  1. <?php
  2. /**
  3.  * SREC class
  4.  *  
  5.  * @author rderesendes
  6.  * @version 0.02
  7.  */
  8. namespace CIC\CSSC;
  9. use CIC\DB\cicDatabaseInterface;
  10. /**
  11.  * 
  12.  * @author rderesendes
  13.  * SREC wrapper
  14.  */
  15. class CSSC extends COMMON {
  16. /**
  17.  * cicDB object
  18.  * @var object
  19.  */
  20.     protected cicDatabaseInterface $db;
  21.     public $userID="";
  22.     public function __construct(cicDatabaseInterface $_db) {
  23. //        $this->db=$_db;
  24.     parent::__construct($_db);
  25.     
  26.     if(!isset($_SESSION)) {
  27.         $this->userID='SHELL';
  28.         $_SESSION=[];
  29.     }
  30.     //laaaame
  31.     if(array_key_exists("userID",$_SESSION))
  32.         $this->userID=$_SESSION['userID'];
  33.     if(array_key_exists("_security.last_username",$_SESSION))
  34.         $this->userID=$_SESSION['_security.last_username'];
  35.         
  36. //    $this->SINFO=new \CIC\CSSC\SINFO($this->db);
  37. //    $this->SREC=new \CIC\CSSC\SREC($this->db);
  38. //    $this->CDES=new \CIC\CSSC\CDES($this->db);
  39.     }
  40. /**
  41. * array of current semester codes
  42. * uses curdate() between STARTDATE AND ENDDATE to determine codes
  43. *
  44. * @author rderesendes
  45. * @return array
  46. */
  47.     public function get_current_sems() {
  48.         $q="SELECT DISTINCT LEFT(CINDEX,6) AS SEM FROM CDES WHERE CURDATE() BETWEEN STARTDATE AND ENDDATE";
  49.         $this->db->query($q);
  50.         $records $this->db->fetch_assoc_all();
  51.         foreach($records as $rows) {
  52.             $RET[]=$rows['SEM'];
  53.         }
  54.         return $RET
  55.     }
  56. /**
  57.  * Allows logging of changes in CSSC tables (SREC/SINFO/CDES etc)
  58.  * 
  59.  * desgined so that other applications can write changes BACK into foxpro
  60.  * 
  61.  *
  62.  * Expected input
  63.  * 
  64.  * array(
  65.  *         TABLE
  66.  *         CINDEX
  67.  *         IDNUM
  68.  *         DATA_FIELD
  69.  *         NEW_DATA
  70.  *         AUTO_MOD
  71.  *         )
  72.  * 
  73.  * @author rderesendes
  74.  * @param array $CHANGES
  75.  * @return array
  76.  */    
  77. public function cssc_change($CHANGES) {
  78.     if(!is_array($CHANGES)) return "ERR";
  79.     if(count($CHANGES) < 1) return "err";
  80.         
  81.     foreach($CHANGES AS $DATA) {
  82.     $REQ=array("TABLE","NEW_DATA","userID","DATA_FIELD");
  83.     foreach($REQ as $req) {
  84.         if(!array_key_exists($req,$DATA)) return "ERROR: MISSING FIELD - $req";  
  85.         }
  86.         $CHECK=0;
  87.         switch($DATA['TABLE']) {
  88.         case "SREC":
  89.             $q="SELECT ".$DATA['DATA_FIELD'] ." FROM SREC WHERE CINDEX=? AND IDNUM=? LIMIT 1";
  90.             $criteria=array($DATA['CINDEX'],$DATA['IDNUM']);
  91.             $CHECK=1;
  92.             break;
  93.         case "CDES":
  94.             $q="SELECT ".$DATA['DATA_FIELD'] ." FROM CDES WHERE CINDEX=? LIMIT 1";
  95.             $criteria=array($DATA['CINDEX']);
  96.             $CHECK=1;
  97.             break;
  98.         case "SINFO":
  99.             $q="SELECT ".$DATA['DATA_FIELD'] ." FROM SINFO WHERE IDNUM=? LIMIT 1";
  100.             $criteria=array($DATA['IDNUM']);
  101.             $CHECK=1;
  102.             break;
  103.         case "INTAKE":
  104.             $q="SELECT ".$DATA['DATA_FIELD'] ." FROM INTAKE WHERE IDNUM=? LIMIT 1";
  105.             $criteria=array($DATA['IDNUM']);
  106.             $CHECK=1;
  107.             break;
  108.         default:
  109.             //do nothing
  110.             break;
  111.         }
  112.     
  113.         if($CHECK) {
  114.             $this->db->query($q,$criteria);
  115.             $records $this->db->fetch_assoc_all();
  116.             $DATA['OLD_DATA']=$records[0][$DATA['DATA_FIELD']];
  117.             $RET[]=$this->cssc_apply_change($DATA);
  118.             }
  119.         }
  120.     $DATA=null;
  121.     return $RET;    
  122.     }
  123.     
  124.     
  125. /**h
  126.  * called from cssc_change()
  127.  * 
  128.  * actually applys changes and returns success
  129.  * 
  130.  * @see cicSREC::cssc_change
  131.  * @author rderesendes
  132.  * @param array $CHANGES
  133.  * @return string|boolean
  134.  */
  135.     private function cssc_apply_change($CHANGES) {
  136.     //checks
  137.     if(!is_array($CHANGES)) return "ERROR: EXPECTING ARRAY";
  138.     //PRIMARY CHECKS
  139.     $REQ=array("TABLE","OLD_DATA","NEW_DATA","userID","DATA_FIELD");
  140.     foreach($REQ as $req) {
  141.         if(!array_key_exists($req,$CHANGES)) return "ERROR: MISSING FIELD - $req";  
  142.         }
  143.     $CHECK=0;
  144.     //if no change just return
  145.     
  146.     if($CHANGES['NEW_DATA']==$CHANGES['OLD_DATA']) return;
  147.     
  148.     switch($CHANGES['TABLE']) {
  149.         case "SREC":
  150.             if(!array_key_exists("CINDEX",$CHANGES)) return "ERROR: MISSING FIELD - CINDEX";  
  151.             if(!array_key_exists("IDNUM",$CHANGES)) return "ERROR: MISSING FIELD - IDNUM";  
  152.             $UPDATE['where']='IDNUM=? AND CINDEX=?';
  153.             $UPDATE['criteria']=array($CHANGES['IDNUM'],$CHANGES['CINDEX']);
  154.             $CHECK=1;
  155.             break;
  156.         case "CDES":
  157.             if(!array_key_exists("CINDEX",$CHANGES)) return "ERROR: MISSING FIELD - CINDEX";  
  158. //            if(!array_key_exists("IDNUM",$CHANGES)) return "ERROR: MISSING FIELD - IDNUM";  
  159.             $UPDATE['where']='CINDEX=?';
  160.             $UPDATE['criteria']=array($CHANGES['CINDEX']);
  161.             $CHECK=1;
  162.             break;
  163.         case "SINFO":
  164. //            if(!array_key_exists("CINDEX",$CHANGES)) return "ERROR: MISSING FIELD - CINDEX";  
  165.             if(!array_key_exists("IDNUM",$CHANGES)) return "ERROR: MISSING FIELD - IDNUM";  
  166.             $UPDATE['where']='IDNUM=?';
  167.             $UPDATE['criteria']=array($CHANGES['IDNUM']);
  168.             $CHECK=1;
  169.             break;
  170.         case "SINFO":
  171.             //            if(!array_key_exists("CINDEX",$CHANGES)) return "ERROR: MISSING FIELD - CINDEX";
  172.             if(!array_key_exists("IDNUM",$CHANGES)) return "ERROR: MISSING FIELD - IDNUM";
  173.             $UPDATE['where']='IDNUM=?';
  174.             $UPDATE['criteria']=array($CHANGES['IDNUM']);
  175.             $CHECK=1;
  176.             break;
  177.                     
  178.         default:
  179.         break;
  180.         }
  181.     if($CHECK) {
  182.         //we look good to go...some final checks
  183.         $CHANGES['TBL']=$CHANGES['TABLE'];
  184.         unset($CHANGES['TABLE']);
  185.         if(!array_key_exists('AUTO_MOD',$CHANGES)) $CHANGES['AUTO_MOD']=0;
  186.         if($CHANGES['AUTO_MOD']==1) {
  187.         $CHANGES['STATUS']=1;
  188.         $CHANGES['MODERATOR']=$CHANGES['userID'];
  189.         $CHANGES['COMPLETED_DATE']=date("Y-m-d H:i:s");
  190.         }
  191.         else $CHANGES['STATUS']=0;
  192.         unset($CHANGES['AUTO_MOD']);
  193.         $CHANGES['ENTERED_DATE']=date("Y-m-d H:i:s");
  194.         if($CHANGES['AUTO_COMMIT']==1) {
  195.             $UPDATE['CHANGE'][$CHANGES['DATA_FIELD']]=$CHANGES['NEW_DATA'];
  196.             $this->db->update($CHANGES['TBL'],$UPDATE['CHANGE'],$UPDATE['where'],$UPDATE['criteria']);
  197.         }
  198.         unset($CHANGES['AUTO_COMMIT']); //TODO PROPER FILTER HERE
  199.         
  200.         if($this->db->insert("CSSC_CHANGES",$CHANGES)) return true;
  201.         }
  202.     }
  203. public function cssc_commit_change($ChangeID) {
  204.     //lookup a change and commit it to the source table/does not affect foxpro
  205. }
  206.     
  207. /**
  208.  * Gets the students  courses for a given date, if not date given checks today
  209.  * 
  210.  * @author rderesendes
  211.  * @param string $IDNUM
  212.  * @param string $DATE
  213.  * @return array
  214.  */
  215. public function get_student_class_schedule($IDNUM,$DATE=0) {
  216.     if($DATE==0$DATE=date("Y-m-d");
  217.         else $DATE=date("Y-m-d",strtotime($DATE));
  218.         
  219.     $q="SELECT C.PERIOD,R.CINDEX,C.TEACHER,C.ROOM_NO FROM SREC AS R INNER JOIN CDES AS C USING (CINDEX) WHERE IDNUM=? AND ? BETWEEN C.STARTDATE AND C.ENDDATE ORDER BY C.PERIOD";
  220.     $this->db->query($q,array($IDNUM,$DATE));
  221.     $records $this->db->fetch_assoc_all();
  222.     foreach($records as $rows) {
  223.         $DATA[$rows['PERIOD']]=$rows;    
  224.     }
  225.     return $DATA;
  226.     
  227. }    
  228. function format($DATA,$FORMAT) {
  229.     $FORMATS=explode("|",$FORMAT);
  230.     
  231.     foreach($FORMATS as $F) {
  232.         $TMP=explode(":",$F);
  233.         $TYPE=$TMP[0];
  234.         $ARG=$TMP[1];
  235.         switch($TYPE) {
  236.             case "LAST":
  237.                 $ARG=($ARG 0) ?  $ARG $ARG*-//if PASSED NEGATIVE, leave it
  238.                 $FORMATTED=substr($DATA,$ARG*-1,$ARG);
  239.                 break;
  240.             case "FIRST":
  241.                 $ARG=($ARG 0) ?  $ARG*-$ARG //if PASSED NEGATIVE, leave flipit
  242.                 $FORMATTED=substr($DATA,0,$ARG);
  243.                 break;
  244.             case "UPPER":
  245.                 $FORMATTED=strtoupper($DATA);
  246.                 break;
  247.             case "LOWER":
  248.                 $FORMATTED=strtolower($DATA);
  249.                 break;
  250.             case "IDNUM":
  251.                 $FORMATTED=substr($DATA0,4)."-".substr($DATA4,2)."-".substr($DATA6,4);
  252.                 break;
  253.             case "CLUBS":
  254.             case "CINDEX":
  255.                 $FORMATTED=substr($DATA,0,6)."-".substr($DATA,6,5)."-".substr($DATA,11,2);
  256.                 break;
  257.             case "CINDEX_SHORT":
  258.                 $FORMATTED=substr($DATA,6,5)."-".substr($DATA,11,2);
  259.                 break;
  260.             case "CINDEX_SCODE":
  261.             case "SCODE":
  262.                 $FORMATTED=substr($DATA,6,5);
  263.                 break;
  264.             case "CONTACT_DATATYPE":
  265.                 $FORMATTED=$CONF["SINFO"]["CONTACTS"]["TYPES"][$DATA];
  266.                 break;
  267.             case "CONTACT_TYPE":
  268.                 $FORMATTED=$CONF["SINFO"]["CONTACTS"]["CTYPES"][$DATA];
  269.                 break;
  270.             case "SEMCODE":
  271.                 $FORMATTED=substr($DATA0,4)."-".substr($DATA4,2);
  272.                 break;
  273.             case "GRADTYPE":
  274.             case "GRADTYPE_STRIPPED":
  275.             case "GRADTYPE_LONG":
  276.                 $REP["S"]=array("(",")");
  277.                 $REP["R"]=array("","");
  278.                 if(array_key_exists($DATA,$CONF["GRADTYPE"])) $DATA=$CONF["GRADTYPE"][$DATA];
  279.                 $FORMATTED=str_replace($REP["S"],$REP["R"],$DATA);
  280.                 break;
  281.             case "GRADTYPE_LONG_":
  282.                 if(array_key_exists($DATA,$CONF["GRADTYPE"])) $DATA=$CONF["GRADTYPE"][$DATA];
  283.                 $FORMATTED=$DATA;
  284.                 break;
  285.             case "GRADTYPE_CODE":
  286.             case "GRADTYPE_SHORT":
  287.                 if(array_key_exists($DATA,$CONF["GRADTYPE"])) $DATA=$CONF["GRADTYPE"][$DATA];
  288.                 $TMP=explode("(",$DATA);
  289.                 $FORMATTED="(".strtoupper(substr($TMP[1],0,1)).")";
  290.                 break;
  291.             
  292.             case "SIGNOUT_REF":
  293.             case "SIGNOUT_REF4":
  294.             case "LAST4":
  295.                 $FORMATTED=substr($DATA, -4);
  296.                 break;
  297.             case "SIGNOUT_REF6":
  298.             case "LAST6":
  299.                 $FORMATTED=substr($DATA, -6);
  300.                 break;
  301.             case "SIGNOUT_REF4-4":
  302.             case "LAST4-4":
  303.                 $FORMATTED=substr($DATA, -8,4)."-".substr($DATA, -4);
  304.                 break;
  305.             case "SIGNOUT_REF8":
  306.             case "LAST8":
  307.                 $FORMATTED=substr($DATA, -8);
  308.                 break;
  309.             case "SIGNOUT_REF10":
  310.             case "LAST10":
  311.                 $FORMATTED=substr($DATA, -10);
  312.                 break;
  313.             case "SIGNOUT_REF5-5":
  314.             case "LAST5-5":
  315.                 $FORMATTED=substr($DATA, -10,5)."-".substr($DATA, -5);
  316.                 break;
  317.             case "SIGNOUT_REF4-2-4":
  318.             case "LAST4-2-4":
  319.                 $FORMATTED=substr($DATA, -10,4)."-".substr($DATA, -6,2)."-".substr($DATA, -4);
  320.                 break;
  321.                     
  322.             default:
  323.                 $FORMATTED=$DATA;
  324.         }
  325.     }
  326.     return $FORMATTED;
  327.     
  328. }
  329. function rand_ltr()    {
  330.     list($usec$sec) = explode(' 'microtime());
  331.     mt_srand($sec $usec 1000000);
  332.     
  333.     $GOT_LTR=FALSE;
  334.     $i=0;
  335.     while($GOT_LTR==FALSE) {
  336.         $LTR1 mt_rand(70,85);
  337.             $LTR2 mt_rand(70,85);
  338.             $LTR_SWAY$LTR1 $LTR2//test distance between digits
  339.         $i++;
  340.         if($LTR_SWAY < -|| $LTR_SWAY 5$GOT_LTR=TRUE;
  341.         if($i>10$GOT_LTR=TRUE//give up after 10 attempts
  342.         }
  343.     return chr($LTR1).chr($LTR2);
  344.         }
  345. }