<?php
/**
* SREC class
*
* @author rderesendes
* @version 0.02
*/
namespace CIC\CSSC;
use CIC\DB\cicDatabaseInterface;
/**
*
* @author rderesendes
* SREC wrapper
*/
class CSSC extends COMMON {
/**
* cicDB object
* @var object
*/
protected cicDatabaseInterface $db;
public $userID="";
public function __construct(cicDatabaseInterface $_db) {
// $this->db=$_db;
parent::__construct($_db);
if(!isset($_SESSION)) {
$this->userID='SHELL';
$_SESSION=[];
}
//laaaame
if(array_key_exists("userID",$_SESSION))
$this->userID=$_SESSION['userID'];
if(array_key_exists("_security.last_username",$_SESSION))
$this->userID=$_SESSION['_security.last_username'];
// $this->SINFO=new \CIC\CSSC\SINFO($this->db);
// $this->SREC=new \CIC\CSSC\SREC($this->db);
// $this->CDES=new \CIC\CSSC\CDES($this->db);
}
/**
* array of current semester codes
*
* uses curdate() between STARTDATE AND ENDDATE to determine codes
*
* @author rderesendes
* @return array
*/
public function get_current_sems() {
$q="SELECT DISTINCT LEFT(CINDEX,6) AS SEM FROM CDES WHERE CURDATE() BETWEEN STARTDATE AND ENDDATE";
$this->db->query($q);
$records = $this->db->fetch_assoc_all();
foreach($records as $rows) {
$RET[]=$rows['SEM'];
}
return $RET;
}
/**
* Allows logging of changes in CSSC tables (SREC/SINFO/CDES etc)
*
* desgined so that other applications can write changes BACK into foxpro
*
*
* Expected input
*
* array(
* TABLE
* CINDEX
* IDNUM
* DATA_FIELD
* NEW_DATA
* AUTO_MOD
* )
*
* @author rderesendes
* @param array $CHANGES
* @return array
*/
public function cssc_change($CHANGES) {
if(!is_array($CHANGES)) return "ERR";
if(count($CHANGES) < 1) return "err";
foreach($CHANGES AS $DATA) {
$REQ=array("TABLE","NEW_DATA","userID","DATA_FIELD");
foreach($REQ as $req) {
if(!array_key_exists($req,$DATA)) return "ERROR: MISSING FIELD - $req";
}
$CHECK=0;
switch($DATA['TABLE']) {
case "SREC":
$q="SELECT ".$DATA['DATA_FIELD'] ." FROM SREC WHERE CINDEX=? AND IDNUM=? LIMIT 1";
$criteria=array($DATA['CINDEX'],$DATA['IDNUM']);
$CHECK=1;
break;
case "CDES":
$q="SELECT ".$DATA['DATA_FIELD'] ." FROM CDES WHERE CINDEX=? LIMIT 1";
$criteria=array($DATA['CINDEX']);
$CHECK=1;
break;
case "SINFO":
$q="SELECT ".$DATA['DATA_FIELD'] ." FROM SINFO WHERE IDNUM=? LIMIT 1";
$criteria=array($DATA['IDNUM']);
$CHECK=1;
break;
case "INTAKE":
$q="SELECT ".$DATA['DATA_FIELD'] ." FROM INTAKE WHERE IDNUM=? LIMIT 1";
$criteria=array($DATA['IDNUM']);
$CHECK=1;
break;
default:
//do nothing
break;
}
if($CHECK) {
$this->db->query($q,$criteria);
$records = $this->db->fetch_assoc_all();
$DATA['OLD_DATA']=$records[0][$DATA['DATA_FIELD']];
$RET[]=$this->cssc_apply_change($DATA);
}
}
$DATA=null;
return $RET;
}
/**h
* called from cssc_change()
*
* actually applys changes and returns success
*
* @see cicSREC::cssc_change
* @author rderesendes
* @param array $CHANGES
* @return string|boolean
*/
private function cssc_apply_change($CHANGES) {
//checks
if(!is_array($CHANGES)) return "ERROR: EXPECTING ARRAY";
//PRIMARY CHECKS
$REQ=array("TABLE","OLD_DATA","NEW_DATA","userID","DATA_FIELD");
foreach($REQ as $req) {
if(!array_key_exists($req,$CHANGES)) return "ERROR: MISSING FIELD - $req";
}
$CHECK=0;
//if no change just return
if($CHANGES['NEW_DATA']==$CHANGES['OLD_DATA']) return;
switch($CHANGES['TABLE']) {
case "SREC":
if(!array_key_exists("CINDEX",$CHANGES)) return "ERROR: MISSING FIELD - CINDEX";
if(!array_key_exists("IDNUM",$CHANGES)) return "ERROR: MISSING FIELD - IDNUM";
$UPDATE['where']='IDNUM=? AND CINDEX=?';
$UPDATE['criteria']=array($CHANGES['IDNUM'],$CHANGES['CINDEX']);
$CHECK=1;
break;
case "CDES":
if(!array_key_exists("CINDEX",$CHANGES)) return "ERROR: MISSING FIELD - CINDEX";
// if(!array_key_exists("IDNUM",$CHANGES)) return "ERROR: MISSING FIELD - IDNUM";
$UPDATE['where']='CINDEX=?';
$UPDATE['criteria']=array($CHANGES['CINDEX']);
$CHECK=1;
break;
case "SINFO":
// if(!array_key_exists("CINDEX",$CHANGES)) return "ERROR: MISSING FIELD - CINDEX";
if(!array_key_exists("IDNUM",$CHANGES)) return "ERROR: MISSING FIELD - IDNUM";
$UPDATE['where']='IDNUM=?';
$UPDATE['criteria']=array($CHANGES['IDNUM']);
$CHECK=1;
break;
case "SINFO":
// if(!array_key_exists("CINDEX",$CHANGES)) return "ERROR: MISSING FIELD - CINDEX";
if(!array_key_exists("IDNUM",$CHANGES)) return "ERROR: MISSING FIELD - IDNUM";
$UPDATE['where']='IDNUM=?';
$UPDATE['criteria']=array($CHANGES['IDNUM']);
$CHECK=1;
break;
default:
break;
}
if($CHECK) {
//we look good to go...some final checks
$CHANGES['TBL']=$CHANGES['TABLE'];
unset($CHANGES['TABLE']);
if(!array_key_exists('AUTO_MOD',$CHANGES)) $CHANGES['AUTO_MOD']=0;
if($CHANGES['AUTO_MOD']==1) {
$CHANGES['STATUS']=1;
$CHANGES['MODERATOR']=$CHANGES['userID'];
$CHANGES['COMPLETED_DATE']=date("Y-m-d H:i:s");
}
else $CHANGES['STATUS']=0;
unset($CHANGES['AUTO_MOD']);
$CHANGES['ENTERED_DATE']=date("Y-m-d H:i:s");
if($CHANGES['AUTO_COMMIT']==1) {
$UPDATE['CHANGE'][$CHANGES['DATA_FIELD']]=$CHANGES['NEW_DATA'];
$this->db->update($CHANGES['TBL'],$UPDATE['CHANGE'],$UPDATE['where'],$UPDATE['criteria']);
}
unset($CHANGES['AUTO_COMMIT']); //TODO PROPER FILTER HERE
if($this->db->insert("CSSC_CHANGES",$CHANGES)) return true;
}
}
public function cssc_commit_change($ChangeID) {
//lookup a change and commit it to the source table/does not affect foxpro
}
/**
* Gets the students courses for a given date, if not date given checks today
*
* @author rderesendes
* @param string $IDNUM
* @param string $DATE
* @return array
*/
public function get_student_class_schedule($IDNUM,$DATE=0) {
if($DATE==0) $DATE=date("Y-m-d");
else $DATE=date("Y-m-d",strtotime($DATE));
$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";
$this->db->query($q,array($IDNUM,$DATE));
$records = $this->db->fetch_assoc_all();
foreach($records as $rows) {
$DATA[$rows['PERIOD']]=$rows;
}
return $DATA;
}
function format($DATA,$FORMAT) {
$FORMATS=explode("|",$FORMAT);
foreach($FORMATS as $F) {
$TMP=explode(":",$F);
$TYPE=$TMP[0];
$ARG=$TMP[1];
switch($TYPE) {
case "LAST":
$ARG=($ARG < 0) ? $ARG : $ARG*-1 ; //if PASSED NEGATIVE, leave it
$FORMATTED=substr($DATA,$ARG*-1,$ARG);
break;
case "FIRST":
$ARG=($ARG < 0) ? $ARG*-1 : $ARG ; //if PASSED NEGATIVE, leave flipit
$FORMATTED=substr($DATA,0,$ARG);
break;
case "UPPER":
$FORMATTED=strtoupper($DATA);
break;
case "LOWER":
$FORMATTED=strtolower($DATA);
break;
case "IDNUM":
$FORMATTED=substr($DATA, 0,4)."-".substr($DATA, 4,2)."-".substr($DATA, 6,4);
break;
case "CLUBS":
case "CINDEX":
$FORMATTED=substr($DATA,0,6)."-".substr($DATA,6,5)."-".substr($DATA,11,2);
break;
case "CINDEX_SHORT":
$FORMATTED=substr($DATA,6,5)."-".substr($DATA,11,2);
break;
case "CINDEX_SCODE":
case "SCODE":
$FORMATTED=substr($DATA,6,5);
break;
case "CONTACT_DATATYPE":
$FORMATTED=$CONF["SINFO"]["CONTACTS"]["TYPES"][$DATA];
break;
case "CONTACT_TYPE":
$FORMATTED=$CONF["SINFO"]["CONTACTS"]["CTYPES"][$DATA];
break;
case "SEMCODE":
$FORMATTED=substr($DATA, 0,4)."-".substr($DATA, 4,2);
break;
case "GRADTYPE":
case "GRADTYPE_STRIPPED":
case "GRADTYPE_LONG":
$REP["S"]=array("(",")");
$REP["R"]=array("","");
if(array_key_exists($DATA,$CONF["GRADTYPE"])) $DATA=$CONF["GRADTYPE"][$DATA];
$FORMATTED=str_replace($REP["S"],$REP["R"],$DATA);
break;
case "GRADTYPE_LONG_":
if(array_key_exists($DATA,$CONF["GRADTYPE"])) $DATA=$CONF["GRADTYPE"][$DATA];
$FORMATTED=$DATA;
break;
case "GRADTYPE_CODE":
case "GRADTYPE_SHORT":
if(array_key_exists($DATA,$CONF["GRADTYPE"])) $DATA=$CONF["GRADTYPE"][$DATA];
$TMP=explode("(",$DATA);
$FORMATTED="(".strtoupper(substr($TMP[1],0,1)).")";
break;
case "SIGNOUT_REF":
case "SIGNOUT_REF4":
case "LAST4":
$FORMATTED=substr($DATA, -4);
break;
case "SIGNOUT_REF6":
case "LAST6":
$FORMATTED=substr($DATA, -6);
break;
case "SIGNOUT_REF4-4":
case "LAST4-4":
$FORMATTED=substr($DATA, -8,4)."-".substr($DATA, -4);
break;
case "SIGNOUT_REF8":
case "LAST8":
$FORMATTED=substr($DATA, -8);
break;
case "SIGNOUT_REF10":
case "LAST10":
$FORMATTED=substr($DATA, -10);
break;
case "SIGNOUT_REF5-5":
case "LAST5-5":
$FORMATTED=substr($DATA, -10,5)."-".substr($DATA, -5);
break;
case "SIGNOUT_REF4-2-4":
case "LAST4-2-4":
$FORMATTED=substr($DATA, -10,4)."-".substr($DATA, -6,2)."-".substr($DATA, -4);
break;
default:
$FORMATTED=$DATA;
}
}
return $FORMATTED;
}
function rand_ltr() {
list($usec, $sec) = explode(' ', microtime());
mt_srand($sec + $usec * 1000000);
$GOT_LTR=FALSE;
$i=0;
while($GOT_LTR==FALSE) {
$LTR1 = mt_rand(70,85);
$LTR2 = mt_rand(70,85);
$LTR_SWAY= $LTR1 - $LTR2; //test distance between digits
$i++;
if($LTR_SWAY < -5 || $LTR_SWAY > 5) $GOT_LTR=TRUE;
if($i>10) $GOT_LTR=TRUE; //give up after 10 attempts
}
return chr($LTR1).chr($LTR2);
}
}