diff --git a/Jenkinsfile b/Jenkinsfile index 06f77ffed..62248b0fe 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -43,7 +43,7 @@ node stage ("Stopping/Removing Docker") { - sh "docker-compose down --rmi all" + sh "docker-compose down --rmi 'all'" } stage ("Generar dockers") diff --git a/client/auth/src/login/login.js b/client/auth/src/login/login.js index 229c1a345..22783f9ab 100644 --- a/client/auth/src/login/login.js +++ b/client/auth/src/login/login.js @@ -48,7 +48,6 @@ export default class Controller { onLoginErr(json) { this.loading = false; this.password = ''; - this.focusUser(); let message; @@ -64,6 +63,7 @@ export default class Controller { } this.showMessage(message); + this.focusUser(); } focusUser() { this.$.userField.select(); diff --git a/client/core/src/lib/app.js b/client/core/src/lib/app.js index dd6ef1f09..3b58309b4 100644 --- a/client/core/src/lib/app.js +++ b/client/core/src/lib/app.js @@ -7,6 +7,10 @@ import {module} from '../module'; * @property {Snackbar} snackbar The main object to show messages. */ export default class App { + constructor($rootScope) { + this.loaderStatus = 0; + this.$rootScope = $rootScope; + } show(message) { if (this.snackbar) this.snackbar.show({message: message}); } @@ -16,5 +20,17 @@ export default class App { showError(message) { this.show(`Error: ${message}`); } + pushLoader() { + this.loaderStatus++; + if (this.loaderStatus === 1) + this.$rootScope.loading = true; + } + popLoader() { + this.loaderStatus--; + if (this.loaderStatus === 0) + this.$rootScope.loading = false; + } } +App.$inject = ['$rootScope']; + module.service('vnApp', App); diff --git a/client/core/src/lib/input.js b/client/core/src/lib/input.js new file mode 100644 index 000000000..8db191c33 --- /dev/null +++ b/client/core/src/lib/input.js @@ -0,0 +1,13 @@ +import Component from './component'; + +/** + * Component that host an input. + */ +export default class Input extends Component { + select() { + this.input.select(); + } + focus() { + this.input.focus(); + } +} diff --git a/client/core/src/lib/interceptor.js b/client/core/src/lib/interceptor.js index 9cd97d78a..6d9266018 100644 --- a/client/core/src/lib/interceptor.js +++ b/client/core/src/lib/interceptor.js @@ -1,11 +1,10 @@ import {module} from '../module'; -interceptor.$inject = ['$q', '$rootScope', '$window', 'vnApp', '$translate', '$cookies']; -function interceptor($q, $rootScope, $window, vnApp, $translate, $cookies) { - $rootScope.loading = false; +interceptor.$inject = ['$q', '$window', 'vnApp', '$translate', '$cookies']; +function interceptor($q, $window, vnApp, $translate, $cookies) { return { request: function(config) { - $rootScope.loading = true; + vnApp.pushLoader(); let token = $cookies.get('vnToken'); if (token) @@ -23,11 +22,11 @@ function interceptor($q, $rootScope, $window, vnApp, $translate, $cookies) { case 'PATCH': vnApp.showMessage($translate.instant('Data saved!')); } - $rootScope.loading = false; + vnApp.popLoader(); return response; }, responseError: function(rejection) { - $rootScope.loading = false; + vnApp.popLoader(); let data = rejection.data; let error; diff --git a/client/core/src/textfield/textfield.html b/client/core/src/textfield/textfield.html index 3b8f24e1e..b2dc608f5 100644 --- a/client/core/src/textfield/textfield.html +++ b/client/core/src/textfield/textfield.html @@ -4,8 +4,7 @@ ng-focus="$ctrl.hasFocus = true" ng-blur="$ctrl.hasFocus = false" ng-mouseenter="$ctrl.hasMouseIn = true" - ng-mouseleave="$ctrl.hasMouseIn = false" -> + ng-mouseleave="$ctrl.hasMouseIn = false"> + ng-readonly="$ctrl.readonly"/>
- info_outline - clear + + info_outline + + + clear +
diff --git a/client/core/src/textfield/textfield.js b/client/core/src/textfield/textfield.js index 09d65ab9d..c6ca4cb1e 100644 --- a/client/core/src/textfield/textfield.js +++ b/client/core/src/textfield/textfield.js @@ -1,9 +1,8 @@ import {module} from '../module'; -import Component from '../lib/component'; -import * as normalizerFactory from '../lib/inputAttrsNormalizer'; +import Input from '../lib/input'; import './style.scss'; -export default class TextfieldController extends Component { +export default class Textfield extends Input { constructor($element, $scope, $attrs, $timeout, normalizer) { super($element); @@ -15,45 +14,39 @@ export default class TextfieldController extends Component { this.$timeout = $timeout; this._value = null; - this.type = this.$attrs.type || 'text'; + this.type = $attrs.type || 'text'; this.showActions = false; this.input = $element[0].querySelector('input'); - this.focus = false; - this.hasInfo = Boolean(this.$attrs.info); - this.info = this.$attrs.info || null; + this.hasInfo = Boolean($attrs.info); + this.info = $attrs.info || null; this.hasFocus = false; this.hasMouseIn = false; componentHandler.upgradeElement($element[0].firstChild); } - get value() { return this._value; } - set value(value) { this._value = (value === undefined || value === '') ? null : value; this.input.value = this._value; this.hasValue = Boolean(this._value); this.mdlUpdate(); } - mdlUpdate() { let mdlField = this.$element[0].firstChild.MaterialTextfield; if (mdlField) mdlField.updateClasses_(); } - clear() { this.value = null; this.input.focus(); } } - -TextfieldController.$inject = ['$element', '$scope', '$attrs', '$timeout', normalizerFactory.NAME]; +Textfield.$inject = ['$element', '$scope', '$attrs', '$timeout', 'vnInputAttrsNormalizer']; module.component('vnTextfield', { template: require('./textfield.html'), - controller: TextfieldController, + controller: Textfield, bindings: { value: '=model', label: '@?', diff --git a/services/auth/server/server.js b/services/auth/server/server.js index c87c400dc..2819f5729 100644 --- a/services/auth/server/server.js +++ b/services/auth/server/server.js @@ -3,7 +3,4 @@ var vnLoopback = require('../../loopback/server/server.js'); var app = module.exports = vnLoopback.loopback(); app.set('applications', require('./application.json')); -vnLoopback.boot(app, __dirname); -if (require.main === module) { - app.start(); -} +vnLoopback.boot(app, __dirname, module); diff --git a/services/client/common/models/client-observation.js b/services/client/common/models/client-observation.js index 39470f4c7..cd1cba2a8 100644 --- a/services/client/common/models/client-observation.js +++ b/services/client/common/models/client-observation.js @@ -11,7 +11,7 @@ module.exports = function(Self) { let app = require('../../server/server'); let Employee = app.models.Employee; Employee.findOne({where: {userFk: userId}}, function (err, user){ - if (user){ + if (user) { ctx.instance.employeeFk = user.id; next(); } diff --git a/services/client/common/models/client.js b/services/client/common/models/client.js index 321e4f055..0340042d3 100644 --- a/services/client/common/models/client.js +++ b/services/client/common/models/client.js @@ -40,7 +40,7 @@ module.exports = function(Self) { message: 'Correo electrónico inválido', allowNull: true, allowBlank: true, - with: /^[\w|\.|\-]+@\w[\w|\.|\-]*\w(,[\w|\.|\-]+@\w[\w|\.|\-]*\w)*$/ + with: /^[\w|.|-]+@\w[\w|.|-]*\w(,[\w|.|-]+@\w[\w|.|-]*\w)*$/ }); Self.validatesLengthOf('postcode', { allowNull: true, @@ -53,6 +53,11 @@ module.exports = function(Self) { message: 'El iban no tiene el formato correcto' }); + let validateDni = require('../validations/validateDni'); + Self.validateBinded('fi', validateDni, { + message: 'DNI Incorrecto' + }); + Self.validate('payMethod', hasSalesMan, { message: 'No se puede cambiar la forma de pago si no hay comercial asignado' }); diff --git a/services/client/common/validations/validateDni.js b/services/client/common/validations/validateDni.js new file mode 100644 index 000000000..ab9008605 --- /dev/null +++ b/services/client/common/validations/validateDni.js @@ -0,0 +1,94 @@ +module.exports = fi => { + let dni = fi; + let getLetterDni = dni => { + const regExpDni = 'TRWAGMYFPDXBNJZSQVHLCKE'; + const letterDni = dni.toUpperCase().substring(0, 1); + let positionLetter = parseInt(dni) % 23; + let getLetter = regExpDni.substring(positionLetter + 1, positionLetter); + switch (letterDni) { + case 'X': case 'Y': case 'Z': + positionLetter = parseInt(dni.replace(letterDni, letterDni.charCodeAt(0) - 88)) % 23; + getLetter = regExpDni.substring(positionLetter + 1, positionLetter); + console.log(letterDni.charCodeAt(0)); + } + return getLetter; + }; + + let getDniSpain = (dniNumeric, dniLetter) => { + let returnValue = false; + switch (dni.length) { + case 9: + if (dniLetter === getLetterDni(dni)) + returnValue = true; + } + return returnValue; + }; + + let getDniForeign = (dniNumeric, dniLetter) => { + let returnValue = false; + switch (dni.length) { + case 9: + if (dniLetter === getLetterDni(dni)) + returnValue = true; + } + return returnValue; + }; + + let getDniBusiness = () => { + if (dni.length == 9) + return true; + return false; + }; + + let getDniFrance = dniLetterCountry => { + let returnValue = false; + switch (dni.length) { + case 13: + if (dniLetter === 'R') + returnValue = true; + } + return returnValue; + }; + + let getDniItaly = dniLetterCountry => { + let returnValue = false; + switch (dni.length) { + case 13: + if (dniLetter === 'T') + returnValue = true; + } + return returnValue; + }; + + let getDni = () => { + const dniNumeric = dni.substring(0, 8); + const dniLetter = dni.substring(8, 9); + const dniLetterCountry = dni.substring(0, 1); + const dniLetterAscii = parseInt(dniLetterCountry.charCodeAt(0)); + let dniValue = false; + switch (true) { + case (dniLetterAscii >= 88 && dniLetterAscii <= 90): // X-Z + dniValue = getDniForeign(dniNumeric, dniLetter); + break; + case (dniLetterAscii === 66): // B + dniValue = getDniBusiness(); + break; + case (dniLetterAscii === 70): // F + dniValue = getDniFrance(dniLetterCountry); + break; + case (dniLetterAscii === 73): // I + dniValue = getDniItaly(dniLetterCountry); + break; + case (dniLetterAscii >= 48 && dniLetterAscii <= 57): // 0- 9 + console.log('dni spain'); + dniValue = getDniSpain(dniNumeric, dniLetter); + break; + default: + console.log('default'); + dniValue = true; + } + return dniValue; + }; + + return getDni(); +}; diff --git a/services/client/package.json b/services/client/package.json index e37c7ab5a..d6a815f19 100644 --- a/services/client/package.json +++ b/services/client/package.json @@ -13,7 +13,6 @@ "url": "https://git.verdnatura.es/salix" }, "dependencies": { - "loopback-context": "^3.3.0", "request": "^2.83.0" } } diff --git a/services/client/server/server.js b/services/client/server/server.js index eda31589d..030bbc1b4 100644 --- a/services/client/server/server.js +++ b/services/client/server/server.js @@ -2,7 +2,4 @@ var vnLoopback = require('../../loopback/server/server.js'); var app = module.exports = vnLoopback.loopback(); -vnLoopback.boot(app, __dirname); -if (require.main === module) { - app.start(); -} +vnLoopback.boot(app, __dirname, module); diff --git a/services/loopback/server/middleware/cors.js b/services/loopback/server/middleware/cors.js index 797775e77..73c0d6832 100644 --- a/services/loopback/server/middleware/cors.js +++ b/services/loopback/server/middleware/cors.js @@ -1,13 +1,5 @@ var cors = require('cors'); -var whitelist = ['http://localhost:8080']; -var corsOptions = { - origin: function(origin, callback) { - var originIsWhitelisted = whitelist.indexOf(origin) !== -1; - callback(originIsWhitelisted ? null : 'Bad Request', originIsWhitelisted); - } -}; - module.exports = function() { return cors({origin: true}); }; diff --git a/services/loopback/server/server.js b/services/loopback/server/server.js index 431ca8775..752395504 100644 --- a/services/loopback/server/server.js +++ b/services/loopback/server/server.js @@ -10,7 +10,7 @@ module.exports = { boot: vnBoot }; -function vnBoot(app, rootDir, cb) { +function vnBoot(app, rootDir, rootModule) { // Internationalization let i18nDir = rootDir + '/i18n'; @@ -22,7 +22,7 @@ function vnBoot(app, rootDir, cb) { }); app.get('/prueba', function(req, res) { - i18n.setLocale(req.get('Accept-Language').substring(0,2)); + i18n.setLocale(req.get('Accept-Language').substring(0, 2)); res.send(i18n.__('Hello')); }); } @@ -63,31 +63,28 @@ function vnBoot(app, rootDir, cb) { modelSources: [ "loopback/common/models", "loopback/server/models", - __dirname + "/../common/models", - __dirname + "/models", + path.join(__dirname, "../common/models"), + path.join(__dirname, "models"), rootDir + "/../common/models", rootDir + "/models" ], mixinDirs: [ "loopback/common/mixins", "loopback/server/mixins", - __dirname + "/../common/mixins", - __dirname + "/mixins", + path.join(__dirname, "../common/mixins"), + path.join(__dirname, "mixins"), rootDir + "/../common/mixins", rootDir + "/mixins" ], bootDirs: [ - __dirname + "/boot", + path.join(__dirname, "boot"), rootDir + "/boot" ] }; boot(app, bootOptions, function(err) { if (err) throw err; - if (require.main === module) { + if (require.main === rootModule) app.start(); - } - if (cb) - cb(app); }); } diff --git a/services/production/server/server.js b/services/production/server/server.js index bc4b454c4..f0493dcd9 100644 --- a/services/production/server/server.js +++ b/services/production/server/server.js @@ -1,7 +1,4 @@ var vnLoopback = require('../../loopback/server/server.js'); var app = module.exports = vnLoopback.loopback(); -vnLoopback.boot(app, __dirname); -if (require.main === module) { - app.start(); -} +vnLoopback.boot(app, __dirname, module); diff --git a/services/route/server/server.js b/services/route/server/server.js index eda31589d..030bbc1b4 100644 --- a/services/route/server/server.js +++ b/services/route/server/server.js @@ -2,7 +2,4 @@ var vnLoopback = require('../../loopback/server/server.js'); var app = module.exports = vnLoopback.loopback(); -vnLoopback.boot(app, __dirname); -if (require.main === module) { - app.start(); -} +vnLoopback.boot(app, __dirname, module); diff --git a/services/salix/server/server.js b/services/salix/server/server.js index 4c7743f0d..0fa36395b 100644 --- a/services/salix/server/server.js +++ b/services/salix/server/server.js @@ -10,8 +10,4 @@ app.set('url auth', '/auth'); app.use(cookieParser()); -vnLoopback.boot(app, __dirname); - -if (require.main === module) { - app.start(); -} +vnLoopback.boot(app, __dirname, module);