number of DOPs to rollover
$dow = 0; //day of week: 0=>Sun ... 6=>Sat
$days = 0;
//$NumDBPlayers = count($Players);
$NumDBPlayers = MyGetPlayerInfo();
$jdStart = CheckForRollover(); //sets $jdStart
CheckForReminder();
//-----------------------
//set max tables for each day
//-----------------------
$jd = $jdStart;
for($d=0; $d<$SUSNoDays; $d++) //for each day of play
{
$k = -1;
while($k < 0) //set max tables for next day of play
{
$dow = jddayofweek($jd,0); //get day of the week
if($SUSDaysUsed[$dow] != 0) //if this is day of play
{
$maxTables[$d] = $SUSMaxTables[$dow]; //set max tables for this day
//$maxTables[$d] = $_SESSION['susmaxtables'][$dow]; //set max tables for this day
$k = 1;
}
$jd++; //try next day
}
}
//--------------------------------------------
//set signup page headings for all DOPs
//--------------------------------------------
for($d=0; $d<$SUSNoDays; $d++)
{
$Headings[$d*2] = $Systemdata['date'][$d];
$Headings[$d*2+1] = $Systemdata['day'][$d];
}
$_SESSION['headings'] = $Headings;
return;
}
//--------------------------------------------------------------------------------
function CheckForRollover() {
//--------------------------------------------------------------------------------
//global $jd;
//global $jdStart;
global $SUSDaysUsed;
global $SUSDaysToSkip;
global $SUSDOPChgHour;
global $SUSNoDays;
global $SUSRemindTime;
global $Players;
global $Status;
global $Systemdata;
//global $maxTables;
$TablesFileName = $_SESSION['path_tables'];
$TablesCsvFileName = $_SESSION['path_tabcsv'];
$PlayersFileName = $_SESSION['path_players'];
$StatusFileName = $_SESSION['path_status'];
$NumDBPlayers = count($Players);
$statLen = $_SESSION['susnostatus'];
$dbjds = 0; //database jdStart
$debug = 0; //controls printing of debug info
$logging = 1; //controls logging
//$jdStart = -1; //julian day for next day of play (DOP)
$daysRollover = 0; //!= 0 => number of DOPs to rollover
$dopChgTime = 0; //time to rollover
$dow = 0; //day of week: 0=>Sun ... 6=>Sat
//-----------------------------------------------
//get julian day number from Systemdata database
//-----------------------------------------------
$jdPlayers = $Systemdata['jdstart'][0];
$jdStart = $jdPlayers;
//-----------------------------
//get today's julian day number
//-----------------------------
$jd = cal_to_jd(CAL_GREGORIAN,date("m"),date("d"),date("Y"));
$jdToday = $jd;
//------------------------
//return if nothing to do
//------------------------
if($jdPlayers > 0 && $jdToday < $jdPlayers) { return $jdStart; }
//------------------------------------------
//if new or zeroed database set
//fill in the jdstart, date and day name
//in the systemdata table and $Systemdata
//------------------------------------------
if($jdPlayers <= 0) {
$jdStart = MyFillJDStart();
return $jdStart;
}
//---------------------
//find jd for each DOP
//---------------------
$jdDOP = array(); //jd for each DOP
$jdDOPOffset = array(); //jd offset from Today for each DOP
$jd = $jdPlayers;
for($i=0; $i<$SUSNoDays; $i++)
{
$dow = (jddayofweek($jd,0));
$jdDOP[$i] = $jd;
$jdDOPOffset[$i] = $jdDOP[$i] - $jdToday;
if($jdDOPOffset[$i] < 0) { $daysRollover++; }
$jd += $SUSDaysToSkip[$dow];
}
if($logging)
{
$jdDOPstr = "jdDOP: ";
for($i=0; $i<$SUSNoDays; $i++)
{
$jdDOPstr .= "$jdDOP[$i]" . "(" . "$jdDOPOffset[$i]" . ") ";
}
$jdDOPstr .= "\n";
}
//--------------------------------------------
//find jdStart for next day of play
//--------------------------------------------
if($daysRollover >= $SUSNoDays) //if need to rollover entire database
{
$jd= $jdToday;
$jdStart = -1;
while($jdStart < 0) //find jd for next DOP
{
$dow = (jddayofweek($jd,0));
if($SUSDaysUsed[$dow] == 0) { //day not day of play
$jd++;
continue;
}
$jdStart = $jd;
}
} else {
$jdStart = $jdDOP[$daysRollover];
}
$dbjds = $jdStart; //jdStart is jd for next DOP
$rolloverDOW = (jddayofweek($jdStart,0));
if($logging)
{
$str = "jdToday=$jdToday jdStart=$jdStart jdPlayers=$jdPlayers dbjds=$dbjds dow=$dow rolloverDOW=$rolloverDOW";
//WriteToLogFile($str,'data');
}
if($debug) { echo("
jdStart=$jdStart dow=$dow jd=$jd rolloverDOW=$rolloverDOW dbjds=$dbjds"); }
//-------------------------------
//check if rollover is required
//-------------------------------
if($jdDOPOffset[$daysRollover] == 0) //is today the next DOP
{
//-------------------
//check rollover time
//-------------------
//get date/time array
$da = cal_from_jd($jdStart, CAL_GREGORIAN);
//get unix time for rollover
$dopChgTime = mktime($SUSDOPChgHour,0,0,$da['month'],$da['day'],$da['year']);
//get current time
$curTime = time();
if($logging)
{
$mm = $da['month'] ;
$dd = $da['day'];
$yy = $da['year'] ;
$str = "month=$mm day=$dd year=$yy dopChgTime=$dopChgTime curTime=$curTime";
//WriteToLogFile($str,'data');
}
if($debug)
{
echo("
today is next DOP: chghour=$SUSDOPChgHour | dopChgTime=$dopChgTime | time=$curTime
");
print_r($da);
}
if($curTime >= $dopChgTime) //if past rollover time
{
//--------------------------------------------
//find new jdStart for next day of play
//--------------------------------------------
$jd = $jdStart + 1;
$jdStart = -1;
while($jdStart < 0)
{
$dow = (jddayofweek($jd,0));
if($SUSDaysUsed[$dow] == 0) { //day not day of play
$jd++;
continue;
}
$jdStart = $jd;
}
$dbjds = $jdStart;
$daysRollover++; //at least one DOP to rollover
if($logging)
{
$str = "Time rollover: NextDOP=> jdStart=$jdStart dbjds=$dbjds";
//WriteToLogFile($str,'data');
}
if($debug) { echo("
rollover: curTime=$curTime | dopChgTime=$dopChgTime | new jdStart=$jdStart dbjds=$dbjds"); }
}
}
//---------------------------------
if($daysRollover > $statLen) { $daysRollover = $statLen; } // if move to new day
if($daysRollover > 0)
{
if($debug) { echo("
Perform rollover: daysRollover=$daysRollover statLen=$statLen"); }
if($logging) {
PruneLogFile();
WriteToLogFile('','header');
WriteToLogFile($jdDOPstr,'data');
$line = "Perform rollover: daysRollover=$daysRollover statLen=$statLen jdStart=$jdStart\n";
WriteToLogFile($line, "data");
}
//----------------------------------------
//backup the database before rolling over
//----------------------------------------
MyBackupDB($rolloverDOW);
$foo = $_SESSION['susname'];
if($debug) { echo("
BackupFiles: daysRollover=$daysRollover SUSName=$foo rolloverDOW=$rolloverDOW"); }
if($logging) {
$line = "BackupFiles: daysRollover=$daysRollover SUSName=$foo rolloverDOW=$rolloverDOW\n";
WriteToLogFile($line, "data");
}
//---------------------------
//reset player ptype entries
//---------------------------
$rc = MyResetPType();
WriteToLogFile("ResetPType(): $rc resets\n", "data");
//-----------------------
//rollover the database
//-----------------------
for($i=0; $i<$daysRollover; $i++)
{
if(!is_int($jdStart = MyRollover(0)))
{
echo "
Rollover:$jdStart";
exit;
}
//pop the Tables file (tables.ser)
if(file_exists($TablesFileName))
{
$Tables = unserialize(file_get_contents($TablesFileName));
if($Tables)
{
ksort($Tables);
array_shift($Tables);
$Tables[2][0]['table'] = -1;
file_put_contents($TablesFileName, serialize($Tables));
}
}
if($debug) { echo("
PopStatusFile: daysRollover=$daysRollover"); }
if($logging) {
$line = "PopStatusFile: daysRollover=$daysRollover\n";
WriteToLogFile($line, "data");
//WriteToLogFile("", "blank");
}
}
//---------------------------------------
//remove the tables csv file (tables.csv)
//---------------------------------------
if(file_exists($TablesCsvFileName))
{
//fclose($TablesCsvFileName);
unlink($TablesCsvFileName);
}
MyGetPlayerInfo(); //reads player files after writing
$SUSRemindTime = abs($SUSRemindTime); //Reset reminder sent status
$_SESSION['susremindtime'] = $SUSRemindTime;
WriteCfgFile();
//------------------------
//Clean the database
//------------------------
/*
CleanDB(); //strip_tags() and recalc the high seq values
$line = "CleanDB() has finished\n";
WriteToLogFile($line, "data");
*/
}
return $jdStart;
}
//--------------------------------------------------------------------------------
function listPids() {
//--------------------------------------------------------------------------------
global $Players;
$_SESSION['susnoplayers'] = $NumDBPlayers = count($Players);
$n=0;
$pids = array();
for($p=0; $p<$NumDBPlayers; $p++)
{
if($Players[$p]['login'] == 'Guest') {
continue;
}
$pids[$n++] = $Players[$p]['pid'];
}
$nG = $n;
for($p=0; $p<$NumDBPlayers; $p++)
{
if($Players[$p]['login'] != 'Guest') {
continue;
}
$pids[$n++] = $Players[$p]['pid'];
}
$pids[$n++] = $nG;
return $pids;
}
//--------------------------------------------------------------------------------
function CalcDraw($doTables, $ndxDOP = -1) {
//--------------------------------------------------------------------------------
//WriteToLogFile("\nCalcDraw($doTables)","data");
//echo "
CalcDraw: doTables = $doTables ndxDOP = $ndxDOP";
global $SUSMaxGames;
global $SUSMaxTables;
global $SUSDaysUsed;
global $SUSDaysToSkip;
global $SUSNumPPG; //Number players per game
global $SUSSubEqReg;
global $SUSNoDays;
global $SUSAllowHalfGames;
global $SUSNotifyOnOff;
global $Players;
global $Status;
global $Systemdata;
global $maxTables; //max tables for each day of play
global $calcCnt;
//update player files
//writePlayerFiles($_SESSION['susdbname']);
$_SESSION['susnoplayers'] = $NumDBPlayers = count($Players);
//arrays of available player info
$sortPid = array(); //player pid
$sortSeq = array(); //player signup sequence
$sortType = array(); //player type
$sortUsed = array(); //player already used in draw
$sortAvg = array(); //player pair's master pt avg
$tableTeam = array(); //pids of team partners
//'pid1','pid2','posn','seq','mpavg'
$GamesPerDay = array();
$nTeam = 0; //number of teams
$nATDays = $_SESSION['numtabledays']; //number of days to assign tables
//general variables
$table = array(); //holding queue to make a table
$nT = 0; //number of tables
$ppt = 4; //players per table
$p = 0; //index into Players array
$s = 0; //index into Status array
$n = 0; //index into sort arrays
$nQ = 0; //number in holding queue
$nA = 0; //number in available players
//----------------------------------------------------------
//----------------------------
//set max tables for each day
//----------------------------
$jd = $Systemdata['jdstart'][0];
for($d=0; $d<$SUSNoDays; $d++) //for each day of play
{
$k = -1;
while($k < 0) //set max tables for next day of play
{
$dow = jddayofweek($jd,0); //get day of the week
if($SUSDaysUsed[$dow] != 0) //if this is day of play
{
$maxTables[$d] = $SUSMaxTables[$dow]; //set max tables for this day
$k = 1;
}
$jd++; //try next day
}
}
//-----------------------
//set status for each day
//-----------------------
for($d=0; $d<$SUSNoDays; $d++)
{
$GamesPerDay[$d] = 0;
$sortPid = array(); //player pid
$sortSeq = array(); //player signup sequence
$sortType = array(); //player type
$sortUsed = array(); //player already used in draw
$sortAvg = array(); //player pair's master pt avg
$table = array(); //holding queue to make a table
$nTeam = 0; //number of teams
$tableTeam = array(); //pids of team partners
//'pid1','pid2','posn','seq','mpavg'
$n = 0;
$nT = 0;
//--------------------------------------------
//build arrays of available player information
//--------------------------------------------
for($s=0; $s<$NumDBPlayers; $s++)
{
$status = $Status[$s][$d]['status'];
if($status == 'A' || $status == 'P')
{
$Status[$s][$d]['prevstatus'] = $status;
$Status[$s][$d]['status'] = 'A';
$chgpid = $Status[$s][$d]['pid'];
$_SESSION['changed_pids'][] = $chgpid;
$sortUsed[$n] = 0;
$sortSeq[$n] = $Status[$s][$d]['seq'];
$sortPid[$n] = $Status[$s][$d]['pid'];
$p = PlayerIndex($sortPid[$n]);
if($d == 0) //account for cutoff ptype
{
$sortType[$n] = $Players[$p]['ptype'];
} else {
$sortType[$n] = $Players[$p]['ptype'] & 1;
}
$n++;
}
}
$nA = $n;
if($nA == 0) { continue; } //loop if no available players
//-------------------------------------
//sort arrays into signup sequence order
//-------------------------------------
array_multisort($sortSeq, SORT_NUMERIC, SORT_ASC, $sortPid, $sortType);
if($SUSSubEqReg == 0)
{
//array_multisort($sortType, SORT_NUMERIC, SORT_ASC, $sortPid, $sortSeq);
//array_multisort is not a stable sort so have to do the following
$acnt = count($sortType);
$regs_0 = array(); //indexs for regulars
$iregs_0 = 0;
$regs_10 = array(); //indexs for regulars on waiting list
$iregs_10 = 0;
$subs_1 = array(); //indexs for subs
$isubs_1 = 0;
$subs_11 = array(); //indexs for subs on waiting list
$isubs_11 = 0;
for($i=0; $i<$acnt; $i++) //separate regulars and subs
//and sort by player type
{
switch($sortType[$i])
{
case 0: //regular
$regs_0[$iregs_0] = $i;
$iregs_0++;
break;
case 10: //regular on waiting list
$regs_10[$iregs_10] = $i;
$iregs_10++;
break;
case 1: //sub
$subs_1[$isubs_1] = $i;
$isubs_1++;
break;
case 11: //sub on waiting list
$subs_11[$isubs_11] = $i;
$isubs_11++;
break;
}
}
$tempSeq = array();
$tempPid = array();
$tempType = array();
$j = 0;
for($i=0; $i<$iregs_0; $i++) //regulars
{
$tempSeq[$j] = $sortSeq[$regs_0[$i]];
$tempPid[$j] = $sortPid[$regs_0[$i]];
$tempType[$j] = $sortType[$regs_0[$i]];
$j++;
}
for($i=0; $i<$isubs_1; $i++) //subs
{
$tempSeq[$j] = $sortSeq[$subs_1[$i]];
$tempPid[$j] = $sortPid[$subs_1[$i]];
$tempType[$j] = $sortType[$subs_1[$i]];
$j++;
}
for($i=0; $i<$iregs_10; $i++) //regulars on waiting list
{
$tempSeq[$j] = $sortSeq[$regs_10[$i]];
$tempPid[$j] = $sortPid[$regs_10[$i]];
$tempType[$j] = $sortType[$regs_10[$i]];
$j++;
}
for($i=0; $i<$isubs_11; $i++) //subs on waiting list
{
$tempSeq[$j] = $sortSeq[$subs_11[$i]];
$tempPid[$j] = $sortPid[$subs_11[$i]];
$tempType[$j] = $sortType[$subs_11[$i]];
$j++;
}
for($i=0; $i<$acnt; $i++) //put sorted values back in sort arrays
{
$sortSeq[$i] = $tempSeq[$i];
$sortPid[$i] = $tempPid[$i];
$sortType[$i] = $tempType[$i];
}
}
//--------------------------
//set status in Status array
//--------------------------
$nQ = 0;
$n = 0;
while($n<$nA)
{
if($sortUsed[$n] == 0)
{
$table[$nQ] = $sortPid[$n]; //add next player to table
$sortUsed[$n] = 1; //show player used
$s = StatusIndex($sortPid[$n]); //index to players status info
$pp = $Status[$s][$d]['partner']; //player's partner
if($pp != 0) //if player has a partner
{
//find player's partner
$i = -1;
for($j=$n+1; $j<$nA; $j++)
{
if($sortPid[$j] == $pp && $sortUsed[$j] == 0)
{
$i = $j; //index of player's partner
break;
}
}
} else { //player has no partner
//find a partner for the player
$i = -1;
for($j=$n+1; $j<$nA; $j++)
{
$s = StatusIndex($sortPid[$j]); //index to players status info
$pp = $Status[$s][$d]['partner']; //player's partner
if($pp == 0 && $sortUsed[$j] == 0) //if player has no partner
{
$i = $j; //index of player's partner
break;
}
}
}
if($i >= 0) //if found a partner
{
//add both to teams table
$tableTeam[$nTeam]['pid1'] = $table[$nQ];
$tableTeam[$nTeam]['pid2'] = $sortPid[$i];
$s = StatusIndex($table[$nQ]); //index to players status info
$tableTeam[$nTeam]['posn'] = $Status[$s][$d]['posn'];
$tableTeam[$nTeam]['seq'] = $Status[$s][$d]['seq'];
if($_SESSION['nmplevels'] > 0)
{
$ndx = PlayerIndex($table[$nQ]);
$avg = $Players[$ndx]['masterpts'];
$ndx = PlayerIndex($sortPid[$i]);
$avg += $Players[$ndx]['masterpts'];
$tableTeam[$nTeam]['mpavg'] = $avg/2;
} else {
$tableTeam[$nTeam]['mpavg'] = 0;
}
$nTeam++;
//add both to table
$nQ++; //add player
$table[$nQ] = $sortPid[$i]; //add partner
$sortUsed[$i] = 1; //show partner used
$nQ++; //add partner
}
//-------------------
//update Status array
//-------------------
if($nQ == $ppt)
{
for($i=0; $i<$ppt; $i++)
{
$s = StatusIndex($table[$i]); //index to players status info
//$Status[$s][$d]['prevstatus'] = $Status[$s][$d]['status'];
$Status[$s][$d]['status'] = 'P';
$chgpid = $Status[$s][$d]['pid'];
$_SESSION['changed_pids'][] = $chgpid;
}
$nQ = 0;
$nT++;
}
} //if player not already used
//if($SUSMaxGames > 0 && $nT >= $SUSMaxGames) break;
if($maxTables[$d] > 0 && $nT >= $maxTables[$d]) { break; }
$n++;
} //for each available player
if($SUSAllowHalfGames != 0)
{
if($nQ == 2)
{
for($i=0; $i<2; $i++)
{
$s = StatusIndex($table[$i]); //index to players status info
//$Status[$s][$d]['prevstatus'] = $Status[$s][$d]['status'];
$Status[$s][$d]['status'] = 'P';
$chgpid = $Status[$s][$d]['pid'];
$_SESSION['changed_pids'][] = $chgpid;
}
$nQ = 0;
$nT++;
}
}
$GamesPerDay[$d] = $nT;
//--------------------------------------------
//assign tables and abort if only doing tables
//--------------------------------------------
if($d < $nATDays && $doTables != 0)
{
if($ndxDOP < 0 || ($ndxDOP >= 0 && $ndxDOP == $d))
{
if( $nTeam > 0)
{
$sortAvg = array();
for($i=0; $i<$nTeam; $i++)
{
$sortAvg[$i] = $tableTeam[$i]['mpavg'];
}
array_multisort($sortAvg, SORT_NUMERIC, SORT_DESC, $tableTeam);
AssignTables($d, $nTeam, $tableTeam);
}
}
}
} //for each day
//-------------------------------
//clean up status for 'A' players
//-------------------------------
for($s=0; $s<$NumDBPlayers; $s++)
{
for($d=0; $d<$SUSNoDays; $d++)
{
if($Status[$s][$d]['status'] == 'A')
{
$Status[$s][$d]['table'] = 0;
$Status[$s][$d]['tableposn'] = 0;
$chgpid = $Status[$s][$d]['pid'];
$_SESSION['changed_pids'][] = $chgpid;
}
}
}
//------------------------------------
//Send Notifications and update ptype
//------------------------------------
$cnt = 0;
for($s=0; $s<$NumDBPlayers; $s++)
{
$pid = $Players[$s]['pid'];
$pNdx = PlayerIndex($pid);
$statusNdx = StatusIndex($pid);
$flag = 0;
$PStat = $Status[$statusNdx][0]['prevstatus'];
$CStat = $Status[$statusNdx][0]['status'];
if($CStat === 'P') //if is playing now then
{ //reset any residual cutoff ptype
if($Players[$pNdx]['ptype'] == 10)
{ $Players[$pNdx]['ptype'] = 0; $flag++;}
if($Players[$pNdx]['ptype'] == 11)
{ $Players[$pNdx]['ptype'] = 1; $flag++;}
if($flag > 0)
{
$ptype = $Players[$pNdx]['ptype'];
MyUpdatePType($pid, $ptype);
$flag = 0;
}
}
if($PStat != $CStat)
{
if($PStat === 'P') //if was playing and not now
{
SendNotifications($pid, 0); //send not playing notice
$Status[$statusNdx][0]['prevstatus'] = $Status[$statusNdx][0]['status'];
$chgpid = $Status[$statusNdx][0]['pid'];
$_SESSION['changed_pids'][] = $chgpid;
$cnt++;
} elseif($CStat === 'P') //if was not playing then is now
{
SendNotifications($pid, 1); //send playing notice
$Status[$statusNdx][0]['prevstatus'] = $Status[$statusNdx][0]['status'];
$chgpid = $Status[$statusNdx][0]['pid'];
$_SESSION['changed_pids'][] = $chgpid;
$cnt++;
}
}
}
$rc = MyUpdateStatus();
$_SESSION['gamesperday'] = $GamesPerDay;
return 0;
}
//--------------------------------------------------------------------------------
function AssignTables($ndxDOP, $nTeam, $tableTeam) {
// $ndxDOP = day index
// $nTeam = Number of teams
// $tableTeam = See DBIndexGlobals.txt in includes for description
//--------------------------------------------------------------------------------
//WriteToLogFile("\nAssignTables($nTeam, $tableTeam)","data");
//echo "
AssignTables: ndxDOP = $ndxDOP nTeam = $nTeam ";
//print_r($tableTeam);
global $Players;
global $Status;
global $Systemdata;
global $SUSNoDays;
global $SUSTitle;
global $SUSAllowHalfGames;
global $Headings;
global $maxTables; //max tables for each day of play
$TablesFileName = $_SESSION['path_tables'];
if(file_exists($TablesFileName) === FALSE)
{
$Tables = array();
$nATDays = $_SESSION['numtabledays'];
for($i=0; $i<$nATDays; $i++)
$Tables[$i][0]['table'] = -1;
$rc = file_put_contents($TablesFileName, serialize($Tables));
if($rc === FALSE) { echo("
Cannot initialize $TablesFileName"); }
} else {
$Tables = unserialize(file_get_contents($TablesFileName));
if($Tables === FALSE)
{
$Tables = array();
$nATDays = $_SESSION['numtabledays'];
for($i=0; $i<$nATDays; $i++)
$Tables[$i][0]['table'] = -1;
} else {
unset($Tables[$ndxDOP]);
$Tables[$ndxDOP][0]['table'] = -1;
}
}
$NumDBPlayers = count($Players);
$tableTeam[] = array(); //pids of team partners
//each[i] has 'pid1','pid2','posn','seq','mpavg'
$d = 0;
$d = $ndxDOP;
$nTables = intval($nTeam / 2); //number of tables
$nHalfTables = $nTeam % 2; //Number of half teams
$nTT = $nTables + $nHalfTables; //number of total tables
//$foo = $maxTables[$ndxDOP];
//echo "
ndxDOP=$ndxDOP | Play=$NumDBPlayers | maxTables=$foo | nTeam=$nTeam | nTables=$nTables | nHalfTables=$nHalfTables | nTT=$nTT";
$_SESSION['tablesfull'][$ndxDOP] = 0;
if($nHalfTables == 0 && $nTables >= $maxTables[$ndxDOP])
{
$_SESSION['tablesfull'][$ndxDOP] = 1;
}
$nt = 0; //current index into $table
$table[] = array(); //table assignments [table][0=>NS 1=>EW]
//ndx into $tableTeam
$nNS = 0; //number of teams requesting NS
$teamNS = array(); //NS pairs from $tableTeam
$nEW = 0; //number of teams requesting EW
$teamEW = array(); //EW pairs from $tableTeam
$nDC = 0; //number of teams requesting DC
$teamDC = array(); //DC pairs from $tableTeam
//-----------------------------
//init $table array to no teams
//-----------------------------
for($t=0; $t<$nTT; $t++)
{
$table[$t][0] = -1;
$table[$t][1] = -1;
}
//------------------------------------------------
//if only one player pair then don't assign tables
//------------------------------------------------
if($nTables <= 0) { return; }
//------------------------------------------------
//count each position request and save index to it
//------------------------------------------------
for($t=0; $t<$nTeam; $t++)
{
switch($tableTeam[$t]['posn'])
{
case 0: //Don't Care (DC)
$teamDC[$nDC++] = $tableTeam[$t];
break;
case 1: //NS requested
$teamNS[$nNS++] = $tableTeam[$t];
break;
case 2: //EW requested
$teamEW[$nEW++] = $tableTeam[$t];
break;
}
}
/*
if($ndxDOP == 0)
{
echo("
\$tableTeam");
print_r($tableTeam);
echo("
\$teamNS");
print_r($teamNS);
echo("
\$teamEW");
print_r($teamEW);
echo("
\$teamDC");
print_r($teamDC);
echo("
----------------------------------------------------------------");
}
*/
//------------------------------------------
//populate NS/EW directions to form tables
//------------------------------------------
$moving = 1;
while($moving > 0)
{
if($nNS > $nEW) //if there are more NS than EW
{
if($nDC > 0)
{ //if there are DCs available
//move DC -> EW
$teamEW[$nEW++] = $teamDC[0];
unset($teamDC[0]);
$teamDC = array_values($teamDC);
$nDC = count($teamDC);
} elseif(($nNS-$nEW) > 1)
{ //if there are extra NSs
//move NS -> EW
$teamEW[$nEW++] = $teamNS[0];
unset($teamNS[0]);
$teamNS = array_values($teamNS);
$nNS = count($teamNS);
} else {
$moving = 0;
}
} elseif($nEW > $nNS) //if there are more EW than NS
{
if($nDC > 0)
{ //if there are DCs available
//move DC -> NS
$teamNS[$nNS++] = $teamDC[0];
unset($teamDC[0]);
$teamDC = array_values($teamDC);
$nDC = count($teamDC);
} elseif(($nEW-$nNS) > 1)
{ //if there are extra EWs
//move EW -> NS
$teamNS[$nNS++] = $teamEW[0];
unset($teamEW[0]);
$teamEW = array_values($teamEW);
$nEW = count($teamEW);
} else {
$moving = 0;
}
} else { //if NS == EW
if($nDC > 0)
{ //if there are DCs available
//move DC -> NS
$teamNS[$nNS++] = $teamDC[0];
unset($teamDC[0]);
$teamDC = array_values($teamDC);
$nDC = count($teamDC);
} else {
$moving = 0;
}
}
}
//------------------------------------------
//sort NS/EW directions to match players
//------------------------------------------
//--------
//sort NS
//--------
$sortAvg = array();
for($i=0; $i<$nNS; $i++)
{
$sortAvg[$i] = $teamNS[$i]['mpavg'];
}
array_multisort($sortAvg, SORT_NUMERIC, SORT_DESC, $teamNS);
//echo "
teamNS";
//print_r($teamNS);
//--------
//sort EW
//--------
$sortAvg = array();
for($i=0; $i<$nEW; $i++)
{
$sortAvg[$i] = $teamEW[$i]['mpavg'];
}
array_multisort($sortAvg, SORT_NUMERIC, SORT_DESC, $teamEW);
//echo "
teamEW";
//print_r($teamEW);
//-----------------------------------
//update the players status database
//and create $Tables file
//-----------------------------------
for($t=0; $t<$nTT; $t++)
{
$Tables[$ndxDOP][$t]['table'] = $t+1;
if($t < $nNS)
{
$pid1ns=$teamNS[$t]['pid1'];
$ndxS = StatusIndex($pid1ns);
$Status[$ndxS][$d]['table'] = $t+1;
$Status[$ndxS][$d]['tableposn'] = 1;
$chgpid = $Status[$ndxS][$d]['pid'];
$_SESSION['changed_pids'][] = $chgpid;
$pid2ns=$teamNS[$t]['pid2'];
$ndxS = StatusIndex($pid2ns);
$Status[$ndxS][$d]['table'] = $t+1;
$Status[$ndxS][$d]['tableposn'] = 1;
$chgpid = $Status[$ndxS][$d]['pid'];
$_SESSION['changed_pids'][] = $chgpid;
//make $Tables entry
$Tables[$ndxDOP][$t]['pid1ns'] = $pid1ns;
$Tables[$ndxDOP][$t]['pid2ns'] = $pid2ns;
$Tables[$ndxDOP][$t]['partns'] = ($Status[$ndxS][$d]['partner'] != 0) ? 1 : 0;
$Tables[$ndxDOP][$t]['mpavgns'] = intval($teamNS[$t]['mpavg']);
}
if($t <= $nTables)
{
if($t < $nEW)
{
$pid1ew=$teamEW[$t]['pid1'];
$ndxS = StatusIndex($pid1ew);
$Status[$ndxS][$d]['table'] = $t+1;
$Status[$ndxS][$d]['tableposn'] = 2;
$chgpid = $Status[$ndxS][$d]['pid'];
$_SESSION['changed_pids'][] = $chgpid;
$pid2ew=$teamEW[$t]['pid2'];
$ndxS = StatusIndex($pid2ew);
$Status[$ndxS][$d]['table'] = $t+1;
$Status[$ndxS][$d]['tableposn'] = 2;
$chgpid = $Status[$ndxS][$d]['pid'];
$_SESSION['changed_pids'][] = $chgpid;
//make $Tables entry
$Tables[$ndxDOP][$t]['pid1ew'] = $pid1ew;
$Tables[$ndxDOP][$t]['pid2ew'] = $pid2ew;
$Tables[$ndxDOP][$t]['partew'] = ($Status[$ndxS][$d]['partner'] != 0) ? 1 : 0;
$Tables[$ndxDOP][$t]['mpavgew'] = intval($teamEW[$t]['mpavg']);
}
} else {
$Tables[$ndxDOP][$t]['pid1ew'] = -1;
$Tables[$ndxDOP][$t]['pid2ew'] = -1;
$Tables[$ndxDOP][$t]['partew'] = 0;
$Tables[$ndxDOP][$t]['mpavgew'] = 0;
}
}
$rc = file_put_contents($TablesFileName, serialize($Tables));
if($rc === FALSE) { echo("
Cannot write $TablesFileName"); }
/*
if($ndxDOP == 0)
{
$foo = count($Tables[$ndxDOP]);
echo "
ndxDOP = $ndxDOP nT = $foo
";
echo "";
print_r($Tables[$ndxDOP]);
echo "
";
}
*/
/*
$cnt = count($Tables);
echo("
nTables=$cnt");
print_r($Tables);
print_r($tableTeam);
exit;
*/
}
//--------------------------------------------------------------------------------
function CheckNotifyTime() {
//--------------------------------------------------------------------------------
global $SUSNotifyTime;
global $SUSDOPChgHour;
global $Systemdata;
if($SUSNotifyTime <= 0) { return 1; }
//-----------------------------------------------
//get julian day number from Systemdata database
//-----------------------------------------------
$jdPlayers = $Systemdata['jdstart'][0];
if($jdPlayers <= 0) { return 0; }
//-----------------------------
//get today's julian day number
//-----------------------------
$jd = cal_to_jd(CAL_GREGORIAN,date("m"),date("d"),date("Y"));
$jdToday = $jd;
//------------------------
//return if today not DOP
//------------------------
if($jdToday != $jdPlayers) { return 0; }
//------------------------
//return if today blocked
//------------------------
if($Systemdata['signupblock'][0] != 0) { return 0; }
//-------------------
//check notify time
//-------------------
//get date/time array
$da = cal_from_jd($jdPlayers, CAL_GREGORIAN);
//get unix time for notify
$nt = $SUSDOPChgHour - $SUSNotifyTime;
$notifyTime = mktime($nt,0,0,$da['month'],$da['day'],$da['year']);
//get current time
$curTime = time();
if($curTime >= $notifyTime) //if past notify time
{
return 1;
}
return 0;
}
//--------------------------------------------------------------------------------
function SendNotifications($pid, $type) {
//--------------------------------------------------------------------------------
global $SUSNoDays;
global $SUSTitle;
global $SUSAdminEmail;
global $SUSNotifyAdmin;
global $SUSNotifyOnOff;
global $Headings;
global $Players;
global $Status;
global $Systemdata;
$flname = array();
if($SUSNotifyOnOff <= 0) { return; }
$playerNdx = PlayerIndex($pid);
$flname = MakeFLName($Players[$playerNdx]['name']);
//send the admins an email
if($SUSNotifyAdmin != 0 && strlen($SUSAdminEmail) > 0)
{
if(CheckNotifyTime() != 0)
{
$toAddr = $SUSAdminEmail;
//$fromAddr = "postmaster@bridgesignup.com";
$fromAddr = "no-reply@bridgesignup.com";
$msgTitle = "Notification from $SUSTitle";
$stat = ($type == 0) ? '"Not Playing"' : '"Playing"';
$msgBody = "$flname: Playing status changed to $stat.";
SendSMTPMail($toAddr, $fromAddr, $msgTitle, $msgBody, "");
//echo "
SendNotifications: $toAddr, $fromAddr, $msgTitle, $msgBody";
}
}
if($Players[$playerNdx]['login'] == 'Guest' || $Players[$playerNdx]['notify'] == 0) { return; }
$date = $_SESSION['headings'][0];
$toAddr = $Players[$playerNdx]['email'];
//$fromAddr = "postmaster@bridgesignup.com";
$fromAddr = "no-reply@bridgesignup.com";
$msgTitle = "Notification from $SUSTitle";
$msgBody = "$flname, \n";
if($type == 0)
{
$msgBody .= "Your playing status for the next game on $date has changed to \"Not Playing\".";
} else {
$msgBody .= "Your playing status for the next game on $date has changed to \"Playing\".";
}
$msgFlag = 1;
SendSMTPMail($toAddr, $fromAddr, $msgTitle, $msgBody, "");
//echo "
SendNotifications: $toAddr, $fromAddr, $msgTitle, $msgBody";
return;
}
//--------------------------------------------------------------------------------
//==============PHP End ======================================================== ?>