From: maxious Date: Sun, 31 Jul 2011 14:18:59 +0000 Subject: Merge branch 'master' of ssh://apples.lambdacomplex.org/git/contractdashboard X-Git-Url: http://maxious.lambdacomplex.org/git/?p=contractdashboard.git&a=commitdiff&h=f1084560197f9266bc712e96ab7736e3f7236468 --- Merge branch 'master' of ssh://apples.lambdacomplex.org/git/contractdashboard --- --- a/admin/linkAmendments.php +++ b/admin/linkAmendments.php @@ -25,4 +25,5 @@ else print_r($errors); } +// also need to eliminate CN 100528/100529 - check for double parent CNs with no childCN, latest sequent CN id wins childCN = 0 ?> --- a/displayBubbletree.php +++ b/displayBubbletree.php @@ -19,11 +19,17 @@ $(function() { hsl2hex(Array($cats/10, .7, .5)); $catName = $unspsc[$row['cat'] . "0000000"] . $row['cat']; if ($row['cat'] == "") $catName = "null"; $subnodes = Array(); @@ -48,26 +56,27 @@ 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" => "#000000" + "color" => "#".$subCatColor ); } $subnodes[] = Array( "label" => $subcatName, "amount" => $tworow['value'], - "color" => "#000000", + "color" => "#".$subCatColor, "children" => $subsubnodes ); } $nodes[] = Array( "label" => $catName, "amount" => $row['value'], - "color" => "#000000", + "color" => "#".$catColor, "children" => $subnodes ); $total+= $row['value']; --- a/displayCalendar.php +++ b/displayCalendar.php @@ -6,15 +6,23 @@ if ($_REQUEST['month']) { echo "

".$_REQUEST['month']."

