-/* jshint indent: 2 */
-var util = require('util');
-var _ = require('lodash');
-
-var Applications = {
- Dial: [{
- app: 'GotoIfTime',
- appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
- }, {
- app: 'Set',
- appdata: 'CALLERID(all)=%s'
- }, {
- app: 'Dial',
- appdata: '%s,%s,%s,%s',
- isApp: true
- }, {
- app: 'NoOp',
- appdata: 'Dial Application End'
- }],
- Queue: [{
- app: 'GotoIfTime',
- appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
- }, {
- app: 'Answer',
- appdata: ''
- }, {
- app: 'Queue',
- appdata: '%s,%s,%s,%s,%s',
- isApp: true
- }, {
- app: 'NoOp',
- appdata: 'Queue Application End'
- }],
- Playback: [{
- app: 'GotoIfTime',
- appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
- }, {
- app: 'Playback',
- appdata: '%s,%s',
- isApp: true
- }, {
- app: 'NoOp',
- appdata: 'Playback Application End'
- }],
- AGI: [{
- app: 'GotoIfTime',
- appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
- }, {
- app: 'AGI',
- appdata: 'agi://127.0.0.1/square,%s',
- isApp: true
- }, {
- app: 'NoOp',
- appdata: 'AGI Application End'
- }],
- Goto: [{
- app: 'GotoIfTime',
- appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
- }, {
- app: 'Goto',
- appdata: '%s,%s,%d',
- isApp: true
- }, {
- app: 'NoOp',
- appdata: 'Goto Application End'
- }],
- Hangup: [{
- app: 'GotoIfTime',
- appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
- }, {
- app: 'Hangup',
- appdata: '%s',
- isApp: true
- }, {
- app: 'NoOp',
- appdata: 'Hangup Application End'
- }],
- Set: [{
- app: 'GotoIfTime',
- appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
- }, {
- app: 'Set',
- appdata: '%s=%s',
- isApp: true
- }, {
- app: 'NoOp',
- appdata: 'Set Application End'
- }],
- custom: [{
- app: 'GotoIfTime',
- appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
- }, {
- app: 'custom',
- appdata: '%s',
- isApp: true
- }, {
- app: 'NoOp',
- appdata: 'Custom Application End'
- }],
- Voicemail: [{
- app: 'GotoIfTime',
- appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
- }, {
- app: 'Voicemail',
- appdata: '%s',
- isApp: true
- }, {
- app: 'NoOp',
- appdata: 'Voicemail Application End'
- }]
-};
-
-
-module.exports = function(sequelize, DataTypes) {
- var Interval = sequelize.define('Interval', {
- name: {
- type: DataTypes.STRING,
- unique: 'name_intervalid'
- },
- interval: {
- type: DataTypes.STRING,
- allowNull: true
- },
- IntervalId: {
- type: DataTypes.INTEGER(11),
- unique: 'name_intervalid'
- }
- }, {
- tableName: 'intervals',
- associate: function(models) {
- Interval.hasMany(models.Interval, {
- as: 'SubIntervals',
- onDelete: 'cascade'
- });
- Interval.hasMany(models.VoiceExtension, {
- as: 'VoiceExtensions'
- });
- Interval.hasMany(models.MailApplication, {
- as: 'MailApplications'
- });
- Interval.hasMany(models.MailApplication, {
- as: 'ChatApplications'
- });
-
- Interval.afterUpdate(function(interval) {
- if (interval.IntervalId !== null) {
- interval.getVoiceExtensions()
- .then(function(voiceExtensions) {
- var appdata;
- var oldappdata;
- voiceExtensions.forEach(function(element) {
- oldappdata = element.appdata.split('?');
- element.appdata = util.format('%s?%s', interval.interval, oldappdata[1]);
- element.interval = interval.interval;
- element.save()
- .catch(function(err) {
- console.log(err);
- });
- })
- })
- .catch(function(err) {
- console.log(err);
- });
- }
- })
-
- Interval.beforeDestroy(function(interval) {
- console.log('interval not yet deleted');
- if (interval.IntervalId !== null) {
- appRewrite(interval, models);
- }
- })
-
- Interval.afterCreate(function(interval) {
- console.log('interval created');
- if (interval.IntervalId !== null) {
- appRewrite(interval, models, true);
- }
- })
- }
- });
-
- function appRewrite(hookInterval, models, create) {
- console.log('Finding extension apps..');
- models.VoiceExtension
- .findAll({
- where: {
- IntervalId: hookInterval.IntervalId,
- }
- })
- .then(function(tmpVoiceExtensions) {
- if (tmpVoiceExtensions && tmpVoiceExtensions.length > 0) {
- console.log('Extensions found');
- var voiceExtensionsIds = _.uniq(_.pluck(_.pluck(tmpVoiceExtensions, 'dataValues'), 'VoiceExtensionId'), true);
- models.VoiceExtension
- .findAll({
- where: {
- VoiceExtensionId: voiceExtensionsIds,
- isApp: true
- }
- })
- .then(function(voiceExtensions) {
- console.log('Starting transaction before destroy..');
- return sequelize.transaction(function(t) {
- console.log('Destroying extension rows...');
- return models.VoiceExtension.destroy({
- where: {
- VoiceExtensionId: voiceExtensionsIds
- }
- }, {
- transaction: t
- })
- .then(function() {
- console.log('Destroyed extensions');
- voiceExtensions = _.pluck(voiceExtensions, 'dataValues');
- var intervalIds = _.filter(_.pluck(voiceExtensions, 'IntervalId'), function(elem) {
- return elem !== null;
- });
- console.log('Finding intervals');
- Interval
- .findAll({
- where: {
- IntervalId: intervalIds,
- id: {
- $ne: create ? null : hookInterval.id
- }
- }
- })
- .then(function(intervals) {
-
- console.log('Found intervals, creating extension rows...');
- var extByExtId;
- voiceExtensionsIds.forEach(function(extId) {
- extByExtId = _.filter(voiceExtensions, function(elem) {
- return elem.VoiceExtensionId == extId;
- });
- var priority = 2;
- var interval;
- extByExtId.forEach(function(tmpElem) {
- console.log('Creating app..');
- var application = _.cloneDeep(Applications[tmpElem.app]);
- if (!application || tmpElem.customApp) {
- application = [{
- app: 'GotoIfTime',
- appdata: '%s?%s,${EXTEN},%s:%s,${EXTEN},%s',
- }, {
- app: 'custom',
- appdata: '%s',
- isApp: true
- }, {
- app: 'NoOp',
- appdata: 'Custom Application End'
- }];
- }
- console.log('PRIORITY');
- console.log(priority);
- var appGroup = util.format('%s%s%s', tmpElem.context, tmpElem.exten, priority);
- tmpElem.interval = tmpElem.interval || '*,*,*,*';
- var tmpIntervals = _.filter(intervals, function(elem) {
- return (elem.IntervalId == tmpElem.IntervalId);
- });
- if (tmpIntervals && tmpIntervals.length > 0) {
- application.splice(0, 1);
- tmpIntervals.forEach(function(elem, index) {
- // interval = createInterval(elem);
- application.unshift({
- app: 'GotoIfTimeFromArray',
- appdata: elem.interval + '?%s,${EXTEN},%s:%s,${EXTEN},%s',
- IntervalId: elem.id,
- isInterval: true,
- interval: elem.interval
- });
- })
- }
- priority = appCreate(application, tmpElem, appGroup, tmpIntervals || [], priority);
- console.log('returned priority');
- console.log(priority);
- models.VoiceExtension
- .bulkCreate(application)
- });
- });
-
- console.log('THE END');
- })
- })
- })
- .catch(function(err) {
- console.log(err);
- });
- })
- .catch(function(err) {
- console.log(err);
- });
- }
- })
- .catch(function(err) {
- console.log(err);
- });
- }
-
-
- return Interval;
-};
-
-// function createInterval(element) {
-// var interval = [];
-// if (element.t_from && element.t_from !== '') {
-// interval[0] = element.t_from;
-// if (element.t_to && element.t_to !== '') {
-// interval[0] += '-' + element.t_to;
-// }
-// } else {
-// interval[0] = '*';
-// }
-//
-// if (element.wd_from && element.wd_from !== '') {
-// interval[1] = element.wd_from;
-// if (element.wd_to && element.wd_to !== '') {
-// interval[1] += '-' + element.wd_to;
-// }
-// } else {
-// interval[1] = '*';
-// }
-//
-// if (element.md_from && element.md_from !== '') {
-// interval[2] = element.md_from;
-// if (element.md_to && element.md_to !== '') {
-// interval[2] += '-' + element.md_to;
-// }
-// } else {
-// interval[2] = '*';
-// }
-//
-// if (element.m_from && element.m_from !== '') {
-// interval[3] = element.m_from;
-// if (element.m_to && element.m_to !== '') {
-// interval[3] += '-' + element.m_to;
-// }
-// } else {
-// interval[3] = '*';
-// }
-//
-// return interval.join(',');
-// }
-
-function appCreate(application, element, appGroup, intervals, priority) {
- var intLength = intervals.length;
- if (element.customApp) {
- element.app = 'custom';
- }
- switch (element.app) {
- case 'Dial':
- if (!element.callerID) {
- _.remove(application, {
- app: 'Set'
- });
- }
- application.forEach(function(elem, index) {
- elem.exten = element.exten;
- elem.type = element.type;
- elem.context = element.context;
- elem.VoiceExtensionId = element.VoiceExtensionId;
- elem.priority = priority ? priority++ : element.priority++;
- elem.appGroup = appGroup;
- switch (elem.app) {
- case 'GotoIfTime':
- elem.appdata = util.format(elem.appdata, element.IntervalId ? '*,*,*,*' : element.interval, elem.context, elem.priority + 1, elem.context, (elem.priority + 2));
- break;
- case 'GotoIfTimeFromArray':
- elem.app = 'GotoIfTime';
- elem.appdata = util.format(elem.appdata, elem.context, elem.priority + intLength - index, elem.context, (index + 1) < intLength ? (elem.priority + 1) : (elem.priority + 2));
- break;
- case 'Dial':
- if (element.type === 'outbound') {
- elem.interval = element.interval;
- elem.trunk = element.trunk;
- elem.TrunkId = element.TrunkId;
- elem.cutdigits = element.cutdigits || 0;
- elem.callerID = element.callerID || null;
- // elem.appdata = util.format('SIP/${EXTEN:%d}@%s', elem.cutdigits, elem.trunk);
- } else {
- elem.IntervalId = element.IntervalId;
- elem.interval = element.interval;
- elem.interface = element.interface;
- elem.app_options = element.app_options || '';
- elem.timeout = element.timeout || '';
- elem.url = element.url || '';
- elem.appdata = util.format(elem.appdata, element.interface, elem.timeout, elem.app_options ? elem.app_options.replace(',', '') : '', elem.url);
- }
- break;
- case 'Set':
- elem.appdata = util.format(elem.appdata, element.callerID);
- break;
- case 'NoOp':
- if (element.type === 'outbound') {
- elem.appdata = 'Outbound Dial Application End';
- }
- break;
- default:
-
- }
- });
- break;
- case 'Queue':
- application.forEach(function(elem, index) {
- elem.exten = element.exten;
- elem.type = element.type;
- elem.context = element.context;
- elem.VoiceExtensionId = element.VoiceExtensionId;
- elem.priority = priority ? priority++ : element.priority++;
- elem.appGroup = appGroup;
- switch (elem.app) {
- case 'GotoIfTime':
- elem.appdata = util.format(elem.appdata, element.IntervalId ? '*,*,*,*' : element.interval, elem.context, elem.priority + 1, elem.context, (elem.priority + 2));
- break;
- case 'GotoIfTimeFromArray':
- elem.app = 'GotoIfTime';
- elem.appdata = util.format(elem.appdata, elem.context, elem.priority + intLength - index, elem.context, (index + 1) < intLength ? (elem.priority + 1) : (elem.priority + 2));
- break;
- case 'Queue':
- elem.IntervalId = element.IntervalId;
- elem.app_options = element.app_options || '';
- elem.audiofile = element.audiofile || '';
- elem.queue = element.queue;
- elem.interval = element.interval;
- elem.interface = element.interface;
- elem.app_options = element.app_options;
- elem.timeout = element.timeout || '';
- elem.url = element.url || '';
- elem.appdata = util.format(elem.appdata, elem.queue, elem.app_options ? elem.app_options.replace(',', '') : '', elem.url, elem.audiofile, elem.timeout);
- break;
- default:
-
- }
- });
- break;
- case 'Playback':
- application.forEach(function(elem, index) {
- elem.exten = element.exten;
- elem.type = element.type;
- elem.context = element.context;
- elem.VoiceExtensionId = element.VoiceExtensionId;
- elem.priority = priority ? priority++ : element.priority++;
- elem.appGroup = appGroup;
- switch (elem.app) {
- case 'GotoIfTime':
- elem.appdata = util.format(elem.appdata, element.IntervalId ? '*,*,*,*' : element.interval, elem.context, elem.priority + 1, elem.context, (elem.priority + 2));
- break;
- case 'GotoIfTimeFromArray':
- elem.app = 'GotoIfTime';
- elem.appdata = util.format(elem.appdata, elem.context, elem.priority + intLength - index, elem.context, (index + 1) < intLength ? (elem.priority + 1) : (elem.priority + 2));
- break;
- case 'Playback':
- elem.IntervalId = element.IntervalId;
- elem.interval = element.interval;
- elem.audiofile = element.audiofile || '';
- elem.app_options = element.app_options || '';
- elem.appdata = util.format(elem.appdata, elem.audiofile, elem.app_options ? elem.app_options.replace(',', '') : '');
- break;
- default:
-
- }
- });
- break;
- case 'AGI':
- application.forEach(function(elem, index) {
- elem.exten = element.exten;
- elem.type = element.type;
- elem.context = element.context;
- elem.VoiceExtensionId = element.VoiceExtensionId;
- elem.priority = priority ? priority++ : element.priority++;
- elem.appGroup = appGroup;
- switch (elem.app) {
- case 'GotoIfTime':
- elem.appdata = util.format(elem.appdata, element.IntervalId ? '*,*,*,*' : element.interval, elem.context, elem.priority + 1, elem.context, (elem.priority + 2));
- break;
- case 'GotoIfTimeFromArray':
- elem.app = 'GotoIfTime';
- elem.appdata = util.format(elem.appdata, elem.context, elem.priority + intLength - index, elem.context, (index + 1) < intLength ? (elem.priority + 1) : (elem.priority + 2));
- break;
- case 'AGI':
- elem.IntervalId = element.IntervalId;
- elem.interval = element.interval;
- elem.project = element.project;
- elem.appdata = util.format(elem.appdata, elem.project);
- break;
- default:
-
- }
- });
- break;
- case 'Goto':
- application.forEach(function(elem, index) {
- elem.exten = element.exten;
- elem.type = element.type;
- elem.context = element.context;
- elem.VoiceExtensionId = element.VoiceExtensionId;
- elem.priority = priority ? priority++ : element.priority++;
- elem.appGroup = appGroup;
- switch (elem.app) {
- case 'GotoIfTime':
- elem.appdata = util.format(elem.appdata, element.IntervalId ? '*,*,*,*' : element.interval, elem.context, elem.priority + 1, elem.context, (elem.priority + 2));
- break;
- case 'GotoIfTimeFromArray':
- elem.app = 'GotoIfTime';
- elem.appdata = util.format(elem.appdata, elem.context, elem.priority + intLength - index, elem.context, (index + 1) < intLength ? (elem.priority + 1) : (elem.priority + 2));
- break;
- case 'Goto':
- elem.IntervalId = element.IntervalId;
- elem.interval = element.interval;
- elem.alt_priority = element.alt_priority;
- elem.alt_extension = element.alt_extension;
- elem.alt_context = element.alt_context;
- elem.appdata = util.format(elem.appdata, elem.alt_context, elem.alt_extension, elem.alt_priority);
- break;
- default:
-
- }
- });
- break;
- case 'Hangup':
- application.forEach(function(elem, index) {
- elem.exten = element.exten;
- elem.type = element.type;
- elem.context = element.context;
- elem.VoiceExtensionId = element.VoiceExtensionId;
- elem.priority = priority ? priority++ : element.priority++;
- elem.appGroup = appGroup;
- switch (elem.app) {
- case 'GotoIfTime':
- elem.appdata = util.format(elem.appdata, element.IntervalId ? '*,*,*,*' : element.interval, elem.context, elem.priority + 1, elem.context, (elem.priority + 2));
- break;
- case 'GotoIfTimeFromArray':
- elem.app = 'GotoIfTime';
- elem.appdata = util.format(elem.appdata, elem.context, elem.priority + intLength - index, elem.context, (index + 1) < intLength ? (elem.priority + 1) : (elem.priority + 2));
- break;
- case 'Hangup':
- elem.IntervalId = element.IntervalId;
- elem.interval = element.interval;
- elem.causecode = element.causecode;
- elem.appdata = util.format(elem.appdata, elem.causecode);
- break;
- default:
-
- }
- });
- break;
- case 'Set':
- application.forEach(function(elem, index) {
- elem.exten = element.exten;
- elem.type = element.type;
- elem.context = element.context;
- elem.VoiceExtensionId = element.VoiceExtensionId;
- elem.priority = priority ? priority++ : element.priority++;
- elem.appGroup = appGroup;
- switch (elem.app) {
- case 'GotoIfTime':
- elem.appdata = util.format(elem.appdata, element.IntervalId ? '*,*,*,*' : element.interval, elem.context, elem.priority + 1, elem.context, (elem.priority + 2));
- break;
- case 'GotoIfTimeFromArray':
- elem.app = 'GotoIfTime';
- elem.appdata = util.format(elem.appdata, elem.context, elem.priority + intLength - index, elem.context, (index + 1) < intLength ? (elem.priority + 1) : (elem.priority + 2));
- break;
- case 'Set':
- elem.IntervalId = element.IntervalId;
- elem.interval = element.interval;
- elem.variable = element.variable;
- elem.value = element.value;
- elem.appdata = util.format(elem.appdata, elem.variable, elem.value);
- break;
- default:
-
- }
- });
- break;
- case 'custom':
- application.forEach(function(elem, index) {
- elem.exten = element.exten;
- elem.type = element.type;
- elem.context = element.context;
- elem.VoiceExtensionId = element.VoiceExtensionId;
- elem.priority = priority ? priority++ : element.priority++;
- elem.appGroup = appGroup;
- switch (elem.app) {
- case 'GotoIfTime':
- elem.appdata = util.format(elem.appdata, element.IntervalId ? '*,*,*,*' : element.interval, elem.context, elem.priority + 1, elem.context, (elem.priority + 2));
- break;
- case 'GotoIfTimeFromArray':
- elem.app = 'GotoIfTime';
- elem.appdata = util.format(elem.appdata, elem.context, elem.priority + intLength - index, elem.context, (index + 1) < intLength ? (elem.priority + 1) : (elem.priority + 2));
- break;
- case 'custom':
- elem.IntervalId = element.IntervalId;
- elem.interval = element.interval;
- elem.app = elem.customApp = element.customApp;
- elem.appdata = util.format(elem.appdata, element.appdata);
- break;
- default:
-
- }
- });
- break;
- case 'Voicemail':
- application.forEach(function(elem, index) {
- elem.exten = element.exten;
- elem.type = element.type;
- elem.context = element.context;
- elem.VoiceExtensionId = element.VoiceExtensionId;
- elem.priority = priority ? priority++ : element.priority++;
- elem.appGroup = appGroup;
- switch (elem.app) {
- case 'GotoIfTime':
- elem.appdata = util.format(elem.appdata, element.IntervalId ? '*,*,*,*' : element.interval, elem.context, elem.priority + 1, elem.context, (elem.priority + 2));
- break;
- case 'GotoIfTimeFromArray':
- elem.app = 'GotoIfTime';
- elem.appdata = util.format(elem.appdata, elem.context, elem.priority + intLength - index, elem.context, (index + 1) < intLength ? (elem.priority + 1) : (elem.priority + 2));
- break;
- case 'Voicemail':
- elem.IntervalId = element.IntervalId;
- elem.interval = element.interval;
- elem.mailbox = element.mailbox;
- elem.appdata = util.format(elem.appdata, elem.mailbox);
- break;
- default:
-
- }
- });
- break;
- default:
- application.forEach(function(elem, index) {
- elem.exten = element.exten;
- elem.type = element.type;
- elem.context = element.context;
- elem.VoiceExtensionId = element.VoiceExtensionId;
- elem.priority = priority ? priority++ : element.priority++;
- elem.appGroup = appGroup;
- switch (elem.app) {
- case 'GotoIfTime':
- elem.appdata = util.format(elem.appdata, element.IntervalId ? '*,*,*,*' : element.interval, elem.context, elem.priority + 1, elem.context, (elem.priority + 2));
- break;
- case 'GotoIfTimeFromArray':
- elem.app = 'GotoIfTime';
- elem.appdata = util.format(elem.appdata, elem.context, elem.priority + intLength - index, elem.context, (index + 1) < intLength ? (elem.priority + 1) : (elem.priority + 2));
- break;
- case 'custom':
- elem.IntervalId = element.IntervalId;
- elem.interval = element.interval;
- elem.app = elem.customApp = element.customApp;
- elem.appdata = util.format(elem.appdata, element.appdata);
- break;
- default:
-
- }
- });
-
- }
- if (priority) {
- return priority;
- }
-}
+var _0xc0f8=["\x65\x78\x70\x6F\x72\x74\x73","\x49\x6E\x74\x65\x72\x76\x61\x6C","\x53\x54\x52\x49\x4E\x47","\x69\x6E\x74\x65\x72\x76\x61\x6C\x73","\x53\x75\x62\x49\x6E\x74\x65\x72\x76\x61\x6C\x73","\x63\x61\x73\x63\x61\x64\x65","\x68\x61\x73\x4D\x61\x6E\x79","\x56\x6F\x69\x63\x65\x45\x78\x74\x65\x6E\x73\x69\x6F\x6E\x73","\x49\x6E\x74\x65\x72\x76\x61\x6C\x49\x64","\x72\x65\x73\x74\x72\x69\x63\x74","\x4D\x61\x69\x6C\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x43\x68\x61\x74\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x73\x75\x62\x69\x6E\x74\x65\x72\x76\x61\x6C\x73","\x6E\x61\x6D\x65","\x69\x6E\x74\x65\x72\x76\x61\x6C","\x61\x64\x64\x53\x63\x6F\x70\x65","\x64\x65\x66\x69\x6E\x65"];module[_0xc0f8[0]]=function(_0xb314x1,_0xb314x2){var _0xb314x3=_0xb314x1[_0xc0f8[16]](_0xc0f8[1],{name:{type:_0xb314x2[_0xc0f8[2]]},description:_0xb314x2[_0xc0f8[2]],interval:{type:_0xb314x2[_0xc0f8[2]],allowNull:true}},{tableName:_0xc0f8[3],associate:function(_0xb314x4){_0xb314x3[_0xc0f8[6]](_0xb314x4.Interval,{as:_0xc0f8[4],onDelete:_0xc0f8[5],hooks:true,required:false});_0xb314x3[_0xc0f8[6]](_0xb314x4.VoiceExtension,{as:_0xc0f8[7],foreignKey:_0xc0f8[8],onDelete:_0xc0f8[9]});_0xb314x3[_0xc0f8[6]](_0xb314x4.MailApplication,{as:_0xc0f8[10]});_0xb314x3[_0xc0f8[6]](_0xb314x4.MailApplication,{as:_0xc0f8[11]});_0xb314x3[_0xc0f8[15]](_0xc0f8[12],{include:[{model:_0xb314x4[_0xc0f8[1]],as:_0xc0f8[4],required:false,attributes:[_0xc0f8[13],_0xc0f8[14]]}]});_0xb314x3[_0xc0f8[15]](_0xc0f8[3],{where:{IntervalId:null}})}});return _0xb314x3}
\ No newline at end of file