diff --git a/stats/index.php b/stats/index.php
index c4b09fd..d394ebf 100644
--- a/stats/index.php
+++ b/stats/index.php
@@ -1,9 +1,14 @@
0 && date_create($_GET['start']);
+ }
+
$semester_start = date_create('first day of august');
if($semester_start > date_create()) {
$semester_start = date_modify($semester_start, '-1 year');
}
- $start = isset($_GET['start']) ? date_create($_GET['start']) : $semester_start;
+ $start = is_valid_start_param() ? date_create($_GET['start']) : $semester_start;
?>
@@ -13,23 +18,33 @@
-
-
+
+
Medlemskapsstatistikk for DNS
+
Disse tallene kan avvike fra faktiske salgtall.
+
+
+
+
+
Salg per dag
-
Salg totalt
+
+
Salg totalt
+
+
+
Salg idag
Dato:
@@ -39,7 +54,11 @@
Bar:
Totalt:
-
Disse tallene kan avvike fra faktiske salgtall.
+
+
+
Salg per dag
+
+
diff --git a/stats/stats.js b/stats/stats.js
index 030fb11..7b1c20f 100644
--- a/stats/stats.js
+++ b/stats/stats.js
@@ -1,8 +1,10 @@
var barSales;
var appSales;
var smsSales;
+var salesData;
var salesChart;
var salesChartToday;
+var saleTypes = ['bar', 'sms', 'app'];
var urls = {
cards: 'https://kassa.neuf.no/stats/card-sales/',
@@ -15,6 +17,7 @@ function sumSales(memo, num) {
}
function toHighchartsSeries(memberships) {
+ memberships = _.sortBy(memberships, 'date');
return _.map(memberships, function (el) {
return [moment.utc(el.date).valueOf(), el.sales]
});
@@ -41,7 +44,119 @@ function getAppSales(start) {
});
}
-function recalc(start) {
+function totals() {
+ var barTotal = _.reduce(barSales, sumSales, 0);
+ $('.bar').html(barTotal);
+ var smsTotal = _.reduce(smsSales, sumSales, 0);
+ $('.sms').html(smsTotal);
+ var appTotal = _.reduce(appSales, sumSales, 0);
+ $('.app').html(appTotal);
+
+ $('.sum').html(barTotal + smsTotal + appTotal);
+}
+
+function today() {
+ var today = moment.utc().format('YYYY-MM-DD');
+ $('.today-date-wrap').text(today);
+ var todayBarSales = _.findWhere(barSales, {date: today}) || {sales: 0};
+ $('.bar-today').html(todayBarSales.sales);
+ var todaySmsSales = _.findWhere(smsSales, {date: today}) || {sales: 0};
+ $('.sms-today').html(todaySmsSales.sales);
+ var todayAppSales = _.findWhere(appSales, {date: today}) || {sales: 0};
+ $('.app-today').html(todayAppSales.sales);
+
+ $('.sum-today').html(todayBarSales.sales + todaySmsSales.sales + todayAppSales.sales);
+
+ salesChartToday = new Highcharts.Chart({
+ chart: {
+ renderTo: 'sales-chart-today',
+ plotBackgroundColor: null,
+ plotBorderWidth: null,
+ plotShadow: false,
+ type: 'pie'
+ },
+ title: {
+ text: false
+ },
+ series: [{
+ name: 'Salg', data: [
+ {name: 'Bar-salg', y: todayBarSales.sales},
+ {name: 'SMS-salg', y: todaySmsSales.sales},
+ {name: 'App-salg', y: todayAppSales.sales}
+ ]
+ }
+ ]
+ });
+}
+
+function groupSalesByDate() {
+ var types = {
+ 'bar': barSales,
+ 'sms': smsSales,
+ 'app': appSales
+ };
+ var salesByDate = {};
+ _.each(types, function (source, type) {
+ _.each(source, function (el) {
+ var d = {};
+ d[el.date] = {
+ 'bar': 0,
+ 'sms': 0,
+ 'app': 0
+ };
+ d[el.date][type]= el.sales;
+
+ $.extend(true, salesByDate, d);
+ });
+ });
+
+ var table_friendly = [];
+ _.each(salesByDate, function (sales, date) {
+ sales.date = date;
+ table_friendly.push(sales);
+ });
+ table_friendly = _.sortBy(table_friendly, 'date').reverse();
+
+ return table_friendly;
+}
+
+function salesTable() {
+ var html = '| Dato | Bar | SMS | App |
';
+ html += '';
+ salesData = groupSalesByDate();
+
+ _.each(salesData, function(el) {
+ html += '| ' + el.date + ' | ';
+ _.each(saleTypes, function(type) {
+ html += '' + el[type] + ' | ';
+ });
+ html += '
';
+ });
+ html += '';
+ $('#sales-table').html(html);
+}
+
+function toCSV(data) {
+ var csvLines = data.map(function(d){
+ return d.date + ',' + saleTypes.map(function(t) { return d[t]; }).join(',');
+ });
+ var csvHeader = 'date,' +saleTypes.join(',') + '\n';
+ return csvHeader + csvLines.join('\n')
+}
+
+function downloadCSVFile(csvData, fileName) {
+ csvData = 'data:text/csv;charset=utf-8,' + csvData;
+ var encodedUri = encodeURI(csvData);
+
+ var link = document.createElement("a");
+ link.setAttribute("href", encodedUri);
+ link.setAttribute("download", fileName);
+ document.body.appendChild(link); // Required for FF
+
+ link.click();
+}
+
+function recalc(start, cb) {
salesChart = new Highcharts.Chart({
chart: {
renderTo: 'sales-chart'
@@ -69,47 +184,12 @@ function recalc(start) {
});
$.when(getSmsSales(start), getAppSales(start), getBarSales(start)).done(function() {
- /* Totals */
- var barTotal = _.reduce(barSales, sumSales, 0);
- $('.bar').html(barTotal);
- var smsTotal = _.reduce(smsSales, sumSales, 0);
- $('.sms').html(smsTotal);
- var appTotal = _.reduce(appSales, sumSales, 0);
- $('.app').html(appTotal);
+ totals();
+ salesTable();
- $('.sum').html(barTotal + smsTotal + appTotal);
-
- /* Today */
- var today = moment.utc().format('YYYY-MM-DD');
- $('.today-date-wrap').text(today);
- var todayBarSales = _.findWhere(barSales, {date:today}) || {sales: 0};
- $('.bar-today').html(todayBarSales.sales);
- var todaySmsSales = _.findWhere(smsSales, {date:today}) || {sales: 0};
- $('.sms-today').html(todaySmsSales.sales);
- var todayAppSales = _.findWhere(appSales, {date:today}) || {sales: 0};
- $('.app-today').html(todayAppSales.sales);
-
- $('.sum-today').html(todayBarSales.sales + todaySmsSales.sales + todayAppSales.sales);
-
- salesChartToday = new Highcharts.Chart({
- chart: {
- renderTo: 'sales-chart-today',
- plotBackgroundColor: null,
- plotBorderWidth: null,
- plotShadow: false,
- type: 'pie'
- },
- title: {
- text: false
- },
- series: [{
- name: 'Salg', data: [
- {name: 'Bar-salg', y: todayBarSales.sales},
- {name: 'SMS-salg', y: todaySmsSales.sales},
- {name: 'App-salg', y: todayAppSales.sales}
- ]}
- ]
- });
+ if(cb) {
+ cb();
+ }
});
}
@@ -118,13 +198,27 @@ $(document).ready(function() {
credits: {enabled: false}
});
+ var $exportBtn = $('.export-data-btn');
var $startInput = $('#start');
- var start = $startInput.val();
- recalc(start);
+ var start = $startInput.val();
+ recalc(start, function() {
+ today();
+ });
+
+ /* Dynamic date change */
$startInput.on('input', function(e) {
start = $(e.target).val();
history.replaceState(null, null, '?start=' + start);
recalc(start);
- })
+ });
+
+ /* Export to CSV */
+ $exportBtn.on('click', function (e) {
+ e.preventDefault();
+ var fileName = 'medlemskapsstats-' + $startInput.val() + '.csv';
+ var csvData = toCSV(salesData);
+ downloadCSVFile(csvData, fileName);
+ });
+
});