Built motion from commit 1038d87.|0.0.141
[motion.git] / public / assets / workers / dashboard / voice / worker.js
1 'use strict';
2
3 self.queues = []; // TYPE ARRAY
4 self.voice = {};
5
6 function getCalls(type) {
7   var tot = 0;
8   self.queues.forEach(function(elm) {
9     tot += elm[type];
10   });
11   return tot;
12 }
13
14 function getAvgAnswerTime() {
15   var complete = 0;
16   var holdtime = 0;
17
18   self.queues.forEach(function(elm) {
19     complete += elm.complete || 0;
20     holdtime += elm.holdtime || 0;
21   });
22
23   return complete ? (holdtime / complete) : 0;
24 }
25
26 function getAvgTalkTime() {
27   var complete = 0;
28   var talktime = 0;
29
30   self.queues.forEach(function(elm) {
31     complete += elm.complete || 0;
32     talktime += elm.talktime || 0;
33   });
34
35   return complete ? (talktime / complete) : 0;
36 }
37
38 function init(data) {
39   var queue;
40
41   for (var key in data.queues) {
42     if (data.queues.hasOwnProperty(key)) {
43       queue = _.find(self.queues, {
44         name: key
45       });
46
47       if (queue) {
48         queue.waiting = data.queues[key].waiting || 0;
49         queue.active = data.queues[key].active || 0;
50         queue.abandon = data.queues[key].abandon || 0;
51         queue.unmanaged = data.queues[key].unmanaged || 0;
52         queue.complete = data.queues[key].complete || 0;
53         queue.holdtime = data.queues[key].holdtime || 0;
54         queue.talktime = data.queues[key].talktime || 0;
55       }
56     }
57   }
58
59   self.voice = {
60     evt: 'dashboard:voice:init',
61     waiting: getCalls('waiting'),
62     active: getCalls('active'),
63     complete: getCalls('complete'),
64     abandon: getCalls('abandon'),
65     unmanaged: getCalls('unmanaged'),
66     avgAnswerTime: getAvgAnswerTime(),
67     avgTalkTime: getAvgTalkTime(),
68     answerRate: (getCalls('complete') / (getCalls('complete') + getCalls('abandon')) * 100) || 0,
69     abandonRate: (getCalls('abandon') / (getCalls('complete') + getCalls('abandon')) * 100) || 0,
70     totalOffered: getCalls('complete') + getCalls('abandon'),
71     outbound: {
72       answered: data.outbound.answered,
73       manualOutbound: data.outbound.manualOutbound,
74       globalDuration: data.outbound.globalDuration,
75       avgDuration: data.outbound.avgDuration,
76       answerRate: (data.outbound.answered / data.outbound.manualOutbound) * 100
77     }
78   };
79
80   self.postMessage(self.voice);
81 }
82
83 function update(data) {
84   var queue = _.find(self.queues, {
85     name: data.name
86   });
87
88   if (queue) {
89     switch (data.evt) {
90       case 'dashboard:voice:waiting':
91         queue.waiting = data.waiting;
92         self.voice.waiting = getCalls('waiting');
93         break;
94       case 'dashboard:voice:active':
95         queue.active = data.active;
96         self.voice.active = getCalls('active');
97         break;
98       case 'dashboard:voice:complete':
99         queue.complete = data.complete;
100         self.voice.complete = getCalls('complete');
101         self.voice.answerRate = (getCalls('complete') / (getCalls('complete') + getCalls('abandon')) * 100) || 0;
102         self.voice.abandonRate = (getCalls('abandon') / (getCalls('complete') + getCalls('abandon')) * 100) || 0;
103         self.voice.totalOffered = self.voice.complete + self.voice.abandon;
104         break;
105       case 'dashboard:voice:abandon':
106         queue.abandon = data.abandon;
107         self.voice.abandon = getCalls('abandon');
108         self.voice.answerRate = (getCalls('complete') / (getCalls('complete') + getCalls('abandon')) * 100) || 0;
109         self.voice.abandonRate = (getCalls('abandon') / (getCalls('complete') + getCalls('abandon')) * 100) || 0;
110         self.voice.totalOffered = self.voice.complete + self.voice.abandon;
111         break;
112       case 'dashboard:voice:active':
113         queue.unmanaged = data.unmanaged;
114         self.voice.unmanaged = getCalls('unmanaged');
115         break;
116       case 'dashboard:voice:holdtime':
117         queue.holdtime = data.holdtime;
118         self.voice.avgAnswerTime = getAvgAnswerTime();
119         break;
120       case 'dashboard:voice:talktime':
121         queue.talktime = data.talktime;
122         self.voice.avgTalkTime = getAvgTalkTime();
123         break;
124       default:
125     }
126
127     self.postMessage(self.voice);
128   }
129 }
130
131 // INITIALIZATION
132 if ('function' === typeof importScripts) {
133   importScripts('/bower_components/lodash/dist/lodash.js');
134
135   addEventListener('message', function(e) {
136     switch (e.data.evt) {
137       case 'myQueues':
138         self.queues = _.map(e.data.queues, function(elm) {
139           return {
140             name: elm.name,
141             waiting: 0,
142             active: 0,
143             complete: 0,
144             abandon: 0,
145             unmanaged: 0
146           };
147         });
148
149         e.data.outbound = {
150           answerRate: 0,
151           answered: 0,
152           avgDuration: 0,
153           globalDuration: 0,
154           manualOutbound: 0
155         };
156
157         init(e.data);
158         break;
159
160       case 'dashboard:voice:init':
161         init(e.data);
162         break;
163
164       case 'dashboard:voice:outbound':
165         self.voice.outbound = e.data;
166         self.postMessage(self.voice);
167         break;
168
169       default:
170         update(e.data);
171     }
172   });
173 }