--- a/lib/common.inc.php
+++ b/lib/common.inc.php
@@ -4,17 +4,31 @@
error_reporting(E_ALL ^ E_NOTICE);
-$conn = new PDO("pgsql:dbname=contractDashboard;user=postgres;password=snmc;host=localhost");
-
-if (!$conn) {
- die("A database error occurred.\n");
-}
+include('db.inc.php');
define('ROOT', pathinfo(__FILE__, PATHINFO_DIRNAME));
if (strstr($_SERVER['PHP_SELF'], "labs/") || strstr($_SERVER['PHP_SELF'], "admin/") || strstr($_SERVER['PHP_SELF'], "heuristics/")) {
$basePath = "../";
}
-require ROOT . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'lib' . DIRECTORY_SEPARATOR . 'openid.php';
+/*require ROOT . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'lib' . DIRECTORY_SEPARATOR . 'openid.php';
+require(ROOT.'/solarium/vendor/autoload.php');
+require(ROOT.'/solarium/library/Solarium/Autoloader.php');
+Solarium\Autoloader::register();
+// check solarium version available
+//echo 'Solarium library version: ' . Solarium\Client::VERSION . ' - ';
+$config = array(
+ 'endpoint' => array(
+ 'localhost' => array(
+ 'host' => '127.0.0.1',
+ 'port' => 8983,
+ 'path' => '/solr/contracts/',
+ )
+ )
+);
+// create a client instance
+$solr_client = new Solarium\Client($config);
+
+
$openid = new LightOpenID($_SERVER['HTTP_HOST']);
// you have to open the session to be able to modify or remove it
session_start();
@@ -43,24 +57,46 @@
} else {
login();
}
-}
+}*/
// $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
function databaseError($errMsg) {
if ($errMsg[2] != "") {
echo '
';
- if ($_SERVER['HTTP_HOST'] != "localhost") Amon::log(print_r($errMsg, true).print_r($_REQUEST, true).print_r($_SERVER, true), array('error'));
die(print_r($errMsg, true));
echo "
";
}
}
-
+function cleanseName($input) {
+
+ return trim(join(" ",array_filter(explode(" ",strtolower($input)), function($v, $k) {
+ $cleanseNamesCorp = Array(
+ "ltd",
+ "limited",
+ "australia",
+ "australian",
+ "australasia",
+ "(aus)",
+ "(aust)",
+ "(australia)",
+ "the",
+ "pty",
+ "contractors",
+ "p/l",
+ "inc.",
+ "inc",
+ "incorporated"
+ );
+ return !in_array($v,$cleanseNamesCorp) ;
+}, ARRAY_FILTER_USE_BOTH)));
+}
function ucsmart($str) {
$shortWords = Array("The", "Pty", "Ltd", "Inc", "Red", "Oil", "A", "An", "And", "At", "For", "In"
- , "Of", "On", "Or", "The", "To", "With");
- $strArray = explode(" ", preg_replace("/(?<=(? $value)
$totale += array_sum_all($value);
return $totale;
+}
+
+function show_stats($stats) {
+ setlocale(LC_MONETARY, 'en_US');
+ $value = number_format(doubleval($stats['total_value']) , 2);
+ echo "
{$stats['total']} contracts, total value $$value
";
+ if ($stats['consultancy'] > 0) {
+ echo "Consultancies: {$stats['consultancy']} contracts, ".percent($stats['consultancy'],$stats['total']);
+ echo "%
";
+ }
+ if ($stats['confidentialityContract']+$stats['confidentialityOutputs'] > 0) {
+ $confidentialities = $stats['confidentialityContract']+$stats['confidentialityOutputs'];
+ echo "Confidentialities: $confidentialities contracts, ".percent( $confidentialities,$stats['total'])."%";
+ echo "( {$stats['confidentialityContract']} on the contract, {$stats['confidentialityOutputs']} on the outputs)";
+ echo "
";
+ }
+ echo "Procurement methods: ";
+ if ($stats['open'] > 0) {
+ echo "Open {$stats['open']} contracts, ".percent($stats['open'],$stats['total']);
+ echo "%, ";
+ }
+ if ($stats['openSON'] > 0) {
+ echo "Open via SON {$stats['openSON']} contracts, ".percent($stats['openSON'],$stats['total']);
+ echo "%, ";
+ }
+ if ($stats['prequalified'] > 0) {
+ echo "Prequalified {$stats['prequalified']} contracts, ".percent($stats['prequalified'],$stats['total']);
+ echo "%, ";
+ }
+ if ($stats['limited'] > 0) {
+ echo "limited {$stats['limited']} contracts, ".percent($stats['limited'],$stats['total']);
+ echo "%, ";
+ }
}
// magic query modifiers
@@ -90,19 +160,23 @@
$supplier = filter_var($_REQUEST['supplier'], FILTER_SANITIZE_STRING);
if ($supplier != "") {
+ if ($supplier[0] !== '-') {
$supplierParts = explode("-", $supplier);
- $supplierName = "%" . $supplierParts[1] . "%";
- $supplierABN = $supplierParts[0];
- if ($supplierParts[0] > 0)
- $supplierQ = ' "supplierABN" = :supplierABN AND ';
- else
- $supplierQ = ' "supplierName" LIKE :supplierName AND ';
+
+ $supplierABN = array_shift($supplierParts);
+ $supplierName = "%" . implode('-',$supplierParts) . "%";
+
+ $supplierQ = ' "supplierABN" = :supplierABN AND ';
+ } else {
+ $supplierName = "%" . substr($supplier,1) . "%";
+ $supplierQ = ' "supplierName" ILIKE :supplierName AND ';
+ }
}
$startYear = 2007;
$year = filter_var($_REQUEST['year'], FILTER_SANITIZE_NUMBER_INT);
if ($year != "") {
- $yearQ = "YEAR(publishDate) = " . $year . " AND ";
+ $yearQ = 'extract(year from "contractStart") = ' . $year . " AND ";
}
$standardQ = ' "childCN" is null '; // AND YEAR(contractStart) >= 2007 AND YEAR(contractStart) <= 2010';
$start = 0.0;
@@ -138,6 +212,7 @@
pcdt: http://purl.org/procurement/public-contracts-datatypes#">
- Contract Dashboard
+
@@ -233,11 +308,9 @@
-
@@ -267,9 +340,21 @@
+
Filter by:
@@ -278,10 +363,15 @@
}
function include_footer() {
- global $start;
+ global $start, $conn;
$end = (float) array_sum(explode(' ', microtime()));
- echo '
' . "Last updated: ".$last_update." Processing time: " . sprintf("%.4f", ($end - $start)) . " seconds" . ' ';
if (strpos($_SERVER['SERVER_NAME'], ".gs")) {
?>
@@ -297,6 +387,160 @@
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
+ /**
+ * https://gist.github.com/remy/370590
+ * Note that this script is intended to be included at the *end* of the document, before
+ */
+(function (window, document) {
+if ('open' in document.createElement('details')) return;
+
+// made global by myself to be reused elsewhere
+var addEvent = (function () {
+ if (document.addEventListener) {
+ return function (el, type, fn) {
+ if (el && el.nodeName || el === window) {
+ el.addEventListener(type, fn, false);
+ } else if (el && el.length) {
+ for (var i = 0; i < el.length; i++) {
+ addEvent(el[i], type, fn);
+ }
+ }
+ };
+ } else {
+ return function (el, type, fn) {
+ if (el && el.nodeName || el === window) {
+ el.attachEvent('on' + type, function () { return fn.call(el, window.event); });
+ } else if (el && el.length) {
+ for (var i = 0; i < el.length; i++) {
+ addEvent(el[i], type, fn);
+ }
+ }
+ };
+ }
+})();
+
+
+/** details support - typically in it's own script */
+// find the first /real/ node
+function firstNode(source) {
+ var node = null;
+ if (source.firstChild.nodeName != "#text") {
+ return source.firstChild;
+ } else {
+ source = source.firstChild;
+ do {
+ source = source.nextSibling;
+ } while (source && source.nodeName == '#text');
+
+ return source || null;
+ }
+}
+
+function isSummary(el) {
+ var nn = el.nodeName.toUpperCase();
+ if (nn == 'DETAILS') {
+ return false;
+ } else if (nn == 'SUMMARY') {
+ return true;
+ } else {
+ return isSummary(el.parentNode);
+ }
+}
+
+function toggleDetails(event) {
+ // more sigh - need to check the clicked object
+ var keypress = event.type == 'keypress',
+ target = event.target || event.srcElement;
+ if (keypress || isSummary(target)) {
+ if (keypress) {
+ // if it's a keypress, make sure it was enter or space
+ keypress = event.which || event.keyCode;
+ if (keypress == 32 || keypress == 13) {
+ // all's good, go ahead and toggle
+ } else {
+ return;
+ }
+ }
+
+ var open = this.getAttribute('open');
+ if (open === null) {
+ this.setAttribute('open', 'open');
+ } else {
+ this.removeAttribute('open');
+ }
+
+ // this.className = open ? 'open' : ''; // Lame
+ // trigger reflow (required in IE - sometimes in Safari too)
+ setTimeout(function () {
+ document.body.className = document.body.className;
+ }, 13);
+
+ if (keypress) {
+ event.preventDefault && event.preventDefault();
+ return false;
+ }
+ }
+}
+
+function addStyle() {
+ var style = document.createElement('style'),
+ head = document.getElementsByTagName('head')[0],
+ key = style.innerText === undefined ? 'textContent' : 'innerText';
+
+ var rules = ['details{display: block;}','details > *{display: none;}','details.open > *{display: block;}','details[open] > *{display: block;}','details > summary:first-child{display: block;cursor: pointer;}','details[open]{display: block;}'];
+ i = rules.length;
+
+ style[key] = rules.join("\n");
+ head.insertBefore(style, head.firstChild);
+}
+
+var details = document.getElementsByTagName('details'),
+ wrapper,
+ i = details.length,
+ j,
+ first = null,
+ label = document.createElement('summary');
+
+label.appendChild(document.createTextNode('Details'));
+
+while (i--) {
+ first = firstNode(details[i]);
+
+ if (first != null && first.nodeName.toUpperCase() == 'SUMMARY') {
+ // we've found that there's a details label already
+ } else {
+ // first = label.cloneNode(true); // cloned nodes weren't picking up styles in IE - random
+ first = document.createElement('summary');
+ first.appendChild(document.createTextNode('Details'));
+ if (details[i].firstChild) {
+ details[i].insertBefore(first, details[i].firstChild);
+ } else {
+ details[i].appendChild(first);
+ }
+ }
+
+ // this feels *really* nasty, but we can't target details :text in css :(
+ j = details[i].childNodes.length;
+ while (j--) {
+ if (details[i].childNodes[j].nodeName === '#text' && (details[i].childNodes[j].nodeValue||'').replace(/\s/g, '').length) {
+ wrapper = document.createElement('text');
+ wrapper.appendChild(details[i].childNodes[j]);
+ details[i].insertBefore(wrapper, details[i].childNodes[j]);
+ }
+ }
+
+ first.legend = true;
+ first.tabIndex = 0;
+}
+
+// trigger details in case this being used on it's own
+document.createElement('details');
+addEvent(details, 'click', toggleDetails);
+addEvent(details, 'keypress', toggleDetails);
+addStyle();
+
+})(window, document);
+