diff --git a/web/assets/js/attendance.js b/web/assets/js/attendance.js
index fec5b52229d9fa1185ef980e69d31bf993b0bfba..808c042a637a042be2561e31b009a1c7a2d2b048 100644
--- a/web/assets/js/attendance.js
+++ b/web/assets/js/attendance.js
@@ -197,7 +197,7 @@ angular.module('datasid.attendance', []).
                 config.plotOptions.series.events = {
                     click: function(event) {
                         $scope.$apply(function () {
-                            $location.path($location.path() + '/' + event.point.category[0]);
+                            $scope.barChart.click(event);
                         });
                     }
                 };
@@ -206,6 +206,14 @@ angular.module('datasid.attendance', []).
                 $scope.barChart.load();
             },
 
+            click: function (event) {
+                if (typeof $state.params.state !== 'undefined') {
+                    window.open('/api/reports/'+$state.current.project+'/avail_report/'+event.point.category[0], '_blank');
+                }
+                else
+                    $location.path($location.path() + '/' + event.point.category[0]);
+            },
+
             load: function () {
                 var options = {
                     project: $state.current.project,
diff --git a/web/reports/build-report.sh b/web/reports/build-report.sh
index 7eb0365bff52db6efbe45aa0a18af33d11a5681d..53b9a2e953f533af8743a305a9f2b4ee63810206 100755
--- a/web/reports/build-report.sh
+++ b/web/reports/build-report.sh
@@ -1,3 +1,11 @@
 #!/bin/bash
 
-java -cp .:lib/* ReportBuilder $*
+cd $(dirname $(readlink -f $0))
+
+tmp=$(mktemp)
+
+java -cp .:lib/* ReportBuilder $* > $tmp
+
+echo -n $tmp
+
+cd - >/dev/null 2>&1
diff --git a/web/routes/charts.js b/web/routes/charts.js
index da98c45adbb64246fde0642dbe11eb60797ac0fe..d873419d2da69b86d9224484f5e0e574d0bd0e8d 100644
--- a/web/routes/charts.js
+++ b/web/routes/charts.js
@@ -1,3 +1,6 @@
+var exec = require('child_process').exec,
+    fs = require('fs');
+
 exports.get_data = function(req, res) {
     if (typeof req.params.project === 'undefined')
         return res.json(400, {error: 'missing_project'});
@@ -132,3 +135,64 @@ exports.get_data = function(req, res) {
 
     res.json(400, {error: 'invalid_params'});
 }
+
+exports.get_report = function(req, res) {
+    if (typeof req.params.project === 'undefined')
+        return res.json(400, {error: 'missing_project'});
+
+    if (typeof req.params.type === 'undefined')
+        return res.json(400, {error: 'missing_report_type'});
+
+    /*
+     * routes = { 'project': [{ type: 'type', file: 'file', params: 'params}, ...]}
+     */
+    var routes = {
+        'tlbr': [
+            /* Availability */
+            {
+                type: 'avail_report', file: 'telecentroAvail.jrxml'
+                , params: [ req.params.id_city ]
+            }
+        ],
+
+        'gesac': [
+            /* Availability */
+            {
+                type: 'avail_report', file: 'gesacAvail.jrxml'
+                , params: [ req.params.id_city ]
+            }
+        ]
+    };
+
+    var project = req.params.project;
+    if (routes[project] === 'undefined')
+        return res.json(400, {error: 'invalid_project'});
+
+    var queries = routes[project];
+    for (var i=0; i<queries.length; i++) {
+        var query = queries[i];
+        if ( query.type === req.params.type ) {
+            for (var p=0; p<query.params.length; p++) {
+                query.params[p] = query.params[p] || null;
+            }
+
+            var cmdline = 'reports/build-report.sh '+query.file+' '+query.params.join(' ');
+
+            exec(cmdline, function (err, stdout, stderr) {
+                if (err) {
+                    console.log(err);
+                    return res.json(500, {error: 'report_building_failed'});
+                }
+
+                res.type('application/pdf');
+                res.sendfile(stdout, function (err) {
+                    fs.unlink(stdout);
+                });
+            });
+
+            return;
+        }
+    }
+
+    res.json(400, {error: 'invalid_params'});
+}
diff --git a/web/server.js b/web/server.js
index 989e4955dabae3096a00b15b2621eb2f42c91fe7..10ce519e98447586990f99ed93794aa02b729a10 100755
--- a/web/server.js
+++ b/web/server.js
@@ -22,6 +22,8 @@ app.all('/api/points/count', db.connect, points.count);
 
 app.all('/api/telecenters/:state?/:city_id?/:telecenter_id?', db.connect, telecenters.list);
 
+app.get('/api/reports/:project/:type/:id_city', db.connect, charts.get_report);
+
 app.get('/api/:project/:type', db.connect, charts.get_data);
 app.get('/api/:project/:type/:region', db.connect, charts.get_data);
 app.get('/api/:project/:type/:region/:state', db.connect, charts.get_data);