Improve BubbleTree colors
Improve BubbleTree colors

file:b/.gitmodules (new)
  [submodule "lib/bubbletree"]
  path = lib/bubbletree
  url = https://github.com/okfn/bubbletree.git
 
<?php <?php
error_reporting(E_ALL); error_reporting(E_ALL);
  include_once("../lib/common.inc.php");
$link = mysql_connect('localhost', 'team7', 'wlUsnD2xu9');  
if (!$link) {  
die('Could not connect: ' . mysql_error());  
}  
@mysql_select_db("team7") or die("Unable to select database");  
$unspscresult = mysql_query ("select * from UNSPSCcategories;"); $unspscresult = mysql_query ("select * from UNSPSCcategories;");
while ($row = mysql_fetch_assoc($unspscresult)) { while ($row = mysql_fetch_assoc($unspscresult)) {
$unspsc[$row['UNSPSC']] = $row['Title']; $unspsc[$row['UNSPSC']] = $row['Title'];
} }
$catsresult = mysql_query ("SELECT LEFT( categoryUNSPSC, 2 ) as cat , SUM( value ) as value $catsresult = mysql_query ("SELECT LEFT( categoryUNSPSC, 2 ) as cat , SUM( value ) as value
FROM `contractnotice` FROM `contractnotice`
GROUP BY cat ;"); GROUP BY cat ;");
echo "<table>"; echo "<table>";
while ($row = mysql_fetch_assoc($catsresult)) { while ($row = mysql_fetch_assoc($catsresult)) {
$catName = $unspsc[$row['cat']."000000"].$row['cat']; $catName = $unspsc[$row['cat']."000000"].$row['cat'];
if ($row['cat'] = "") $catName = "null"; if ($row['cat'] == "") $catName = "null";
echo "<tr><td>$catName</td><td>".$row['value']."</td></tr>"; echo "<tr><td>$catName</td><td>".$row['value']."</td></tr>";
} }
?> ?>
   
 
  <!DOCTYPE html>
  <html xmlns="http://www.w3.org/1999/xhtml">
  <head>
  <meta charset="UTF-8"/>
  <title>Minimal BubbleTree Demo</title>
  <script type="text/javascript" src="lib/bubbletree/lib/jquery-1.5.2.min.js"></script>
  <script type="text/javascript" src="lib/bubbletree/lib/jquery.history.js"></script>
  <script type="text/javascript" src="lib/bubbletree/lib/raphael.js"></script>
  <script type="text/javascript" src="lib/bubbletree/lib/vis4.js"></script>
  <script type="text/javascript" src="lib/bubbletree/lib/Tween.js"></script>
  <script type="text/javascript" src="lib/bubbletree/build/bubbletree.js"></script>
  <link rel="stylesheet" type="text/css" href="lib/bubbletree/build/bubbletree.css" />
  <script type="text/javascript" src="lib/bubbletree/styles/cofog.js"></script>
 
 
  <script type="text/javascript">
 
  $(function() {
  <?php
  include_once ("lib/common.inc.php");
 
  include("lib/Color.php");
  $color = new Lux_Color();
 
 
  $unspscresult = mysql_query("select * from UNSPSCcategories;");
  while ($row = mysql_fetch_assoc($unspscresult)) {
  $unspsc[$row['UNSPSC']] = $row['Title'];
  }
  $total = 0;
  $cats = 0;
  $catsresult = mysql_query("SELECT LEFT( categoryUNSPSC, 1 ) as cat ,
  SUM( value ) as value
  FROM `contractnotice`
  WHERE childCN = 0
  GROUP BY cat ;");
  $nodes = Array();
  while ($row = mysql_fetch_assoc($catsresult)) {
  $cats++;
  $catColor = $color->hsl2hex(Array($cats/10, .7, .5));
  $catName = $unspsc[$row['cat'] . "0000000"] . $row['cat'];
  if ($row['cat'] == "") $catName = "null";
  $subnodes = Array();
  $cattwosresult = mysql_query("SELECT LEFT( categoryUNSPSC, 2 ) as cat ,
  SUM( value ) as value
  FROM `contractnotice`
  WHERE childCN = 0 and LEFT( categoryUNSPSC, 1 ) = '{$row['cat']}'
  GROUP BY cat ;");
  while ($tworow = mysql_fetch_assoc($cattwosresult)) {
  $subcatName = $unspsc[$tworow['cat'] . "000000"] . $tworow['cat'];
  if ($tworow['cat'] == "") $subcatName = "null";
  $subsubnodes = Array();
  $catthreesresult = mysql_query("SELECT LEFT( categoryUNSPSC, 3 ) as cat ,
  SUM( value ) as value
  FROM `contractnotice`
  WHERE childCN = 0 and LEFT( categoryUNSPSC, 2 ) = '{$tworow['cat']}'
  GROUP BY cat ;");
  $subCatColor = $color->hsl2hex(Array($cats/10, rand(1,10)/10, .5));
  while ($threerow = mysql_fetch_assoc($catthreesresult)) {
  $subsubcatName = $unspsc[$threerow['cat'] . "00000"] . $threerow['cat'];
  if ($threerow['cat'] == "") $subsubcatName = "null";
  $subsubnodes[] = Array(
  "label" => $subsubcatName,
  "amount" => $threerow['value'],
  "color" => "#".$subCatColor
  );
  }
  $subnodes[] = Array(
  "label" => $subcatName,
  "amount" => $tworow['value'],
  "color" => "#".$subCatColor,
  "children" => $subsubnodes
  );
  }
  $nodes[] = Array(
  "label" => $catName,
  "amount" => $row['value'],
  "color" => "#".$catColor,
  "children" => $subnodes
  );
  $total+= $row['value'];
  }
  $data = Array(
  "label" => "Australian Federal Government Contract Spending",
  "amount" => $total,
  "color" => "#000000",
  "children" => $nodes
  );
  echo "var data =eval('('+'" . json_encode($data) . "'+')');";
  ?>
 
  new BubbleTree({
  data: data,
  container: '.bubbletree'
  });
 
 
  });
 
  </script>
  </head>
  <body>
  <div class="bubbletree-wrapper">
  <div class="bubbletree"></div>
  </div>
  </body>
  </html>
 
<?php <?php
//long contract period (number of weeks/days?) //long contract period (number of weeks/days?)
$heuristics["DATE_LONG_CONTRACT_PERIOD"] = Array( $heuristics["DATE_LONG_CONTRACT_PERIOD"] = Array(
"description" => "long contract period (number of weeks/days?)" "description" => "long contract period (number of weeks/days?)"
); );
function DATE_LONG_CONTRACT_PERIOD($cn) function DATE_LONG_CONTRACT_PERIOD($cn)
{ {
$averageContractPeriod = getAverageContractPeriod(); $averageContractPeriod = getAverageContractPeriod();
$stddevContractPeriod = getstddevContractPeriod(); $stddevContractPeriod = getstddevContractPeriod();
$diff = strtotime($cn['contractEnd']) - strtotime($cn['contractStart']); $diff = strtotime($cn['contractEnd']) - strtotime($cn['contractStart']);
$days = intval($diff / (60 * 60 * 24)); $days = intval($diff / (60 * 60 * 24));
$value = abs($days - $averageContractPeriod) / $stddevContractPeriod; $value = abs($days - $averageContractPeriod) / $stddevContractPeriod;
return Array( return Array(
"heuristic_value" => $value, "heuristic_value" => $value,
"raw_value" => $days, "raw_value" => $days,
"mean" => $averageContractPeriod, "mean" => $averageContractPeriod,
"stddev" => $stddevContractPeriod "stddev" => $stddevContractPeriod
); );
} }
$averageContractPeriod; $averageContractPeriod;
function getAverageContractPeriod() function getAverageContractPeriod()
{ {
global $averageContractPeriod; global $averageContractPeriod, $stddevContractPeriod;
if (!$averageContractPeriod) { if (!$averageContractPeriod) {
$query = "select AVG(dateDiff(contractEnd,contractStart)) from contractnotice"; getStddevAverageContractPeriod();
$result = mysql_query($query);  
$r = mysql_fetch_array($result, MYSQL_BOTH);  
$averageContractPeriod = $r[0];  
} }
return $averageContractPeriod; return $averageContractPeriod;
} }
$stddevContractPeriod; $stddevContractPeriod;
function getstddevContractPeriod() function getstddevContractPeriod()
{ {
global $stddevContractPeriod; global $averageContractPeriod, $stddevContractPeriod;
if (!$stddevContractPeriod) { if (!$stddevContractPeriod) {
$query = "select STDDEV(dateDiff(contractEnd,contractStart)) from contractnotice"; getStddevAverageContractPeriod();
$result = mysql_query($query);  
$r = mysql_fetch_array($result, MYSQL_BOTH);  
$stddevContractPeriod = $r[0];  
} }
return $stddevContractPeriod; return $stddevContractPeriod;
} }
  function getStddevAverageContractPeriod()
  {
  global $averageContractPeriod, $stddevContractPeriod;
  $query = "select AVG(dateDiff(contractEnd,contractStart)),stddev(dateDiff(contractEnd,contractStart)) from contractnotice";
  $result = mysql_query($query);
  $r = mysql_fetch_array($result, MYSQL_BOTH);
  $averageContractPeriod = $r[0];
  $stddevContractPeriod = $r[1];
  }
   
   
//Reported late, 45 days? A late contract is a dodgy contract except maybe for variations? //Reported late, 45 days? A late contract is a dodgy contract except maybe for variations?
$heuristics["DATE_REPORTED_LATE"] = Array( $heuristics["DATE_REPORTED_LATE"] = Array(
"description" => "Reported late, 45 days?" "description" => "Reported late, 45 days?"
); );
function DATE_REPORTED_LATE($cn) function DATE_REPORTED_LATE($cn)
{ {
$averageDaysLate = getAverageDaysLate(); $averageDaysLate = getAverageDaysLate();
$stddevDaysLate = getStddevDaysLate(); $stddevDaysLate = getStddevDaysLate();
$diff = strtotime($cn['publishDate']) - strtotime($cn['contractStart']); $diff = strtotime($cn['publishDate']) - strtotime($cn['contractStart']);
$days = intval($diff / (60 * 60 * 24)); $days = intval($diff / (60 * 60 * 24));
if ($days <= 0) { if ($days <= 0) {
$value = 0; $value = 0;
} }
else { else {
// +1 demerit for exceeding 45 day requirement // +1 demerit for exceeding 45 day requirement
$value = (abs($days - $averageDaysLate) / $stddevDaysLate) + ($days < 45 ? 0 : 1); $value = (abs($days - $averageDaysLate) / $stddevDaysLate) + ($days < 45 ? 0 : 1);
} }
return Array( return Array(
"heuristic_value" => $value, "heuristic_value" => $value,
"raw_value" => $days, "raw_value" => $days,
"mean" => $averageDaysLate, "mean" => $averageDaysLate,
"stddev" => $stddevDaysLate "stddev" => $stddevDaysLate
); );
} }
$averageDaysLate; $averageDaysLate;
function getAverageDaysLate() function getAverageDaysLate()
{ {
global $averageDaysLate; global $averageDaysLate;
if (!$averageDaysLate) { if (!$averageDaysLate) {
$query = "select AVG(dateDiff(publishDate,contractStart)) from contractnotice"; getDaysLate();
$result = mysql_query($query);  
$r = mysql_fetch_array($result, MYSQL_BOTH);  
$averageDaysLate = $r[0];  
} }
return $averageDaysLate; return $averageDaysLate;
} }
$stddevDaysLate; $stddevDaysLate;
function getStddevDaysLate() function getStddevDaysLate()
{ {
global $stddevDaysLate; global $stddevDaysLate;
if (!$stddevDaysLate) { if (!$stddevDaysLate) {
$query = "select STDDEV(dateDiff(publishDate,contractStart)) from contractnotice"; getDaysLate();
$result = mysql_query($query);  
$r = mysql_fetch_array($result, MYSQL_BOTH);  
$stddevDaysLate = $r[0];  
} }
return $stddevDaysLate; return $stddevDaysLate;
} }
  function getDaysLate() {
   
  global $averageDaysLate,$stddevDaysLate;
   
  $query = "select AVG(dateDiff(publishDate,contractStart)), STDDEV(dateDiff(publishDate,contractStart)) from contractnotice";
  $result = mysql_query($query);
  $r = mysql_fetch_array($result, MYSQL_BOTH);
  $averageDaysLate = $r[0];
  $stddevDaysLate = $r[1];
   
  }
?> ?>
<?php <?php
include_once("../lib/common.inc.php"); include_once ("../lib/common.inc.php");
$heuristics = Array(); $heuristics = Array();
//each heuristic adds self to description array //each heuristic adds self to description array
include ("dateHeuristics.php"); include ("dateHeuristics.php");
//include("historyHeuristics.php"); include ("historyHeuristics.php");
//include("metadataHeuristics.php"); //include ("metadataHeuristics.php");
//include("valueHeuristics.php"); //include ("valueHeuristics.php");
// method signature heuristic($contractNoticeAsArray);  
function runHeuristic($heuristicName, $cn) function runHeuristic($heuristicName, $cn)
{ {
$hresults = call_user_func($heuristicName, $cn); // check if already ran
if (!isset($hresults["heuristic_value"]) || !isset($hresults["raw_value"]) || !isset($hresults["mean"]) || !isset($hresults["stddev"])) { $query = "select count(*) from heuristic_results where heuristic_name = '$heuristicName' and CNID = '{$cn['CNID']}'";
print_r($hresults); $result = mysql_query($query);
die("Missing field in heurtistic $heuristicName result"); $r = mysql_fetch_array($result);
} if ($r[0] == 0) {
$query = "insert into heuristic_results values('$heuristicName', // if not, run now
  $hresults = call_user_func($heuristicName, $cn);
  if (!isset($hresults["heuristic_value"]) || !isset($hresults["raw_value"]) || !isset($hresults["mean"]) || !isset($hresults["stddev"])) {
  print_r($hresults);
  die("Missing field in heurtistic $heuristicName result");
  }
  $query = "insert into heuristic_results values('$heuristicName',
'{$hresults["heuristic_value"]}', '{$hresults["heuristic_value"]}',
'{$hresults["raw_value"]}', '{$hresults["raw_value"]}',
'{$hresults["mean"]}', '{$hresults["mean"]}',
'{$hresults["stddev"]}', '{$hresults["stddev"]}',
'{$cn["CNID"]}', '{$cn["CNID"]}',
NOW(), NOW(),
'{$cn["publishDate"]}', '{$cn["publishDate"]}',
'{$cn["agencyABN"]}', '{$cn["agencyABN"]}',
'{$cn["supplierID"]}' '{$cn["supplierID"]}'
)"; )";
// save value and cn data via sql // save value and cn data via sql
$result = mysql_query($query); $result = mysql_query($query);
if ($result) echo "Saved $heuristicName for {$cn["CNID"]} <br>\n"; if ($result) echo "Saved $heuristicName for {$cn["CNID"]} <br>\n";
elseif (strpos(mysql_error() , "Duplicate entry") === false) echo $hresults . " failed insert.<br>" . mysql_error() . " <br> $query <br><br>\n"; elseif (strpos(mysql_error() , "Duplicate entry") === false) echo $hresults . " failed insert.<br>" . mysql_error() . " <br> $query <br><br>\n";
  }
} }
?> ?>
   
<?php <?php
// "unusual for agency/supplier due to previous low number of transactions " $heuristics["HISTORY_LOW_TRANSACTIONS_AGENCY"] = Array(
$heuristics["HISTORY_LOW_TRANSACTIONS"] = Array( "description" => "unusual for agency due to previous low number of transactions "
"description" => "unusual for agency/supplier due to previous low number of transactions "  
); );
function HISTORY_LOW_TRANSACTIONS($cn) function HISTORY_LOW_TRANSACTIONS_AGENCY($cn)
{ {
$averageContractPeriod = getAverageContractPeriod(); $thisAgencyTransactions = getAgencyTransactions($cn['agencyName']);
$diff = strtotime($cn['contractStart']) - strtotime($cn['publishDate']); $averageAgencyTransactions = getAverageAgencyTransactions();
$days = intval($diff / 24); $stddevAgencyTransactions = getstddevAgencyTransactions();
return ($days > 45 ? 1 : 0); $diff = strtotime($cn['contractEnd']) - strtotime($cn['contractStart']);
  $days = intval($diff / (60 * 60 * 24));
  $value = abs($days - $averageAgencyTransactions) / $stddevAgencyTransactions;
  return Array(
  "heuristic_value" => $value,
  "raw_value" => $days,
  "mean" => $averageAgencyTransactions,
  "stddev" => $stddevAgencyTransactions
  );
} }
/* - unusual value for time of year $agencyTransactions = Array();
- compare to all other records in last 2 weeks function getAgencyTransactions($agencyName)
- ie. many large contracts in june so takes more to standout*/  
   
$heuristics["HISTORY_HIGH_VALUE_FOR_MONTH"] = Array(  
"description" => "unusual value for time of year");  
function HISTORY_HIGH_VALUE_FOR_MONTH($cn)  
{ {
$averageContractPeriod = getAverageContractPeriod(); global $agencyTransactions;
$diff = strtotime($cn['contractStart']) - strtotime($cn['publishDate']); if (!$agencyTransactions[$agencyName]) {
$days = intval($diff / 24); $query = 'select count(*) from contractnotice where agencyName = "' . $agencyName . '"';
return ($days > 45 ? 1 : 0); $result = mysql_query($query);
  $r = mysql_fetch_array($result, MYSQL_BOTH);
  $agencyTransactions[$agencyName] = $r[0];
  }
  return $agencyTransactions[$agencyName];
} }
  $averageAgencyTransactions;
  function getAverageAgencyTransactions()
  {
  global $averageAgencyTransactions;
  if (!$averageAgencyTransactions) {
  getStatsAgencyTransactions();