"; $monthParts = explode("-",$_REQUEST['month']); - $query = "SELECT CNID, description, value, agencyName, category, contractStart, supplierName - FROM `contractnotice` - WHERE childCN = 0 - AND YEAR(contractStart) = {$monthParts[1]} - AND MONTH(contractStart) = {$monthParts[0]} - ORDER BY value DESC"; - $result = mysql_query($query); -echo ''; - echo ''; + $query = 'SELECT "CNID", "description", "value", "agencyName", "category", "contractStart", "supplierName" + FROM contractnotice + WHERE "childCN" = 0 + AND extract(year from "contractStart") = :year + AND extract(month from "contractStart") = :month + ORDER BY value DESC'; +$query = $conn->prepare($query); +$query->bindParam(":month", $monthParts[0]); + +$query->bindParam(":year", $monthParts[1]); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + } + +MethodCountGraph($supplier); +CnCGraph($supplier); echo " @@ -26,7 +34,7 @@ "; - while ($row = mysql_fetch_array($result, MYSQL_BOTH)) { + foreach ($query->fetchAll() as $row) { setlocale(LC_MONETARY, 'en_US'); $value = number_format(doubleval($row['value']) , 2); echo (" @@ -52,10 +60,14 @@ echo ''; -$query = "SELECT YEAR(contractStart), MONTH(contractStart), -SUM(value) as val, count(1) as count FROM `contractnotice` WHERE childCN = 0 GROUP BY MONTH(contractStart), YEAR(contractStart) ORDER BY YEAR(contractStart), MONTH(contractStart) "; +$query = 'SELECT extract(year from "contractStart"), extract(month from "contractStart"), +SUM(value) as val, count(1) as count FROM contractnotice WHERE "childCN" = 0 GROUP BY extract(year from "contractStart"), extract(month from "contractStart") ORDER BY extract(year from "contractStart"), extract(month from "contractStart") '; +$query = $conn->prepare($query); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + } -$result = mysql_query($query); echo "
Supplier
@@ -63,7 +75,7 @@ "; -while ($row = mysql_fetch_array($result, MYSQL_BOTH)) { + foreach ($query->fetchAll() as $row) { setlocale(LC_MONETARY, 'en_US'); $value = number_format(doubleval($row["val"]),2); $month_name = date( 'F', mktime(0, 0, 0, $row[1]) ); --- a/displayHeatmap.php +++ b/displayHeatmap.php @@ -1,7 +1,7 @@ = '$year' AND supplierPostcode = postcode GROUP BY supplierPostcode"; -$result = mysql_query($query); +$query = 'SELECT "supplierPostcode", sum("value") as value, max(lat) as lat, max(lon) as lon FROM contractnotice inner join postcodes on "supplierPostcode" = postcode::text where "childCN" = 0 AND "supplierCountry" = \'Australia\' GROUP BY "supplierPostcode"'; +$query = $conn->prepare($query); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + } + $left = "FFFF50"; $right= "EF0050"; @@ -41,8 +46,7 @@ $colorset[$i] = imagecolorallocatealpha($handle, $leftR + ($i*(($rightR-$leftR)/250)), $leftG + ($i*(($rightG-$leftG)/250)), $leftB + ($i*(($rightB-$leftB)/250)),117 - ($i/250)*40); } -while ($row = mysql_fetch_array($result, MYSQL_BOTH)) -{ + foreach ($query->fetchAll() as $row) { $xpage = round((($XRange - ($MaxX - $row['lon'])) / $xdivlength)); if ($row['lat'] < -40.25) $row['lat']-= 0.75; $ypage = round(($YRange - (abs($MaxY) - abs($row['lat']))) / $ydivheight); --- a/displaySupplier.php +++ b/displaySupplier.php @@ -4,9 +4,9 @@ include_header("Supplier"); $supplierS = htmlentities(strip_tags($_REQUEST['supplier'])); - echo ''; - echo ''; - echo ''; + MethodCountGraph($supplierS); + CnCGraph($supplierS); + MethodValueGraph($supplierS); /*lobbyist ties links to ABR/ASIC/Google News/ASX/Court records @@ -62,6 +62,7 @@ histograph of supplier size/value */ include_header("Suppliers"); +suppliersGraph(); $query = 'SELECT SUM("value") as val, MAX("supplierName") as supplierName, "supplierABN",( case when "supplierABN" != 0 THEN "supplierABN"::text ELSE "supplierName" END) as supplierID FROM contractnotice --- a/heuristics/heuristics.inc.php +++ b/heuristics/heuristics.inc.php @@ -3,13 +3,13 @@ $heuristics = Array(); //each heuristic adds self to description array include ("dateHeuristics.php"); -//include ("historyHeuristics.php"); +include ("historyHeuristics.php"); //include ("metadataHeuristics.php"); //include ("valueHeuristics.php"); function runHeuristic($heuristicName, $cn) { // check if already ran - $query = "select count(*) from heuristic_results where heuristic_name = '$heuristicName' and CNID = '{$CN['CNID']}"; + $query = "select count(*) from heuristic_results where heuristic_name = '$heuristicName' and CNID = '{$cn['CNID']}'"; $result = mysql_query($query); $r = mysql_fetch_array($result); if ($r[0] == 0) { @@ -37,3 +37,4 @@ } } ?> + --- /dev/null +++ b/lib/Color.php @@ -1,1 +1,502 @@ - + + * + * @license http://www.opensource.org/licenses/bsd-license.php BSD License + * + * @version $Id$ + * + */ +class Lux_Color +{ + /** + * + * Converts hexadecimal colors to RGB. + * + * @param string $hex Hexadecimal value. Accepts values with 3 or 6 numbers, + * with or without #, e.g., CCC, #CCC, CCCCCC or #CCCCCC. + * + * @return array RGB values: 0 => R, 1 => G, 2 => B + * + */ + public function hex2rgb($hex) + { + // Remove #. + if (strpos($hex, '#') === 0) { + $hex = substr($hex, 1); + } + + if (strlen($hex) == 3) { + $hex .= $hex; + } + + if (strlen($hex) != 6) { + return false; + } + + // Convert each tuple to decimal. + $r = hexdec(substr($hex, 0, 2)); + $g = hexdec(substr($hex, 2, 2)); + $b = hexdec(substr($hex, 4, 2)); + + return array($r, $g, $b); + } + + /** + * + * Converts hexadecimal colors to HSV. + * + * @param string $hex Hexadecimal value. Accepts values with 3 or 6 numbers, + * with or without #, e.g., CCC, #CCC, CCCCCC or #CCCCCC. + * + * @return array HSV values: 0 => H, 1 => S, 2 => V + * + */ + public function hex2hsv($hex) + { + return $this->rgb2hsv($this->hex2rgb($hex)); + } + + /** + * + * Converts hexadecimal colors to HSL. + * + * @param string $hex Hexadecimal value. Accepts values with 3 or 6 numbers, + * with or without #, e.g., CCC, #CCC, CCCCCC or #CCCCCC. + * + * @return array HSL values: 0 => H, 1 => S, 2 => L + * + */ + public function hex2hsl($hex) + { + return $this->rgb2hsl($this->hex2rgb($hex)); + } + + /** + * + * Converts RGB colors to hexadecimal. + * + * @param array $rgb RGB values: 0 => R, 1 => G, 2 => B + * + * @return string Hexadecimal value with six digits, e.g., CCCCCC. + * + */ + public function rgb2hex($rgb) + { + if(count($rgb) < 3) { + return false; + } + + list($r, $g, $b) = $rgb; + + // From php.net. + $r = 0x10000 * max(0, min(255, $r)); + $g = 0x100 * max(0, min(255, $g)); + $b = max(0, min(255, $b)); + + return strtoupper(str_pad(dechex($r + $g + $b), 6, 0, STR_PAD_LEFT)); + } + + /** + * + * Converts RGB to HSV. + * + * @param array $rgb RGB values: 0 => R, 1 => G, 2 => B + * + * @return array HSV values: 0 => H, 1 => S, 2 => V + * + */ + public function rgb2hsv($rgb) + { + // RGB values = 0 ÷ 255 + $var_R = ($rgb[0] / 255); + $var_G = ($rgb[1] / 255); + $var_B = ($rgb[2] / 255); + + // Min. value of RGB + $var_Min = min($var_R, $var_G, $var_B); + + // Max. value of RGB + $var_Max = max($var_R, $var_G, $var_B); + + // Delta RGB value + $del_Max = $var_Max - $var_Min; + + $V = $var_Max; + + // This is a gray, no chroma... + if ( $del_Max == 0 ) { + // HSV results = 0 ÷ 1 + $H = 0; + $S = 0; + } else { + // Chromatic data... + $S = $del_Max / $var_Max; + + $del_R = ((($var_Max - $var_R) / 6) + ($del_Max / 2)) / $del_Max; + $del_G = ((($var_Max - $var_G) / 6) + ($del_Max / 2)) / $del_Max; + $del_B = ((($var_Max - $var_B) / 6) + ($del_Max / 2)) / $del_Max; + + if ($var_R == $var_Max) { + $H = $del_B - $del_G; + } else if ($var_G == $var_Max) { + $H = (1 / 3) + $del_R - $del_B; + } else if ($var_B == $var_Max) { + $H = (2 / 3) + $del_G - $del_R; + } + + if ($H < 0) { + $H += 1; + } + if ($H > 1) { + $H -= 1; + } + } + + // Returns agnostic values. + // Range will depend on the application: e.g. $H*360, $S*100, $V*100. + return array($H, $S, $V); + } + + /** + * + * Converts RGB to HSL. + * + * @param array $rgb RGB values: 0 => R, 1 => G, 2 => B + * + * @return array HSL values: 0 => H, 1 => S, 2 => L + * + */ + public function rgb2hsl($rgb) + { + // Where RGB values = 0 ÷ 255. + $var_R = $rgb[0] / 255; + $var_G = $rgb[1] / 255; + $var_B = $rgb[2] / 255; + + // Min. value of RGB + $var_Min = min($var_R, $var_G, $var_B); + // Max. value of RGB + $var_Max = max($var_R, $var_G, $var_B); + // Delta RGB value + $del_Max = $var_Max - $var_Min; + + $L = ($var_Max + $var_Min) / 2; + + if ( $del_Max == 0 ) { + // This is a gray, no chroma... + // HSL results = 0 ÷ 1 + $H = 0; + $S = 0; + } else { + // Chromatic data... + if ($L < 0.5) { + $S = $del_Max / ($var_Max + $var_Min); + } else { + $S = $del_Max / ( 2 - $var_Max - $var_Min ); + } + + $del_R = ((($var_Max - $var_R) / 6) + ($del_Max / 2)) / $del_Max; + $del_G = ((($var_Max - $var_G) / 6) + ($del_Max / 2)) / $del_Max; + $del_B = ((($var_Max - $var_B) / 6) + ($del_Max / 2)) / $del_Max; + + if ($var_R == $var_Max) { + $H = $del_B - $del_G; + } else if ($var_G == $var_Max) { + $H = ( 1 / 3 ) + $del_R - $del_B; + } else if ($var_B == $var_Max) { + $H = ( 2 / 3 ) + $del_G - $del_R; + } + + if ($H < 0) { + $H += 1; + } + if ($H > 1) { + $H -= 1; + } + } + + return array($H, $S, $L); + } + + /** + * + * Converts HSV colors to hexadecimal. + * + * @param array $hsv HSV values: 0 => H, 1 => S, 2 => V + * + * @return string Hexadecimal value with six digits, e.g., CCCCCC. + * + */ + public function hsv2hex($hsv) + { + return $this->rgb2hex($this->hsv2rgb($hsv)); + } + + /** + * + * Converts HSV to RGB. + * + * @param array $hsv HSV values: 0 => H, 1 => S, 2 => V + * + * @return array RGB values: 0 => R, 1 => G, 2 => B + * + */ + public function hsv2rgb($hsv) + { + $H = $hsv[0]; + $S = $hsv[1]; + $V = $hsv[2]; + + // HSV values = 0 ÷ 1 + if ($S == 0) { + $R = $V * 255; + $G = $V * 255; + $B = $V * 255; + } else { + $var_h = $H * 6; + // H must be < 1 + if ( $var_h == 6 ) { + $var_h = 0; + } + // Or ... $var_i = floor( $var_h ) + $var_i = floor( $var_h ); + $var_1 = $V * ( 1 - $S ); + $var_2 = $V * ( 1 - $S * ( $var_h - $var_i ) ); + $var_3 = $V * ( 1 - $S * ( 1 - ( $var_h - $var_i ) ) ); + + switch($var_i) { + case 0: + $var_r = $V; + $var_g = $var_3; + $var_b = $var_1; + break; + case 1: + $var_r = $var_2; + $var_g = $V; + $var_b = $var_1; + break; + case 2: + $var_r = $var_1; + $var_g = $V; + $var_b = $var_3; + break; + case 3: + $var_r = $var_1; + $var_g = $var_2; + $var_b = $V; + break; + case 4: + $var_r = $var_3; + $var_g = $var_1; + $var_b = $V; + break; + default: + $var_r = $V; + $var_g = $var_1; + $var_b = $var_2; + } + + //RGB results = 0 ÷ 255 + $R = $var_r * 255; + $G = $var_g * 255; + $B = $var_b * 255; + } + + return array($R, $G, $B); + } + + /** + * + * Converts HSV colors to HSL. + * + * @param array $hsv HSV values: 0 => H, 1 => S, 2 => V + * + * @return array HSL values: 0 => H, 1 => S, 2 => L + * + */ + public function hsv2hsl($hsv) + { + return $this->rgb2hsl($this->hsv2rgb($hsv)); + } + + /** + * + * Converts hexadecimal colors to HSL. + * + * @param array $hsl HSL values: 0 => H, 1 => S, 2 => L + * + * @return string Hexadecimal value. Accepts values with 3 or 6 numbers, + * with or without #, e.g., CCC, #CCC, CCCCCC or #CCCCCC. + * + */ + public function hsl2hex($hsl) + { + return $this->rgb2hex($this->hsl2rgb($hsl)); + } + + /** + * + * Converts HSL to RGB. + * + * @param array $hsv HSL values: 0 => H, 1 => S, 2 => L + * + * @return array RGB values: 0 => R, 1 => G, 2 => B + * + */ + public function hsl2rgb($hsl) + { + list($H, $S, $L) = $hsl; + + if ($S == 0) { + // HSL values = 0 ÷ 1 + // RGB results = 0 ÷ 255 + $R = $L * 255; + $G = $L * 255; + $B = $L * 255; + } else { + if ($L < 0.5) { + $var_2 = $L * (1 + $S); + } else { + $var_2 = ($L + $S) - ($S * $L); + } + + $var_1 = 2 * $L - $var_2; + + $R = 255 * $this->_hue2rgb($var_1, $var_2, $H + (1 / 3)); + $G = 255 * $this->_hue2rgb($var_1, $var_2, $H); + $B = 255 * $this->_hue2rgb($var_1, $var_2, $H - (1 / 3)); + } + + return array($R, $G, $B); + } + + /** + * + * Support method for hsl2rgb(): converts hue ro RGB. + * + * @param + * + * @param + * + * @param + * + * @return int + * + */ + protected function _hue2rgb($v1, $v2, $vH) + { + if ($vH < 0) { + $vH += 1; + } + + if ($vH > 1) { + $vH -= 1; + } + + if ((6 * $vH) < 1) { + return ($v1 + ($v2 - $v1) * 6 * $vH); + } + + if ((2 * $vH) < 1) { + return $v2; + } + + if ((3 * $vH) < 2) { + return ($v1 + ($v2 - $v1) * (( 2 / 3) - $vH) * 6); + } + + return $v1; + } + + /** + * + * Converts hexadecimal colors to HSL. + * + * @param array $hsl HSL values: 0 => H, 1 => S, 2 => L + * + * @return array HSV values: 0 => H, 1 => S, 2 => V + * + */ + public function hsl2hsv($hsl) + { + return $this->rgb2hsv($this->hsl2rgb($hsl)); + } + + /** + * + * Updates HSV values. + * + * @param array $hsv HSV values: 0 => H, 1 => S, 2 => V + * + * @param array $values Values to update: 0 => value to add to H (0 to 360), + * 1 and 2 => values to multiply S and V (0 to 100). Example: + * + * {{{code:php + * // Update saturation to 80% in the provided HSV. + * $hsv = array(120, 0.75, 0.75); + * $new_hsv = $color->updateHsv($hsv, array(null, 80, null)); + * }}} + * + */ + public function updateHsv($hsv, $values) + { + if (isset($values[0])) { + $hsv[0] = max(0, min(360, ($hsv[0] + $values[0]))); + } + + if (isset($values[1])) { + $hsv[1] = max(0, min(1, ($hsv[1] * ($values[1] / 100)))); + } + + if (isset($values[2])) { + $hsv[2] = max(0, min(1, ($hsv[2] * ($values[2] / 100)))); + } + + return $hsv; + } + + /** + * + * Updates HSL values. + * + * @param array $hsl HSL values: 0 => H, 1 => S, 2 => L + * + * @param array $values Values to update: 0 => value to add to H (0 to 360), + * 1 and 2 => values to multiply S and V (0 to 100). Example: + * + * {{{code:php + * // Update saturation to 80% in the provided HSL. + * $hsl = array(120, 0.75, 0.75); + * $new_hsl = $color->updateHsl($hsl, array(null, 80, null)); + * }}} + * + */ + public function updateHsl($hsl, $values) + { + if (isset($values[0])) { + $hsl[0] = max(0, min(360, ($hsl[0] + $values[0]))); + } + + if (isset($values[1])) { + $hsl[1] = max(0, min(1, ($hsl[1] * ($values[1] / 100)))); + } + + if (isset($values[2])) { + $hsl[2] = max(0, min(1, ($hsl[2] * ($values[2] / 100)))); + } + + return $hsl; + } +} --- a/lib/graphs.inc.php +++ b/lib/graphs.inc.php @@ -296,40 +296,63 @@ } function SuppliersGraph() { + + global $conn; + includeFlot(); $topX = 10; -$query = "SELECT value, supplierName -FROM `contractnotice` WHERE (YEAR(contractStart) >= 2009) AND childCN = 0 -GROUP BY supplierABN ORDER BY value DESC limit $topX"; -$result = mysql_query($query); $suppliers = Array(); $values = Array(); -while ($row = mysql_fetch_array($result, MYSQL_BOTH)) { + + +$query = 'SELECT SUM("value") as value, MAX("supplierName") as supplierName, ( + case when "supplierABN" != 0 THEN "supplierABN"::text ELSE "supplierName" END) as supplierID +FROM contractnotice +WHERE "childCN" = 0 +GROUP BY supplierID +ORDER BY value DESC +LIMIT '.$topX; +$query = $conn->prepare($query); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + } + foreach ($query->fetchAll() as $row) { setlocale(LC_MONETARY, 'en_US'); // $value = number_format(doubleval($row["value"]) , 2); $suppliers[] = ucsmart($row[1]); $values[] = doubleval($row["value"]); } -mysql_free_result($result); - -$query = "SELECT sum(a.value) as val, supplierCountry from (SELECT value, supplierName, supplierCountry -FROM `contractnotice` WHERE (YEAR(contractStart) >= 2009) AND childCN = 0 -GROUP BY supplierName ORDER BY value LIMIT 18446744073709551610 OFFSET $topX) as a group by supplierCountry order by val DESC limit 5 offset 1"; -$result = mysql_query($query); -while ($row = mysql_fetch_array($result, MYSQL_BOTH)) { - $suppliers[] = "Other suppliers in ".ucsmart($row["supplierCountry"]); + +$query = 'SELECT sum(a.svalue) as val, suppliercountry from (SELECT sum("value") as svalue, max("supplierCountry") as suppliercountry +FROM contractnotice WHERE "childCN" = 0 and "supplierCountry" NOT ILIKE \'Australia\' +GROUP BY "supplierName" ORDER BY svalue LIMIT 18446744073 OFFSET 10) as a group by suppliercountry order by val DESC limit 10 '; +$query = $conn->prepare($query); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + } + + foreach ($query->fetchAll() as $row) { + $suppliers[] = "Other suppliers in ".ucsmart($row["suppliercountry"]); $values[] = doubleval($row[0]); } -mysql_free_result($result); - -$query = "SELECT sum(a.value) as val, TRUNCATE(supplierPostcode,-2) as postcode from (SELECT value, supplierName, supplierPostcode, supplierCountry -FROM `contractnotice` WHERE (YEAR(contractStart) >= 2009) AND childCN = 0 -GROUP BY supplierName ORDER BY value LIMIT 18446744073709551610 OFFSET $topX) as a -WHERE (supplierCountry LIKE 'Australia' OR supplierCountry LIKE 'AUSTRALIA') AND supplierPostcode < 10000 -group by TRUNCATE(supplierPostcode,-2) -order by val DESC"; -$result = mysql_query($query); -while ($row = mysql_fetch_array($result, MYSQL_BOTH)) { + +$query = 'SELECT sum(a.value) as val, substring( +supplierpostcode from 0 for 2) as postcode from (SELECT sum(value) as value, max("supplierPostcode") as supplierpostcode, max("supplierCountry") as suppliercountry +FROM contractnotice WHERE "childCN" = 0 +GROUP BY "supplierABN" ORDER BY sum(value) LIMIT 1844674 OFFSET 10) as a +WHERE (suppliercountry ILIKE \'Australia\') +group by substring( +supplierpostcode from 0 for 2) +order by val DESC;'; +$query = $conn->prepare($query); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + } + + foreach ($query->fetchAll() as $row) { if ($row['postcode'][0] == 2 && $row['postcode'][1] == 6) $ACTvalue += $row[0]; else if ($row['postcode'][0] == 2 || $row['postcode'][0] == 1) $NSWvalue += $row[0]; else if ($row['postcode'][0] == 3 || $row['postcode'][0] == 8) $Vicvalue += $row[0]; @@ -339,7 +362,6 @@ else if ($row['postcode'][0] == 7) $Tasvalue += $row[0]; else if ($row['postcode'][0] == 0) $NTvalue += $row[0]; } -mysql_free_result($result); $suppliers[] = "Other suppliers in Australia - ACT"; $values[] = doubleval($ACTvalue); $suppliers[] = "Other suppliers in Australia - NSW"; @@ -356,7 +378,53 @@ $values[] = doubleval($SAvalue); $suppliers[] = "Other suppliers in Australia - Tasmania"; $values[] = doubleval($Tasvalue); - -} + ?> + +
+ +
Month/YearNumber of Contracts