add network graph
[contractdashboard.git] / displaySON.gexf.php
blob:a/displaySON.gexf.php -> blob:b/displaySON.gexf.php
--- a/displaySON.gexf.php
+++ b/displaySON.gexf.php
@@ -1,1 +1,98 @@
+<?php
+include_once("./lib/common.inc.php");
 
+// TODO
+// color suppliers based on value? static list of high value suppliers?
+// TODO sigma
+// link on contracts site?
+// allow higher zoom levels
+// describe methodology and yellow/red color meaning, creative commons attribution
+$used_node_ids = Array();
+$included_panel_ids = Array();
+$used_edge_ids = Array();
+function add_node($id, $label, $parent = "", $panel = false)
+{
+    global $used_node_ids;
+    if (!in_array($id, $used_node_ids)) {
+        echo "<node id='" . urlencode($id) . "' label=\"" . str_replace('"','',str_replace("&", "and", $label)) . "\" " . ($parent != "" ? "pid='$parent'><viz:size value='" . rand(1, 50) . "'/>" : "><viz:size value='2'/>")
+            . "<viz:color b='" . ($panel ? 0 : 0) . "' g='" . ($panel ? 0 : 255) . "' r='" . ($panel ? 255 : 255) . "'/>";
+        echo "</node>" . PHP_EOL;
+        $used_node_ids[] = $id;
+    }
+}
+
+function add_edge($from, $to, $weight = '1.0')
+{
+    global $used_edge_ids, $included_panel_ids;
+    $id = urlencode($from . '-' . $to);
+
+    if (!in_array($id, $used_edge_ids)) {
+        echo "<edge id='" . $id . "' source='" . urlencode($from) . "' target='" . urlencode($to) . "' weight='" . $weight . "'>" . PHP_EOL;
+        if ($weight != 0.1) {
+            echo "<viz:color b='192' g='192' r='192'/>";
+    } else {
+            echo "<viz:color b='0' g='0' r='255'/>";
+        }
+        echo "</edge>" . PHP_EOL;
+        $used_edge_ids[] = $id;
+    }
+}
+
+$edges = Array();
+header('Content-Type: application/gexf+xml');
+echo '<?xml version="1.0" encoding="UTF-8"?>
+<gexf xmlns="http://www.gexf.net/1.2draft" xmlns:viz="http://www.gexf.net/1.2draft/viz" version="1.2">
+    <meta lastmodifieddate="2009-03-20">
+        <creator>Gexf.net</creator>
+        <description>A hello world! file</description>
+    </meta>
+    <graph mode="static" defaultedgetype="directed">
+
+        <nodes>' . PHP_EOL;
+
+$query = '
+SELECT "supplierABN", min("supplierName") AS "supplierName", contractnotice."SONID", count(*), sum(value) AS value 
+FROM contractnotice 
+WHERE "childCN" IS NULL 
+AND extract(year from "publishDate") = \'2016\'
+AND "supplierABN" in (select distinct "supplierABN" from contractnotice where (left("categoryUNSPSC"::text,2) = \'43\' or left("categoryUNSPSC"::text,2) = \'80\') )
+AND contractnotice."SONID" != \'\' AND contractnotice."SONID" IS NOT NULL GROUP BY "supplierABN", contractnotice."SONID"';
+$query = $conn->prepare($query);
+$query->execute();
+databaseError($conn->errorInfo());
+foreach ($query->fetchAll() as $row) {
+    add_node($row['supplierABN'], $row['supplierName'], "",false);
+    $included_panel_ids[] = $row['SONID'];
+    $edges[] = array("head" => $row['SONID'], "tail" => $row['supplierABN'], "weight" => $row['count']);
+}
+
+$query = 'SELECT "SONID", title FROM standingoffers';
+$query = $conn->prepare($query);
+$query->execute();
+foreach ($query->fetchAll() as $row) {
+   // if (in_array($row['SONID'], $included_panel_ids)){
+    add_node($row['SONID'], $row['title'], "", true);
+   // }
+}
+
+$query = 'select "SONID", abn,name from standingoffer_suppliers';
+$query = $conn->prepare($query);
+$query->execute();
+databaseError($conn->errorInfo());
+foreach ($query->fetchAll() as $row) {
+    add_node($row['abn'], $row['name']);
+
+    $edges[] = array("head"=>$row['SONID'], "tail"=>$row['abn'], "weight"=> 0.1);
+}
+
+echo '</nodes>
+        <edges>' . PHP_EOL;
+foreach ($edges as $edge) {
+    add_edge($edge['head'], $edge['tail']);
+}
+echo ' </edges>
+    </graph>
+</gexf>' . PHP_EOL;
+
+?>
+