3 var _ = require('lodash');
4 var moment = require('moment');
6 var MailApplication = require('../models').MailApplication;
7 var MailAccount = require('../models').MailAccount;
8 var MailQueue = require('../models').MailQueue;
9 var MailRoom = require('../models').MailRoom;
10 var Interval = require('../models').Interval;
12 var ReportMailSession = require('../models').ReportMailSession;
13 var ReportMail = require('../models').ReportMail;
15 var User = require('../models').User;
19 module.exports = function(kue) {
20 var kueMail = kue.createQueue();
22 kueMail.process('mail', 20, function(job, done) {
26 ReportMail.afterUpdate(function(doc) {
27 if (doc.changed('agentconnectedAt')) {
28 if (timeouts[doc.uniqueid]) {
29 clearTimeout(timeouts[doc.uniqueid].timeout);
30 timeouts[doc.uniqueid].done();
31 delete timeouts[doc.uniqueid];
35 .findById(doc.uniqueid)
36 .then(function(mailRoom) {
42 .catch(function(err) {
48 agentringnoanswerAt: moment().format("YYYY-MM-DD HH:mm:ss"),
49 reason: "answered_elsewhere",
50 lastevent: "answered_elsewhere"
53 uniqueid: doc.uniqueid,
58 .catch(function(err) {
64 mailleaveAt: moment().format("YYYY-MM-DD HH:mm:ss"),
65 fullname: doc.fullname,
66 membername: doc.membername,
67 mailqueuename: doc.mailqueuename
70 uniqueid: doc.uniqueid,
74 .catch(function(err) {
80 MailRoom.afterCreate(function(doc) {
83 MailRoom.afterDestroy(function(doc) {
88 function onSave(kue, doc, cb) {
89 if (doc.status === 'NEW') {
91 kue.create('mail', doc.dataValues).save();
95 function onProcess(job, done) {
97 .findById(job.data.MailAccountId, {
99 model: MailApplication,
115 .then(function(mailAccount) {
117 done(new Error('No Available MailApplications..'));
121 if (!mailAccount.MailApplications.length) {
122 done(new Error('DialPlan ended..'));
126 job.data.MailRoomId = job.data.id;
127 var session = _.merge(job.data, mailAccount.dataValues);
130 uniqueid: session.MailRoomId,
131 subject: session.subject,
134 attachment: session.attachment,
135 accountname: session.name,
136 accountaddress: session.address,
137 mailjoinAt: moment().format("YYYY-MM-DD HH:mm:ss")
140 session.MailApplications = _.sortBy(session.MailApplications, 'priority');
141 onInvite(session, 0, 0, 0, 0, done);
143 .catch(function(err) {
148 function onInvite(data, i, j, holdtime, count, done) {
149 console.log('invite', 'i', i, 'j', j, 'holdtime', holdtime);
153 if (i === data.MailApplications.length) {
154 console.error('DialPlan ended..');
157 uniqueid: data.MailRoomId,
158 mailunmanagedAt: moment().format("YYYY-MM-DD HH:mm:ss"),
159 mailleaveAt: moment().format("YYYY-MM-DD HH:mm:ss")
162 done(new Error('DialPlan ended..'));
166 if (data.MailApplications[i].MailQueue) {
169 // ONLINE AGENTS COUNTER
170 var online = _.countBy(data.MailApplications[i].MailQueue.Users, {
174 if (online && onInterval(data.MailApplications[i].Interval ? data.MailApplications[i].Interval : data.MailApplications[i].interval)) {
175 // AT LEAST ONE AVAILABLE AGENT
176 if (j === data.MailApplications[i].MailQueue.Users.length) {
177 if (data.MailApplications[i].timeout > holdtime) {
178 onInvite(data, i, 0, holdtime, count, done);
181 onInvite(data, ++i, 0, 0, count, done);
186 switch (data.MailApplications[i].MailQueue.strategy) {
188 if (data.MailApplications[i].MailQueue.Users[j].online &&
189 onInterval(data.MailApplications[i].Interval ? data.MailApplications[i].Interval : data.MailApplications[i].interval)) {
191 timeout = (((data.MailApplications[i].timeout - holdtime) > data.MailApplications[i].MailQueue.timeout) ?
192 data.MailApplications[i].MailQueue.timeout : (data.MailApplications[i].timeout - holdtime));
195 uniqueid: data.MailRoomId,
197 subject: data.subject,
200 attachment: data.attachment,
201 accountname: data.name,
202 accountaddress: data.address,
203 application: data.MailApplications[i].app,
204 fullname: data.MailApplications[i].MailQueue.Users[j].fullname,
205 membername: data.MailApplications[i].MailQueue.Users[j].name,
206 agentid: data.MailApplications[i].MailQueue.Users[j].id,
207 mailqueuename: data.MailApplications[i].MailQueue.name,
210 agentcalledAt: moment().format("YYYY-MM-DD HH:mm:ss")
213 console.log('queue', data.MailApplications[i].MailQueue.name, 'agent', data.MailApplications[i].MailQueue.Users[j].name, 'timeout', timeout, 'holdtime', holdtime);
214 aTimeout = setTimeout(function() {
216 uniqueid: data.MailRoomId,
219 lastevent: 'timeout',
220 agentringnoanswerAt: moment().format("YYYY-MM-DD HH:mm:ss")
224 onInvite(data, i, ++j, holdtime, ++count, done);
228 if (!timeouts[data.MailRoomId]) {
229 timeouts[data.MailRoomId] = {};
232 timeouts[data.MailRoomId].timeout = aTimeout;
233 timeouts[data.MailRoomId].done = done;
236 onInvite(data, i, ++j, holdtime, count, done);
243 timeout = (((data.MailApplications[i].timeout - holdtime) > data.MailApplications[i].MailQueue.timeout) ?
244 data.MailApplications[i].MailQueue.timeout : (data.MailApplications[i].timeout - holdtime));
247 data.MailApplications[i].MailQueue.Users.forEach(function(user) {
250 uniqueid: data.MailRoomId,
252 subject: data.subject,
255 attachment: data.attachment,
256 accountname: data.name,
257 accountaddress: data.address,
258 application: data.MailApplications[i].app,
259 fullname: user.fullname,
260 membername: user.name,
262 mailqueuename: data.MailApplications[i].MailQueue.name,
265 agentcalledAt: moment().format("YYYY-MM-DD HH:mm:ss")
270 if (users.length && onInterval(data.MailApplications[i].Interval ? data.MailApplications[i].Interval : data.MailApplications[i].interval)) {
271 onReport(users, true);
272 aTimeout = setTimeout(function() {
273 console.log('count', count);
275 uniqueid: data.MailRoomId,
278 lastevent: 'timeout',
279 agentringnoanswerAt: moment().format("YYYY-MM-DD HH:mm:ss")
282 j += data.MailApplications[i].MailQueue.Users.length;
283 onInvite(data, i, j, holdtime, ++count, done);
287 if (!timeouts[data.MailRoomId]) {
288 timeouts[data.MailRoomId] = {};
291 timeouts[data.MailRoomId].timeout = aTimeout;
292 timeouts[data.MailRoomId].done = done;
295 console.log('queue', data.MailApplications[i].MailQueue.name, 'timeout', timeout, 'holdtime', holdtime);
297 onInvite(data, ++i, 0, 0, count, done);
303 console.error('Unknown strategy');
306 onInvite(data, ++i, 0, 0, count, done);
311 timeout = data.MailApplications[i].timeout;
312 if (data.MailApplications[i].User.online &&
313 onInterval(data.MailApplications[i].Interval ? data.MailApplications[i].Interval : data.MailApplications[i].interval)) {
315 uniqueid: data.MailRoomId,
317 subject: data.subject,
320 attachment: data.attachment,
321 accountname: data.name,
322 accountaddress: data.address,
323 application: data.MailApplications[i].app,
324 fullname: data.MailApplications[i].User.fullname,
325 membername: data.MailApplications[i].User.name,
326 agentid: data.MailApplications[i].User.id,
329 agentcalledAt: moment().format("YYYY-MM-DD HH:mm:ss")
332 console.log('agent', data.MailApplications[i].User.name, 'timeout', timeout, 'holdtime', holdtime);
334 aTimeout = setTimeout(function() {
336 uniqueid: data.MailRoomId,
339 lastevent: 'timeout',
340 agentringnoanswerAt: moment().format("YYYY-MM-DD HH:mm:ss")
343 onInvite(data, ++i, 0, 0, count, done);
347 if (!timeouts[data.MailRoomId]) {
348 timeouts[data.MailRoomId] = {};
351 timeouts[data.MailRoomId].timeout = aTimeout;
352 timeouts[data.MailRoomId].done = done;
354 onInvite(data, ++i, 0, 0, ++count, done);
360 function onReport(report, bulk) {
363 .bulkCreate(report, {
364 individualHooks: true
366 .catch(function(err) {
372 .catch(function(err) {
378 function onReportSession(report) {
383 uniqueid: report.uniqueid
387 .spread(function(reportMailSession, created) {
391 individualHooks: true
393 .catch(function(err) {
400 function onReportUpdate(report) {
404 uniqueid: report.uniqueid,
405 sorting: report.count
407 individualHooks: true
409 .catch(function(err) {
414 function onInterval(interval) {
415 if (_.isObject(interval)) {
416 for (var i = 0; i < interval.SubIntervals.length; i++) {
417 if (!onCheckInterval(interval.SubIntervals[i].interval)) {
423 return onCheckInterval(interval);
427 function onCheckInterval(interval) {
429 var daysOfWeek = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
430 var daysOfMonth = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31];
431 var months = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];
434 var tRange = interval.split(',')[0];
435 var dwRange = interval.split(',')[1];
436 var dmRange = interval.split(',')[2];
437 var mRange = interval.split(',')[3];
438 // TIME RANGE CHECKING
439 if (tRange !== '*') {
440 var time = moment().format("HH:mm");
441 var tFrom = tRange.split('-')[0];
442 var tTo = tRange.split('-')[1];
444 if ((time < tFrom) || (time > tTo)) {
445 console.log('TRANGE KO');
449 // DAYS OF WEEK RANGE CHECKING
450 if (dwRange !== '*') {
451 var cWeekDay = daysOfWeek[moment().day()];
452 var dwFrom = _.indexOf(daysOfWeek, dwRange.split('-')[0]);
453 var dwTo = _.indexOf(daysOfWeek, dwRange.split('-')[1]);
455 for (i = 0; i < dwFrom; i++) {
456 shift = daysOfWeek.shift();
457 daysOfWeek.push(shift);
460 dwFrom = _.indexOf(daysOfWeek, dwRange.split('-')[0]);
461 dwTo = _.indexOf(daysOfWeek, dwRange.split('-')[1]) + 1;
463 daysOfWeek = daysOfWeek.slice(dwFrom, dwTo);
465 if (!_.includes(daysOfWeek, cWeekDay)) {
466 console.log('DWRANGE KO');
470 // DAYS OF MONTH RANGE CHECKING
471 if (dmRange !== '*') {
472 var cMonthDay = moment().date();
473 var dmFrom = _.indexOf(daysOfMonth, parseInt(dmRange.split('-')[0], 10));
474 var dmTo = _.indexOf(daysOfMonth, parseInt(dmRange.split('-')[1]));
476 for (i = 0; i < dmFrom; i++) {
477 shift = daysOfMonth.shift();
478 daysOfMonth.push(shift);
481 dmFrom = _.indexOf(daysOfMonth, parseInt(dmRange.split('-')[0], 10));
482 dmTo = _.indexOf(daysOfMonth, parseInt(dmRange.split('-')[1]), 10) + 1;
484 daysOfMonth = daysOfMonth.slice(dmFrom, dmTo);
486 if (!_.includes(daysOfMonth, cMonthDay)) {
487 console.log('DMRANGE KO');
491 // MONTHS RANGE CHECKING
492 if (mRange !== '*') {
493 var cMonth = months[moment().month()];
494 var mFrom = _.indexOf(months, mRange.split('-')[0]);
495 var mTo = _.indexOf(months, mRange.split('-')[1]);
497 for (i = 0; i < mFrom; i++) {
498 shift = months.shift();
502 mFrom = _.indexOf(months, mRange.split('-')[0]);
503 mTo = _.indexOf(months, mRange.split('-')[1]) + 1;
505 months = months.slice(mFrom, mTo);
507 if (!_.includes(months, cMonth)) {
508 console.log('MRANGE KO');
513 console.log('INTERVAL OK');