5 angular.module('egReportMod', ['egCoreMod', 'ui.bootstrap'])
6 .factory('egReportTemplateSvc',
8 ['$uibModal','$q','egCore','egConfirmDialog','egAlertDialog',
9 function($uibModal , $q , egCore , egConfirmDialog , egAlertDialog) {
11 //dojo.requireLocalization("openils.reports", "reports");
12 //var egCore.strings = dojo.i18n.getLocalization("openils.reports", "reports");
14 var OILS_RPT_DTYPE_ARRAY = 'array';
15 var OILS_RPT_DTYPE_STRING = 'text';
16 var OILS_RPT_DTYPE_MONEY = 'money';
17 var OILS_RPT_DTYPE_BOOL = 'bool';
18 var OILS_RPT_DTYPE_INT = 'int';
19 var OILS_RPT_DTYPE_ID = 'id';
20 var OILS_RPT_DTYPE_OU = 'org_unit';
21 var OILS_RPT_DTYPE_FLOAT = 'float';
22 var OILS_RPT_DTYPE_TIMESTAMP = 'timestamp';
23 var OILS_RPT_DTYPE_INTERVAL = 'interval';
24 var OILS_RPT_DTYPE_LINK = 'link';
25 var OILS_RPT_DTYPE_NONE = '';
26 var OILS_RPT_DTYPE_NULL = null;
27 var OILS_RPT_DTYPE_UNDEF;
29 var OILS_RPT_DTYPE_ALL = [
30 OILS_RPT_DTYPE_STRING,
35 OILS_RPT_DTYPE_TIMESTAMP,
41 OILS_RPT_DTYPE_INTERVAL,
44 var OILS_RPT_DTYPE_NOT_ID = [OILS_RPT_DTYPE_STRING,OILS_RPT_DTYPE_MONEY,OILS_RPT_DTYPE_INT,OILS_RPT_DTYPE_FLOAT,OILS_RPT_DTYPE_TIMESTAMP];
45 var OILS_RPT_DTYPE_NOT_BOOL = [OILS_RPT_DTYPE_STRING,OILS_RPT_DTYPE_MONEY,OILS_RPT_DTYPE_INT,OILS_RPT_DTYPE_FLOAT,OILS_RPT_DTYPE_TIMESTAMP,OILS_RPT_DTYPE_ID,OILS_RPT_DTYPE_OU,OILS_RPT_DTYPE_LINK];
53 label : egCore.strings.OPERATORS_EQUALS
57 label : egCore.strings.OPERATORS_LIKE
61 label : egCore.strings.OPERATORS_ILIKE
65 label : egCore.strings.OPERATORS_GREATER_THAN,
66 labels : { timestamp : egCore.strings.OPERATORS_GT_TIME }
70 label : egCore.strings.OPERATORS_GT_EQUAL,
71 labels : { timestamp : egCore.strings.OPERATORS_GTE_TIME }
76 label : egCore.strings.OPERATORS_LESS_THAN,
77 labels : { timestamp : egCore.strings.OPERATORS_LT_TIME }
81 label : egCore.strings.OPERATORS_LT_EQUAL,
82 labels : { timestamp : egCore.strings.OPERATORS_LTE_TIME }
86 label : egCore.strings.OPERATORS_IN_LIST
90 label : egCore.strings.OPERATORS_NOT_IN_LIST
94 label : egCore.strings.OPERATORS_BETWEEN
98 label : egCore.strings.OPERATORS_NOT_BETWEEN
102 label : egCore.strings.OPERATORS_IS_NULL
106 label : egCore.strings.OPERATORS_IS_NOT_NULL
110 label : egCore.strings.OPERATORS_NULL_BLANK
114 label : egCore.strings.OPERATORS_NOT_NULL_BLANK
118 labels : { 'array' : egCore.strings.OPERATORS_EQ_ANY }
122 labels : { 'array' : egCore.strings.OPERATORS_NE_ANY }
128 datatype : OILS_RPT_DTYPE_ALL,
129 label : egCore.strings.TRANSFORMS_BARE
133 datatype : OILS_RPT_DTYPE_NOT_ID,
134 label : egCore.strings.TRANSFORMS_FIRST
138 datatype : OILS_RPT_DTYPE_NOT_ID,
139 label : egCore.strings.TRANSFORMS_LAST
143 datatype : OILS_RPT_DTYPE_NOT_BOOL,
145 label : egCore.strings.TRANSFORMS_COUNT
149 datatype : OILS_RPT_DTYPE_NOT_BOOL,
151 label : egCore.strings.TRANSFORMS_COUNT_DISTINCT
155 datatype : OILS_RPT_DTYPE_NOT_ID,
157 label : egCore.strings.TRANSFORMS_MIN
161 datatype : OILS_RPT_DTYPE_NOT_ID,
163 label : egCore.strings.TRANSFORMS_MAX
166 /* string transforms ------------------------- */
169 datatype : [ OILS_RPT_DTYPE_STRING ],
171 label : egCore.strings.TRANSFORMS_SUBSTRING
175 datatype : [ OILS_RPT_DTYPE_STRING ],
176 label : egCore.strings.TRANSFORMS_LOWER
180 datatype : [ OILS_RPT_DTYPE_STRING ],
181 label : egCore.strings.TRANSFORMS_UPPER
185 datatype : [ OILS_RPT_DTYPE_STRING ],
186 label : egCore.strings.TRANSFORMS_FIRST5
190 datatype : [OILS_RPT_DTYPE_STRING, 'text'],
191 label : egCore.strings.TRANSFORMS_FIRST_WORD
194 /* timestamp transforms ----------------------- */
196 datatype : [ OILS_RPT_DTYPE_TIMESTAMP ],
197 label : egCore.strings.TRANSFORMS_DOW,
202 datatype : [ OILS_RPT_DTYPE_TIMESTAMP ],
203 label : egCore.strings.TRANSFORMS_DOM,
205 regex : /^[0-9]{1,2}$/
209 datatype : [ OILS_RPT_DTYPE_TIMESTAMP ],
210 label : egCore.strings.TRANSFORMS_DOY,
212 regex : /^[0-9]{1,3}$/
216 datatype : [ OILS_RPT_DTYPE_TIMESTAMP ],
217 label : egCore.strings.TRANSFORMS_WOY,
219 regex : /^[0-9]{1,2}$/
223 datatype : [ OILS_RPT_DTYPE_TIMESTAMP ],
224 label : egCore.strings.TRANSFORMS_MOY,
230 datatype : [ OILS_RPT_DTYPE_TIMESTAMP ],
231 label : egCore.strings.TRANSFORMS_QOY,
236 datatype : [ OILS_RPT_DTYPE_TIMESTAMP ],
237 label : egCore.strings.TRANSFORMS_HOD,
243 datatype : [ OILS_RPT_DTYPE_TIMESTAMP ],
244 label : egCore.strings.TRANSFORMS_DATE,
245 regex : /^\d{4}-\d{2}-\d{2}$/,
247 cal_format : '%Y-%m-%d',
252 datatype : [ OILS_RPT_DTYPE_TIMESTAMP ],
253 label : egCore.strings.TRANSFORMS_MONTH_TRUNC,
254 regex : /^\d{4}-\d{2}$/,
256 cal_format : '%Y-%m',
261 datatype : [ OILS_RPT_DTYPE_TIMESTAMP ],
262 label : egCore.strings.TRANSFORMS_YEAR_TRUNC,
270 datatype : [ OILS_RPT_DTYPE_TIMESTAMP ],
271 label : egCore.strings.TRANSFORMS_HOUR_TRUNC,
274 cal_format : '%Y-%m-$d %H',
279 datatype : [ OILS_RPT_DTYPE_TIMESTAMP ],
281 label : egCore.strings.TRANSFORMS_DAY_NAME
285 datatype : [ OILS_RPT_DTYPE_TIMESTAMP ],
287 label : egCore.strings.TRANSFORMS_MONTH_NAME
290 datatype : [ OILS_RPT_DTYPE_TIMESTAMP ],
291 label : egCore.strings.TRANSFORMS_AGE
295 datatype : [ OILS_RPT_DTYPE_TIMESTAMP ],
296 label : egCore.strings.TRANSFORMS_MONTHS_AGO
300 datatype : [ OILS_RPT_DTYPE_TIMESTAMP ],
301 label : egCore.strings.TRANSFORMS_QUARTERS_AGO
304 /* int / float transforms ----------------------------------- */
306 datatype : [ OILS_RPT_DTYPE_INT, OILS_RPT_DTYPE_FLOAT, OILS_RPT_DTYPE_MONEY ],
307 label : egCore.strings.TRANSFORMS_SUM,
312 datatype : [ OILS_RPT_DTYPE_INT, OILS_RPT_DTYPE_FLOAT, OILS_RPT_DTYPE_MONEY ],
313 label : egCore.strings.TRANSFORMS_AVERAGE,
318 datatype : [ OILS_RPT_DTYPE_INT, OILS_RPT_DTYPE_FLOAT ],
319 label : egCore.strings.TRANSFORMS_ROUND,
323 datatype : [ OILS_RPT_DTYPE_FLOAT ],
324 label : egCore.strings.TRANSFORMS_INT
329 service.addFields = function (type, fields, transform, source_label, source_path, op) {
330 fields.forEach(function(f) {
331 var l = f.label ? f.label : f.name;
332 var new_field = angular.extend(
335 { index : service[type].length,
338 path_label : source_label,
340 transform : transform,
346 service[type].forEach(function(e) {
347 if (e.name == new_field.name && e.path == new_field.path) add = false;
349 if (add) service[type].push(new_field);
353 service.moveFieldUp = function (type, field) {
355 while (service[type].length) {
356 var f = service[type].pop();
357 if (field.index == f.index && f.index > 0)
358 new_list.unshift(f,service[type].pop());
362 new_list.forEach(function(f) {
363 service[type].push(angular.extend(f, { index : service[type].length}));
367 service.moveFieldDown = function (type, field) {
369 var start_len = service[type].length - 1;
370 while (service[type].length) {
371 var f = service[type].shift();
372 if (field.index == f.index && f.index < start_len)
373 new_list.push(service[type].shift(),f);
377 new_list.forEach(function(f) {
378 service[type].push(angular.extend(f, { index : service[type].length}));
382 service.updateFilterValue = function(item, value) {
383 switch (item.operator.op) {
388 //if value isn't an array yet, split into an array for
389 // operators that need it
390 if (typeof value === 'string') {
391 value = value.split(/\s*,\s*/);
396 //if value was split but shouldn't be, then convert back to
397 // comma-separated string
398 if (Array.isArray(value)) {
399 value = value.toString();
403 service.filter_fields[item.index].value = value;
406 service.removeField = function (type, field) {
408 while (service[type].length) {
409 var f = service[type].pop();
410 if (field.index != f.index ) new_list.push(f);
412 new_list.forEach(function(f) {
413 service[type].push(angular.extend(f, { index : service[type].length}));
417 service.getTransformByLabel = function (l) {
418 for( var key in service.Transforms ) {
419 var t = service.Transforms[key];
420 if (l == t.label) return key;
421 if (angular.isArray(t.labels) && t.labels.indexOf(l) > -1) return key;
426 service.getFilterByLabel = function (l) {
427 for( var key in service.Filters ) {
428 var t = service.Filters[key];
429 if (l == t.label) return key;
430 if (angular.isArray(t.labels) && t.labels.indexOf(l) > -1) return key;
435 service.getTransforms = function (args) {
436 var dtype = args.datatype;
437 var agg = args.aggregate;
438 var nonagg = args.non_aggregate;
439 var label = args.label;
443 for( var key in service.Transforms ) {
444 var obj = service.Transforms[key];
445 if( agg && !nonagg && !obj.aggregate ) continue;
446 if( !agg && nonagg && obj.aggregate ) continue;
447 if( !dtype && obj.datatype.length > 0 ) continue;
448 if( dtype && obj.datatype.length > 0 && transformIsForDatatype(key,dtype).length == 0 ) continue;
456 service.transformIsForDatatype = function (tform, dtype) {
457 var obj = service.Transforms[tform];
458 return obj.datateype.filter(function(d) { return (d == dtype) })[0];