Built motion from commit 95c3d5ad5.|1.0.29
[motion.git] / server / models / user.js
index 3da8563..e000bca 100644 (file)
@@ -1 +1,1175 @@
-var _0xdd2a=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x63\x72\x79\x70\x74\x6F","\x6D\x64\x35","\x6C\x6F\x64\x61\x73\x68","\x65\x78\x70\x6F\x72\x74\x73","\x55\x73\x65\x72","\x53\x54\x52\x49\x4E\x47","\x6E\x61\x6D\x65","\x73\x65\x74\x44\x61\x74\x61\x56\x61\x6C\x75\x65","\x64\x65\x66\x61\x75\x6C\x74\x75\x73\x65\x72","\x65\x6D\x61\x69\x6C","\x74\x6F\x4C\x6F\x77\x65\x72\x43\x61\x73\x65","\x61\x64\x6D\x69\x6E","\x75\x73\x65\x72","\x61\x67\x65\x6E\x74","\x74\x65\x6C\x65\x70\x68\x6F\x6E\x65","\x73\x61\x6C\x74","\x6D\x61\x6B\x65\x53\x61\x6C\x74","\x70\x61\x73\x73\x77\x6F\x72\x64","\x65\x6E\x63\x72\x79\x70\x74\x50\x61\x73\x73\x77\x6F\x72\x64","\x6D\x64\x35\x73\x65\x63\x72\x65\x74","\x3A\x61\x73\x74\x65\x72\x69\x73\x6B\x3A","\x6D\x64\x35\x50\x61\x73\x73\x77\x6F\x72\x64","\x6C\x6F\x63\x61\x6C","\x69\x6E\x74\x65\x72\x6E\x61\x6C","\x61\x63\x63\x6F\x75\x6E\x74\x63\x6F\x64\x65","\x49\x4E\x54\x45\x47\x45\x52","\x42\x4F\x4F\x4C\x45\x41\x4E","\x44\x41\x54\x45","\x64\x79\x6E\x61\x6D\x69\x63","\x66\x72\x69\x65\x6E\x64","\x70\x65\x65\x72","\x66\x72\x6F\x6D\x2D\x73\x69\x70","\x75\x64\x70","\x72\x66\x63\x32\x38\x33\x33","\x69\x6E\x66\x6F","\x73\x68\x6F\x72\x74\x69\x6E\x66\x6F","\x69\x6E\x62\x61\x6E\x64","\x61\x75\x74\x6F","\x79\x65\x73","\x6E\x6F","\x6E\x6F\x6E\x61\x74","\x75\x70\x64\x61\x74\x65","\x66\x6F\x72\x63\x65\x5F\x72\x70\x6F\x72\x74\x2C\x63\x6F\x6D\x65\x64\x69\x61","\x65\x6E","\x61\x6C\x6C","\x61\x6C\x61\x77\x3B\x75\x6C\x61\x77\x3B\x67\x73\x6D","\x70\x6F\x72\x74\x2C\x69\x6E\x76\x69\x74\x65","\x6E\x65\x76\x65\x72","\x22\x22\x20\x3C\x3E","\x61\x63\x63\x65\x70\x74","\x72\x65\x66\x75\x73\x65","\x6F\x72\x69\x67\x69\x6E\x61\x74\x65","\x75\x61\x63","\x75\x61\x73","\x41\x4C\x4C\x4F\x57\x45\x44\x5F\x4E\x4F\x54\x5F\x53\x43\x52\x45\x45\x4E\x45\x44","\x41\x4C\x4C\x4F\x57\x45\x44\x5F\x50\x41\x53\x53\x45\x44\x5F\x53\x43\x52\x45\x45\x4E","\x41\x4C\x4C\x4F\x57\x45\x44\x5F\x46\x41\x49\x4C\x45\x44\x5F\x53\x43\x52\x45\x45\x4E","\x41\x4C\x4C\x4F\x57\x45\x44","\x50\x52\x4F\x48\x49\x42\x5F\x4E\x4F\x54\x5F\x53\x43\x52\x45\x45\x4E\x45\x44","\x50\x52\x4F\x48\x49\x42\x5F\x50\x41\x53\x53\x45\x44\x5F\x53\x43\x52\x45\x45\x4E","\x50\x52\x4F\x48\x49\x42\x5F\x46\x41\x49\x4C\x45\x44\x5F\x53\x43\x52\x45\x45\x4E","\x50\x52\x4F\x48\x49\x42","\x75\x73\x65\x72\x73","\x62\x61\x73\x65\x36\x34","\x72\x61\x6E\x64\x6F\x6D\x42\x79\x74\x65\x73","","\x70\x62\x6B\x64\x66\x32\x53\x79\x6E\x63","\x68\x61\x73\x4D\x61\x6E\x79","\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x6D\x6F\x64\x75\x6C\x65\x73","\x62\x65\x6C\x6F\x6E\x67\x73\x54\x6F\x4D\x61\x6E\x79","\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x63\x68\x61\x6E\x6E\x65\x6C\x73","\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x6D\x61\x69\x6C\x5F\x72\x6F\x6F\x6D\x73","\x55\x73\x65\x72\x48\x61\x73\x54\x65\x61\x6D","\x55\x73\x65\x72\x48\x61\x73\x43\x68\x61\x74\x52\x6F\x6F\x6D","\x55\x73\x65\x72\x48\x61\x73\x4D\x61\x69\x6C\x51\x75\x65\x75\x65","\x55\x73\x65\x72\x48\x61\x73\x43\x68\x61\x74\x51\x75\x65\x75\x65","\x55\x73\x65\x72\x48\x61\x73\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65","\x55\x73\x65\x72\x49\x64","\x55\x73\x65\x72\x45\x78\x74\x65\x6E\x73\x69\x6F\x6E\x73","\x63\x61\x73\x63\x61\x64\x65","\x61\x64\x64\x53\x63\x6F\x70\x65","\x69\x64","\x66\x75\x6C\x6C\x6E\x61\x6D\x65","\x64\x65\x66\x69\x6E\x65"];_0xdd2a[0];var crypto=require(_0xdd2a[1]);var md5=require(_0xdd2a[2]);var _=require(_0xdd2a[3]);module[_0xdd2a[4]]=function(_0x77fcx4,_0x77fcx5){var _0x77fcx6=_0x77fcx4[_0xdd2a[84]](_0xdd2a[5],{name:{type:_0x77fcx5[_0xdd2a[6]],unique:true,validate:{notEmpty:true},set:function(_0x77fcx7){this[_0xdd2a[8]](_0xdd2a[7],_0x77fcx7);this[_0xdd2a[8]](_0xdd2a[9],_0x77fcx7);}},email:{type:_0x77fcx5[_0xdd2a[6]],unique:true,set:function(_0x77fcx8){if(_0x77fcx8){this[_0xdd2a[8]](_0xdd2a[10],_0x77fcx8[_0xdd2a[11]]())}},defaultValue:null},role:{type:_0x77fcx5.ENUM(_0xdd2a[12],_0xdd2a[13],_0xdd2a[14],_0xdd2a[15])},password:{type:_0x77fcx5[_0xdd2a[6]],allowNull:false,validate:{notEmpty:true},set:function(_0x77fcx9){this[_0xdd2a[16]]=this[_0xdd2a[17]]();this[_0xdd2a[8]](_0xdd2a[18],this[_0xdd2a[19]](_0x77fcx9));this[_0xdd2a[8]](_0xdd2a[20],this[_0xdd2a[22]](this[_0xdd2a[7]]+_0xdd2a[21]+_0x77fcx9));}},provider:{type:_0x77fcx5[_0xdd2a[6]],defaultValue:_0xdd2a[23]},internal:{type:_0x77fcx5.INTEGER(11),unique:true,set:function(_0x77fcxa){this[_0xdd2a[8]](_0xdd2a[24],_0x77fcxa);this[_0xdd2a[8]](_0xdd2a[25],_0x77fcxa);}},salt:{type:_0x77fcx5[_0xdd2a[6]]},phone:{type:_0x77fcx5[_0xdd2a[6]]},mobile:{type:_0x77fcx5[_0xdd2a[6]]},address:{type:_0x77fcx5[_0xdd2a[6]]},zipcode:{type:_0x77fcx5[_0xdd2a[6]]},userpic:{type:_0x77fcx5[_0xdd2a[6]]},city:{type:_0x77fcx5[_0xdd2a[6]]},country:{type:_0x77fcx5[_0xdd2a[6]]},facebookUserId:{type:_0x77fcx5[_0xdd2a[26]]},twitterUserId:{type:_0x77fcx5[_0xdd2a[26]]},twitterKey:{type:_0x77fcx5[_0xdd2a[6]]},twitterSecret:{type:_0x77fcx5[_0xdd2a[6]]},github:{type:_0x77fcx5[_0xdd2a[6]]},openId:{type:_0x77fcx5[_0xdd2a[6]]},online:{type:_0x77fcx5[_0xdd2a[27]],defaultValue:false},lastLoginAt:{type:_0x77fcx5[_0xdd2a[28]]},ipaddr:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true},port:{type:_0x77fcx5.INTEGER(5),allowNull:true},regseconds:{type:_0x77fcx5.INTEGER(11),allowNull:true},defaultuser:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true},fullcontact:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true},regserver:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true},useragent:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true},lastms:{type:_0x77fcx5.INTEGER(11),allowNull:true},host:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true,defaultValue:_0xdd2a[29]},type:{type:_0x77fcx5.ENUM(_0xdd2a[30],_0xdd2a[13],_0xdd2a[31]),allowNull:true,defaultValue:_0xdd2a[30]},context:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true,defaultValue:_0xdd2a[32]},permit:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true},deny:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true},secret:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true},md5secret:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true},remotesecret:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true},transport:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true,defaultValue:_0xdd2a[33]},dtmfmode:{type:_0x77fcx5.ENUM(_0xdd2a[34],_0xdd2a[35],_0xdd2a[36],_0xdd2a[37],_0xdd2a[38]),allowNull:true,defaultValue:_0xdd2a[34]},directmedia:{type:_0x77fcx5.ENUM(_0xdd2a[39],_0xdd2a[40],_0xdd2a[41],_0xdd2a[42]),allowNull:true,defaultValue:_0xdd2a[40]},nat:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true,defaultValue:_0xdd2a[43]},callgroup:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true},pickupgroup:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true},language:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true,defaultValue:_0xdd2a[44]},disallow:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true,defaultValue:_0xdd2a[45]},allow:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true,defaultValue:_0xdd2a[46]},insecure:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true,defaultValue:_0xdd2a[47]},trustrpid:{type:_0x77fcx5.ENUM(_0xdd2a[39],_0xdd2a[40]),allowNull:true,defaultValue:_0xdd2a[40]},progressinband:{type:_0x77fcx5.ENUM(_0xdd2a[39],_0xdd2a[40],_0xdd2a[48]),allowNull:true},promiscredir:{type:_0x77fcx5.ENUM(_0xdd2a[39],_0xdd2a[40]),allowNull:true},useclientcode:{type:_0x77fcx5.ENUM(_0xdd2a[39],_0xdd2a[40]),allowNull:true},accountcode:{type:_0x77fcx5.INTEGER(11),allowNull:true},setvar:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true},callerid:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true,defaultValue:_0xdd2a[49]},amaflags:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true},callcounter:{type:_0x77fcx5.ENUM(_0xdd2a[39],_0xdd2a[40]),allowNull:true,defaultValue:_0xdd2a[39]},busylevel:{type:_0x77fcx5.INTEGER(11),allowNull:true},allowoverlap:{type:_0x77fcx5.ENUM(_0xdd2a[39],_0xdd2a[40]),allowNull:true},allowsubscribe:{type:_0x77fcx5.ENUM(_0xdd2a[39],_0xdd2a[40]),allowNull:true},videosupport:{type:_0x77fcx5.ENUM(_0xdd2a[39],_0xdd2a[40]),allowNull:true},maxcallbitrate:{type:_0x77fcx5.INTEGER(11),allowNull:true},rfc2833compensate:{type:_0x77fcx5.ENUM(_0xdd2a[39],_0xdd2a[40]),allowNull:true},mailbox:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true},"\x73\x65\x73\x73\x69\x6F\x6E\x2D\x74\x69\x6D\x65\x72\x73":{type:_0x77fcx5.ENUM(_0xdd2a[50],_0xdd2a[51],_0xdd2a[52]),allowNull:true},"\x73\x65\x73\x73\x69\x6F\x6E\x2D\x65\x78\x70\x69\x72\x65\x73":{type:_0x77fcx5.INTEGER(11),allowNull:true},"\x73\x65\x73\x73\x69\x6F\x6E\x2D\x6D\x69\x6E\x73\x65":{type:_0x77fcx5.INTEGER(11),allowNull:true},"\x73\x65\x73\x73\x69\x6F\x6E\x2D\x72\x65\x66\x72\x65\x73\x68\x65\x72":{type:_0x77fcx5.ENUM(_0xdd2a[53],_0xdd2a[54]),allowNull:true},t38pt_usertpsource:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true},regexten:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true},fromdomain:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true},fromuser:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true},qualify:{type:_0x77fcx5.ENUM(_0xdd2a[39],_0xdd2a[40]),allowNull:true,defaultValue:_0xdd2a[39]},defaultip:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true},rtptimeout:{type:_0x77fcx5.INTEGER(11),allowNull:true},rtpholdtimeout:{type:_0x77fcx5.INTEGER(11),allowNull:true},sendrpid:{type:_0x77fcx5.ENUM(_0xdd2a[39],_0xdd2a[40]),allowNull:true,defaultValue:_0xdd2a[40]},outboundproxy:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true},callbackextension:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true},timert1:{type:_0x77fcx5.INTEGER(11),allowNull:true},timerb:{type:_0x77fcx5.INTEGER(11),allowNull:true},qualifyfreq:{type:_0x77fcx5.INTEGER(11),allowNull:true},constantssrc:{type:_0x77fcx5.ENUM(_0xdd2a[39],_0xdd2a[40]),allowNull:true},contactpermit:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true},contactdeny:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true},usereqphone:{type:_0x77fcx5.ENUM(_0xdd2a[39],_0xdd2a[40]),allowNull:true,defaultValue:_0xdd2a[40]},textsupport:{type:_0x77fcx5.ENUM(_0xdd2a[39],_0xdd2a[40]),allowNull:true},faxdetect:{type:_0x77fcx5.ENUM(_0xdd2a[39],_0xdd2a[40]),allowNull:true},buggymwi:{type:_0x77fcx5.ENUM(_0xdd2a[39],_0xdd2a[40]),allowNull:true},auth:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true},fullname:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true},trunkname:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true},cid_number:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true},callingpres:{type:_0x77fcx5.ENUM(_0xdd2a[55],_0xdd2a[56],_0xdd2a[57],_0xdd2a[58],_0xdd2a[59],_0xdd2a[60],_0xdd2a[61],_0xdd2a[62]),allowNull:true},mohinterpret:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true},mohsuggest:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true},parkinglot:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true},hasvoicemail:{type:_0x77fcx5.ENUM(_0xdd2a[39],_0xdd2a[40]),allowNull:true},subscribemwi:{type:_0x77fcx5.ENUM(_0xdd2a[39],_0xdd2a[40]),allowNull:true},vmexten:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true},description:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true},autoframing:{type:_0x77fcx5.ENUM(_0xdd2a[39],_0xdd2a[40]),allowNull:true},limitonpeers:{type:_0x77fcx5.ENUM(_0xdd2a[39],_0xdd2a[40]),allowNull:true,defaultValue:_0xdd2a[39]},rtpkeepalive:{type:_0x77fcx5.INTEGER(11),allowNull:true},"\x63\x61\x6C\x6C\x2D\x6C\x69\x6D\x69\x74":{type:_0x77fcx5.INTEGER(11),allowNull:true,defaultValue:null},g726nonstandard:{type:_0x77fcx5.ENUM(_0xdd2a[39],_0xdd2a[40]),allowNull:true},ignoresdpversion:{type:_0x77fcx5.ENUM(_0xdd2a[39],_0xdd2a[40]),allowNull:true},allowtransfer:{type:_0x77fcx5.ENUM(_0xdd2a[39],_0xdd2a[40]),allowNull:true},dynamic:{type:_0x77fcx5.ENUM(_0xdd2a[39],_0xdd2a[40]),allowNull:true},encryption:{type:_0x77fcx5.ENUM(_0xdd2a[39],_0xdd2a[40]),allowNull:true,defaultValue:_0xdd2a[40]},registry:{type:_0x77fcx5[_0xdd2a[6]],allowNull:true}},{tableName:_0xdd2a[63],instanceMethods:{authenticate:function(_0x77fcxb){return this[_0xdd2a[19]](_0x77fcxb)===this[_0xdd2a[18]]},makeSalt:function(){return crypto[_0xdd2a[65]](16).toString(_0xdd2a[64])},encryptPassword:function(_0x77fcx9){if(!_0x77fcx9||!this[_0xdd2a[16]]){return _0xdd2a[66]};var _0x77fcxc= new Buffer(this[_0xdd2a[16]],_0xdd2a[64]);return crypto[_0xdd2a[67]](_0x77fcx9,_0x77fcxc,10000,64).toString(_0xdd2a[64]);},md5Password:function(_0x77fcx9){if(!_0x77fcx9){return _0xdd2a[66]};return md5(_0x77fcx9);}},associate:function(_0x77fcxd){_0x77fcx6[_0xdd2a[68]](_0x77fcxd.ChatMessage);_0x77fcx6[_0xdd2a[68]](_0x77fcxd.Contact);_0x77fcx6[_0xdd2a[70]](_0x77fcxd.Module,{through:_0xdd2a[69]});_0x77fcx6[_0xdd2a[70]](_0x77fcxd.Channel,{through:_0xdd2a[71]});_0x77fcx6[_0xdd2a[70]](_0x77fcxd.MailRoom,{through:_0xdd2a[72]});_0x77fcx6[_0xdd2a[70]](_0x77fcxd.Team,{through:_0x77fcxd[_0xdd2a[73]]});_0x77fcx6[_0xdd2a[70]](_0x77fcxd.ChatRoom,{through:_0x77fcxd[_0xdd2a[74]]});_0x77fcx6[_0xdd2a[70]](_0x77fcxd.MailQueue,{through:_0x77fcxd[_0xdd2a[75]]});_0x77fcx6[_0xdd2a[70]](_0x77fcxd.ChatQueue,{through:_0x77fcxd[_0xdd2a[76]]});_0x77fcx6[_0xdd2a[70]](_0x77fcxd.VoiceQueue,{through:_0x77fcxd[_0xdd2a[77]]});_0x77fcx6[_0xdd2a[68]](_0x77fcxd.VoiceExtension,{foreignKey:_0xdd2a[78],as:_0xdd2a[79],onDelete:_0xdd2a[80]});_0x77fcx6[_0xdd2a[81]](_0xdd2a[13],{where:{role:{$in:[_0xdd2a[12],_0xdd2a[13]]}}});_0x77fcx6[_0xdd2a[81]](_0xdd2a[14],{where:{role:_0xdd2a[14]},attributes:[_0xdd2a[82],_0xdd2a[7],_0xdd2a[10],_0xdd2a[24],_0xdd2a[83]]});}});return _0x77fcx6;};
\ No newline at end of file
+'use strict';
+
+var crypto = require('crypto');
+var md5 = require('md5');
+var _ = require('lodash');
+var moment = require('moment');
+
+module.exports = function(sequelize, DataTypes) {
+  var User = sequelize.define('User', {
+    name: {
+      type: DataTypes.STRING,
+      unique: 'name',
+      validate: {
+        notEmpty: true,
+        is: /^[A-Za-z0-9\.\_]+$/i
+      },
+      set: function(name) {
+        this.setDataValue('name', name);
+        this.setDataValue('defaultuser', name);
+      }
+    },
+    fullname: {
+      type: DataTypes.STRING,
+      allowNull: false,
+    },
+    email: {
+      type: DataTypes.STRING,
+      unique: 'email',
+      isEmail: true,
+      set: function(email) {
+        if (email) {
+          this.setDataValue('email', email.toLowerCase());
+        }
+      },
+      defaultValue: null
+    },
+    role: {
+      type: DataTypes.ENUM('admin', 'user', 'agent', 'telephone')
+    },
+    password: {
+      type: DataTypes.STRING,
+      allowNull: false,
+      validate: {
+        notEmpty: true
+      },
+      set: function(password) {
+        this.salt = this.makeSalt();
+        this.setDataValue('password', this.encryptPassword(password));
+        this.setDataValue('md5secret', this.md5Password(this.name + ':asterisk:' + password));
+      }
+    },
+    provider: {
+      type: DataTypes.STRING,
+      defaultValue: 'local'
+    },
+    internal: {
+      type: DataTypes.INTEGER(11),
+      unique: 'internal',
+      set: function(internal) {
+        this.setDataValue('internal', internal);
+        this.setDataValue('accountcode', internal);
+      }
+    },
+    salt: {
+      type: DataTypes.STRING
+    },
+    phone: {
+      type: DataTypes.STRING
+    },
+    mobile: {
+      type: DataTypes.STRING
+    },
+    address: {
+      type: DataTypes.STRING
+    },
+    zipcode: {
+      type: DataTypes.STRING
+    },
+    userpic: {
+      type: DataTypes.STRING
+    },
+    city: {
+      type: DataTypes.STRING
+    },
+    country: {
+      type: DataTypes.STRING
+    },
+    online: {
+      type: DataTypes.BOOLEAN,
+      defaultValue: false
+    },
+    lastLoginAt: {
+      type: DataTypes.DATE
+    },
+    status: {
+      type: DataTypes.STRING,
+      defaultValue: 'UNKNOWN'
+    },
+    statusAt: {
+      type: DataTypes.DATE
+    },
+    queueStatus: {
+      type: DataTypes.STRING,
+      defaultValue: 'complete'
+    },
+    queueStatusAt: {
+      type: DataTypes.DATE
+    },
+    lastQueue: {
+      type: DataTypes.STRING
+    },
+    voicePause: {
+      type: DataTypes.BOOLEAN,
+      defaultValue: false,
+      // set: function(voicePause) {
+      //   this.setDataValue('voicePause', voicePause);
+      //   if (voicePause) {
+      //     this.setDataValue('queueStatus', 'paused');
+      //     this.setDataValue('queueStatusAt', moment().format("YYYY-MM-DD HH:mm:ss"));
+      //   } else {
+      //     this.setDataValue('queueStatus', 'complete');
+      //     this.setDataValue('queueStatusAt', moment().format("YYYY-MM-DD HH:mm:ss"));
+      //   }
+      // }
+    },
+    chatPause: {
+      type: DataTypes.BOOLEAN,
+      defaultValue: false
+    },
+    mailPause: {
+      type: DataTypes.BOOLEAN,
+      defaultValue: false
+    },
+    faxPause: {
+      type: DataTypes.BOOLEAN,
+      defaultValue: false
+    },
+    smsPause: {
+      type: DataTypes.BOOLEAN,
+      defaultValue: false
+    },
+    openchannelPause: {
+      type: DataTypes.BOOLEAN,
+      defaultValue: false
+    },
+    pauseType: {
+      type: DataTypes.STRING,
+      defaultValue: 'Default Pause'
+    },
+    lastPauseAt: {
+      type: DataTypes.DATE
+    },
+    chatCapacity: {
+      type: DataTypes.INTEGER,
+      defaultValue: 0
+    },
+    mailCapacity: {
+      type: DataTypes.INTEGER,
+      defaultValue: 0
+    },
+    faxCapacity: {
+      type: DataTypes.INTEGER,
+      defaultValue: 0
+    },
+    smsCapacity: {
+      type: DataTypes.INTEGER,
+      defaultValue: 0
+    },
+    openchannelCapacity: {
+      type: DataTypes.INTEGER,
+      defaultValue: 0
+    },
+    phoneBarAutoAnswer: {
+      type: DataTypes.BOOLEAN,
+      defaultValue: false
+    },
+    phoneBarEnableSettings: {
+      type: DataTypes.BOOLEAN,
+      defaultValue: true
+    },
+    phoneBarUnconditionalNumber: {
+      type: DataTypes.STRING,
+      get: function() {
+        if (this.getDataValue('phoneBarUnconditional')) {
+          return this.getDataValue('phoneBarUnconditionalNumber');
+        }
+        return null;
+      }
+    },
+    phoneBarNoReplyNumber: {
+      type: DataTypes.STRING,
+      get: function() {
+        if (this.getDataValue('phoneBarNoReply')) {
+          return this.getDataValue('phoneBarNoReplyNumber');
+        }
+        return null;
+      }
+    },
+    phoneBarBusyNumber: {
+      type: DataTypes.STRING,
+      get: function() {
+        if (this.getDataValue('phoneBarBusy')) {
+          return this.getDataValue('phoneBarBusyNumber');
+        }
+        return null;
+      }
+    },
+    phoneBarUnconditional: {
+      type: DataTypes.BOOLEAN,
+      defaultValue: false
+    },
+    phoneBarNoReply: {
+      type: DataTypes.BOOLEAN,
+      defaultValue: false
+    },
+    phoneBarBusy: {
+      type: DataTypes.BOOLEAN,
+      defaultValue: false
+    },
+    phoneBarListenPort: {
+      type: DataTypes.INTEGER(5),
+      defaultValue: 5060
+    },
+    phoneBarECTail: {
+      type: DataTypes.INTEGER(5),
+      defaultValue: 200
+    },
+    phoneBarExpires: {
+      type: DataTypes.INTEGER(5),
+      defaultValue: 120
+    },
+    phoneBarNameServer: {
+      type: DataTypes.STRING,
+      allowNull: true
+    },
+    phoneBarStunServer: {
+      type: DataTypes.STRING,
+      allowNull: true
+    },
+    phoneBarVADEnabled: {
+      type: DataTypes.BOOLEAN,
+      defaultValue: false
+    },
+    phoneBarNoUDP: {
+      type: DataTypes.BOOLEAN,
+      defaultValue: false
+    },
+    phoneBarNoTCP: {
+      type: DataTypes.BOOLEAN,
+      defaultValue: true
+    },
+    phoneBarLogLevel: {
+      type: DataTypes.INTEGER(5),
+      defaultValue: 1
+    },
+    phoneBarPublishEnabled: {
+      type: DataTypes.BOOLEAN,
+      defaultValue: false
+    },
+    phoneBarRemoteControl: {
+      type: DataTypes.BOOLEAN,
+      defaultValue: false
+    },
+    phoneBarRemoteControlPort: {
+      type: DataTypes.INTEGER,
+      defaultValue: 9888
+    },
+    chanspy: {
+      type: DataTypes.BOOLEAN,
+      defaultValue: false
+    },
+    description: {
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    host: {
+      type: DataTypes.STRING,
+      allowNull: true,
+      defaultValue: 'dynamic'
+    },
+    ipaddr: { //REALTIME ASTERISK
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    port: { //REALTIME ASTERISK
+      type: DataTypes.INTEGER(5),
+      allowNull: true,
+    },
+    regseconds: { //REALTIME ASTERISK
+      type: DataTypes.INTEGER(11),
+      allowNull: true,
+    },
+    fullcontact: { //REALTIME ASTERISK
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    regserver: { //REALTIME ASTERISK
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    useragent: { //REALTIME ASTERISK
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    lastms: { //REALTIME ASTERISK
+      type: DataTypes.INTEGER(11),
+      allowNull: true,
+    },
+    type: {
+      type: DataTypes.ENUM('friend', 'user', 'peer'),
+      allowNull: true,
+      defaultValue: 'friend'
+    },
+    context: {
+      type: DataTypes.STRING,
+      allowNull: true,
+      defaultValue: 'from-sip'
+    },
+    callingpres: {
+      type: DataTypes.ENUM('ALLOWED_NOT_SCREENED',
+        'ALLOWED_PASSED_SCREEN', 'ALLOWED_FAILED_SCREEN', 'ALLOWED',
+        'PROHIB_NOT_SCREENED', 'PROHIB_PASSED_SCREEN',
+        'PROHIB_FAILED_SCREEN', 'PROHIB'),
+      allowNull: true,
+    },
+    deny: {
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    permit: {
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    secret: {
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    md5secret: {
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    remotesecret: {
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    transport: {
+      type: DataTypes.STRING,
+      allowNull: true,
+      defaultValue: 'udp'
+    },
+    dtmfmode: {
+      type: DataTypes.ENUM('rfc2833', 'info', 'shortinfo', 'inband',
+        'auto'),
+      allowNull: true,
+      defaultValue: 'rfc2833'
+    },
+    directmedia: {
+      type: DataTypes.ENUM('yes', 'no', 'nonat', 'update', 'outgoing'),
+      allowNull: true,
+      defaultValue: 'no'
+    },
+    directrtpsetup: {
+      type: DataTypes.ENUM('yes', 'no'),
+      allowNull: true,
+      defaultValue: 'no'
+    },
+    directmediapermit: {
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    directmediadeny: {
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    nat: {
+      type: DataTypes.STRING,
+      allowNull: true,
+      defaultValue: 'force_rport,comedia'
+    },
+    callgroup: {
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    namedcallgroup: { //We are in named call groups engineering,sales,netgroup,protgroup
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    pickupgroup: {
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    namedpickupgroup: { //We can do call pick-p for named call group sales
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    language: {
+      type: DataTypes.STRING,
+      allowNull: true,
+      defaultValue: 'en'
+    },
+    tonezone: {
+      type: DataTypes.STRING,
+      allowNull: true
+    },
+    disallow: {
+      type: DataTypes.STRING,
+      allowNull: true,
+      defaultValue: 'all'
+    },
+    allow: {
+      type: DataTypes.STRING,
+      allowNull: true,
+      defaultValue: 'ulaw;gsm'
+    },
+    autoframing: {
+      type: DataTypes.ENUM('yes', 'no'),
+      allowNull: true,
+    },
+    insecure: {
+      type: DataTypes.STRING,
+      allowNull: true,
+      defaultValue: 'port,invite'
+    },
+    trustrpid: {
+      type: DataTypes.ENUM('yes', 'no'),
+      allowNull: true,
+      defaultValue: 'no'
+    },
+    trust_id_outbound: {
+      type: DataTypes.ENUM('yes', 'no'),
+      allowNull: true,
+      defaultValue: 'no'
+    },
+    progressinband: {
+      type: DataTypes.ENUM('yes', 'no', 'never'),
+      allowNull: true,
+    },
+    promiscredir: {
+      type: DataTypes.ENUM('yes', 'no'),
+      allowNull: true,
+    },
+    useclientcode: {
+      type: DataTypes.ENUM('yes', 'no'),
+      allowNull: true,
+    },
+    accountcode: {
+      type: DataTypes.INTEGER(11),
+      allowNull: true,
+    },
+    setvar: {
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    callerid: {
+      type: DataTypes.STRING,
+      allowNull: true,
+      defaultValue: '"" <>'
+    },
+    amaflags: {
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    callcounter: {
+      type: DataTypes.ENUM('yes', 'no'),
+      allowNull: true,
+      defaultValue: 'yes'
+    },
+    busylevel: {
+      type: DataTypes.INTEGER(11),
+      allowNull: true,
+    },
+    allowoverlap: {
+      type: DataTypes.ENUM('yes', 'no'),
+      allowNull: true,
+    },
+    allowsubscribe: {
+      type: DataTypes.ENUM('yes', 'no'),
+      allowNull: true,
+    },
+    allowtransfer: {
+      type: DataTypes.ENUM('yes', 'no'),
+      allowNull: true,
+    },
+    ignoresdpversion: {
+      type: DataTypes.ENUM('yes', 'no'),
+      allowNull: true,
+    },
+    subscribecontext: {
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    template: {
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    videosupport: {
+      type: DataTypes.ENUM('yes', 'no', 'always'),
+      allowNull: true,
+      defaultValue: 'no'
+    },
+    maxcallbitrate: {
+      type: DataTypes.INTEGER(11),
+      allowNull: true,
+    },
+    rfc2833compensate: {
+      type: DataTypes.ENUM('yes', 'no'),
+      allowNull: true,
+    },
+    mailbox: {
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    session_timers: {
+      type: DataTypes.ENUM('accept', 'refuse', 'originate'),
+      allowNull: true,
+    },
+    session_expires: {
+      type: DataTypes.INTEGER(11),
+      allowNull: true,
+    },
+    session_minse: {
+      type: DataTypes.INTEGER(11),
+      allowNull: true,
+    },
+    session_refresher: {
+      type: DataTypes.ENUM('uac', 'uas'),
+      allowNull: true,
+      defaultValue: 'uas'
+    },
+    t38pt_usertpsource: {
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    regexten: {
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    fromdomain: {
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    fromuser: {
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    qualify: {
+      type: DataTypes.ENUM('yes', 'no'),
+      allowNull: true,
+      defaultValue: 'yes'
+    },
+    keepalive: {
+      type: DataTypes.INTEGER(11),
+      allowNull: true,
+    },
+    defaultip: {
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    defaultuser: {
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    rtptimeout: { // Terminate call if 60 seconds of no RTP or RTCP activity on the audio channel  when we're not on hold.
+      type: DataTypes.INTEGER(11),
+      allowNull: true,
+    },
+    rtpholdtimeout: { // Terminate call if 300 seconds of no RTP or RTCP activity on the audio channel when we're on hold (must be > rtptimeout)
+      type: DataTypes.INTEGER(11),
+      allowNull: true,
+    },
+    rtpkeepalive: { // Send keepalives in the RTP stream to keep NAT open (default is off - zero)
+      type: DataTypes.INTEGER(11),
+      allowNull: true,
+    },
+    sendrpid: {
+      type: DataTypes.ENUM('yes', 'no'),
+      allowNull: true,
+      defaultValue: 'no'
+    },
+    outboundproxy: {
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    callbackextension: {
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    timert1: {
+      type: DataTypes.INTEGER(11),
+      allowNull: true,
+    },
+    timerb: {
+      type: DataTypes.INTEGER(11),
+      allowNull: true,
+    },
+    qualifyfreq: {
+      type: DataTypes.INTEGER(11),
+      allowNull: true,
+    },
+    contactpermit: {
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    contactdeny: {
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    contactacl: {
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    unsolicited_mailbox: {
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    use_q850_reason: {
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    maxforwards: {
+      type: DataTypes.INTEGER(11),
+      allowNull: true,
+    },
+    encryption: {
+      type: DataTypes.ENUM('yes', 'no'),
+      allowNull: true,
+      defaultValue: 'no'
+    },
+    avpf: {
+      type: DataTypes.ENUM('yes', 'no'),
+      allowNull: true
+    },
+    force_avp: {
+      type: DataTypes.ENUM('yes', 'no'),
+      allowNull: true
+    },
+    icesupport: {
+      type: DataTypes.ENUM('yes', 'no'),
+      allowNull: true
+    },
+    dtlsenable: {
+      type: DataTypes.ENUM('yes', 'no'),
+      allowNull: true
+    },
+    dtlsverify: {
+      type: DataTypes.ENUM('yes', 'no', 'fingerprint', 'certificate'),
+      allowNull: true
+    },
+    dtlsrekey: {
+      type: DataTypes.INTEGER(11),
+      allowNull: true,
+    },
+    dtlscertfile: {
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    dtlsprivatekey: {
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    dtlscipher: {
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    dtlscafile: {
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    dtlscapath: {
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    dtlssetup: {
+      type: DataTypes.ENUM('active', 'passive', 'actpass'),
+      allowNull: true
+    },
+    dtlsfingerprint: {
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    usereqphone: { //This provider requires ";user=phone" on URI
+      type: DataTypes.ENUM('yes', 'no'),
+      allowNull: true,
+      defaultValue: 'no'
+    },
+    recordonfeature: { //Feature to use when INFO with Record: on is received.
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    recordofffeature: { //Feature to use when INFO with Record: off is received.
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    call_limit: {
+      type: DataTypes.INTEGER(11),
+      allowNull: true,
+      defaultValue: 10
+    },
+    registertrying: { //Send a 100 Trying when the device registers.
+      type: DataTypes.ENUM('yes', 'no'),
+      allowNull: true,
+    },
+    subscribemwi: { //Only send notifications if this phone subscribes for mailbox notification
+      type: DataTypes.ENUM('yes', 'no'),
+      allowNull: true,
+    },
+    vmexten: { // dialplan extension to reach mailbox. defaults to global vmexten which defaults to "asterisk"
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    mohinterpret: { // This option specifies a preference for which music on hold class this channel should listen to when put on hold
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    mohsuggest: { //  This option specifies which music on hold class to suggest to the peer channel when this channel places the peer on hold.
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    parkinglot: {
+      type: DataTypes.STRING,
+      allowNull: true,
+    },
+    canreinvite: {
+      type: DataTypes.ENUM('yes', 'no', 'nonat', 'update', 'update,nonat'),
+      allowNull: true,
+      defaultValue: 'no'
+    },
+    loginInPause: {
+      type: DataTypes.BOOLEAN,
+      defaultValue: false
+    },
+    resetPasswordToken: {
+      type: DataTypes.STRING
+    },
+    resetPasswordExpires: {
+      type: DataTypes.DATE
+    },
+    phoneBarEnableRecording: {
+      type: DataTypes.BOOLEAN,
+      defaultValue: true
+    },
+    showWebBar: {
+      type: DataTypes.BOOLEAN,
+      defaultValue: false
+    },
+    phoneBarShowOmniDesktop: {
+      type: DataTypes.BOOLEAN,
+      defaultValue: true
+    },
+    phoneBarRingInUse: {
+      type: DataTypes.BOOLEAN,
+      defaultValue: false
+    },
+    phoneBarDnd: {
+      type: DataTypes.BOOLEAN,
+      defaultValue: true
+    },
+    phoneBarUnansweredCallBadge: {
+      type: DataTypes.BOOLEAN,
+      defaultValue: true
+    }
+  }, {
+    tableName: 'users',
+    charset: 'utf8',
+    collate: 'utf8_bin',
+    instanceMethods: {
+      /**
+       * Authenticate - check if the passwords are the same
+       *
+       * @param {String} plainText
+       *        {function} callBack
+       * @api public
+       */
+      authenticate: function(plainText) {
+        return this.encryptPassword(plainText) === this.password;
+      },
+      /**
+       * Make salt
+       *
+       * @return {String}
+       * @api public
+       */
+      makeSalt: function() {
+        return crypto.randomBytes(16).toString('base64');
+      },
+      /**
+       * Encrypt password
+       *
+       * @param {String} password
+       * @return {String}
+       * @api public
+       */
+      encryptPassword: function(password) {
+        if (!password || !this.salt) return '';
+        var salt = new Buffer(this.salt, 'base64');
+        return crypto.pbkdf2Sync(password, salt, 10000, 64).toString(
+          'base64');
+      },
+      /**
+       * md5 password
+       *
+       * @param {String} password
+       * @return {String}
+       * @api public
+       */
+      md5Password: function(password) {
+        if (!password) return '';
+        return md5(password);
+      }
+    },
+    associate: function(models) {
+      // BELOGNS TO MANY
+      User.hasMany(models.ChatMessage);
+      User.hasMany(models.MailMessage);
+      User.hasMany(models.Contact);
+      User.hasMany(models.Action);
+      User.belongsToMany(models.Module, {
+        through: models.UserHasModule,
+        required: false
+      });
+      User.belongsToMany(models.MailRoom, {
+        through: models.UserHasMailRoom,
+      });
+      User.belongsToMany(models.Channel, {
+        through: 'user_has_channels'
+      });
+      User.belongsToMany(models.SmsRoom, {
+        through: 'user_has_sms_rooms'
+      });
+      User.belongsToMany(models.OpenchannelRoom, {
+        through: 'user_has_openchannel_rooms'
+      });
+      User.belongsToMany(models.FaxRoom, {
+        through: 'user_has_fax_rooms'
+      });
+      User.belongsToMany(models.Team, {
+        through: models.UserHasTeam
+      });
+      User.belongsToMany(models.VoiceQueue, {
+        through: models.UserHasVoiceQueue,
+        required: false
+      });
+      User.belongsToMany(models.VoiceQueue, {
+        through: models.UserHasVoiceQueuePermit,
+        as: 'PVoiceQueues'
+      });
+      User.belongsToMany(models.MailQueue, {
+        through: models.UserHasMailQueue,
+        required: false
+      });
+      User.belongsToMany(models.SmsQueue, {
+        through: models.UserHasSmsQueue,
+        required: false
+      });
+      User.belongsToMany(models.SmsQueue, {
+        through: models.UserHasSmsQueuePermit,
+        as: 'PSmsQueues'
+      });
+      User.belongsToMany(models.OpenchannelQueue, {
+        through: models.UserHasOpenchannelQueue,
+        required: false
+      });
+      User.belongsToMany(models.OpenchannelQueue, {
+        through: models.UserHasOpenchannelQueuePermit,
+        as: 'POpenchannelQueues'
+      });
+      User.belongsToMany(models.MailQueue, {
+        through: models.UserHasMailQueuePermit,
+        as: 'PMailQueues'
+      });
+      User.belongsToMany(models.FaxQueue, {
+        through: models.UserHasFaxQueue,
+        required: false
+      });
+      User.belongsToMany(models.FaxQueue, {
+        through: models.UserHasFaxQueuePermit,
+        as: 'PFaxQueues'
+      });
+      User.belongsToMany(models.ChatQueue, {
+        through: models.UserHasChatQueue,
+        required: false
+      });
+      User.belongsToMany(models.ChatQueue, {
+        through: models.UserHasChatQueuePermit,
+        as: 'PChatQueues'
+      });
+      User.belongsToMany(models.ChatRoom, {
+        through: models.UserHasChatRoom
+      });
+      User.belongsToMany(models.List, {
+        through: models.UserHasList
+      });
+      User.hasMany(models.VoiceExtension, {
+        foreignKey: 'UserId',
+        as: 'UserExtensions',
+        onDelete: 'cascade',
+        hooks: true
+      });
+
+      // SCOPES MANAGEMENT
+      User.addScope('all', {
+        attributes: ['id',
+          'name',
+          'email',
+          'internal',
+          'fullname',
+          'role',
+          'online',
+          'userpic',
+          'accountcode',
+          'transport',
+          'host',
+          'role',
+          'nat',
+          'type',
+          'allow',
+          'lastLoginAt',
+          'ipaddr',
+          'fullcontact',
+          'port',
+          'lastms',
+          'description',
+          'callgroup',
+          'pickupgroup'
+        ]
+      });
+
+      // SCOPES MANAGEMENT
+      User.addScope('user', {
+        where: {
+          role: {
+            $in: ['admin', 'user']
+          },
+        },
+        attributes: ['id',
+          'name',
+          'email',
+          'internal',
+          'fullname',
+          'role',
+          'userpic',
+          'accountcode',
+          'transport',
+          'host',
+          'role',
+          'nat',
+          'type',
+          'allow',
+          'lastLoginAt',
+          'ipaddr',
+          'fullcontact',
+          'port',
+          'lastms',
+          'description',
+          'callgroup',
+          'pickupgroup'
+        ]
+      });
+      User.addScope('agent', {
+        where: {
+          role: 'agent'
+        },
+        attributes: ['id',
+          'name',
+          'email',
+          'internal',
+          'fullname',
+          'role',
+          'userpic',
+          'accountcode',
+          'transport',
+          'host',
+          'nat',
+          'type',
+          'allow',
+          'chatCapacity',
+          'mailCapacity',
+          'faxCapacity',
+          'smsCapacity',
+          'openchannelCapacity',
+          'online',
+          'lastLoginAt',
+          'phoneBarAutoAnswer',
+          'phoneBarEnableSettings',
+          'phoneBarUnconditional',
+          'phoneBarNoReply',
+          'phoneBarBusy',
+          'phoneBarUnconditionalNumber',
+          'phoneBarNoReplyNumber',
+          'phoneBarBusyNumber',
+          'phoneBarListenPort',
+          'phoneBarExpires',
+          'phoneBarRemoteControl',
+          'phoneBarRemoteControlPort',
+          'phoneBarEnableRecording',
+          'chanspy',
+          'voicePause',
+          'mailPause',
+          'faxPause',
+          'chatPause',
+          'smsPause',
+          'openchannelPause',
+          'pauseType',
+          'lastPauseAt',
+          'status',
+          'statusAt',
+          'queueStatus',
+          'queueStatusAt',
+          'lastQueue',
+          'useragent',
+          'ipaddr',
+          'fullcontact',
+          'port',
+          'lastms',
+          'description',
+          'loginInPause',
+          'showWebBar',
+          'callgroup',
+          'pickupgroup',
+          'phoneBarShowOmniDesktop',
+          'phoneBarRingInUse',
+          'phoneBarDnd',
+          'phoneBarUnansweredCallBadge',
+          'phone',
+          'mobile'
+        ]
+      });
+      User.addScope('telephone', {
+        where: {
+          role: 'telephone'
+        }
+      });
+      User.addScope('queues', {
+        include: [{
+          model: models.VoiceQueue,
+          required: false
+        }, {
+          model: models.ChatQueue,
+          required: false
+        }, {
+          model: models.MailQueue,
+          required: false
+        }, {
+          model: models.FaxQueue,
+          required: false
+        }, {
+          model: models.SmsQueue,
+          required: false
+        }, {
+          model: models.OpenchannelQueue,
+          required: false
+        }]
+      });
+
+      User.addScope('checkPauseStatus', function(query) {
+        var scope = {
+          where: {}
+        };
+        if (query.voicePause) {
+          scope.where.voicePause = (query.voicePause === 'true') ?
+            true : false;
+          delete query.voicePause;
+        } else if (query.faxPause) {
+          scope.where.faxPause = (query.faxPause === 'true') ? true :
+            false;
+          delete query.faxPause;
+        } else if (query.chatPause) {
+          scope.where.chatPause = (query.chatPause === 'true') ?
+            true : false;
+          delete query.chatPause;
+        } else if (query.mailPause) {
+          scope.where.mailPause = (query.mailPause === 'true') ?
+            true : false;
+          delete query.mailPause;
+        } else if (query.smsPause) {
+          scope.where.smsPause = (query.smsPause === 'true') ?
+            true : false;
+          delete query.smsPause;
+        } else if (query.openchannelPause) {
+          scope.where.openchannelPause = (query.openchannelPause === 'true') ?
+            true : false;
+          delete query.openchannelPause;
+        }
+        return scope;
+      });
+      User.addScope('checkOnlineStatus', function(query) {
+        var scope = {
+          where: {}
+        };
+        if (query.online) {
+          scope.where.online = (query.online === 'true') ? true :
+            false;
+          delete query.online;
+        }
+        return scope;
+      });
+      User.addScope('checkSipStatus', function(query) {
+        var scope = {
+          where: {}
+        };
+        if (query.status) {
+          scope.where.status = query.status;
+          delete query.status;
+        }
+        return scope;
+      });
+      User.addScope('checkQueueStatus', function(query) { //to be executed before checkOnlineStatus
+        var scope = {
+          where: {}
+        };
+        if (query.queueStatus) {
+          if (query.queueStatus === 'paused') {
+            scope.where.voicePause = true;
+          } else {
+            scope.where.queueStatus = query.queueStatus;
+            scope.where.voicePause = false;
+            query.online = 'true';
+          }
+          delete query.queueStatus;
+        }
+        return scope;
+      });
+
+      User.addScope('me', function(userId) {
+        var scope = {
+          where: {
+            id: userId
+          },
+          attributes: ['id', 'fullname', 'name', 'email', 'role', 'userpic', 'lastLoginAt', 'voicePause',
+            'mailPause',
+            'chatPause',
+            'faxPause',
+            'smsPause',
+            'openchannelPause',
+            'lastPauseAt',
+            'pauseType',
+            'phoneBarRemoteControl',
+            'phoneBarRemoteControlPort',
+            'loginInPause',
+            'showWebBar'
+          ],
+          include: [{
+            model: models.Module,
+            include: [{
+              model: models.Module,
+              as: 'SubModules',
+              required: false,
+              include: [{
+                all: true
+              }]
+            }]
+          }, {
+            model: models.VoiceQueue,
+            as: 'PVoiceQueues'
+          }, {
+            model: models.ChatQueue,
+            as: 'PChatQueues'
+          }, {
+            model: models.MailQueue,
+            as: 'PMailQueues'
+          }, {
+            model: models.FaxQueue,
+            as: 'PFaxQueues'
+          }, {
+            model: models.SmsQueue,
+            as: 'PSmsQueues'
+          }]
+        };
+        return scope;
+      });
+    }
+  });
+
+  return User;
+}