172 lines
6.3 KiB
JavaScript
Executable File
172 lines
6.3 KiB
JavaScript
Executable File
odoo.define('web_cohort.MockServer', function (require) {
|
|
'use strict';
|
|
|
|
var MockServer = require('web.MockServer');
|
|
|
|
MockServer.include({
|
|
//--------------------------------------------------------------------------
|
|
// Private
|
|
//--------------------------------------------------------------------------
|
|
|
|
/**
|
|
* @override
|
|
* @private
|
|
* @returns {Promise}
|
|
*/
|
|
_performRpc: function (route, args) {
|
|
if (args.method === 'get_cohort_data') {
|
|
return this._mockGetCohortData(args.model, args.kwargs);
|
|
} else {
|
|
return this._super(route, args);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* @private
|
|
* @param {string} model
|
|
* @param {Object} kwargs
|
|
* @returns {Promise}
|
|
*/
|
|
_mockGetCohortData: function (model, kwargs) {
|
|
var self = this;
|
|
var displayFormats = {
|
|
'day': 'DD MMM YYYY',
|
|
'week': 'ww YYYY',
|
|
'month': 'MMMM YYYY',
|
|
'year': 'Y',
|
|
};
|
|
var rows = [];
|
|
var totalValue = 0;
|
|
var initialChurnValue = 0;
|
|
var columnsAvg = {};
|
|
|
|
var groups = this._mockReadGroup(model, {
|
|
domain: kwargs.domain,
|
|
fields: [kwargs.date_start],
|
|
groupby: [kwargs.date_start + ':' + kwargs.interval],
|
|
});
|
|
var totalCount = groups.length;
|
|
_.each(groups, function (group) {
|
|
var format;
|
|
switch (kwargs.interval) {
|
|
case 'day':
|
|
format = 'YYYY-MM-DD';
|
|
break;
|
|
case 'week':
|
|
format = 'ww YYYY';
|
|
break;
|
|
case 'month':
|
|
format = 'MMMM YYYY';
|
|
break;
|
|
case 'year':
|
|
format = 'Y';
|
|
break;
|
|
}
|
|
var cohortStartDate = moment(group[kwargs.date_start + ':' + kwargs.interval], format);
|
|
|
|
var records = self._mockSearchReadController({
|
|
model: model,
|
|
domain: group.__domain,
|
|
});
|
|
var value = 0;
|
|
if (kwargs.measure === '__count__') {
|
|
value = records.length;
|
|
} else {
|
|
if (records.length) {
|
|
value = _.pluck(records.records, kwargs.measure).reduce(function (a, b) {
|
|
return a + b;
|
|
});
|
|
}
|
|
}
|
|
totalValue += value;
|
|
var initialValue = value;
|
|
|
|
var columns = [];
|
|
var colStartDate = cohortStartDate.clone();
|
|
if (kwargs.timeline === 'backward') {
|
|
colStartDate = colStartDate.subtract(15, kwargs.interval);
|
|
}
|
|
for (var column = 0; column <= 15; column++) {
|
|
if (!columnsAvg[column]) {
|
|
columnsAvg[column] = {'percentage': 0, 'count': 0};
|
|
}
|
|
if (column !== 0) {
|
|
colStartDate.add(1, kwargs.interval);
|
|
}
|
|
if (colStartDate > moment()) {
|
|
columnsAvg[column]['percentage'] += 0;
|
|
columnsAvg[column]['count'] += 0;
|
|
columns.push({
|
|
'value': '-',
|
|
'churn_value': '-',
|
|
'percentage': '',
|
|
});
|
|
continue;
|
|
}
|
|
|
|
var compareDate = colStartDate.format(displayFormats[kwargs.interval]);
|
|
var colRecords = _.filter(records.records, function (record) {
|
|
return record[kwargs.date_stop] && moment(record[kwargs.date_stop], 'YYYY-MM-DD').format(displayFormats[kwargs.interval]) == compareDate;
|
|
});
|
|
var colValue = 0;
|
|
if (kwargs.measure === '__count__') {
|
|
colValue = colRecords.length;
|
|
} else {
|
|
if (colRecords.length) {
|
|
colValue = _.pluck(colRecords, kwargs.measure).reduce(function (a, b) {
|
|
return a + b;
|
|
});
|
|
}
|
|
}
|
|
|
|
if (kwargs.timeline === 'backward' && column === 0) {
|
|
colRecords = _.filter(records.records, function (record) {
|
|
return record[kwargs.date_stop] && moment(record[kwargs.date_stop], 'YYYY-MM-DD') >= colStartDate;
|
|
});
|
|
if (kwargs.measure === '__count__') {
|
|
initialValue = colRecords.length;
|
|
} else {
|
|
if (colRecords.length) {
|
|
initialValue = _.pluck(colRecords, kwargs.measure).reduce(function (a, b) {
|
|
return a + b;
|
|
});
|
|
}
|
|
}
|
|
initialChurnValue = value - initialValue;
|
|
}
|
|
var previousValue = column === 0 ? initialValue : columns[column - 1]['value'];
|
|
var remainingValue = previousValue - colValue;
|
|
var previousChurnValue = column === 0 ? initialChurnValue : columns[column - 1]['churn_value'];
|
|
var churnValue = colValue + previousChurnValue;
|
|
var percentage = value ? parseFloat(remainingValue / value) : 0;
|
|
if (kwargs.mode === 'churn') {
|
|
percentage = 1 - percentage;
|
|
}
|
|
percentage = Number((100 * percentage).toFixed(1));
|
|
columnsAvg[column]['percentage'] += percentage;
|
|
columnsAvg[column]['count'] += 1;
|
|
columns.push({
|
|
'value': remainingValue,
|
|
'churn_value': churnValue,
|
|
'percentage': percentage,
|
|
'domain': [],
|
|
'period': compareDate,
|
|
});
|
|
}
|
|
rows.push({
|
|
'date': cohortStartDate.format(displayFormats[kwargs.interval]),
|
|
'value': value,
|
|
'domain': group.__domain,
|
|
'columns': columns,
|
|
});
|
|
});
|
|
|
|
return Promise.resolve({
|
|
'rows': rows,
|
|
'avg': {'avg_value': totalCount ? (totalValue / totalCount) : 0, 'columns_avg': columnsAvg},
|
|
});
|
|
},
|
|
});
|
|
|
|
});
|