From f94b35176e09511d3d53c1ec349db1ef268da662 Mon Sep 17 00:00:00 2001 From: Juan Ferrer Toribio Date: Thu, 17 Jan 2019 12:06:40 +0100 Subject: [PATCH 01/37] Disable concurrent builds in Jenkinsfile --- Jenkinsfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Jenkinsfile b/Jenkinsfile index a5ad595d76..72988ce922 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -2,6 +2,9 @@ pipeline { agent any + options { + disableConcurrentBuilds() + } environment { REGISTRY = 'registry.verdnatura.es' DOCKER_HOST_1 = 'tcp://vch1.verdnatura.es:2376' From 2011e56a6a259b446fadb4d47386026e8ad162e5 Mon Sep 17 00:00:00 2001 From: Carlos Jimenez Ruiz Date: Mon, 21 Jan 2019 17:01:01 +0100 Subject: [PATCH 02/37] #982 Preparar tests para que puedan ser lanzados desde el servidor --- README.md | 2 +- gulpfile.js | 30 ++++++++++++---- package-lock.json | 92 +++++++++++++++++++++++++++-------------------- package.json | 1 + 4 files changed, 79 insertions(+), 46 deletions(-) diff --git a/README.md b/README.md index 1381289d08..ab7cf3f36c 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ $ karma start For server-side unit tests run from project's root. ``` -$ npm run test +$ gulp backTest ``` For end-to-end tests run from project's root. diff --git a/gulpfile.js b/gulpfile.js index dc2adf5a9c..8337c451eb 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -59,7 +59,9 @@ function backOnly(done) { } backOnly.description = `Starts backend service`; -function backTestsOnly() { +// backend tests + +function backTestOnly() { serviceRoot = 'vn-loopback'; let app = require(`./loopback/server/server`); @@ -71,16 +73,30 @@ function backTestsOnly() { specFiles.push(`./modules/${mod}/back/**/*.spec.js`); const jasmine = require('gulp-jasmine'); + const reporters = require('jasmine-reporters'); + let options = {errorOnFail: false}; + + if (argv.junit || argv.j) + options.reporter = new reporters.JUnitXmlReporter(); + return gulp.src(specFiles) - .pipe(jasmine({errorOnFail: false})) + .pipe(jasmine(options)) .on('jasmineDone', function() { app.disconnect(); }); } -backTestsOnly.description = `Runs the backend tests only`; +backTestOnly.description = `Runs the backend tests only, can receive args --junit or -j to save reports on a xml file`; -const backTests = gulp.series(docker, backTestsOnly); -backTests.description = `Restarts database and runs the backend tests`; +const backendTest = gulp.series(docker, backTestOnly); +backendTest.description = `Restarts database and runs the backend tests`; + +const backTest = gulp.parallel(backendTest, done => { + gulp.watch('modules', gulp.series(backendTest)); + done(); +}); +backTest.description = `Watches for changes in modules to execute backendTest task`; + +// end to end tests function e2eOnly() { const jasmine = require('gulp-jasmine'); @@ -467,8 +483,8 @@ module.exports = { front, back, backOnly, - backTestsOnly, - backTests, + backTestOnly, + backTest, e2eOnly, e2e, smokesOnly, diff --git a/package-lock.json b/package-lock.json index 467dfffe84..187a9bd6de 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2255,7 +2255,7 @@ }, "browserify-rsa": { "version": "4.0.1", - "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { @@ -2305,7 +2305,7 @@ }, "buffer": { "version": "4.9.1", - "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "dev": true, "requires": { @@ -2524,7 +2524,7 @@ }, "camelcase-keys": { "version": "2.1.0", - "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { @@ -3001,7 +3001,7 @@ }, "colors": { "version": "1.1.2", - "resolved": "http://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", "dev": true }, @@ -3194,7 +3194,7 @@ }, "content-disposition": { "version": "0.5.2", - "resolved": "http://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" }, "content-security-policy-builder": { @@ -3395,7 +3395,7 @@ }, "css-loader": { "version": "0.25.0", - "resolved": "http://registry.npmjs.org/css-loader/-/css-loader-0.25.0.tgz", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.25.0.tgz", "integrity": "sha1-w/68jOKPTINXa2sTcH9H+Qw5AiM=", "dev": true, "requires": { @@ -4019,7 +4019,7 @@ "dot-prop": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha1-HxngwuGqDjJ5fEl5nyg3rGr2nFc=", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", "dev": true, "requires": { "is-obj": "^1.0.0" @@ -4052,7 +4052,7 @@ }, "readable-stream": { "version": "1.1.14", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, "requires": { @@ -4192,7 +4192,7 @@ }, "jsonfile": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "resolved": "http://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", "dev": true, "requires": { @@ -4721,7 +4721,7 @@ }, "events": { "version": "1.1.1", - "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", "dev": true }, @@ -5444,7 +5444,7 @@ }, "fs-access": { "version": "1.0.1", - "resolved": "http://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", "dev": true, "requires": { @@ -6267,7 +6267,7 @@ }, "globby": { "version": "5.0.0", - "resolved": "http://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", "dev": true, "requires": { @@ -6312,7 +6312,7 @@ }, "got": { "version": "6.7.1", - "resolved": "http://registry.npmjs.org/got/-/got-6.7.1.tgz", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "dev": true, "requires": { @@ -7491,7 +7491,7 @@ }, "is-builtin-module": { "version": "1.0.0", - "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { @@ -7638,7 +7638,7 @@ }, "is-obj": { "version": "1.0.1", - "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, @@ -7859,6 +7859,16 @@ "integrity": "sha1-5kAN8ea1bhMLYcS80JPap/boyhU=", "dev": true }, + "jasmine-reporters": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/jasmine-reporters/-/jasmine-reporters-2.3.2.tgz", + "integrity": "sha512-u/7AT9SkuZsUfFBLLzbErohTGNsEUCKaQbsVYnLFW1gEuL2DzmBL4n8v90uZsqIqlWvWUgian8J6yOt5Fyk/+A==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1", + "xmldom": "^0.1.22" + } + }, "jasmine-spec-reporter": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz", @@ -8150,7 +8160,7 @@ "karma-chrome-launcher": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", - "integrity": "sha1-zxudBxNswY/iOTJ9JGVMPbw2is8=", + "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", "dev": true, "requires": { "fs-access": "^1.0.0", @@ -8328,7 +8338,7 @@ }, "load-json-file": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { @@ -9836,7 +9846,7 @@ }, "media-typer": { "version": "0.3.0", - "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, "mem": { @@ -9859,7 +9869,7 @@ }, "meow": { "version": "3.7.0", - "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "requires": { @@ -10075,7 +10085,7 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { "minimist": "0.0.8" @@ -10083,7 +10093,7 @@ "dependencies": { "minimist": { "version": "0.0.8", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" } } @@ -10235,7 +10245,7 @@ }, "multipipe": { "version": "0.1.2", - "resolved": "http://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", "dev": true, "requires": { @@ -10461,7 +10471,7 @@ "dependencies": { "jsesc": { "version": "0.5.0", - "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", "dev": true } @@ -11416,7 +11426,7 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, @@ -11432,7 +11442,7 @@ }, "os-tmpdir": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, @@ -11620,7 +11630,7 @@ }, "path-browserify": { "version": "0.0.0", - "resolved": "http://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", "dev": true }, @@ -12371,7 +12381,7 @@ }, "pretty-bytes": { "version": "1.0.4", - "resolved": "http://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", "dev": true, "requires": { @@ -12460,7 +12470,7 @@ }, "through2": { "version": "0.2.3", - "resolved": "http://registry.npmjs.org/through2/-/through2-0.2.3.tgz", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz", "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=", "dev": true, "requires": { @@ -12999,7 +13009,7 @@ "dependencies": { "jsesc": { "version": "0.5.0", - "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", "dev": true } @@ -14261,7 +14271,7 @@ "split2": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", - "integrity": "sha1-GGsldbz4PoW30YRldWI47k7kJJM=", + "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", "dev": true, "requires": { "through2": "^2.0.2" @@ -14363,7 +14373,7 @@ }, "stream-browserify": { "version": "2.0.1", - "resolved": "http://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", "dev": true, "requires": { @@ -14534,7 +14544,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -14940,7 +14950,7 @@ }, "tar": { "version": "2.2.1", - "resolved": "http://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", "dev": true, "requires": { @@ -15110,7 +15120,7 @@ }, "through": { "version": "2.3.8", - "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "through2": { @@ -15293,7 +15303,7 @@ "touch": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha1-/jZfX3XsntTlaCXgu3bSSrdK+Ds=", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", "dev": true, "requires": { "nopt": "~1.0.10" @@ -15382,7 +15392,7 @@ }, "tty-browserify": { "version": "0.0.0", - "resolved": "http://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, @@ -16026,7 +16036,7 @@ }, "vm-browserify": { "version": "0.0.4", - "resolved": "http://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", "dev": true, "requires": { @@ -16915,7 +16925,7 @@ "write-file-atomic": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha1-H/YVdcLipOjlENb6TiQ8zhg5mas=", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", "dev": true, "requires": { "graceful-fs": "^4.1.11", @@ -16964,6 +16974,12 @@ "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-1.0.2.tgz", "integrity": "sha1-+mv3YqYKQT+z3Y9LA8WyaSONMI8=" }, + "xmldom": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", + "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=", + "dev": true + }, "xmlhttprequest-ssl": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", diff --git a/package.json b/package.json index 4db2d3e197..ef11157b1a 100644 --- a/package.json +++ b/package.json @@ -55,6 +55,7 @@ "html-webpack-plugin": "^4.0.0-beta.5", "http-proxy-middleware": "^0.19.1", "jasmine": "^2.99.0", + "jasmine-reporters": "^2.3.2", "jasmine-spec-reporter": "^4.2.1", "json-loader": "^0.5.7", "karma": "^3.1.4", From 4e83172dae67bc2172067abd8501d90ba6b4b57c Mon Sep 17 00:00:00 2001 From: Joan Sanchez Date: Tue, 22 Jan 2019 09:55:35 +0100 Subject: [PATCH 03/37] added print service part 1 #1001 --- loopback/server/boot/print.js | 3 + modules/client/front/billing-data/index.js | 2 +- services/print/config/print.json | 28 ++++ services/print/config/routes.json | 11 ++ services/print/lib/config.js | 31 ++++ services/print/lib/database.js | 9 ++ services/print/lib/emailEngine.js | 144 ++++++++++++++++++ services/print/lib/errorHandler.js | 21 +++ .../print/lib/exceptions/userException.js | 12 ++ services/print/lib/mixins/text.js | 7 + services/print/lib/reportEngine.js | 95 ++++++++++++ services/print/lib/router.js | 66 ++++++++ services/print/lib/smtp.js | 22 +++ services/print/package.json | 26 ++++ .../client-welcome/assets/css/style.css | 42 +++++ .../print/reports/client-welcome/index.html | 68 +++++++++ .../print/reports/client-welcome/index.js | 46 ++++++ .../print/reports/client-welcome/locale.js | 55 +++++++ .../delivery-note/assets/css/style.css | 3 + .../print/reports/delivery-note/index.html | 4 + services/print/reports/delivery-note/index.js | 36 +++++ .../print/reports/delivery-note/locale.js | 8 + .../reports/email-footer/assets/css/style.css | 62 ++++++++ .../email-footer/assets/images/action.png | Bin 0 -> 3225 bytes .../email-footer/assets/images/facebook.png | Bin 0 -> 3586 bytes .../email-footer/assets/images/info.png | Bin 0 -> 3045 bytes .../email-footer/assets/images/instagram.png | Bin 0 -> 3719 bytes .../email-footer/assets/images/linkedin.png | Bin 0 -> 3588 bytes .../email-footer/assets/images/pinterest.png | Bin 0 -> 3807 bytes .../email-footer/assets/images/twitter.png | Bin 0 -> 3646 bytes .../email-footer/assets/images/youtube.png | Bin 0 -> 3513 bytes .../print/reports/email-footer/index.html | 49 ++++++ services/print/reports/email-footer/index.js | 28 ++++ services/print/reports/email-footer/locale.js | 20 +++ .../reports/email-header/assets/css/style.css | 12 ++ .../email-header/assets/images/logo.png | Bin 0 -> 30712 bytes .../print/reports/email-header/index.html | 5 + services/print/reports/email-header/index.js | 22 +++ services/print/reports/email-header/locale.js | 5 + .../letter-debtor-nd/assets/css/style.css | 42 +++++ .../letter-debtor-nd/assets/files/model.ezp | Bin 0 -> 9845 bytes .../letter-debtor-nd/assets/files/model2.ezp | Bin 0 -> 9845 bytes .../print/reports/letter-debtor-nd/index.html | 59 +++++++ .../print/reports/letter-debtor-nd/index.js | 56 +++++++ .../print/reports/letter-debtor-nd/locale.js | 37 +++++ .../letter-debtor-st/assets/css/style.css | 42 +++++ .../letter-debtor-st/assets/files/model.ezp | Bin 0 -> 9845 bytes .../letter-debtor-st/assets/files/model2.ezp | Bin 0 -> 9845 bytes .../print/reports/letter-debtor-st/index.html | 42 +++++ .../print/reports/letter-debtor-st/index.js | 61 ++++++++ .../print/reports/letter-debtor-st/locale.js | 27 ++++ .../payment-update/assets/css/style.css | 42 +++++ .../print/reports/payment-update/index.html | 45 ++++++ .../print/reports/payment-update/index.js | 49 ++++++ .../print/reports/payment-update/locale.js | 49 ++++++ .../printer-setup/assets/css/style.css | 42 +++++ .../printer-setup/assets/files/model.ezp | Bin 0 -> 9845 bytes .../print/reports/printer-setup/index.html | 56 +++++++ services/print/reports/printer-setup/index.js | 51 +++++++ .../print/reports/printer-setup/locale.js | 54 +++++++ services/print/server.js | 18 +++ 61 files changed, 1713 insertions(+), 1 deletion(-) create mode 100644 loopback/server/boot/print.js create mode 100755 services/print/config/print.json create mode 100644 services/print/config/routes.json create mode 100644 services/print/lib/config.js create mode 100644 services/print/lib/database.js create mode 100644 services/print/lib/emailEngine.js create mode 100644 services/print/lib/errorHandler.js create mode 100644 services/print/lib/exceptions/userException.js create mode 100755 services/print/lib/mixins/text.js create mode 100644 services/print/lib/reportEngine.js create mode 100644 services/print/lib/router.js create mode 100644 services/print/lib/smtp.js create mode 100755 services/print/package.json create mode 100644 services/print/reports/client-welcome/assets/css/style.css create mode 100644 services/print/reports/client-welcome/index.html create mode 100755 services/print/reports/client-welcome/index.js create mode 100644 services/print/reports/client-welcome/locale.js create mode 100644 services/print/reports/delivery-note/assets/css/style.css create mode 100644 services/print/reports/delivery-note/index.html create mode 100755 services/print/reports/delivery-note/index.js create mode 100644 services/print/reports/delivery-note/locale.js create mode 100644 services/print/reports/email-footer/assets/css/style.css create mode 100644 services/print/reports/email-footer/assets/images/action.png create mode 100644 services/print/reports/email-footer/assets/images/facebook.png create mode 100644 services/print/reports/email-footer/assets/images/info.png create mode 100644 services/print/reports/email-footer/assets/images/instagram.png create mode 100644 services/print/reports/email-footer/assets/images/linkedin.png create mode 100644 services/print/reports/email-footer/assets/images/pinterest.png create mode 100644 services/print/reports/email-footer/assets/images/twitter.png create mode 100644 services/print/reports/email-footer/assets/images/youtube.png create mode 100644 services/print/reports/email-footer/index.html create mode 100755 services/print/reports/email-footer/index.js create mode 100644 services/print/reports/email-footer/locale.js create mode 100644 services/print/reports/email-header/assets/css/style.css create mode 100644 services/print/reports/email-header/assets/images/logo.png create mode 100644 services/print/reports/email-header/index.html create mode 100755 services/print/reports/email-header/index.js create mode 100644 services/print/reports/email-header/locale.js create mode 100644 services/print/reports/letter-debtor-nd/assets/css/style.css create mode 100755 services/print/reports/letter-debtor-nd/assets/files/model.ezp create mode 100755 services/print/reports/letter-debtor-nd/assets/files/model2.ezp create mode 100644 services/print/reports/letter-debtor-nd/index.html create mode 100755 services/print/reports/letter-debtor-nd/index.js create mode 100644 services/print/reports/letter-debtor-nd/locale.js create mode 100644 services/print/reports/letter-debtor-st/assets/css/style.css create mode 100755 services/print/reports/letter-debtor-st/assets/files/model.ezp create mode 100755 services/print/reports/letter-debtor-st/assets/files/model2.ezp create mode 100644 services/print/reports/letter-debtor-st/index.html create mode 100755 services/print/reports/letter-debtor-st/index.js create mode 100644 services/print/reports/letter-debtor-st/locale.js create mode 100644 services/print/reports/payment-update/assets/css/style.css create mode 100644 services/print/reports/payment-update/index.html create mode 100755 services/print/reports/payment-update/index.js create mode 100644 services/print/reports/payment-update/locale.js create mode 100644 services/print/reports/printer-setup/assets/css/style.css create mode 100755 services/print/reports/printer-setup/assets/files/model.ezp create mode 100644 services/print/reports/printer-setup/index.html create mode 100755 services/print/reports/printer-setup/index.js create mode 100644 services/print/reports/printer-setup/locale.js create mode 100644 services/print/server.js diff --git a/loopback/server/boot/print.js b/loopback/server/boot/print.js new file mode 100644 index 0000000000..686578fec9 --- /dev/null +++ b/loopback/server/boot/print.js @@ -0,0 +1,3 @@ +module.exports = function(app) { + require('../../../services/print/server.js')(app); +}; diff --git a/modules/client/front/billing-data/index.js b/modules/client/front/billing-data/index.js index 9fff882382..4583e51b88 100644 --- a/modules/client/front/billing-data/index.js +++ b/modules/client/front/billing-data/index.js @@ -35,7 +35,7 @@ export default class Controller { } notifyChanges() { - this.$http.get(`/mailer/notification/payment-update/${this.client.id}`).then( + this.$http.get(`/email/payment-update`, {clientFk: this.client.id}).then( () => this.vnApp.showMessage(this.$translate.instant('Notification sent!')) ); } diff --git a/services/print/config/print.json b/services/print/config/print.json new file mode 100755 index 0000000000..e5bc720212 --- /dev/null +++ b/services/print/config/print.json @@ -0,0 +1,28 @@ +{ + "app": { + "port": 3000, + "defaultLanguage": "es", + "senderMail": "nocontestar@verdnatura.es", + "senderName": "Verdnatura" + }, + "mysql": { + "host": "localhost", + "port": 3306, + "database": "vn", + "user": "root", + "password": "root" + }, + "smtp": { + "host": "localhost", + "port": 465, + "secure": true, + "auth": { + "user": "", + "pass": "" + }, + "tls": { + "rejectUnauthorized": false + }, + "pool": true + } +} \ No newline at end of file diff --git a/services/print/config/routes.json b/services/print/config/routes.json new file mode 100644 index 0000000000..d226eedefc --- /dev/null +++ b/services/print/config/routes.json @@ -0,0 +1,11 @@ +[ + {"type": "email", "name": "client-welcome"}, + {"type": "email", "name": "printer-setup"}, + {"type": "email", "name": "payment-update"}, + {"type": "email", "name": "letter-debtor-st"}, + {"type": "email", "name": "letter-debtor-nd"}, + {"type": "report", "name": "delivery-note"}, + {"type": "report", "name": "invoice"}, + {"type": "static", "name": "email-header"}, + {"type": "static", "name": "email-footer"} +] \ No newline at end of file diff --git a/services/print/lib/config.js b/services/print/lib/config.js new file mode 100644 index 0000000000..b9e3538a5e --- /dev/null +++ b/services/print/lib/config.js @@ -0,0 +1,31 @@ +const fs = require('fs-extra'); +let env = process.env.NODE_ENV ? process.env.NODE_ENV : 'development'; + +let configPath = `/etc/`; +let config = require('../config/print.json'); +let configFiles = [ + `${configPath}/print.json`, + `${configPath}/print.${env}.json` +]; + +for (let configFile of configFiles) { + if (fs.existsSync(configFile)) + Object.assign(config, require(configFile)); +} + +/* let proxyConf = {}; +let proxyFiles = [ + '../../nginx/config.yml', + `${configPath}/config.yml`, + `${configPath}/config.${env}.yml` +]; + +for (let proxyFile of proxyFiles) { + if (fs.existsSync(proxyFile)) + Object.assign(proxyConf, require(proxyFile)); +} */ + +// config.proxy = proxyConf; +config.env = env; + +module.exports = config; diff --git a/services/print/lib/database.js b/services/print/lib/database.js new file mode 100644 index 0000000000..bd0e18c543 --- /dev/null +++ b/services/print/lib/database.js @@ -0,0 +1,9 @@ +const mysql = require('mysql2/promise'); +const config = require('./config.js'); + +module.exports = { + init() { + if (!this.pool) + this.pool = mysql.createPool(config.mysql); + }, +}; diff --git a/services/print/lib/emailEngine.js b/services/print/lib/emailEngine.js new file mode 100644 index 0000000000..0ae947137a --- /dev/null +++ b/services/print/lib/emailEngine.js @@ -0,0 +1,144 @@ +const Vue = require('vue'); +const VueI18n = require('vue-i18n'); +const renderer = require('vue-server-renderer').createRenderer(); +const fs = require('fs-extra'); +const juice = require('juice'); +const smtp = require('./smtp'); +const i18n = new VueI18n({ + locale: 'es', +}); + +Vue.use(VueI18n); + +if (!process.env.OPENSSL_CONF) + process.env.OPENSSL_CONF = '/etc/ssl/'; + +module.exports = { + + path: `${appPath}/reports`, + + /** + * Renders a report component + * + * @param {String} name - Report name + * @param {Object} ctx - Request context + */ + async render(name, ctx) { + const component = require(`${this.path}/${name}`); + const prefetchedData = await this.preFetch(component, ctx); + + const app = new Vue({ + i18n, + render: h => h(component), + }); + + return renderer.renderToString(app).then(renderedHtml => { + return { + html: renderedHtml, + data: prefetchedData, + }; + }); + }, + + /** + * Prefetch all component data from asyncData method + * + * @param {Object} component - Component object + * @param {Object} ctx - Request context + */ + async preFetch(component, ctx) { + const preFetchData = {attachments: []}; + let params = {}; + let data = {}; + + if (Object.keys(ctx.body).length > 0) + params = ctx.body; + + if (Object.keys(ctx.query).length > 0) + params = ctx.query; + + await this.attachAssets(component); + + if (component.hasOwnProperty('data')) + data = component.data(); + + if (component.hasOwnProperty('asyncData')) { + const asyncData = await component.asyncData(ctx, params); + + if (asyncData.locale) { + const locale = component.i18n.messages[asyncData.locale]; + preFetchData.subject = locale.subject; + } + + if (asyncData.recipient) + preFetchData.recipient = asyncData.recipient; + + const mergedData = {...data, ...asyncData}; + component.data = function data() { + return mergedData; + }; + } + + if (data && data.hasOwnProperty('attachments')) { + const fileNames = data.attachments; + fileNames.forEach(attachment => { + const componentPath = `${this.path}/${component.name}`; + let fileSrc = componentPath + attachment; + + if (attachment.slice(0, 4) === 'http' || attachment.slice(0, 4) === 'https') + fileSrc = attachment; + + const fileName = attachment.split('/').pop(); + preFetchData.attachments.push({ + filename: fileName, + path: fileSrc, + cid: attachment, + }); + }); + } + + if (component.components) { + const components = component.components; + const promises = []; + + Object.keys(components).forEach(component => { + promises.push(this.preFetch(components[component], ctx)); + }); + + return Promise.all(promises).then(results => { + results.forEach(result => { + result.attachments.forEach(atth => { + preFetchData.attachments.push(atth); + }); + }); + return preFetchData; + }); + } + + return preFetchData; + }, + + async attachAssets(component) { + const localePath = `${this.path}/${component.name}/locale.js`; + const templatePath = `${this.path}/${component.name}/index.html`; + const stylePath = `${this.path}/${component.name}/assets/css/style.css`; + + const template = await fs.readFile(templatePath, 'utf8'); + const css = await fs.readFile(stylePath, 'utf8'); + + component.i18n = require(localePath); + component.template = juice.inlineContent(template, css); + }, + + async toEmail(name, ctx) { + const rendered = await this.render(name, ctx); + const data = rendered.data; + const options = { + to: data.recipient, + subject: data.subject, + html: rendered.html, + attachments: data.attachments, + }; + return smtp.send(options); + }, +}; diff --git a/services/print/lib/errorHandler.js b/services/print/lib/errorHandler.js new file mode 100644 index 0000000000..21890a068d --- /dev/null +++ b/services/print/lib/errorHandler.js @@ -0,0 +1,21 @@ +module.exports = (app) => { + process.on('uncaughtException', (err) => { + console.error(`Caught exception: ${err}`); + }); + + process.on('warning', (err) => { + console.error(`My warning err`); + }); + + app.use(function(error, request, response, next) { + if (!error.httpStatusCode) + return next(error); + + response.status(error.httpStatusCode); + response.json({ + httpStatusCode: error.httpStatusCode, + name: error.name, + message: error.message, + }); + }); +}; diff --git a/services/print/lib/exceptions/userException.js b/services/print/lib/exceptions/userException.js new file mode 100644 index 0000000000..feb7547d24 --- /dev/null +++ b/services/print/lib/exceptions/userException.js @@ -0,0 +1,12 @@ +module.exports = class UserException extends Error { + /** + * UserException + * @param {String} message - Error message + */ + constructor(message) { + super(message); + + this.httpStatusCode = 400; + this.name = 'UserException'; + } +}; diff --git a/services/print/lib/mixins/text.js b/services/print/lib/mixins/text.js new file mode 100755 index 0000000000..be67a8746d --- /dev/null +++ b/services/print/lib/mixins/text.js @@ -0,0 +1,7 @@ +module.exports = { + methods: { + uFirst: (text) => { + return text; + }, + }, +}; diff --git a/services/print/lib/reportEngine.js b/services/print/lib/reportEngine.js new file mode 100644 index 0000000000..23b1e199ee --- /dev/null +++ b/services/print/lib/reportEngine.js @@ -0,0 +1,95 @@ +const Vue = require('vue'); +const VueI18n = require('vue-i18n'); +const renderer = require('vue-server-renderer').createRenderer(); +const fs = require('fs-extra'); +const pdf = require('phantom-html2pdf'); +const juice = require('juice'); + +Vue.use(VueI18n); + +if (!process.env.OPENSSL_CONF) + process.env.OPENSSL_CONF = '/etc/ssl/'; + +module.exports = { + + path: `${appPath}/reports`, + + /** + * Renders a report component + * + * @param {String} name - Report name + * @param {Object} ctx - Request context + */ + async render(name, ctx) { + const component = require(`${this.path}/${name}`); + + await this.preFetch(component, ctx); + + const i18n = new VueI18n({ + locale: 'es', + }); + const app = new Vue({ + i18n, + render: h => h(component), + }); + + return renderer.renderToString(app); + }, + + /** + * Prefetch all component data from asyncData method + * + * @param {Object} component - Component object + * @param {Object} ctx - Request context + */ + async preFetch(component, ctx) { + let data = {}; + + await this.attachAssets(component); + + if (component.hasOwnProperty('data')) + data = component.data(); + + if (component.hasOwnProperty('asyncData')) { + const fetch = await component.asyncData(ctx, ctx.body); + const mergedData = {...data, ...fetch}; + + component.data = function data() { + return mergedData; + }; + } + + if (component.components) { + const components = component.components; + const promises = []; + + Object.keys(components).forEach(component => { + promises.push(this.preFetch(components[component], ctx)); + }); + + return Promise.all(promises); + } + }, + + async attachAssets(component) { + const localePath = `${this.path}/${component.name}/locale.js`; + const templatePath = `${this.path}/${component.name}/index.html`; + const stylePath = `${this.path}/${component.name}/assets/css/style.css`; + + const template = await fs.readFile(templatePath, 'utf8'); + const css = await fs.readFile(stylePath, 'utf8'); + + component.i18n = require(localePath); + component.template = juice.inlineContent(template, css); + }, + + async toPdf(name, ctx) { + const options = { + html: await this.render(name, ctx), + }; + const result = await pdf.convert(options); + const stream = await result.toStream(); + + return stream; + }, +}; diff --git a/services/print/lib/router.js b/services/print/lib/router.js new file mode 100644 index 0000000000..0418a07d93 --- /dev/null +++ b/services/print/lib/router.js @@ -0,0 +1,66 @@ +const reportEngine = require('./reportEngine.js'); +const emailEngine = require('./emailEngine'); +const express = require('express'); +const routes = require(`../config/routes.json`); + +module.exports = app => { + this.path = `${appPath}/reports`; + + /** + * Enables a report + * + * @param {String} name - Report state path + */ + function registerReport(name) { + if (!name) throw new Error('Report name required'); + + app.get(`/report/${name}`, (request, response, next) => { + response.setHeader('Content-Disposition', `attachment; filename="${name}.pdf"`); + response.setHeader('Content-type', 'application/pdf'); + + reportEngine.toPdf(name, request).then(stream => { + stream.pipe(response); + }).catch(e => { + next(e); + }); + }); + } + + /** + * Enables a email + * + * @param {String} name - Report state path + */ + function registerEmail(name) { + if (!name) throw new Error('Email name required'); + + app.get(`/email/${name}`, (request, response, next) => { + emailEngine.render(name, request).then(rendered => { + response.send(rendered.html); + }).catch(e => { + next(e); + }); + }); + + app.post(`/email/${name}`, (request, response, next) => { + emailEngine.toEmail(name, request).then(() => { + response.status(200).json({status: 200}); + }).catch(e => { + next(e); + }); + }); + } + + /** + * Register routes + */ + routes.forEach(route => { + if (route.type === 'email') + registerEmail(route.name); + else if (route.type === 'report') + registerReport(route.name); + + const staticPath = this.path + `/${route.name}/assets`; + app.use(`/assets`, express.static(staticPath)); + }); +}; diff --git a/services/print/lib/smtp.js b/services/print/lib/smtp.js new file mode 100644 index 0000000000..042bd91af6 --- /dev/null +++ b/services/print/lib/smtp.js @@ -0,0 +1,22 @@ +const nodemailer = require('nodemailer'); +const config = require('./config.js'); + +module.exports = { + init() { + if (!this.transporter) + this.transporter = nodemailer.createTransport(config.smtp); + }, + + send(options) { + options.from = `${config.app.senderName} <${config.app.senderMail}>`; + + if (process.env.NODE_ENV !== 'production') + options.to = config.app.senderMail; + + return this.transporter.sendMail(options); + }, + + log() { + + }, +}; diff --git a/services/print/package.json b/services/print/package.json new file mode 100755 index 0000000000..5b0939757a --- /dev/null +++ b/services/print/package.json @@ -0,0 +1,26 @@ +{ + "name": "vn-print", + "version": "2.0.0", + "description": "Print service", + "main": "server/server.js", + "scripts": { + "start": "node server/server.js", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "https://git.verdnatura.es/salix" + }, + "license": "GPL-3.0", + "dependencies": { + "fs-extra": "^7.0.1", + "juice": "^5.0.1", + "mysql2": "^1.6.1", + "nodemailer": "^4.7.0", + "phantom": "^6.0.3", + "phantom-html2pdf": "^4.0.1", + "vue": "^2.5.17", + "vue-i18n": "^8.3.1", + "vue-server-renderer": "^2.5.17" + } +} diff --git a/services/print/reports/client-welcome/assets/css/style.css b/services/print/reports/client-welcome/assets/css/style.css new file mode 100644 index 0000000000..8f5acd032b --- /dev/null +++ b/services/print/reports/client-welcome/assets/css/style.css @@ -0,0 +1,42 @@ +body { + background-color: #EEE +} + +.container { + font-family: arial, sans-serif; + max-width: 600px; + min-width: 320px; + font-size: 16px; + margin: 0 auto; + color: #555 +} + +.main { + background-color: #FFF; + padding: 20px +} + +.main a { + color: #8dba25 +} + +.main h1 { + color: #999 +} + +.main h3 { + font-size: 16px +} + +.title { + background-color: #95d831; + text-transform: uppercase; + text-align: center; + padding: 35px 0 +} + +.title h1 { + font-size: 32px; + color: #333; + margin: 0 +} \ No newline at end of file diff --git a/services/print/reports/client-welcome/index.html b/services/print/reports/client-welcome/index.html new file mode 100644 index 0000000000..fc0295b8f4 --- /dev/null +++ b/services/print/reports/client-welcome/index.html @@ -0,0 +1,68 @@ + + + + {{ $t('subject') }} + + +
+ +
+ +
+

{{ $t('title') }}

+
+ + +

{{$t('dearClient')}},

+

+ +

+

{{$t('clientId')}}: {{ id }}
+
{{$t('user')}}: {{userName}}
+
{{$t('password')}}: ******** + ({{$t('passwordResetText')}}) +
+

+ +

{{$t('sections.howToBuy.title')}}

+

{{$t('sections.howToBuy.description')}}

+
    +
  1. + +
  2. +
+

{{$t('sections.howToBuy.stock')}}

+

{{$t('sections.howToBuy.delivery')}}

+ +

{{$t('sections.howToPay.title')}}

+

{{$t('sections.howToPay.description')}}

+
    +
  • + +
  • +
+ +

{{$t('sections.toConsider.title')}}

+

{{$t('sections.toConsider.description')}}

+ +

{{$t('sections.claimsPolicy.title')}}

+

{{$t('sections.claimsPolicy.description')}}

+ +

+

+

+ {{$t('salesPersonName')}}: {{salesPersonName}} +
+
+ {{$t('salesPersonPhone')}}: {{salesPersonPhone}} +
+
+ {{$t('salesPersonEmail')}}: + {{salesPersonEmail}} +
+

+
+ +
+ + \ No newline at end of file diff --git a/services/print/reports/client-welcome/index.js b/services/print/reports/client-welcome/index.js new file mode 100755 index 0000000000..2234187b44 --- /dev/null +++ b/services/print/reports/client-welcome/index.js @@ -0,0 +1,46 @@ +const database = require(`${appPath}/lib/database`); +const emailHeader = require('../email-header'); +const emailFooter = require('../email-footer'); +const UserException = require(`${appPath}/lib/exceptions/userException`); + +module.exports = { + name: 'client-welcome', + async asyncData(ctx, params) { + const data = { + isPreview: ctx.method === 'GET', + }; + + if (!params.clientFk) + throw new UserException('No client id specified'); + + return this.methods.fetchClientData(params.clientFk) + .then(([result]) => { + return Object.assign(data, result[0]); + }); + }, + created() { + this.$i18n.locale = this.locale; + }, + methods: { + fetchClientData(clientFk) { + return database.pool.query(` + SELECT + c.id, + u.lang locale, + u.name AS userName, + c.email recipient, + CONCAT(w.name, ' ', w.firstName) salesPersonName, + w.phone AS salesPersonPhone, + CONCAT(wu.name, '@verdnatura.es') AS salesPersonEmail + FROM client c + JOIN account.user u ON u.id = c.id + LEFT JOIN worker w ON w.id = c.salesPersonFk + LEFT JOIN account.user wu ON wu.id = w.userFk + WHERE c.id = ?`, [clientFk]); + }, + }, + components: { + 'email-header': emailHeader, + 'email-footer': emailFooter, + }, +}; diff --git a/services/print/reports/client-welcome/locale.js b/services/print/reports/client-welcome/locale.js new file mode 100644 index 0000000000..bf18a9d918 --- /dev/null +++ b/services/print/reports/client-welcome/locale.js @@ -0,0 +1,55 @@ +module.exports = { + messages: { + es: { + subject: 'Bienvenido a Verdnatura', + title: '¡Te damos la bienvenida!', + dearClient: 'Estimado cliente', + clientData: `Tus datos para poder comprar en la web de Verdnatura + (https://www.verdnatura.es) + o en nuestras aplicaciones para iOS y + Android + (Ver tutorial de uso), son`, + clientId: 'Identificador de cliente', + user: 'Usuario', + password: 'Contraseña', + passwordResetText: 'Haz clic en "¿Has olvidado tu contraseña?"', + sections: { + howToBuy: { + title: 'Cómo hacer un pedido', + description: `Para realizar un pedido en nuestra web, + debes configurarlo indicando:`, + requeriments: [ + 'Si quieres recibir el pedido (por agencia o por nuestro propio reparto) o si lo prefieres recoger en alguno de nuestros almacenes.', + 'La fecha en la que quieres recibir el pedido (se preparará el día anterior).', + 'La dirección de entrega o el almacén donde quieres recoger el pedido.'], + stock: 'En nuestra web y aplicaciones puedes visualizar el stock disponible de flor cortada, verdes, plantas, complementos y artificial. Ten en cuenta que dicho stock puede variar en función de la fecha seleccionada al configurar el pedido. Es importante CONFIRMAR los pedidos para que la mercancía quede reservada.', + delivery: 'El reparto se realiza de lunes a sábado según la zona en la que te encuentres. Por regla general, los pedidos que se entregan por agencia, deben estar confirmados y pagados antes de las 17h del día en que se preparan (el día anterior a recibirlos), aunque esto puede variar si el pedido se envía a través de nuestro reparto y según la zona.', + }, + howToPay: { + title: 'Cómo pagar', + description: 'Las formas de pago admitidas en Verdnatura son:', + options: [ + 'Con tarjeta a través de nuestra plataforma web (al confirmar el pedido).', + 'Mediante giro bancario mensual, modalidad que hay que solicitar y tramitar.', + ], + }, + toConsider: { + title: 'Cosas a tener en cuenta', + description: `Verdnatura vende EXCLUSIVAMENTE a profesionales, por lo que debes + remitirnos el Modelo 036 ó 037, para comprobar que está + dado/a de alta en el epígrafe correspondiente al comercio de flores.`, + }, + claimsPolicy: { + title: 'POLÍTICA DE RECLAMACIONES', + description: `Verdnatura aceptará las reclamaciones que se realicen dentro + de los dos días naturales siguientes a la recepción del pedido (incluyendo el mismo día de la recepción). + Pasado este plazo no se aceptará ninguna reclamación.`, + }, + }, + help: 'Cualquier duda que te surja, no dudes en consultarla, ¡estamos para atenderte!', + salesPersonName: 'Soy tu comercial y mi nombre es', + salesPersonPhone: 'Teléfono y whatsapp', + salesPersonEmail: 'Dirección de e-mail', + }, + }, +}; diff --git a/services/print/reports/delivery-note/assets/css/style.css b/services/print/reports/delivery-note/assets/css/style.css new file mode 100644 index 0000000000..918036c36a --- /dev/null +++ b/services/print/reports/delivery-note/assets/css/style.css @@ -0,0 +1,3 @@ +.blue { + color: blue +} \ No newline at end of file diff --git a/services/print/reports/delivery-note/index.html b/services/print/reports/delivery-note/index.html new file mode 100644 index 0000000000..37d97258a0 --- /dev/null +++ b/services/print/reports/delivery-note/index.html @@ -0,0 +1,4 @@ +
+ {{$t('clientId')}}: {{ id1 }} {{ id2 }} + heey +
\ No newline at end of file diff --git a/services/print/reports/delivery-note/index.js b/services/print/reports/delivery-note/index.js new file mode 100755 index 0000000000..07f77ffd0e --- /dev/null +++ b/services/print/reports/delivery-note/index.js @@ -0,0 +1,36 @@ +const database = require(`${appPath}/lib/database`); +const UserException = require(`${appPath}/lib/exceptions/userException`); + +module.exports = { + name: 'delivery-note', + async asyncData(ctx, params) { + console.log(params); + const promises = []; + const dataIndex = promises.push(this.methods.fetchData()) - 1; + const itemsIndex = promises.push(this.methods.fetchItems()) - 1; + + return Promise.all(promises).then(result => { + const [[data]] = result[dataIndex]; + const [[items]] = result[itemsIndex]; + + return { + id1: data.id, + id2: items.id, + }; + }); + }, + data() { + return { + id: null, + }; + }, + methods: { + fetchData() { + return database.pool.query('SELECT 1 AS id'); + }, + + fetchItems() { + return database.pool.query('SELECT 2 AS id'); + }, + }, +}; diff --git a/services/print/reports/delivery-note/locale.js b/services/print/reports/delivery-note/locale.js new file mode 100644 index 0000000000..ed35f8b4e9 --- /dev/null +++ b/services/print/reports/delivery-note/locale.js @@ -0,0 +1,8 @@ +module.exports = { + messages: { + es: { + clientId: 'Id cliente', + }, + }, +} +; \ No newline at end of file diff --git a/services/print/reports/email-footer/assets/css/style.css b/services/print/reports/email-footer/assets/css/style.css new file mode 100644 index 0000000000..c3ad26042d --- /dev/null +++ b/services/print/reports/email-footer/assets/css/style.css @@ -0,0 +1,62 @@ +footer { + font-family: arial, sans-serif; + max-width: 600px; + min-width: 320px; + font-size: 16px; + margin: 0 auto +} + +.buttons { + background-color: #FFF; + text-align: center; + width: 100% +} + +.buttons a { + text-decoration: none; + font-size: 18px; + color: #fff +} + +.buttons .btn { + background-color: #333; + min-width: 300px; + height: 72px; + display: inline-block; + text-align: center +} + +.buttons .btn .text { + display: inline-block; + padding-top: 22px +} + +.buttons .btn .icon { + background-color: #95d831; + text-align: center; + padding-top: 22px; + float: right; + height: 50px; + width: 70px +} + +.networks { + background-color: #555; + text-align: center; + padding: 20px 0 +} + +.networks a { + text-decoration: none; + margin-right: 5px +} + +.networks a img { + margin: 0 +} + +.privacy { + padding: 20px 0; + font-size: 10px; + font-weight: 100 +} \ No newline at end of file diff --git a/services/print/reports/email-footer/assets/images/action.png b/services/print/reports/email-footer/assets/images/action.png new file mode 100644 index 0000000000000000000000000000000000000000..2cd16c453d66b10611f90ee01deba70edbd7113e GIT binary patch literal 3225 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 literal 0 HcmV?d00001 diff --git a/services/print/reports/email-footer/assets/images/linkedin.png b/services/print/reports/email-footer/assets/images/linkedin.png new file mode 100644 index 0000000000000000000000000000000000000000..0d191e5aee4fa6b5a86ec10745ca92cfd258c269 GIT binary patch literal 3588 zcmV+f4*T(mP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0009oNkl zF8mLK7F@WntF976NTDvqZ2~T$P)sEYr=VGMq2fYg14G;C_;GU@pVKtXo5`EWJG=Yt zz2EzN=bd+c-9#Uv)__yMd%z6v7BB%E18P7UcmUi7?g4jzRbV5f)b91%)FavBz(>FZ z;AP-jU>#@xTfh#m4U7Y0z$7pQ%mJr?KY=CSW=iQt$`tj4x}rW&>*|6!S`cG2_SFMt zMLkgl*`w-pwWThr(+7k*9eAz4KYCDvPpS=dQ$17C7d#XA4fSNdVDoBIy`df{+4PRY zIZbuGSCB>Zv3i98ih3o^UF=1}kJa-GLDchc{(KP|ZVp<*&(V1Ee{DRxL_@v7A&{`~ z#=c%9+|Fj%KV89}b5p&(U*Kq!<<|Oihpl`7O1a4u;899xu?wIH;9TSuw^B;Kl}vmY zcp;_q;eT?82&vOu0KB38<-hW)`clcHr-R?|{KIQ%y-R=#J}d7Jz)b4uwcYeGw6)OX z=GhLyZS~CokX{I$HPjjPVUcW2y{vwtu66se2S9pMeWcEyURBqqfP|8+jzq<=-oxMg z;;suy>0CVj7?{m1{SNpPxD0#%yaxOZd>sYA!-Blmff>}h>ZO9DxAR7wdw#pa-dEKh z+*`g^UnzL*CG~C=HQiQ8U-Vtz?dQy$0zNBg_9&27NfHw}b zv*=5Vl|;JLG5%$bHARZqG2lTKjg-kj_}P@wlRhCPf%{o>ex|5~Oab?@XjRQsg!CM6 zCyU7t#YA%yVJXsNAcz((}e&K`0tpADWHBPpe}x&&N|0ML!p^SMVyuCd=3;H!@D z&t0B*5m?&owic;ehGZJgRxVF##K_(bBkAR+VXIq>SG(^~*$z`ItX3~Cx1m~H)7-{t z^`|>DUY(nO4jZq|olA#Tsm|@z9sy|R_lT9eu}ytyekgb2{|o@N7p$=+VXSok0000< KMNUMnLSTX^4#cKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000CENklgxWH8VWFNC5XBLqos(IRhJ5_*xh zQ4mOJ7a@Wmtc&u(va48KCjFs;B16)xz+e{|sLM7t)J=ZfJX>F1XLH|o&T*aR=6v7t zzR#cYywCUidlNN)+6p`hYyrA~hk;c<2ha-K1V({jUc0r2=u3v&eBLw*QzJfDRn^Ip|%y|(H3+A z!RLg!wh_uMRS&9@>M?aqo%pT^ev`p}X}uI)rw*#8)lCgL!A-$`P+eCmv#sicdPH5) zVAop`awgQRWtsG-H`G3EBdC2Lx2KGSZ>T$208n>^{H;ZNc;a?jcovIK+|tJ*N(`z; z_#Z&{_~4vTCBn|>Mt^h#KhD$Y!MPI0WTV1bjp1-In}AYg@dR)^rPNb{fHq(Quo}1n zxB;96zE3Gl)WG)`aA!(s`@d?5NU3W|GOein@!?d1@mR0akU6KK=9xhrPzOpf+^b%5 zesE3QTT;$v>VcW^QoW$=D8cC6ITRdMug|h}u!O7~p=T>S6 z52&xHf8_S=E>Rs`SG!U7sV56ESef(R%j%X`Tc&PT_oy$bs{+4V{W5nFD+|g!sqRBP zuI?{Ld?@Fq8v_4|dNpU!DfRVOzf1i+vv#PU-2Lit)KhA2krqoG$q0TY@Vyx&f2`uq z&&0kLGPsdw+2$*|S3N}#ZZ1H$KBr72^D$?YdoH){gTQy>@aqf6-mH$aL=!qz;FP*D z&zDn5=YU6mdw?@3rB7om-}~JQkWw0rW_KDMDj<6d=xB+q`APx8Y+W+lQFp}e`OI2( zj_z{ixowu`Tfr5ewIu|179jj9^SnY`0sImvJKLZ>m81JPj`%@fQ3ijtfb34-W=kAZ zdjZ1yvF}PLT?CE-+4|zitUCgqRKWwBDImKY7+n;DlnU_GJPC)w4epEgH`VbN)O5CJ^ieDNj)6z{c|XLsi=iBat3DV={j{To$5yQ z{+L(fVOV`by}KTrOI>@!>H0Y$M0>>TUsFoI)yVU|Jz}$U~m@9`WO%_lULJ*uDfj&jQ@orW!53Aa~<`4*>i< VObRb@RyqIx002ovPDHLkV1il=DP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000ANNklq zonhYl&7bci+7Pt|cn)|Gr~oH{r+{NX4^RhIfhFKJ@D1<<@Lfu&UesDryhpg@z^ke6sYmz9;X$>k&Z}oTbc1IDzp4(l3pS#ztJl=S9e#R; z!_K-oQWRuN-B2&{5JkNlcE^fDctbtUK8Sig?2qKU;q`|d;cX(mzT+E@EKyajaR4OV zc(r9#iL^G~>5ne+9E$c07Ye*;s8n%py>yCi72V%1L|}+{5#e7 z=T&uv11!<2T>ZbjRDV@RJ7nw$^^*ElbYHTG88-j2loa*Hz+weI$EE28&ghTU0pyc841T;{DG2Ob4x z)GO*EP0qXylv-d60z)aKUoz~@0hLmWNYzZI7vi@ByaOz#Z>WzqoOyZ&jQ3MYZ)V!9 z0w+Wp5mazgK^{~2JiXn6@Q~x6HWt0C80cU_qz=<6&?i5Hy zYrwHmOwB8q${WCiHnU;1fX)igQ;IRaFH?CE_^Azt7gI`01@!uWdMS8`-YniBrMtjO zz_$gR{-mH@FR)q)BBj3o!0*6sz}-x}KYxEFDWy9F zogM&g7pjO2DJVsCTy}TzSx{+3`d+qc(-RP^X-ow3z_Tf(g$$q*z%Wpb zCaNA;WdZoSjSudD$pyFt3~pjsyKYA8+G)Hid5^ATn7We7Yf$Je*0e#fyZGrX5$~Q& zz?L`OJv)~zS*26kt;xWh*t6|clLEBwd&K?R*iHf;7undRHY2|;yYYVq03xx!4kRYS Q0ssI207*qoM6N<$f)8laWdHyG literal 0 HcmV?d00001 diff --git a/services/print/reports/email-footer/assets/images/youtube.png b/services/print/reports/email-footer/assets/images/youtube.png new file mode 100644 index 0000000000000000000000000000000000000000..11871deb548d3f160444b577756e872cac2cda45 GIT binary patch literal 3513 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 + + + + + +
+ + Facebook + + + Twitter + + + Youtube + + + Pinterest + + + Instagram + + + Linkedin + +
+ + + +
+

{{$t('privacy.fiscalAddress')}}

+

{{$t('privacy.disclaimer')}}

+

{{$t('privacy.law')}}

+
+ + \ No newline at end of file diff --git a/services/print/reports/email-footer/index.js b/services/print/reports/email-footer/index.js new file mode 100755 index 0000000000..07fc857dde --- /dev/null +++ b/services/print/reports/email-footer/index.js @@ -0,0 +1,28 @@ +module.exports = { + name: 'email-footer', + asyncData(ctx, params) { + return { + isPreview: ctx.method === 'GET', + }; + }, + created() { + const embeded = []; + this.attachments.map((attachment) => { + const src = this.isPreview ? attachment : `cid:${attachment}`; + embeded[attachment] = src; + }); + this.embeded = embeded; + }, + data() { + return { + attachments: [ + '/assets/images/facebook.png', + '/assets/images/twitter.png', + '/assets/images/youtube.png', + '/assets/images/pinterest.png', + '/assets/images/instagram.png', + '/assets/images/linkedin.png', + ], + }; + }, +}; diff --git a/services/print/reports/email-footer/locale.js b/services/print/reports/email-footer/locale.js new file mode 100644 index 0000000000..a6c8aceab9 --- /dev/null +++ b/services/print/reports/email-footer/locale.js @@ -0,0 +1,20 @@ +module.exports = { + messages: { + es: { + buttons: { + webAcccess: 'Visita nuestra Web', + info: 'Ayúdanos a mejorar', + }, + privacy: { + fiscalAddress: 'VERDNATURA LEVANTE SL, B97367486 Avda. Espioca, 100, 46460 Silla · www.verdnatura.es · clientes@verdnatura.es', + disclaimer: `- AVISO - Este mensaje es privado y confidencial, y debe ser utilizado + exclusivamente por la persona destinataria del mismo. Si usted ha recibido este mensaje + por error, le rogamos lo comunique al remitente y borre dicho mensaje y cualquier documento + adjunto que pudiera contener. Verdnatura Levante SL no renuncia a la confidencialidad ni a + ningún privilegio por causa de transmisión errónea o mal funcionamiento. Igualmente no se hace + responsable de los cambios, alteraciones, errores u omisiones que pudieran hacerse al mensaje una vez enviado.`, + law: 'En cumplimiento de lo dispuesto en la Ley Orgánica 15/1999, de Protección de Datos de Carácter Personal, le comunicamos que los datos personales que facilite se incluirán en ficheros automatizados de VERDNATURA LEVANTE S.L., pudiendo en todo momento ejercitar los derechos de acceso, rectificación, cancelación y oposición, comunicándolo por escrito al domicilio social de la entidad. La finalidad del fichero es la gestión administrativa, contabilidad, y facturación.', + }, + }, + }, +}; diff --git a/services/print/reports/email-header/assets/css/style.css b/services/print/reports/email-header/assets/css/style.css new file mode 100644 index 0000000000..73dfb8abca --- /dev/null +++ b/services/print/reports/email-header/assets/css/style.css @@ -0,0 +1,12 @@ +header { + font-family: arial, sans-serif; + max-width: 600px; + min-width: 320px; + font-size: 16px; + margin: 0 auto; + color: #555 +} + +header img { + width: 100% +} \ No newline at end of file diff --git a/services/print/reports/email-header/assets/images/logo.png b/services/print/reports/email-header/assets/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3c063ae444b501e6d0ac7a9588781efcb31e1e72 GIT binary patch literal 30712 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%0AZQE6(OF&wX?nb&(3F$_|vza?Z{P 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 + + VerdNatura + + diff --git a/services/print/reports/email-header/index.js b/services/print/reports/email-header/index.js new file mode 100755 index 0000000000..87b2d1aa9d --- /dev/null +++ b/services/print/reports/email-header/index.js @@ -0,0 +1,22 @@ +module.exports = { + name: 'email-header', + asyncData(ctx, params) { + return { + isPreview: ctx.method === 'GET', + }; + }, + created() { + const embeded = []; + this.attachments.map((attachment) => { + const src = this.isPreview ? attachment : `cid:${attachment}`; + embeded[attachment] = src; + }); + this.embeded = embeded; + }, + + data() { + return { + attachments: ['/assets/images/logo.png'], + }; + }, +}; diff --git a/services/print/reports/email-header/locale.js b/services/print/reports/email-header/locale.js new file mode 100644 index 0000000000..a3d2003a53 --- /dev/null +++ b/services/print/reports/email-header/locale.js @@ -0,0 +1,5 @@ +module.exports = { + messages: { + es: {clientName: 'Nombre cliente'}, + }, +}; diff --git a/services/print/reports/letter-debtor-nd/assets/css/style.css b/services/print/reports/letter-debtor-nd/assets/css/style.css new file mode 100644 index 0000000000..8f5acd032b --- /dev/null +++ b/services/print/reports/letter-debtor-nd/assets/css/style.css @@ -0,0 +1,42 @@ +body { + background-color: #EEE +} + +.container { + font-family: arial, sans-serif; + max-width: 600px; + min-width: 320px; + font-size: 16px; + margin: 0 auto; + color: #555 +} + +.main { + background-color: #FFF; + padding: 20px +} + +.main a { + color: #8dba25 +} + +.main h1 { + color: #999 +} + +.main h3 { + font-size: 16px +} + +.title { + background-color: #95d831; + text-transform: uppercase; + text-align: center; + padding: 35px 0 +} + +.title h1 { + font-size: 32px; + color: #333; + margin: 0 +} \ No newline at end of file diff --git a/services/print/reports/letter-debtor-nd/assets/files/model.ezp b/services/print/reports/letter-debtor-nd/assets/files/model.ezp new file mode 100755 index 0000000000000000000000000000000000000000..297df3d214694a64f677aa40d7305ebddb368e28 GIT binary patch literal 9845 zcmeHNe@s=^9sfSKh9||2*4nYk*jse!?10BFM@dJ#3i`0vpitY_kSLZ%eeHwygm-;t z-J%gKNm*tS(`n`!+ib0!u32a6m?If!OGe*lW?J2xVv8HiY(kr?-5+dg_xAbRdkGqLA|nOmjm%q3S;iwKVX~9rJ2ct`=DvXbk6pPdZ8X zCnhhSgbjR{ygPF9yt(<_ydqCtK}q4VlKf@TWXpXUTa~J5TOciFojwVSQ7C(5%OiWG z8@chxnakL`jt^LQ@fkWntLHflI=INIF?af-?ePV#r4-{iUjH~n3!q*MCi$yF;mvg+ zi=J%Ti0mqbi|YcvMHJ?H>ISP!HR$$6j0&`q$d<+yvD&de#U;s->TsPc!zET+##TT& zkx1~z92ac=N=N(GPtg9fXCE*^F$M|!R5b^iqJd^lbs%a)kjE|H6=KX^nB_J5?lOG2 z!6T>~S|KMaK;c*;e+_;(&S|goK$^fh^#}^f?IPcR0L^Ivb=sF2k_mj^ygS+VwoiWW zOs>{Bf1kFYCs(@-^oz*lFfe6vq1Oi74_rl#9#`WD;?FY`sT{`R+q7ZiAT|<5_ zt4cP#7B`0`c{?zX(tq!ho+tc+u#K2s@gGLp=&T;s`EV+KwvpK&=FO=*hrAthZ9q5bQF@KIPJIsw zeGzIQCq2SPuE)X4eMmQQAU^_{`pRa}7Tt`=dKY9L1mV|yKKkGyPb@5e%h1^aU#x47 zY?H@qds7Hr>BE+NH}kp6743{tBr%-f5jYsZKkw<^jxHx#&%uEhKhu^|Az=R{f{1#R@k#`rqe~FnN z@tzy4wS;quG;MA=kge5cB$9so*TvdTQ7CIe{lwRnYQ2!hf!{!hUcmbun0^ROUjxv~ z%E{3<2l>6NAPqME*z7krhnzCnzJBafztUqp6S~DHTuaOxK&$mOh`B|36>}kI=Q^SM zTu(t~aBZZ$fx`9~n-~3&w;wj{%-=*w6I7oKfqw+09K21(_L{QO z&+j$k(eD~NudhRL6ggPXV(PNKuV8EJC6v|g*KA9_gndSG3shRn{ZS$09PixMFi!zK zgZC;UlGA7P&*5qGS1e#bKAO547hZ!oySQ$7dm zd(=&7y^BKu|;!#@w53}Z5DDI22EY&@Xk{?no9jW(0l|{zYTOoHrfz5 z9e~Y)6)pK*>>X?IKCXG;tT`5_d*h2+V`?p-e-FwUX^=MP5!~jl$k2(>kysZ~d^wj- zjJ$5ln7y_>ea25(xts&9 zzt8RsHr0n?o|-^wbkg5^v{yxCyvQba@7owLk4cqiYPjYe&nkUwMP-FPt{=6pWbl}6DrOOK7;vT##@KD_b16O&?L0&P)d+}V2 zH`86eP9*VOjj9>8JxB{aWB#LNb5g$mPi62+*X5y5Fw(+ay%HvB2WOwtf$F#x@hD${^P@h<(oydM&cvC5eiZkL>%&G<{rbQI7z)(o z`5%z*UTyBN+>tX2=5o6%HqS_Svf+~Q%F2qW>he769E0+S`i1F#YrUXN0OhlFWS+z=itNH7ir+hXkVE3nI7=e{Zb+5E60v?FU__Z>5F_Z?e25f zML>^tzr>C-I}?~d-;70^1e+`SVrsFbvoC_kch%>yFAA<>UrZv_boa$6^vCCJUKCz^ zUm*Rd&5KFI;@GW2;appHPx*S@5b=Moc<%jZ74Gr?wKy}RydRk7%=7Gf*bi|JTh`<^ O)c;>mciLg9iT)e;UnVyI literal 0 HcmV?d00001 diff --git a/services/print/reports/letter-debtor-nd/assets/files/model2.ezp b/services/print/reports/letter-debtor-nd/assets/files/model2.ezp new file mode 100755 index 0000000000000000000000000000000000000000..297df3d214694a64f677aa40d7305ebddb368e28 GIT binary patch literal 9845 zcmeHNe@s=^9sfSKh9||2*4nYk*jse!?10BFM@dJ#3i`0vpitY_kSLZ%eeHwygm-;t z-J%gKNm*tS(`n`!+ib0!u32a6m?If!OGe*lW?J2xVv8HiY(kr?-5+dg_xAbRdkGqLA|nOmjm%q3S;iwKVX~9rJ2ct`=DvXbk6pPdZ8X zCnhhSgbjR{ygPF9yt(<_ydqCtK}q4VlKf@TWXpXUTa~J5TOciFojwVSQ7C(5%OiWG z8@chxnakL`jt^LQ@fkWntLHflI=INIF?af-?ePV#r4-{iUjH~n3!q*MCi$yF;mvg+ zi=J%Ti0mqbi|YcvMHJ?H>ISP!HR$$6j0&`q$d<+yvD&de#U;s->TsPc!zET+##TT& zkx1~z92ac=N=N(GPtg9fXCE*^F$M|!R5b^iqJd^lbs%a)kjE|H6=KX^nB_J5?lOG2 z!6T>~S|KMaK;c*;e+_;(&S|goK$^fh^#}^f?IPcR0L^Ivb=sF2k_mj^ygS+VwoiWW zOs>{Bf1kFYCs(@-^oz*lFfe6vq1Oi74_rl#9#`WD;?FY`sT{`R+q7ZiAT|<5_ zt4cP#7B`0`c{?zX(tq!ho+tc+u#K2s@gGLp=&T;s`EV+KwvpK&=FO=*hrAthZ9q5bQF@KIPJIsw zeGzIQCq2SPuE)X4eMmQQAU^_{`pRa}7Tt`=dKY9L1mV|yKKkGyPb@5e%h1^aU#x47 zY?H@qds7Hr>BE+NH}kp6743{tBr%-f5jYsZKkw<^jxHx#&%uEhKhu^|Az=R{f{1#R@k#`rqe~FnN z@tzy4wS;quG;MA=kge5cB$9so*TvdTQ7CIe{lwRnYQ2!hf!{!hUcmbun0^ROUjxv~ z%E{3<2l>6NAPqME*z7krhnzCnzJBafztUqp6S~DHTuaOxK&$mOh`B|36>}kI=Q^SM zTu(t~aBZZ$fx`9~n-~3&w;wj{%-=*w6I7oKfqw+09K21(_L{QO z&+j$k(eD~NudhRL6ggPXV(PNKuV8EJC6v|g*KA9_gndSG3shRn{ZS$09PixMFi!zK zgZC;UlGA7P&*5qGS1e#bKAO547hZ!oySQ$7dm zd(=&7y^BKu|;!#@w53}Z5DDI22EY&@Xk{?no9jW(0l|{zYTOoHrfz5 z9e~Y)6)pK*>>X?IKCXG;tT`5_d*h2+V`?p-e-FwUX^=MP5!~jl$k2(>kysZ~d^wj- zjJ$5ln7y_>ea25(xts&9 zzt8RsHr0n?o|-^wbkg5^v{yxCyvQba@7owLk4cqiYPjYe&nkUwMP-FPt{=6pWbl}6DrOOK7;vT##@KD_b16O&?L0&P)d+}V2 zH`86eP9*VOjj9>8JxB{aWB#LNb5g$mPi62+*X5y5Fw(+ay%HvB2WOwtf$F#x@hD${^P@h<(oydM&cvC5eiZkL>%&G<{rbQI7z)(o z`5%z*UTyBN+>tX2=5o6%HqS_Svf+~Q%F2qW>he769E0+S`i1F#YrUXN0OhlFWS+z=itNH7ir+hXkVE3nI7=e{Zb+5E60v?FU__Z>5F_Z?e25f zML>^tzr>C-I}?~d-;70^1e+`SVrsFbvoC_kch%>yFAA<>UrZv_boa$6^vCCJUKCz^ zUm*Rd&5KFI;@GW2;appHPx*S@5b=Moc<%jZ74Gr?wKy}RydRk7%=7Gf*bi|JTh`<^ O)c;>mciLg9iT)e;UnVyI literal 0 HcmV?d00001 diff --git a/services/print/reports/letter-debtor-nd/index.html b/services/print/reports/letter-debtor-nd/index.html new file mode 100644 index 0000000000..384def01fa --- /dev/null +++ b/services/print/reports/letter-debtor-nd/index.html @@ -0,0 +1,59 @@ + + + + {{ $t('subject') }} + + +
+ + + + +
+ +
+

{{ $t('title') }}

+
+ + +

{{ $t('sections.introduction.title') }},

+

{{ $t('sections.introduction.description') }}

+

{{ $t('sections.introduction.terms') }}

+ +

+ {{ $t('sections.payMethod.description') }}: +

    +
  1. + {{ option }} +
  2. +
+

+ +

+ {{ $t('sections.legalAction.description') }}: +

    +
  1. + {{ option }} +
  2. +
+

+ +

+

+ +

+

+
{{bankName}}
+
{{iban}}
+
+
{{$t('transferAccount') }}
+
+
+

+
+ + + +
+ + \ No newline at end of file diff --git a/services/print/reports/letter-debtor-nd/index.js b/services/print/reports/letter-debtor-nd/index.js new file mode 100755 index 0000000000..bcf7880544 --- /dev/null +++ b/services/print/reports/letter-debtor-nd/index.js @@ -0,0 +1,56 @@ +const database = require(`${appPath}/lib/database`); +const emailHeader = require('../email-header'); +const emailFooter = require('../email-footer'); +const UserException = require(`${appPath}/lib/exceptions/userException`); + +module.exports = { + name: 'letter-debtor-nd', + async asyncData(ctx, params) { + const data = { + isPreview: ctx.method === 'GET', + }; + + if (!params.clientFk) + throw new UserException('No client id specified'); + + return this.methods.fetchClientData(params.clientFk, params.companyFk) + .then(([result]) => { + return Object.assign(data, result[0]); + }); + }, + created() { + this.$i18n.locale = this.locale; + }, + data() { + return { + attachments: ['http://localhost:8080/report/delivery-note'], + }; + }, + methods: { + fetchClientData(clientFk, companyFk) { + return database.pool.query(` + SELECT + u.lang locale, + c.email recipient, + c.dueDay, + c.iban, + sa.iban, + be.name AS bankName + FROM client c + JOIN company AS cny + JOIN supplierAccount AS sa ON sa.id = cny.supplierAccountFk + JOIN bankEntity be ON be.id = sa.bankEntityFk + JOIN account.user u ON u.id = c.id + WHERE c.id = ? AND cny.id = ?`, [clientFk, companyFk]); + }, + }, + computed: { + accountAddress: function() { + return this.iban.slice(-4); + }, + }, + components: { + 'email-header': emailHeader, + 'email-footer': emailFooter, + }, +}; diff --git a/services/print/reports/letter-debtor-nd/locale.js b/services/print/reports/letter-debtor-nd/locale.js new file mode 100644 index 0000000000..07b81099fd --- /dev/null +++ b/services/print/reports/letter-debtor-nd/locale.js @@ -0,0 +1,37 @@ +module.exports = { + messages: { + es: { + subject: 'Reiteración de aviso por saldo deudor', + title: 'Aviso reiterado', + sections: { + introduction: { + title: 'Estimado cliente', + description: `Nos dirigimos a Vd. nuevamente para informarle que sigue + pendiente su deuda con nuestra empresa, tal y como puede comprobar en el extracto adjunto.`, + terms: `Dado que los plazos de pago acordados están ampliamente superados, no procede mayor dilación en la liquidación del importe adeudado.`, + }, + payMethod: { + description: 'Para ello dispone de las siguientes formas de pago', + options: [ + 'Pago online desde nuestra web.', + 'Ingreso o transferencia al número de cuenta que detallamos al pie de esta carta, indicando el número de cliente.', + ], + }, + legalAction: { + description: `En caso de no ser atendido este apremio de pago, nos veremos obligados + a iniciar las acciones legales que procedan, entre las que están`, + options: [ + 'Inclusión en ficheros negativos sobre solvencia patrimonial y crédito.', + 'Reclamación judicial.', + 'Cesión de deuda a una empresa de gestión de cobro.', + ], + }, + }, + contactPhone: 'Para consultas, puede ponerse en contacto con nosotros en el 96 324 21 00.', + conclusion: 'En espera de sus noticias.
Gracias por su atención.', + transferAccount: 'Datos para transferencia bancaria', + }, + }, +}; + + diff --git a/services/print/reports/letter-debtor-st/assets/css/style.css b/services/print/reports/letter-debtor-st/assets/css/style.css new file mode 100644 index 0000000000..8f5acd032b --- /dev/null +++ b/services/print/reports/letter-debtor-st/assets/css/style.css @@ -0,0 +1,42 @@ +body { + background-color: #EEE +} + +.container { + font-family: arial, sans-serif; + max-width: 600px; + min-width: 320px; + font-size: 16px; + margin: 0 auto; + color: #555 +} + +.main { + background-color: #FFF; + padding: 20px +} + +.main a { + color: #8dba25 +} + +.main h1 { + color: #999 +} + +.main h3 { + font-size: 16px +} + +.title { + background-color: #95d831; + text-transform: uppercase; + text-align: center; + padding: 35px 0 +} + +.title h1 { + font-size: 32px; + color: #333; + margin: 0 +} \ No newline at end of file diff --git a/services/print/reports/letter-debtor-st/assets/files/model.ezp b/services/print/reports/letter-debtor-st/assets/files/model.ezp new file mode 100755 index 0000000000000000000000000000000000000000..297df3d214694a64f677aa40d7305ebddb368e28 GIT binary patch literal 9845 zcmeHNe@s=^9sfSKh9||2*4nYk*jse!?10BFM@dJ#3i`0vpitY_kSLZ%eeHwygm-;t z-J%gKNm*tS(`n`!+ib0!u32a6m?If!OGe*lW?J2xVv8HiY(kr?-5+dg_xAbRdkGqLA|nOmjm%q3S;iwKVX~9rJ2ct`=DvXbk6pPdZ8X zCnhhSgbjR{ygPF9yt(<_ydqCtK}q4VlKf@TWXpXUTa~J5TOciFojwVSQ7C(5%OiWG z8@chxnakL`jt^LQ@fkWntLHflI=INIF?af-?ePV#r4-{iUjH~n3!q*MCi$yF;mvg+ zi=J%Ti0mqbi|YcvMHJ?H>ISP!HR$$6j0&`q$d<+yvD&de#U;s->TsPc!zET+##TT& zkx1~z92ac=N=N(GPtg9fXCE*^F$M|!R5b^iqJd^lbs%a)kjE|H6=KX^nB_J5?lOG2 z!6T>~S|KMaK;c*;e+_;(&S|goK$^fh^#}^f?IPcR0L^Ivb=sF2k_mj^ygS+VwoiWW zOs>{Bf1kFYCs(@-^oz*lFfe6vq1Oi74_rl#9#`WD;?FY`sT{`R+q7ZiAT|<5_ zt4cP#7B`0`c{?zX(tq!ho+tc+u#K2s@gGLp=&T;s`EV+KwvpK&=FO=*hrAthZ9q5bQF@KIPJIsw zeGzIQCq2SPuE)X4eMmQQAU^_{`pRa}7Tt`=dKY9L1mV|yKKkGyPb@5e%h1^aU#x47 zY?H@qds7Hr>BE+NH}kp6743{tBr%-f5jYsZKkw<^jxHx#&%uEhKhu^|Az=R{f{1#R@k#`rqe~FnN z@tzy4wS;quG;MA=kge5cB$9so*TvdTQ7CIe{lwRnYQ2!hf!{!hUcmbun0^ROUjxv~ z%E{3<2l>6NAPqME*z7krhnzCnzJBafztUqp6S~DHTuaOxK&$mOh`B|36>}kI=Q^SM zTu(t~aBZZ$fx`9~n-~3&w;wj{%-=*w6I7oKfqw+09K21(_L{QO z&+j$k(eD~NudhRL6ggPXV(PNKuV8EJC6v|g*KA9_gndSG3shRn{ZS$09PixMFi!zK zgZC;UlGA7P&*5qGS1e#bKAO547hZ!oySQ$7dm zd(=&7y^BKu|;!#@w53}Z5DDI22EY&@Xk{?no9jW(0l|{zYTOoHrfz5 z9e~Y)6)pK*>>X?IKCXG;tT`5_d*h2+V`?p-e-FwUX^=MP5!~jl$k2(>kysZ~d^wj- zjJ$5ln7y_>ea25(xts&9 zzt8RsHr0n?o|-^wbkg5^v{yxCyvQba@7owLk4cqiYPjYe&nkUwMP-FPt{=6pWbl}6DrOOK7;vT##@KD_b16O&?L0&P)d+}V2 zH`86eP9*VOjj9>8JxB{aWB#LNb5g$mPi62+*X5y5Fw(+ay%HvB2WOwtf$F#x@hD${^P@h<(oydM&cvC5eiZkL>%&G<{rbQI7z)(o z`5%z*UTyBN+>tX2=5o6%HqS_Svf+~Q%F2qW>he769E0+S`i1F#YrUXN0OhlFWS+z=itNH7ir+hXkVE3nI7=e{Zb+5E60v?FU__Z>5F_Z?e25f zML>^tzr>C-I}?~d-;70^1e+`SVrsFbvoC_kch%>yFAA<>UrZv_boa$6^vCCJUKCz^ zUm*Rd&5KFI;@GW2;appHPx*S@5b=Moc<%jZ74Gr?wKy}RydRk7%=7Gf*bi|JTh`<^ O)c;>mciLg9iT)e;UnVyI literal 0 HcmV?d00001 diff --git a/services/print/reports/letter-debtor-st/assets/files/model2.ezp b/services/print/reports/letter-debtor-st/assets/files/model2.ezp new file mode 100755 index 0000000000000000000000000000000000000000..297df3d214694a64f677aa40d7305ebddb368e28 GIT binary patch literal 9845 zcmeHNe@s=^9sfSKh9||2*4nYk*jse!?10BFM@dJ#3i`0vpitY_kSLZ%eeHwygm-;t z-J%gKNm*tS(`n`!+ib0!u32a6m?If!OGe*lW?J2xVv8HiY(kr?-5+dg_xAbRdkGqLA|nOmjm%q3S;iwKVX~9rJ2ct`=DvXbk6pPdZ8X zCnhhSgbjR{ygPF9yt(<_ydqCtK}q4VlKf@TWXpXUTa~J5TOciFojwVSQ7C(5%OiWG z8@chxnakL`jt^LQ@fkWntLHflI=INIF?af-?ePV#r4-{iUjH~n3!q*MCi$yF;mvg+ zi=J%Ti0mqbi|YcvMHJ?H>ISP!HR$$6j0&`q$d<+yvD&de#U;s->TsPc!zET+##TT& zkx1~z92ac=N=N(GPtg9fXCE*^F$M|!R5b^iqJd^lbs%a)kjE|H6=KX^nB_J5?lOG2 z!6T>~S|KMaK;c*;e+_;(&S|goK$^fh^#}^f?IPcR0L^Ivb=sF2k_mj^ygS+VwoiWW zOs>{Bf1kFYCs(@-^oz*lFfe6vq1Oi74_rl#9#`WD;?FY`sT{`R+q7ZiAT|<5_ zt4cP#7B`0`c{?zX(tq!ho+tc+u#K2s@gGLp=&T;s`EV+KwvpK&=FO=*hrAthZ9q5bQF@KIPJIsw zeGzIQCq2SPuE)X4eMmQQAU^_{`pRa}7Tt`=dKY9L1mV|yKKkGyPb@5e%h1^aU#x47 zY?H@qds7Hr>BE+NH}kp6743{tBr%-f5jYsZKkw<^jxHx#&%uEhKhu^|Az=R{f{1#R@k#`rqe~FnN z@tzy4wS;quG;MA=kge5cB$9so*TvdTQ7CIe{lwRnYQ2!hf!{!hUcmbun0^ROUjxv~ z%E{3<2l>6NAPqME*z7krhnzCnzJBafztUqp6S~DHTuaOxK&$mOh`B|36>}kI=Q^SM zTu(t~aBZZ$fx`9~n-~3&w;wj{%-=*w6I7oKfqw+09K21(_L{QO z&+j$k(eD~NudhRL6ggPXV(PNKuV8EJC6v|g*KA9_gndSG3shRn{ZS$09PixMFi!zK zgZC;UlGA7P&*5qGS1e#bKAO547hZ!oySQ$7dm zd(=&7y^BKu|;!#@w53}Z5DDI22EY&@Xk{?no9jW(0l|{zYTOoHrfz5 z9e~Y)6)pK*>>X?IKCXG;tT`5_d*h2+V`?p-e-FwUX^=MP5!~jl$k2(>kysZ~d^wj- zjJ$5ln7y_>ea25(xts&9 zzt8RsHr0n?o|-^wbkg5^v{yxCyvQba@7owLk4cqiYPjYe&nkUwMP-FPt{=6pWbl}6DrOOK7;vT##@KD_b16O&?L0&P)d+}V2 zH`86eP9*VOjj9>8JxB{aWB#LNb5g$mPi62+*X5y5Fw(+ay%HvB2WOwtf$F#x@hD${^P@h<(oydM&cvC5eiZkL>%&G<{rbQI7z)(o z`5%z*UTyBN+>tX2=5o6%HqS_Svf+~Q%F2qW>he769E0+S`i1F#YrUXN0OhlFWS+z=itNH7ir+hXkVE3nI7=e{Zb+5E60v?FU__Z>5F_Z?e25f zML>^tzr>C-I}?~d-;70^1e+`SVrsFbvoC_kch%>yFAA<>UrZv_boa$6^vCCJUKCz^ zUm*Rd&5KFI;@GW2;appHPx*S@5b=Moc<%jZ74Gr?wKy}RydRk7%=7Gf*bi|JTh`<^ O)c;>mciLg9iT)e;UnVyI literal 0 HcmV?d00001 diff --git a/services/print/reports/letter-debtor-st/index.html b/services/print/reports/letter-debtor-st/index.html new file mode 100644 index 0000000000..73e2205633 --- /dev/null +++ b/services/print/reports/letter-debtor-st/index.html @@ -0,0 +1,42 @@ + + + + {{ $t('subject') }} + + +
+ + + + +
+ +
+

{{ $t('title') }}

+
+ + +

{{ $t('sections.introduction.title') }},

+

{{ $t('sections.introduction.description') }}

+ +

{{ $t('checkExtract') }}

+

{{ $t('checkValidData') }}

+

{{ $t('payMethod') }}

+

{{ $t('conclusion') }}

+ +

+

+
{{bankName}}
+
{{iban}}
+
+
{{$t('transferAccount') }}
+
+
+

+
+ + + +
+ + \ No newline at end of file diff --git a/services/print/reports/letter-debtor-st/index.js b/services/print/reports/letter-debtor-st/index.js new file mode 100755 index 0000000000..7fb41092ed --- /dev/null +++ b/services/print/reports/letter-debtor-st/index.js @@ -0,0 +1,61 @@ +const database = require(`${appPath}/lib/database`); +const emailHeader = require('../email-header'); +const emailFooter = require('../email-footer'); +const UserException = require(`${appPath}/lib/exceptions/userException`); + +module.exports = { + name: 'letter-debtor-st', + async asyncData(ctx, params) { + const data = { + isPreview: ctx.method === 'GET', + }; + + if (!params.clientFk) + throw new UserException('No client id specified'); + + if (!params.companyFk) + throw new UserException('No company id specified'); + + return this.methods.fetchClientData(params.clientFk, params.companyFk) + .then(([[result]]) => { + if (!result) throw new UserException('Client data not found'); + + return Object.assign(data, result); + }); + }, + created() { + this.$i18n.locale = this.locale; + }, + data() { + return { + attachments: ['http://localhost:5000/report/delivery-note'], + }; + }, + methods: { + fetchClientData(clientFk, companyFk) { + return database.pool.query(` + SELECT + u.lang locale, + c.email recipient, + c.dueDay, + c.iban, + sa.iban, + be.name AS bankName + FROM client c + JOIN company AS cny + JOIN supplierAccount AS sa ON sa.id = cny.supplierAccountFk + JOIN bankEntity be ON be.id = sa.bankEntityFk + JOIN account.user u ON u.id = c.id + WHERE c.id = ? AND cny.id = ?`, [clientFk, companyFk]); + }, + }, + computed: { + accountAddress: function() { + return this.iban.slice(-4); + }, + }, + components: { + 'email-header': emailHeader, + 'email-footer': emailFooter, + }, +}; diff --git a/services/print/reports/letter-debtor-st/locale.js b/services/print/reports/letter-debtor-st/locale.js new file mode 100644 index 0000000000..60387e13b7 --- /dev/null +++ b/services/print/reports/letter-debtor-st/locale.js @@ -0,0 +1,27 @@ +module.exports = { + messages: { + es: { + subject: 'Aviso inicial por saldo deudor', + title: 'Aviso inicial', + sections: { + introduction: { + title: 'Estimado cliente', + description: `Por el presente escrito te comunicamos que, según nuestros + datos contables, tu cuenta tiene un saldo pendiente de liquidar.`, + }, + }, + checkExtract: `Te solicitamos compruebes que el extracto adjunto corresponde con los datos de que Vd. dispone. + Nuestro departamento de administración le aclarará gustosamente cualquier duda que pueda tener, + e igualmente le facilitará cualquier documento que solicite.`, + checkValidData: `Si al comprobar los datos aportados resultaran correctos, + te rogamos procedas a regularizar tu situación.`, + payMethod: `Si no deseas desplazarte personalmente hasta nuestras oficinas, + puedes realizar el pago mediante transferencia bancaria a la cuenta que figura al pie del comunicado, + indicando tu número de cliente, o bien puedes realizar el pago online desde nuestra página web.`, + conclusion: 'De antemano te agradecemos tu amable colaboración.', + transferAccount: 'Datos para transferencia bancaria', + }, + }, +}; + + diff --git a/services/print/reports/payment-update/assets/css/style.css b/services/print/reports/payment-update/assets/css/style.css new file mode 100644 index 0000000000..8f5acd032b --- /dev/null +++ b/services/print/reports/payment-update/assets/css/style.css @@ -0,0 +1,42 @@ +body { + background-color: #EEE +} + +.container { + font-family: arial, sans-serif; + max-width: 600px; + min-width: 320px; + font-size: 16px; + margin: 0 auto; + color: #555 +} + +.main { + background-color: #FFF; + padding: 20px +} + +.main a { + color: #8dba25 +} + +.main h1 { + color: #999 +} + +.main h3 { + font-size: 16px +} + +.title { + background-color: #95d831; + text-transform: uppercase; + text-align: center; + padding: 35px 0 +} + +.title h1 { + font-size: 32px; + color: #333; + margin: 0 +} \ No newline at end of file diff --git a/services/print/reports/payment-update/index.html b/services/print/reports/payment-update/index.html new file mode 100644 index 0000000000..f74a51493c --- /dev/null +++ b/services/print/reports/payment-update/index.html @@ -0,0 +1,45 @@ + + + + {{ $t('subject') }} + + +
+ + + + +
+ +
+

{{ $t('title') }}

+
+ + +

{{ $t('sections.introduction.title') }},

+

+ +

+

+ {{ $t('sections.pay.method') }}: + {{ payMethodName }} +
+
+ {{ $t('sections.pay.day') }}: + {{ $t('sections.pay.dueDay', [dueDay]) }} +
+

+ +

+

+ {{ $t('sections.pay.cardImplicates') }} +

+ +

{{ $t('notifyAnError') }}

+
+ + + +
+ + \ No newline at end of file diff --git a/services/print/reports/payment-update/index.js b/services/print/reports/payment-update/index.js new file mode 100755 index 0000000000..f6a2962982 --- /dev/null +++ b/services/print/reports/payment-update/index.js @@ -0,0 +1,49 @@ +const database = require(`${appPath}/lib/database`); +const emailHeader = require('../email-header'); +const emailFooter = require('../email-footer'); +const UserException = require(`${appPath}/lib/exceptions/userException`); + +module.exports = { + name: 'payment-update', + async asyncData(ctx, params) { + const data = { + isPreview: ctx.method === 'GET', + }; + + if (!params.clientFk) + throw new UserException('No client id specified'); + + return this.methods.fetchClientData(params.clientFk) + .then(([result]) => { + return Object.assign(data, result[0]); + }); + }, + created() { + this.$i18n.locale = this.locale; + }, + methods: { + fetchClientData(clientFk) { + return database.pool.query(` + SELECT + u.lang locale, + c.email recipient, + c.dueDay, + c.iban, + pm.id payMethodFk, + pm.name payMethodName + FROM client c + JOIN payMethod pm ON pm.id = c.payMethodFk + JOIN account.user u ON u.id = c.id + WHERE c.id = ?`, [clientFk]); + }, + }, + computed: { + accountAddress: function() { + return this.iban.slice(-4); + }, + }, + components: { + 'email-header': emailHeader, + 'email-footer': emailFooter, + }, +}; diff --git a/services/print/reports/payment-update/locale.js b/services/print/reports/payment-update/locale.js new file mode 100644 index 0000000000..1e7d1dbbc0 --- /dev/null +++ b/services/print/reports/payment-update/locale.js @@ -0,0 +1,49 @@ +module.exports = { + messages: { + es: { + subject: 'Cambios en las condiciones de pago', + title: 'Cambios en las condiciones', + sections: { + introduction: { + title: 'Estimado cliente', + description: `Le informamos que han cambiado las condiciones de pago de su cuenta. +
A continuación le indicamos las nuevas condiciones`, + }, + pay: { + method: 'Método de pago', + day: 'Día de pago', + dueDay: '{0} de cada mes', + cardImplicates: `Su modo de pago actual implica que deberá abonar el + importe de los pedidos realizados en el mismo día para que se puedan enviar.`, + accountImplicates: `Su modo de pago actual implica que se le pasará un cargo a la + cuenta terminada en "{0}" por el importe pendiente, al vencimiento establecido en las condiciones.`, + }, + }, + notifyAnError: `En el caso de detectar algún error en los datos indicados + o para cualquier aclaración, debes dirigirte a tu comercial.`, + }, + fr: { + subject: 'Changement des C.G.V', + title: 'Changement des C.G.V', + sections: { + introduction: { + title: 'Chèr client', + description: `Nous vous informons que les conditions de paiement ont changé. +
Voici les nouvelles conditions`, + }, + pay: { + method: 'Méthode de paiement', + day: 'Date paiement', + dueDay: '{0} de chaque mois', + cardImplicates: `Avec votre mode de règlement vous devrez + payer le montant des commandes avant son départ.`, + accountImplicates: `Avec ce mode de règlement nous vous passerons un prélèvement automatique dans votre compte bancaire + se termine dans "{0}" our le montant dû, au date à terme établi en nos conditions.`, + }, + }, + notifyAnError: `Pour tout renseignement contactez votre commercial.`, + }, + }, +}; + + diff --git a/services/print/reports/printer-setup/assets/css/style.css b/services/print/reports/printer-setup/assets/css/style.css new file mode 100644 index 0000000000..8f5acd032b --- /dev/null +++ b/services/print/reports/printer-setup/assets/css/style.css @@ -0,0 +1,42 @@ +body { + background-color: #EEE +} + +.container { + font-family: arial, sans-serif; + max-width: 600px; + min-width: 320px; + font-size: 16px; + margin: 0 auto; + color: #555 +} + +.main { + background-color: #FFF; + padding: 20px +} + +.main a { + color: #8dba25 +} + +.main h1 { + color: #999 +} + +.main h3 { + font-size: 16px +} + +.title { + background-color: #95d831; + text-transform: uppercase; + text-align: center; + padding: 35px 0 +} + +.title h1 { + font-size: 32px; + color: #333; + margin: 0 +} \ No newline at end of file diff --git a/services/print/reports/printer-setup/assets/files/model.ezp b/services/print/reports/printer-setup/assets/files/model.ezp new file mode 100755 index 0000000000000000000000000000000000000000..297df3d214694a64f677aa40d7305ebddb368e28 GIT binary patch literal 9845 zcmeHNe@s=^9sfSKh9||2*4nYk*jse!?10BFM@dJ#3i`0vpitY_kSLZ%eeHwygm-;t z-J%gKNm*tS(`n`!+ib0!u32a6m?If!OGe*lW?J2xVv8HiY(kr?-5+dg_xAbRdkGqLA|nOmjm%q3S;iwKVX~9rJ2ct`=DvXbk6pPdZ8X zCnhhSgbjR{ygPF9yt(<_ydqCtK}q4VlKf@TWXpXUTa~J5TOciFojwVSQ7C(5%OiWG z8@chxnakL`jt^LQ@fkWntLHflI=INIF?af-?ePV#r4-{iUjH~n3!q*MCi$yF;mvg+ zi=J%Ti0mqbi|YcvMHJ?H>ISP!HR$$6j0&`q$d<+yvD&de#U;s->TsPc!zET+##TT& zkx1~z92ac=N=N(GPtg9fXCE*^F$M|!R5b^iqJd^lbs%a)kjE|H6=KX^nB_J5?lOG2 z!6T>~S|KMaK;c*;e+_;(&S|goK$^fh^#}^f?IPcR0L^Ivb=sF2k_mj^ygS+VwoiWW zOs>{Bf1kFYCs(@-^oz*lFfe6vq1Oi74_rl#9#`WD;?FY`sT{`R+q7ZiAT|<5_ zt4cP#7B`0`c{?zX(tq!ho+tc+u#K2s@gGLp=&T;s`EV+KwvpK&=FO=*hrAthZ9q5bQF@KIPJIsw zeGzIQCq2SPuE)X4eMmQQAU^_{`pRa}7Tt`=dKY9L1mV|yKKkGyPb@5e%h1^aU#x47 zY?H@qds7Hr>BE+NH}kp6743{tBr%-f5jYsZKkw<^jxHx#&%uEhKhu^|Az=R{f{1#R@k#`rqe~FnN z@tzy4wS;quG;MA=kge5cB$9so*TvdTQ7CIe{lwRnYQ2!hf!{!hUcmbun0^ROUjxv~ z%E{3<2l>6NAPqME*z7krhnzCnzJBafztUqp6S~DHTuaOxK&$mOh`B|36>}kI=Q^SM zTu(t~aBZZ$fx`9~n-~3&w;wj{%-=*w6I7oKfqw+09K21(_L{QO z&+j$k(eD~NudhRL6ggPXV(PNKuV8EJC6v|g*KA9_gndSG3shRn{ZS$09PixMFi!zK zgZC;UlGA7P&*5qGS1e#bKAO547hZ!oySQ$7dm zd(=&7y^BKu|;!#@w53}Z5DDI22EY&@Xk{?no9jW(0l|{zYTOoHrfz5 z9e~Y)6)pK*>>X?IKCXG;tT`5_d*h2+V`?p-e-FwUX^=MP5!~jl$k2(>kysZ~d^wj- zjJ$5ln7y_>ea25(xts&9 zzt8RsHr0n?o|-^wbkg5^v{yxCyvQba@7owLk4cqiYPjYe&nkUwMP-FPt{=6pWbl}6DrOOK7;vT##@KD_b16O&?L0&P)d+}V2 zH`86eP9*VOjj9>8JxB{aWB#LNb5g$mPi62+*X5y5Fw(+ay%HvB2WOwtf$F#x@hD${^P@h<(oydM&cvC5eiZkL>%&G<{rbQI7z)(o z`5%z*UTyBN+>tX2=5o6%HqS_Svf+~Q%F2qW>he769E0+S`i1F#YrUXN0OhlFWS+z=itNH7ir+hXkVE3nI7=e{Zb+5E60v?FU__Z>5F_Z?e25f zML>^tzr>C-I}?~d-;70^1e+`SVrsFbvoC_kch%>yFAA<>UrZv_boa$6^vCCJUKCz^ zUm*Rd&5KFI;@GW2;appHPx*S@5b=Moc<%jZ74Gr?wKy}RydRk7%=7Gf*bi|JTh`<^ O)c;>mciLg9iT)e;UnVyI literal 0 HcmV?d00001 diff --git a/services/print/reports/printer-setup/index.html b/services/print/reports/printer-setup/index.html new file mode 100644 index 0000000000..1bf6221869 --- /dev/null +++ b/services/print/reports/printer-setup/index.html @@ -0,0 +1,56 @@ + + + + {{ $t('subject') }} + + +
+ + + + +
+ +
+

{{ $t('title') }}

+
+ + +

{{$t('description.dear')}},

+

{{$t('description.instructions')}}

+

+

+ +

{{$t('sections.QLabel.title')}}

+

{{$t('sections.QLabel.description')}}:

+
    +
  1. + +
  2. +
+ + +

{{$t('sections.help.title')}}

+

{{$t('sections.help.description')}}

+

+ + +

+

+ {{$t('salesPersonName')}}: {{salesPersonName}} +
+
+ {{$t('salesPersonPhone')}}: {{salesPersonPhone}} +
+
+ {{$t('salesPersonEmail')}}: + {{salesPersonEmail}} +
+

+
+ + + +
+ + \ No newline at end of file diff --git a/services/print/reports/printer-setup/index.js b/services/print/reports/printer-setup/index.js new file mode 100755 index 0000000000..d32ea9c18b --- /dev/null +++ b/services/print/reports/printer-setup/index.js @@ -0,0 +1,51 @@ +const database = require(`${appPath}/lib/database`); +const emailHeader = require('../email-header'); +const emailFooter = require('../email-footer'); +const UserException = require(`${appPath}/lib/exceptions/userException`); + +module.exports = { + name: 'printer-setup', + async asyncData(ctx, params) { + const data = { + isPreview: ctx.method === 'GET', + }; + + if (!params.clientFk) + throw new UserException('No client id specified'); + + return this.methods.fetchClientData(params.clientFk) + .then(([result]) => { + return Object.assign(data, result[0]); + }); + }, + created() { + this.$i18n.locale = this.locale; + }, + data() { + return { + attachments: ['/assets/files/model.ezp'], + }; + }, + methods: { + fetchClientData(clientFk) { + return database.pool.query(` + SELECT + c.id, + u.lang locale, + u.name AS userName, + c.email recipient, + CONCAT(w.name, ' ', w.firstName) salesPersonName, + w.phone AS salesPersonPhone, + CONCAT(wu.name, '@verdnatura.es') AS salesPersonEmail + FROM client c + JOIN account.user u ON u.id = c.id + LEFT JOIN worker w ON w.id = c.salesPersonFk + LEFT JOIN account.user wu ON wu.id = w.userFk + WHERE c.id = ?`, [clientFk]); + }, + }, + components: { + 'email-header': emailHeader, + 'email-footer': emailFooter, + }, +}; diff --git a/services/print/reports/printer-setup/locale.js b/services/print/reports/printer-setup/locale.js new file mode 100644 index 0000000000..bd6360e8fd --- /dev/null +++ b/services/print/reports/printer-setup/locale.js @@ -0,0 +1,54 @@ +module.exports = { + messages: { + es: { + subject: 'Instalación y configuración de impresora', + title: '¡Gracias por tu confianza!', + description: { + dear: 'Estimado cliente', + instructions: 'Sigue las intrucciones especificadas en este correo para llevar a cabo la instalación de la impresora.', + followGuide: `Puedes utilizar como guía, el video del montaje del ribon y la cinta + https://www.youtube.com/watch?v=qhb0kgQF3o8. + También necesitarás el QLabel, el programa para imprimir las cintas.`, + downloadFrom: `Puedes descargarlo desde este enlace + http://ww.godexintl.com/es1/download/downloads/Download/2996`, + }, + sections: { + QLabel: { + title: 'Utilización de QLabel', + description: 'Para utilizar el programa de impresión de cintas sigue estos pasos', + steps: [ + 'Abre el programa QLabel', + 'Haz clic en el icono de la barra superior con forma de "carpeta"', + 'Selecciona el archivo llamado "model.ezp" adjunto en este correo', + 'Haz clic encima del texto con el boton secundario del ratón', + 'Elige la primera opcion "setup"', + 'Cambia el texto para imprimir', + 'Haz clic en el boton "Ok"', + 'Desplázate con el raton para ver la medida máxima', + 'Haz clic encima del texto con el botón secundario del ratón', + 'Elige la primera opcion "Setup printer"', + 'Haz clic en la primera pestalla "Label Setup"', + 'Modifica la propidad "Paper Height"', + 'Haz clic en el boton "Ok"', + 'Haz clic sobre el icono de la impresora', + 'Haz clic en "Print"', + ], + }, + help: { + title: '¿Necesitas ayuda?', + description: `Si necesitas ayuda, descárgate nuestro programa de soporte para poder conectarnos + remotamente a tu equipo y hacerte la instalación. Proporciónanos un horario de contacto para atenderte, y contactaremos contigo.`, + remoteSupport: `Puedes descargarte el programa desde este enlace + http://soporte.verdnatura.es.`, + }, + }, + help: 'Cualquier duda que te surja, no dudes en consultarla, ¡estamos para atenderte!', + salesPersonName: 'Soy tu comercial y mi nombre es', + salesPersonPhone: 'Teléfono y whatsapp', + salesPersonEmail: 'Dirección de e-mail', + }, + }, +}; + + diff --git a/services/print/server.js b/services/print/server.js new file mode 100644 index 0000000000..29d457d8e7 --- /dev/null +++ b/services/print/server.js @@ -0,0 +1,18 @@ +const database = require('./lib/database'); +const smtp = require('./lib/smtp'); + +module.exports = app => { + global.appPath = __dirname; + + process.env.OPENSSL_CONF = '/etc/ssl/'; + + // Init database instance + database.init(); + // Init SMTP Instance + smtp.init(); + + require('./lib/router')(app); + require('./lib/errorHandler')(app); +}; + + From db7f69fc41d057a0ce3b1ce072dae2e9f64f90e2 Mon Sep 17 00:00:00 2001 From: Joan Sanchez Date: Tue, 22 Jan 2019 10:04:38 +0100 Subject: [PATCH 04/37] removed link to mailer service on docker compose --- docker-compose.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 2d5c8cb335..cc66e2ab23 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,7 +10,6 @@ services: - ${PORT}:80 links: - api - - mailer api: image: registry.verdnatura.es/salix-api:${TAG} restart: unless-stopped From 87a0a0bccc8d3aebbc3723f10681e3e4e193efe1 Mon Sep 17 00:00:00 2001 From: Gerard Date: Tue, 22 Jan 2019 10:04:42 +0100 Subject: [PATCH 05/37] #972 ticket.tracking --- e2e/helpers/selectors.js | 7 +- .../05_create_new_tracking_state.spec.js | 14 +--- loopback/locale/es.json | 1 + .../methods/ticket-tracking/changeState.js | 17 +++-- .../ticket-tracking/specs/changeState.spec.js | 62 +++++++++++++--- modules/ticket/back/models/ticket-tracking.js | 1 + modules/ticket/front/routes.json | 2 +- modules/ticket/front/tracking/edit/index.html | 21 ++++-- modules/ticket/front/tracking/edit/index.js | 60 +++++++++++++-- .../ticket/front/tracking/edit/index.spec.js | 74 +++++++++++++++++++ .../ticket/front/tracking/index/index.html | 2 +- modules/ticket/front/tracking/index/index.js | 8 +- 12 files changed, 220 insertions(+), 49 deletions(-) create mode 100644 modules/ticket/front/tracking/edit/index.spec.js diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js index d7cb354470..fe0b699204 100644 --- a/e2e/helpers/selectors.js +++ b/e2e/helpers/selectors.js @@ -386,7 +386,8 @@ export default { trackingButton: `vn-left-menu a[ui-sref="ticket.card.tracking.index"]`, createStateButton: `${components.vnFloatButton}`, stateAutocomplete: 'vn-ticket-tracking-edit vn-autocomplete[field="$ctrl.ticket.stateFk"]', - saveButton: `${components.vnSubmit}` + saveButton: `${components.vnSubmit}`, + cancelButton: `vn-ticket-tracking-edit vn-button[ui-sref="ticket.card.tracking.index"]` }, ticketBasicData: { basicDataButton: `vn-left-menu a[ui-sref="ticket.card.data.stepOne"]`, @@ -437,8 +438,8 @@ export default { saveServiceButton: `${components.vnSubmit}` }, createStateView: { - stateAutocomplete: `vn-autocomplete[field="$ctrl.ticket.stateFk"]`, - clearStateInputButton: `vn-autocomplete[field="$ctrl.ticket.stateFk"] > div > div > div > vn-icon > i`, + stateAutocomplete: `vn-autocomplete[field="$ctrl.stateFk"]`, + clearStateInputButton: `vn-autocomplete[field="$ctrl.stateFk"] > div > div > div > vn-icon > i`, saveStateButton: `${components.vnSubmit}` }, claimsIndex: { diff --git a/e2e/paths/ticket-module/05_create_new_tracking_state.spec.js b/e2e/paths/ticket-module/05_create_new_tracking_state.spec.js index 44f3dae51a..8446d84fc9 100644 --- a/e2e/paths/ticket-module/05_create_new_tracking_state.spec.js +++ b/e2e/paths/ticket-module/05_create_new_tracking_state.spec.js @@ -25,27 +25,19 @@ describe('Ticket Create new tracking state path', () => { .click(selectors.createStateView.saveStateButton) .waitForLastSnackbar(); - expect(result).toEqual('No changes to save'); + expect(result).toEqual('State cannot be blank'); }); it(`should attempt create a new state then clear and save it`, async() => { let result = await nightmare .autocompleteSearch(selectors.createStateView.stateAutocomplete, '¿Fecha?') .waitToClick(selectors.createStateView.clearStateInputButton) - .click(selectors.createStateView.saveStateButton) + .waitToClick(selectors.createStateView.saveStateButton) .waitForLastSnackbar(); - expect(result).toEqual('Data saved!'); + expect(result).toEqual('State cannot be blank'); }); - it('should again access to the create state view by clicking the create floating button', async() => { - let url = await nightmare - .click(selectors.ticketTracking.createStateButton) - .wait(selectors.createStateView.stateAutocomplete) - .parsedUrl(); - - expect(url.hash).toContain('tracking/edit'); - }); it(`should create a new state`, async() => { let result = await nightmare diff --git a/loopback/locale/es.json b/loopback/locale/es.json index a244b5ae68..de9547daa6 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -18,6 +18,7 @@ "That payment method requires an IBAN": "El método de pago seleccionado requiere un IBAN", "That payment method requires a BIC": "El método de pago seleccionado requiere un BIC", "State cannot be blank": "El estado no puede estar en blanco", + "Worker cannot be blank": "El trabajador no puede estar en blanco", "Cannot change the payment method if no salesperson": "No se puede cambiar la forma de pago si no hay comercial asignado", "can't be blank": "El campo no puede estar vacío", "Observation type cannot be blank": "El tipo de observación no puede estar en blanco", diff --git a/modules/ticket/back/methods/ticket-tracking/changeState.js b/modules/ticket/back/methods/ticket-tracking/changeState.js index 3ec81f2ce3..a701a1fdb3 100644 --- a/modules/ticket/back/methods/ticket-tracking/changeState.js +++ b/modules/ticket/back/methods/ticket-tracking/changeState.js @@ -25,18 +25,25 @@ module.exports = Self => { let models = Self.app.models; let isProduction; let isEditable = await Self.app.models.Ticket.isEditable(params.ticketFk); + let assignedState = await Self.app.models.State.findOne({where: {code: 'PICKER_DESIGNED'}}); + let isAssigned = assignedState.id === params.stateFk; + let currentUserId; if (ctx.req.accessToken) { let token = ctx.req.accessToken; - let currentUserId = token && token.userId; - isProduction = await models.Account.hasRole(currentUserId, 'Production'); + currentUserId = token && token.userId; + isProduction = await models.Account.hasRole(currentUserId, 'production'); + isSalesperson = await models.Account.hasRole(currentUserId, 'salesPerson'); + } + + if ((!isEditable && !isProduction) || (isEditable && !isAssigned && isSalesperson) || (!isSalesperson && !isProduction)) + throw new UserError(`You don't have enough privileges to change the state of this ticket`); + + if (!isAssigned) { let worker = await models.Worker.findOne({where: {userFk: currentUserId}}); params.workerFk = worker.id; } - if (!isEditable && !isProduction) - throw new UserError(`You don't have enough privileges to change the state of this ticket`); - return await Self.app.models.TicketTracking.create(params); }; }; diff --git a/modules/ticket/back/methods/ticket-tracking/specs/changeState.spec.js b/modules/ticket/back/methods/ticket-tracking/specs/changeState.spec.js index 1b35b6d700..1ac4ec14b0 100644 --- a/modules/ticket/back/methods/ticket-tracking/specs/changeState.spec.js +++ b/modules/ticket/back/methods/ticket-tracking/specs/changeState.spec.js @@ -3,18 +3,18 @@ const app = require(`${serviceRoot}/server/server`); describe('ticket changeState()', () => { let ticket; - beforeAll(async () => { + beforeAll(async() => { let originalTicket = await app.models.Ticket.findOne({where: {id: 16}}); originalTicket.id = null; ticket = await app.models.Ticket.create(originalTicket); }); - afterAll(async () => { + afterAll(async() => { await app.models.Ticket.destroyById(ticket.id); }); - it('should throw an error if the ticket is not editable and the user isnt production', async () => { - let ctx = {req: {accessToken: {userId: 110}}}; + it('should throw an error if the ticket is not editable and the user isnt production', async() => { + let ctx = {req: {accessToken: {userId: 18}}}; let params = {ticketFk: 2, stateFk: 3}; let error; try { @@ -26,26 +26,66 @@ describe('ticket changeState()', () => { expect(error).toEqual(new Error(`You don't have enough privileges to change the state of this ticket`)); }); - it('should be able to create a ticket tracking line for a not editable ticket if the user has the production role', async () => { - let ctx = {req: {accessToken: {userId: 50}}}; - let params = {ticketFk: 20, stateFk: 3}; + it('should throw an error if the state is assigned and theres not worker in params', async() => { + let ctx = {req: {accessToken: {userId: 18}}}; + let assignedState = await app.models.State.findOne({where: {code: 'PICKER_DESIGNED'}}); + let params = {ticketFk: 11, stateFk: assignedState.id}; + let error; + try { + await app.models.TicketTracking.changeState(ctx, params); + } catch (e) { + error = e; + } + + expect(error.message).toEqual('La instancia `TicketTracking` no es válida. Detalles: `workerFk` Worker cannot be blank (value: undefined).'); + }); + + it('should throw an error if a worker thats not production tries to change the state to one thats not assigned', async() => { + let ctx = {req: {accessToken: {userId: 110}}}; + let params = {ticketFk: 11, stateFk: 3}; + let error; + try { + await app.models.TicketTracking.changeState(ctx, params); + } catch (e) { + error = e; + } + + expect(error.message).toEqual(`You don't have enough privileges to change the state of this ticket`); + }); + + it('should be able to create a ticket tracking line for a not editable ticket if the user has the production role', async() => { + let ctx = {req: {accessToken: {userId: 49}}}; + let params = {ticketFk: ticket.id, stateFk: 3}; let res = await app.models.TicketTracking.changeState(ctx, params); expect(res.__data.ticketFk).toBe(params.ticketFk); expect(res.__data.stateFk).toBe(params.stateFk); - expect(res.__data.workerFk).toBe(50); + expect(res.__data.workerFk).toBe(49); expect(res.__data.id).toBeDefined(); }); - it('return an array with the created ticket tracking line', async () => { - let ctx = {req: {accessToken: {userId: 108}}}; + it('return an array with the created ticket tracking line', async() => { + let ctx = {req: {accessToken: {userId: 49}}}; let params = {ticketFk: ticket.id, stateFk: 3}; let res = await app.models.TicketTracking.changeState(ctx, params); expect(res.__data.ticketFk).toBe(params.ticketFk); expect(res.__data.stateFk).toBe(params.stateFk); - expect(res.__data.workerFk).toBe(110); + expect(res.__data.workerFk).toBe(49); + expect(res.__data.id).toBeDefined(); + }); + + it('return an array with the created ticket tracking line when the user is salesperson, uses the state assigned and thes a workerFk given', async() => { + let ctx = {req: {accessToken: {userId: 18}}}; + let assignedState = await app.models.State.findOne({where: {code: 'PICKER_DESIGNED'}}); + let params = {ticketFk: ticket.id, stateFk: assignedState.id, workerFk: 1}; + let res = await app.models.TicketTracking.changeState(ctx, params); + + expect(res.__data.ticketFk).toBe(params.ticketFk); + expect(res.__data.stateFk).toBe(params.stateFk); + expect(res.__data.workerFk).toBe(params.workerFk); + expect(res.__data.workerFk).toBe(1); expect(res.__data.id).toBeDefined(); }); }); diff --git a/modules/ticket/back/models/ticket-tracking.js b/modules/ticket/back/models/ticket-tracking.js index 2ebef8a9a9..2b2a935365 100644 --- a/modules/ticket/back/models/ticket-tracking.js +++ b/modules/ticket/back/models/ticket-tracking.js @@ -2,4 +2,5 @@ module.exports = function(Self) { require('../methods/ticket-tracking/changeState')(Self); Self.validatesPresenceOf('stateFk', {message: 'State cannot be blank'}); + Self.validatesPresenceOf('workerFk', {message: 'Worker cannot be blank'}); }; diff --git a/modules/ticket/front/routes.json b/modules/ticket/front/routes.json index 59fd490bf5..f130195e0c 100644 --- a/modules/ticket/front/routes.json +++ b/modules/ticket/front/routes.json @@ -142,7 +142,7 @@ "params": { "ticket": "$ctrl.ticket" }, - "acl": ["production", "administrative"] + "acl": ["production", "administrative", "salesPerson"] }, { "url" : "/sale-checked", diff --git a/modules/ticket/front/tracking/edit/index.html b/modules/ticket/front/tracking/edit/index.html index b2ca12e437..1d26e08dc0 100644 --- a/modules/ticket/front/tracking/edit/index.html +++ b/modules/ticket/front/tracking/edit/index.html @@ -1,9 +1,8 @@ - + + data="$ctrl.params" + form="form">
@@ -11,11 +10,23 @@ + + {{firstName}} {{name}} + diff --git a/modules/ticket/front/tracking/edit/index.js b/modules/ticket/front/tracking/edit/index.js index 77bc7d12fb..f3a64aaaf4 100644 --- a/modules/ticket/front/tracking/edit/index.js +++ b/modules/ticket/front/tracking/edit/index.js @@ -1,7 +1,8 @@ import ngModule from '../../module'; class Controller { - constructor($scope, $state, vnApp, $translate) { + constructor($scope, $state, vnApp, $translate, $http) { + this.$http = $http; this.$ = $scope; this.$state = $state; this.vnApp = vnApp; @@ -9,17 +10,60 @@ class Controller { this.ticket = { ticketFk: $state.params.id }; + this.params = {ticketFk: $state.params.id}; } - onSubmit() { - this.$.watcher.submit().then( - () => { - this.card.reload(); - this.$state.go('ticket.card.tracking.index'); + + $onInit() { + this.getPickerDesignedState(); + } + + set stateFk(value) { + this.params.stateFk = value; + this.isPickerDesignedState = this.getIsPickerDesignedState(value); + } + + get stateFk() { + return this.params.stateFk; + } + + set workerFk(value) { + this.params.workerFk = value; + } + + get workerFk() { + return this.params.workerFk; + } + + getPickerDesignedState() { + let filter = { + where: { + code: 'PICKER_DESIGNED' } - ); + }; + let json = encodeURIComponent(JSON.stringify(filter)); + this.$http.get(`/api/States?filter=${json}`).then(res => { + if (res && res.data) + this.pickerDesignedState = res.data[0].id; + }); + } + + getIsPickerDesignedState(value) { + if (value == this.pickerDesignedState) + return true; + + return false; + } + + onSubmit() { + this.$http.post(`/api/TicketTrackings/changeState`, this.params).then(() => { + this.$.watcher.updateOriginalData(); + this.card.reload(); + this.vnApp.showSuccess(this.$translate.instant('Data saved!')); + this.$state.go('ticket.card.tracking.index'); + }); } } -Controller.$inject = ['$scope', '$state', 'vnApp', '$translate']; +Controller.$inject = ['$scope', '$state', 'vnApp', '$translate', '$http']; ngModule.component('vnTicketTrackingEdit', { template: require('./index.html'), diff --git a/modules/ticket/front/tracking/edit/index.spec.js b/modules/ticket/front/tracking/edit/index.spec.js new file mode 100644 index 0000000000..9d5fbbfb17 --- /dev/null +++ b/modules/ticket/front/tracking/edit/index.spec.js @@ -0,0 +1,74 @@ +import './index'; + +describe('Ticket', () => { + describe('Component vnTicketTrackingEdit', () => { + let controller; + let $httpBackend; + + beforeEach(ngModule('ticket')); + + beforeEach(angular.mock.inject(($componentController, _$httpBackend_, $translate, vnApp) => { + $httpBackend = _$httpBackend_; + controller = $componentController('vnTicketTrackingEdit'); + controller.ticket = {id: 1}; + controller.$ = {watcher: {updateOriginalData: () => {}}}; + controller.card = {reload: () => {}}; + controller.vnApp = {showSuccess: () => {}}; + controller.$translate = $translate; + controller.vnApp = vnApp; + })); + + describe('stateFk setter/getter', () => { + it('should set params.stateFk and set isPickerDesignedState', () => { + let stateFk = {id: 1}; + controller.stateFk = stateFk; + + expect(controller.params.stateFk).toEqual(stateFk); + expect(controller.isPickerDesignedState).toEqual(false); + }); + }); + + describe('workerFk setter', () => { + it('should set params.workerFk', () => { + controller.workerFk = 1; + + expect(controller.params.workerFk).toEqual(1); + }); + }); + + describe('getPickerDesignedState()', () => { + it('should get the state that has the code PICKER_DESIGNED', () => { + let filter = { + where: { + code: 'PICKER_DESIGNED' + } + }; + let json = encodeURIComponent(JSON.stringify(filter)); + $httpBackend.expectGET(`/api/States?filter=${json}`).respond([{id: 22}]); + controller.getPickerDesignedState(); + $httpBackend.flush(); + + expect(controller.pickerDesignedState).toEqual(22); + }); + }); + + describe('onSubmit()', () => { + it('should POST the data, call updateOriginalData, reload, showSuccess and go functions', () => { + controller.params = {stateFk: 22, workerFk: 101}; + spyOn(controller.card, 'reload'); + spyOn(controller.$.watcher, 'updateOriginalData'); + spyOn(controller.vnApp, 'showSuccess'); + spyOn(controller.$state, 'go'); + + $httpBackend.expectPOST(`/api/TicketTrackings/changeState`, controller.params).respond({}); + controller.onSubmit(); + $httpBackend.flush(); + + expect(controller.card.reload).toHaveBeenCalledWith(); + expect(controller.$.watcher.updateOriginalData).toHaveBeenCalledWith(); + expect(controller.vnApp.showSuccess).toHaveBeenCalledWith(controller.$translate.instant('Data saved!')); + expect(controller.$state.go).toHaveBeenCalledWith('ticket.card.tracking.index'); + }); + }); + }); +}); diff --git a/modules/ticket/front/tracking/index/index.html b/modules/ticket/front/tracking/index/index.html index 33ec6761ff..21ef5c176e 100644 --- a/modules/ticket/front/tracking/index/index.html +++ b/modules/ticket/front/tracking/index/index.html @@ -34,6 +34,6 @@ - + \ No newline at end of file diff --git a/modules/ticket/front/tracking/index/index.js b/modules/ticket/front/tracking/index/index.js index 5b127650ef..54b21f76c9 100644 --- a/modules/ticket/front/tracking/index/index.js +++ b/modules/ticket/front/tracking/index/index.js @@ -6,15 +6,15 @@ class Controller { this.filter = { include: [ { - relation: "worker", + relation: 'worker', scope: { - fields: ["firstName", "name"] + fields: ['firstName', 'name'] } }, { - relation: "state", + relation: 'state', scope: { - fields: ["name"] + fields: ['name'] } } ] From b0a60fc94a54cfc8a8e531901c8d85fe14a6ed1e Mon Sep 17 00:00:00 2001 From: Gerard Date: Tue, 22 Jan 2019 10:31:12 +0100 Subject: [PATCH 06/37] #1023 claim.detail cantidad total parecer ser erronea --- modules/claim/front/detail/index.html | 66 ++++++++++++++------------- modules/claim/front/detail/index.js | 17 +++++-- 2 files changed, 49 insertions(+), 34 deletions(-) diff --git a/modules/claim/front/detail/index.html b/modules/claim/front/detail/index.html index 857e1a93eb..2c62a5abbd 100644 --- a/modules/claim/front/detail/index.html +++ b/modules/claim/front/detail/index.html @@ -82,38 +82,42 @@ - + -

Claimable sales from ticket {{$ctrl.claim.ticketFk}}

- - - - Id - Landed - Quantity - Description - Price - Disc. - Total - - - - - {{sale.saleFk}} {{$index}} - {{sale.landed | dateTime: 'dd/MM/yyyy'}} - {{sale.quantity}} - {{sale.concept}} - {{sale.price | currency:'€':2}} - {{sale.discount}} % - - {{(sale.quantity * sale.price) - ((sale.discount * (sale.quantity * sale.price))/100) | currency:'€':2}} - - - - - No results - - + +
Claimable sales from ticket {{$ctrl.claim.ticketFk}}
+
+ + + + + Id + Landed + Quantity + Description + Price + Disc. + Total + + + + + {{sale.saleFk}} {{$index}} + {{sale.landed | dateTime: 'dd/MM/yyyy'}} + {{sale.quantity}} + {{sale.concept}} + {{sale.price | currency:'€':2}} + {{sale.discount}} % + + {{(sale.quantity * sale.price) - ((sale.discount * (sale.quantity * sale.price))/100) | currency:'€':2}} + + + + + No results + + +
{ + this._salesClaimed.forEach(sale => { let orgSale = sale.sale; this.paidTotal += this.getSaleTotal(orgSale); this.claimedTotal += sale.quantity * orgSale.price - ((orgSale.discount * (sale.quantity * orgSale.price)) / 100); @@ -81,7 +92,7 @@ class Controller { } getSaleTotal(sale) { - return sale.quantity * sale.price - ((100 - sale.discount) / 100); + return (sale.quantity * sale.price) - ((100 - sale.discount) / 100); } // Item Descriptor From 471374f32d0add969f371970b8dc322c3e54fd6e Mon Sep 17 00:00:00 2001 From: Gerard Date: Tue, 22 Jan 2019 10:31:36 +0100 Subject: [PATCH 07/37] excluded test due changes in mailer #79 --- modules/client/front/billing-data/index.spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/client/front/billing-data/index.spec.js b/modules/client/front/billing-data/index.spec.js index 52cfeacfad..b8d0f8b116 100644 --- a/modules/client/front/billing-data/index.spec.js +++ b/modules/client/front/billing-data/index.spec.js @@ -30,8 +30,8 @@ describe('Client', () => { expect(controller.notifyChanges).toHaveBeenCalledWith(); }); }); - - describe('notifyChanges()', () => { + // Excluded due mailer changes #79 + xdescribe('notifyChanges()', () => { it(`should perform a GET query`, () => { $httpBackend.when('GET', `/mailer/notification/payment-update/101`).respond(true); $httpBackend.expect('GET', `/mailer/notification/payment-update/101`); From ec1d36f8b926c5ad9c29c6c45127c203702b376a Mon Sep 17 00:00:00 2001 From: Joan Sanchez Date: Tue, 22 Jan 2019 10:57:52 +0100 Subject: [PATCH 08/37] copy print folder on dockerfile build --- Dockerfile | 2 ++ loopback/server/boot/print.js | 2 +- {services/print => print}/config/print.json | 0 {services/print => print}/config/routes.json | 0 {services/print => print}/lib/config.js | 0 {services/print => print}/lib/database.js | 0 {services/print => print}/lib/emailEngine.js | 0 {services/print => print}/lib/errorHandler.js | 0 .../print => print}/lib/exceptions/userException.js | 0 {services/print => print}/lib/mixins/text.js | 0 {services/print => print}/lib/reportEngine.js | 0 {services/print => print}/lib/router.js | 0 {services/print => print}/lib/smtp.js | 0 {services/print => print}/package.json | 0 .../reports/client-welcome/assets/css/style.css | 0 .../reports/client-welcome/index.html | 0 .../print => print}/reports/client-welcome/index.js | 0 .../reports/client-welcome/locale.js | 0 .../reports/delivery-note/assets/css/style.css | 0 .../reports/delivery-note/index.html | 0 .../print => print}/reports/delivery-note/index.js | 0 .../print => print}/reports/delivery-note/locale.js | 0 .../reports/email-footer/assets/css/style.css | 0 .../reports/email-footer/assets/images/action.png | Bin .../reports/email-footer/assets/images/facebook.png | Bin .../reports/email-footer/assets/images/info.png | Bin .../email-footer/assets/images/instagram.png | Bin .../reports/email-footer/assets/images/linkedin.png | Bin .../email-footer/assets/images/pinterest.png | Bin .../reports/email-footer/assets/images/twitter.png | Bin .../reports/email-footer/assets/images/youtube.png | Bin .../print => print}/reports/email-footer/index.html | 0 .../print => print}/reports/email-footer/index.js | 0 .../print => print}/reports/email-footer/locale.js | 0 .../reports/email-header/assets/css/style.css | 0 .../reports/email-header/assets/images/logo.png | Bin .../print => print}/reports/email-header/index.html | 0 .../print => print}/reports/email-header/index.js | 0 .../print => print}/reports/email-header/locale.js | 0 .../reports/letter-debtor-nd/assets/css/style.css | 0 .../reports/letter-debtor-nd/assets/files/model.ezp | Bin .../letter-debtor-nd/assets/files/model2.ezp | Bin .../reports/letter-debtor-nd/index.html | 0 .../reports/letter-debtor-nd/index.js | 0 .../reports/letter-debtor-nd/locale.js | 0 .../reports/letter-debtor-st/assets/css/style.css | 0 .../reports/letter-debtor-st/assets/files/model.ezp | Bin .../letter-debtor-st/assets/files/model2.ezp | Bin .../reports/letter-debtor-st/index.html | 0 .../reports/letter-debtor-st/index.js | 0 .../reports/letter-debtor-st/locale.js | 0 .../reports/payment-update/assets/css/style.css | 0 .../reports/payment-update/index.html | 0 .../print => print}/reports/payment-update/index.js | 0 .../reports/payment-update/locale.js | 0 .../reports/printer-setup/assets/css/style.css | 0 .../reports/printer-setup/assets/files/model.ezp | Bin .../reports/printer-setup/index.html | 0 .../print => print}/reports/printer-setup/index.js | 0 .../print => print}/reports/printer-setup/locale.js | 0 {services/print => print}/server.js | 0 61 files changed, 3 insertions(+), 1 deletion(-) rename {services/print => print}/config/print.json (100%) rename {services/print => print}/config/routes.json (100%) rename {services/print => print}/lib/config.js (100%) rename {services/print => print}/lib/database.js (100%) rename {services/print => print}/lib/emailEngine.js (100%) rename {services/print => print}/lib/errorHandler.js (100%) rename {services/print => print}/lib/exceptions/userException.js (100%) rename {services/print => print}/lib/mixins/text.js (100%) rename {services/print => print}/lib/reportEngine.js (100%) rename {services/print => print}/lib/router.js (100%) rename {services/print => print}/lib/smtp.js (100%) rename {services/print => print}/package.json (100%) rename {services/print => print}/reports/client-welcome/assets/css/style.css (100%) rename {services/print => print}/reports/client-welcome/index.html (100%) rename {services/print => print}/reports/client-welcome/index.js (100%) rename {services/print => print}/reports/client-welcome/locale.js (100%) rename {services/print => print}/reports/delivery-note/assets/css/style.css (100%) rename {services/print => print}/reports/delivery-note/index.html (100%) rename {services/print => print}/reports/delivery-note/index.js (100%) rename {services/print => print}/reports/delivery-note/locale.js (100%) rename {services/print => print}/reports/email-footer/assets/css/style.css (100%) rename {services/print => print}/reports/email-footer/assets/images/action.png (100%) rename {services/print => print}/reports/email-footer/assets/images/facebook.png (100%) rename {services/print => print}/reports/email-footer/assets/images/info.png (100%) rename {services/print => print}/reports/email-footer/assets/images/instagram.png (100%) rename {services/print => print}/reports/email-footer/assets/images/linkedin.png (100%) rename {services/print => print}/reports/email-footer/assets/images/pinterest.png (100%) rename {services/print => print}/reports/email-footer/assets/images/twitter.png (100%) rename {services/print => print}/reports/email-footer/assets/images/youtube.png (100%) rename {services/print => print}/reports/email-footer/index.html (100%) rename {services/print => print}/reports/email-footer/index.js (100%) rename {services/print => print}/reports/email-footer/locale.js (100%) rename {services/print => print}/reports/email-header/assets/css/style.css (100%) rename {services/print => print}/reports/email-header/assets/images/logo.png (100%) rename {services/print => print}/reports/email-header/index.html (100%) rename {services/print => print}/reports/email-header/index.js (100%) rename {services/print => print}/reports/email-header/locale.js (100%) rename {services/print => print}/reports/letter-debtor-nd/assets/css/style.css (100%) rename {services/print => print}/reports/letter-debtor-nd/assets/files/model.ezp (100%) rename {services/print => print}/reports/letter-debtor-nd/assets/files/model2.ezp (100%) rename {services/print => print}/reports/letter-debtor-nd/index.html (100%) rename {services/print => print}/reports/letter-debtor-nd/index.js (100%) rename {services/print => print}/reports/letter-debtor-nd/locale.js (100%) rename {services/print => print}/reports/letter-debtor-st/assets/css/style.css (100%) rename {services/print => print}/reports/letter-debtor-st/assets/files/model.ezp (100%) rename {services/print => print}/reports/letter-debtor-st/assets/files/model2.ezp (100%) rename {services/print => print}/reports/letter-debtor-st/index.html (100%) rename {services/print => print}/reports/letter-debtor-st/index.js (100%) rename {services/print => print}/reports/letter-debtor-st/locale.js (100%) rename {services/print => print}/reports/payment-update/assets/css/style.css (100%) rename {services/print => print}/reports/payment-update/index.html (100%) rename {services/print => print}/reports/payment-update/index.js (100%) rename {services/print => print}/reports/payment-update/locale.js (100%) rename {services/print => print}/reports/printer-setup/assets/css/style.css (100%) rename {services/print => print}/reports/printer-setup/assets/files/model.ezp (100%) rename {services/print => print}/reports/printer-setup/index.html (100%) rename {services/print => print}/reports/printer-setup/index.js (100%) rename {services/print => print}/reports/printer-setup/locale.js (100%) rename {services/print => print}/server.js (100%) diff --git a/Dockerfile b/Dockerfile index 6c0a6a4106..2b55f61d8a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,12 +18,14 @@ RUN apt-get update \ WORKDIR /salix COPY package.json package-lock.json ./ COPY loopback/package.json loopback/ +COPY print/package.json print/ RUN npm install --only=prod COPY loopback loopback COPY back back COPY modules modules COPY dist/webpack-assets.json dist/ +COPY print print COPY \ modules.yml \ LICENSE \ diff --git a/loopback/server/boot/print.js b/loopback/server/boot/print.js index 686578fec9..4a4996d2c0 100644 --- a/loopback/server/boot/print.js +++ b/loopback/server/boot/print.js @@ -1,3 +1,3 @@ module.exports = function(app) { - require('../../../services/print/server.js')(app); + require('../../../print/server.js')(app); }; diff --git a/services/print/config/print.json b/print/config/print.json similarity index 100% rename from services/print/config/print.json rename to print/config/print.json diff --git a/services/print/config/routes.json b/print/config/routes.json similarity index 100% rename from services/print/config/routes.json rename to print/config/routes.json diff --git a/services/print/lib/config.js b/print/lib/config.js similarity index 100% rename from services/print/lib/config.js rename to print/lib/config.js diff --git a/services/print/lib/database.js b/print/lib/database.js similarity index 100% rename from services/print/lib/database.js rename to print/lib/database.js diff --git a/services/print/lib/emailEngine.js b/print/lib/emailEngine.js similarity index 100% rename from services/print/lib/emailEngine.js rename to print/lib/emailEngine.js diff --git a/services/print/lib/errorHandler.js b/print/lib/errorHandler.js similarity index 100% rename from services/print/lib/errorHandler.js rename to print/lib/errorHandler.js diff --git a/services/print/lib/exceptions/userException.js b/print/lib/exceptions/userException.js similarity index 100% rename from services/print/lib/exceptions/userException.js rename to print/lib/exceptions/userException.js diff --git a/services/print/lib/mixins/text.js b/print/lib/mixins/text.js similarity index 100% rename from services/print/lib/mixins/text.js rename to print/lib/mixins/text.js diff --git a/services/print/lib/reportEngine.js b/print/lib/reportEngine.js similarity index 100% rename from services/print/lib/reportEngine.js rename to print/lib/reportEngine.js diff --git a/services/print/lib/router.js b/print/lib/router.js similarity index 100% rename from services/print/lib/router.js rename to print/lib/router.js diff --git a/services/print/lib/smtp.js b/print/lib/smtp.js similarity index 100% rename from services/print/lib/smtp.js rename to print/lib/smtp.js diff --git a/services/print/package.json b/print/package.json similarity index 100% rename from services/print/package.json rename to print/package.json diff --git a/services/print/reports/client-welcome/assets/css/style.css b/print/reports/client-welcome/assets/css/style.css similarity index 100% rename from services/print/reports/client-welcome/assets/css/style.css rename to print/reports/client-welcome/assets/css/style.css diff --git a/services/print/reports/client-welcome/index.html b/print/reports/client-welcome/index.html similarity index 100% rename from services/print/reports/client-welcome/index.html rename to print/reports/client-welcome/index.html diff --git a/services/print/reports/client-welcome/index.js b/print/reports/client-welcome/index.js similarity index 100% rename from services/print/reports/client-welcome/index.js rename to print/reports/client-welcome/index.js diff --git a/services/print/reports/client-welcome/locale.js b/print/reports/client-welcome/locale.js similarity index 100% rename from services/print/reports/client-welcome/locale.js rename to print/reports/client-welcome/locale.js diff --git a/services/print/reports/delivery-note/assets/css/style.css b/print/reports/delivery-note/assets/css/style.css similarity index 100% rename from services/print/reports/delivery-note/assets/css/style.css rename to print/reports/delivery-note/assets/css/style.css diff --git a/services/print/reports/delivery-note/index.html b/print/reports/delivery-note/index.html similarity index 100% rename from services/print/reports/delivery-note/index.html rename to print/reports/delivery-note/index.html diff --git a/services/print/reports/delivery-note/index.js b/print/reports/delivery-note/index.js similarity index 100% rename from services/print/reports/delivery-note/index.js rename to print/reports/delivery-note/index.js diff --git a/services/print/reports/delivery-note/locale.js b/print/reports/delivery-note/locale.js similarity index 100% rename from services/print/reports/delivery-note/locale.js rename to print/reports/delivery-note/locale.js diff --git a/services/print/reports/email-footer/assets/css/style.css b/print/reports/email-footer/assets/css/style.css similarity index 100% rename from services/print/reports/email-footer/assets/css/style.css rename to print/reports/email-footer/assets/css/style.css diff --git a/services/print/reports/email-footer/assets/images/action.png b/print/reports/email-footer/assets/images/action.png similarity index 100% rename from services/print/reports/email-footer/assets/images/action.png rename to print/reports/email-footer/assets/images/action.png diff --git a/services/print/reports/email-footer/assets/images/facebook.png b/print/reports/email-footer/assets/images/facebook.png similarity index 100% rename from services/print/reports/email-footer/assets/images/facebook.png rename to print/reports/email-footer/assets/images/facebook.png diff --git a/services/print/reports/email-footer/assets/images/info.png b/print/reports/email-footer/assets/images/info.png similarity index 100% rename from services/print/reports/email-footer/assets/images/info.png rename to print/reports/email-footer/assets/images/info.png diff --git a/services/print/reports/email-footer/assets/images/instagram.png b/print/reports/email-footer/assets/images/instagram.png similarity index 100% rename from services/print/reports/email-footer/assets/images/instagram.png rename to print/reports/email-footer/assets/images/instagram.png diff --git a/services/print/reports/email-footer/assets/images/linkedin.png b/print/reports/email-footer/assets/images/linkedin.png similarity index 100% rename from services/print/reports/email-footer/assets/images/linkedin.png rename to print/reports/email-footer/assets/images/linkedin.png diff --git a/services/print/reports/email-footer/assets/images/pinterest.png b/print/reports/email-footer/assets/images/pinterest.png similarity index 100% rename from services/print/reports/email-footer/assets/images/pinterest.png rename to print/reports/email-footer/assets/images/pinterest.png diff --git a/services/print/reports/email-footer/assets/images/twitter.png b/print/reports/email-footer/assets/images/twitter.png similarity index 100% rename from services/print/reports/email-footer/assets/images/twitter.png rename to print/reports/email-footer/assets/images/twitter.png diff --git a/services/print/reports/email-footer/assets/images/youtube.png b/print/reports/email-footer/assets/images/youtube.png similarity index 100% rename from services/print/reports/email-footer/assets/images/youtube.png rename to print/reports/email-footer/assets/images/youtube.png diff --git a/services/print/reports/email-footer/index.html b/print/reports/email-footer/index.html similarity index 100% rename from services/print/reports/email-footer/index.html rename to print/reports/email-footer/index.html diff --git a/services/print/reports/email-footer/index.js b/print/reports/email-footer/index.js similarity index 100% rename from services/print/reports/email-footer/index.js rename to print/reports/email-footer/index.js diff --git a/services/print/reports/email-footer/locale.js b/print/reports/email-footer/locale.js similarity index 100% rename from services/print/reports/email-footer/locale.js rename to print/reports/email-footer/locale.js diff --git a/services/print/reports/email-header/assets/css/style.css b/print/reports/email-header/assets/css/style.css similarity index 100% rename from services/print/reports/email-header/assets/css/style.css rename to print/reports/email-header/assets/css/style.css diff --git a/services/print/reports/email-header/assets/images/logo.png b/print/reports/email-header/assets/images/logo.png similarity index 100% rename from services/print/reports/email-header/assets/images/logo.png rename to print/reports/email-header/assets/images/logo.png diff --git a/services/print/reports/email-header/index.html b/print/reports/email-header/index.html similarity index 100% rename from services/print/reports/email-header/index.html rename to print/reports/email-header/index.html diff --git a/services/print/reports/email-header/index.js b/print/reports/email-header/index.js similarity index 100% rename from services/print/reports/email-header/index.js rename to print/reports/email-header/index.js diff --git a/services/print/reports/email-header/locale.js b/print/reports/email-header/locale.js similarity index 100% rename from services/print/reports/email-header/locale.js rename to print/reports/email-header/locale.js diff --git a/services/print/reports/letter-debtor-nd/assets/css/style.css b/print/reports/letter-debtor-nd/assets/css/style.css similarity index 100% rename from services/print/reports/letter-debtor-nd/assets/css/style.css rename to print/reports/letter-debtor-nd/assets/css/style.css diff --git a/services/print/reports/letter-debtor-nd/assets/files/model.ezp b/print/reports/letter-debtor-nd/assets/files/model.ezp similarity index 100% rename from services/print/reports/letter-debtor-nd/assets/files/model.ezp rename to print/reports/letter-debtor-nd/assets/files/model.ezp diff --git a/services/print/reports/letter-debtor-nd/assets/files/model2.ezp b/print/reports/letter-debtor-nd/assets/files/model2.ezp similarity index 100% rename from services/print/reports/letter-debtor-nd/assets/files/model2.ezp rename to print/reports/letter-debtor-nd/assets/files/model2.ezp diff --git a/services/print/reports/letter-debtor-nd/index.html b/print/reports/letter-debtor-nd/index.html similarity index 100% rename from services/print/reports/letter-debtor-nd/index.html rename to print/reports/letter-debtor-nd/index.html diff --git a/services/print/reports/letter-debtor-nd/index.js b/print/reports/letter-debtor-nd/index.js similarity index 100% rename from services/print/reports/letter-debtor-nd/index.js rename to print/reports/letter-debtor-nd/index.js diff --git a/services/print/reports/letter-debtor-nd/locale.js b/print/reports/letter-debtor-nd/locale.js similarity index 100% rename from services/print/reports/letter-debtor-nd/locale.js rename to print/reports/letter-debtor-nd/locale.js diff --git a/services/print/reports/letter-debtor-st/assets/css/style.css b/print/reports/letter-debtor-st/assets/css/style.css similarity index 100% rename from services/print/reports/letter-debtor-st/assets/css/style.css rename to print/reports/letter-debtor-st/assets/css/style.css diff --git a/services/print/reports/letter-debtor-st/assets/files/model.ezp b/print/reports/letter-debtor-st/assets/files/model.ezp similarity index 100% rename from services/print/reports/letter-debtor-st/assets/files/model.ezp rename to print/reports/letter-debtor-st/assets/files/model.ezp diff --git a/services/print/reports/letter-debtor-st/assets/files/model2.ezp b/print/reports/letter-debtor-st/assets/files/model2.ezp similarity index 100% rename from services/print/reports/letter-debtor-st/assets/files/model2.ezp rename to print/reports/letter-debtor-st/assets/files/model2.ezp diff --git a/services/print/reports/letter-debtor-st/index.html b/print/reports/letter-debtor-st/index.html similarity index 100% rename from services/print/reports/letter-debtor-st/index.html rename to print/reports/letter-debtor-st/index.html diff --git a/services/print/reports/letter-debtor-st/index.js b/print/reports/letter-debtor-st/index.js similarity index 100% rename from services/print/reports/letter-debtor-st/index.js rename to print/reports/letter-debtor-st/index.js diff --git a/services/print/reports/letter-debtor-st/locale.js b/print/reports/letter-debtor-st/locale.js similarity index 100% rename from services/print/reports/letter-debtor-st/locale.js rename to print/reports/letter-debtor-st/locale.js diff --git a/services/print/reports/payment-update/assets/css/style.css b/print/reports/payment-update/assets/css/style.css similarity index 100% rename from services/print/reports/payment-update/assets/css/style.css rename to print/reports/payment-update/assets/css/style.css diff --git a/services/print/reports/payment-update/index.html b/print/reports/payment-update/index.html similarity index 100% rename from services/print/reports/payment-update/index.html rename to print/reports/payment-update/index.html diff --git a/services/print/reports/payment-update/index.js b/print/reports/payment-update/index.js similarity index 100% rename from services/print/reports/payment-update/index.js rename to print/reports/payment-update/index.js diff --git a/services/print/reports/payment-update/locale.js b/print/reports/payment-update/locale.js similarity index 100% rename from services/print/reports/payment-update/locale.js rename to print/reports/payment-update/locale.js diff --git a/services/print/reports/printer-setup/assets/css/style.css b/print/reports/printer-setup/assets/css/style.css similarity index 100% rename from services/print/reports/printer-setup/assets/css/style.css rename to print/reports/printer-setup/assets/css/style.css diff --git a/services/print/reports/printer-setup/assets/files/model.ezp b/print/reports/printer-setup/assets/files/model.ezp similarity index 100% rename from services/print/reports/printer-setup/assets/files/model.ezp rename to print/reports/printer-setup/assets/files/model.ezp diff --git a/services/print/reports/printer-setup/index.html b/print/reports/printer-setup/index.html similarity index 100% rename from services/print/reports/printer-setup/index.html rename to print/reports/printer-setup/index.html diff --git a/services/print/reports/printer-setup/index.js b/print/reports/printer-setup/index.js similarity index 100% rename from services/print/reports/printer-setup/index.js rename to print/reports/printer-setup/index.js diff --git a/services/print/reports/printer-setup/locale.js b/print/reports/printer-setup/locale.js similarity index 100% rename from services/print/reports/printer-setup/locale.js rename to print/reports/printer-setup/locale.js diff --git a/services/print/server.js b/print/server.js similarity index 100% rename from services/print/server.js rename to print/server.js From 668da9ac12e8842ca7faac1f7356e061d22b52a3 Mon Sep 17 00:00:00 2001 From: Joan Sanchez Date: Tue, 22 Jan 2019 11:16:14 +0100 Subject: [PATCH 09/37] added print folder to gulpfile install --- gulpfile.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index 8337c451eb..92fb8ee430 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -129,13 +129,7 @@ function install() { const install = require('gulp-install'); const print = require('gulp-print'); - let packageFiles = ['front/package.json']; - let services = fs.readdirSync(servicesDir); - services.forEach(service => { - let packageJson = `${servicesDir}/${service}/package.json`; - if (fs.existsSync(packageJson)) - packageFiles.push(packageJson); - }); + let packageFiles = ['front/package.json', 'print/package.json']; return gulp.src(packageFiles) .pipe(print(filepath => { return `Installing packages in ${filepath}`; From 166546564daf675d67c3ca9c8d251b804a1167b4 Mon Sep 17 00:00:00 2001 From: Joan Sanchez Date: Tue, 22 Jan 2019 11:30:25 +0100 Subject: [PATCH 10/37] updated payment-update path Method --- modules/client/front/billing-data/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/client/front/billing-data/index.js b/modules/client/front/billing-data/index.js index 4583e51b88..40116b4168 100644 --- a/modules/client/front/billing-data/index.js +++ b/modules/client/front/billing-data/index.js @@ -35,7 +35,7 @@ export default class Controller { } notifyChanges() { - this.$http.get(`/email/payment-update`, {clientFk: this.client.id}).then( + this.$http.post(`/email/payment-update`, {clientFk: this.client.id}).then( () => this.vnApp.showMessage(this.$translate.instant('Notification sent!')) ); } From bdce8d9aa56c8e41b6494c518452dfcea6332360 Mon Sep 17 00:00:00 2001 From: Joan Sanchez Date: Tue, 22 Jan 2019 11:48:00 +0100 Subject: [PATCH 11/37] fixed prod config path volume --- print/lib/config.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/print/lib/config.js b/print/lib/config.js index b9e3538a5e..c14538f3e0 100644 --- a/print/lib/config.js +++ b/print/lib/config.js @@ -1,7 +1,7 @@ const fs = require('fs-extra'); let env = process.env.NODE_ENV ? process.env.NODE_ENV : 'development'; -let configPath = `/etc/`; +let configPath = `/etc/salix`; let config = require('../config/print.json'); let configFiles = [ `${configPath}/print.json`, @@ -28,4 +28,5 @@ for (let proxyFile of proxyFiles) { // config.proxy = proxyConf; config.env = env; + module.exports = config; From e45b6886c0544f8d10ce5f627eb54203413bac31 Mon Sep 17 00:00:00 2001 From: Carlos Jimenez Ruiz Date: Tue, 22 Jan 2019 11:54:17 +0100 Subject: [PATCH 12/37] selectors update --- e2e/helpers/selectors.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js index 932ecc845e..f82ffc69dc 100644 --- a/e2e/helpers/selectors.js +++ b/e2e/helpers/selectors.js @@ -454,9 +454,11 @@ export default { observationInput: `vn-textarea[label="Observation"] textarea`, saveButton: `${components.vnSubmit}` }, - claimDetails: { - detailsButton: `vn-left-menu a[ui-sref="claim.card.detail"]`, - addItemButton: `vn-claim-detail a vn-float-button` + claimDetail: { + detailButton: `vn-left-menu a[ui-sref="claim.card.detail"]`, + addItemButton: `vn-claim-detail a vn-float-button`, + firstClaimableSaleFromTicket: 'vn-claim-detail > vn-dialog vn-tbody > vn-tr', + claimDetailLine: 'vn-claim-detail > vn-vertical > vn-card > div > vn-vertical > vn-table > div > vn-tbody > vn-tr' }, claimDevelopment: { developmentButton: 'vn-left-menu a[ui-sref="claim.card.development"]', From b24f0a944215488c7c31a0a20399efd1abf6ab08 Mon Sep 17 00:00:00 2001 From: Gerard Date: Tue, 22 Jan 2019 12:24:19 +0100 Subject: [PATCH 13/37] #1023 claim.detail cantidad total parecer ser erronea --- modules/claim/front/detail/index.html | 1 - modules/claim/front/detail/index.js | 4 +++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/claim/front/detail/index.html b/modules/claim/front/detail/index.html index 2c62a5abbd..63cab4f8bd 100644 --- a/modules/claim/front/detail/index.html +++ b/modules/claim/front/detail/index.html @@ -47,7 +47,6 @@ diff --git a/modules/claim/front/detail/index.js b/modules/claim/front/detail/index.js index bec5e8c3db..69edb7f396 100644 --- a/modules/claim/front/detail/index.js +++ b/modules/claim/front/detail/index.js @@ -92,7 +92,9 @@ class Controller { } getSaleTotal(sale) { - return (sale.quantity * sale.price) - ((100 - sale.discount) / 100); + let total = 0.0; + total += sale.quantity * sale.price - ((sale.discount * (sale.quantity * sale.price)) / 100); + return total; } // Item Descriptor From 5f850e76e2e2a726c06979730dc8dfef0f59a02b Mon Sep 17 00:00:00 2001 From: Carlos Jimenez Ruiz Date: Tue, 22 Jan 2019 13:18:20 +0100 Subject: [PATCH 14/37] #884 e2e claim.detail + bug fixes en autocompleteSearch extension --- e2e/helpers/extensions.js | 1 + e2e/helpers/selectors.js | 5 +- .../claim-module/01_edit_basic_data.spec.js | 4 +- e2e/paths/claim-module/03_detail.spec.js | 64 +++++++++++++++++++ modules/agency/front/index/index.html | 2 +- modules/claim/front/index/index.html | 2 +- modules/client/front/index/index.html | 1 + modules/item/front/index/index.html | 1 + modules/order/front/index/index.html | 2 +- modules/ticket/front/index/index.html | 2 +- modules/travel/front/index/index.html | 2 +- 11 files changed, 78 insertions(+), 8 deletions(-) create mode 100644 e2e/paths/claim-module/03_detail.spec.js diff --git a/e2e/helpers/extensions.js b/e2e/helpers/extensions.js index be9914ef61..0515cf5102 100644 --- a/e2e/helpers/extensions.js +++ b/e2e/helpers/extensions.js @@ -287,6 +287,7 @@ let actions = { this.wait(`vn-searchbar input`) .type(`vn-searchbar input`, searchValue) .click(`vn-searchbar vn-icon[icon="search"]`) + .waitForNumberOfElements('.searchResult', 1) .evaluate(() => { return document.querySelector('ui-view vn-card vn-table') != null; }) diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js index 5e54f4fd5b..e020bdf617 100644 --- a/e2e/helpers/selectors.js +++ b/e2e/helpers/selectors.js @@ -459,7 +459,10 @@ export default { detailButton: `vn-left-menu a[ui-sref="claim.card.detail"]`, addItemButton: `vn-claim-detail a vn-float-button`, firstClaimableSaleFromTicket: 'vn-claim-detail > vn-dialog vn-tbody > vn-tr', - claimDetailLine: 'vn-claim-detail > vn-vertical > vn-card > div > vn-vertical > vn-table > div > vn-tbody > vn-tr' + claimDetailLine: 'vn-claim-detail > vn-vertical > vn-card > div > vn-vertical > vn-table > div > vn-tbody > vn-tr', + secondItemQuantityInput: 'vn-claim-detail vn-tr:nth-child(2) vn-textfield[model="saleClaimed.quantity"] input', + totalClaimed: 'vn-claim-detail > vn-vertical > vn-card > div > vn-vertical > vn-horizontal > div > vn-label-value:nth-child(2) > section > span', + secondItemDeleteButton: 'vn-claim-detail > vn-vertical > vn-card > div > vn-vertical > vn-table > div > vn-tbody > vn-tr:nth-child(2) > vn-td:nth-child(9) > vn-icon-button > button > vn-icon > i' }, claimDevelopment: { developmentButton: 'vn-left-menu a[ui-sref="claim.card.development"]', diff --git a/e2e/paths/claim-module/01_edit_basic_data.spec.js b/e2e/paths/claim-module/01_edit_basic_data.spec.js index 3c9355bb6c..6bc5b87ba7 100644 --- a/e2e/paths/claim-module/01_edit_basic_data.spec.js +++ b/e2e/paths/claim-module/01_edit_basic_data.spec.js @@ -25,8 +25,8 @@ describe('Claim edit basic data path', () => { it('should confirm the claim state was edited', async() => { const result = await nightmare - .click(selectors.claimDetails.detailsButton) - .wait(selectors.claimDetails.addItemButton) + .click(selectors.claimDetail.detailButton) + .wait(selectors.claimDetail.addItemButton) .click(selectors.claimBasicData.basicDataButton) .wait(selectors.claimBasicData.claimStateAutocomplete) .waitToGetProperty(`${selectors.claimBasicData.claimStateAutocomplete} input`, 'value'); diff --git a/e2e/paths/claim-module/03_detail.spec.js b/e2e/paths/claim-module/03_detail.spec.js new file mode 100644 index 0000000000..ae27f3b348 --- /dev/null +++ b/e2e/paths/claim-module/03_detail.spec.js @@ -0,0 +1,64 @@ +import selectors from '../../helpers/selectors.js'; +import createNightmare from '../../helpers/nightmare'; + +describe('Claim detail', () => { + const nightmare = createNightmare(); + + beforeAll(() => { + nightmare + .loginAndModule('salesPerson', 'claim') + .accessToSearchResult('4') + .accessToSection('claim.card.detail'); + }); + + it('should add the first claimable item from ticket to the claim', async() => { + const result = await nightmare + .waitToClick(selectors.claimDetail.addItemButton) + .waitToClick(selectors.claimDetail.firstClaimableSaleFromTicket) + .waitForLastSnackbar(); + + expect(result).toEqual('Data saved!'); + }); + + it('should confirm the claim contains now two items', async() => { + const result = await nightmare + .countElement(selectors.claimDetail.claimDetailLine); + + expect(result).toEqual(2); + }); + + it('should edit de second item claimed quantity', async() => { + const result = await nightmare + .write(selectors.claimDetail.secondItemQuantityInput, 10) + .type('body', '\u000d') // simulates enter + .waitForLastSnackbar(); + + expect(result).toEqual('Data saved!'); + }); + + it('should confirm the second item, and the claimed total were correctly edited', async() => { + const claimedQuantity = await nightmare + .getProperty(selectors.claimDetail.secondItemQuantityInput, 'value'); + + const totalClaimed = await nightmare + .getProperty(selectors.claimDetail.totalClaimed, 'innerText'); + + expect(claimedQuantity).toEqual('10'); + expect(totalClaimed).toEqual('29.50 €'); + }); + + it('should delete the second item from the claim', async() => { + const result = await nightmare + .waitToClick(selectors.claimDetail.secondItemDeleteButton) + .waitForLastSnackbar(); + + expect(result).toEqual('Data saved!'); + }); + + it('should confirm the claim contains now one item', async() => { + const result = await nightmare + .countElement(selectors.claimDetail.claimDetailLine); + + expect(result).toEqual(1); + }); +}); diff --git a/modules/agency/front/index/index.html b/modules/agency/front/index/index.html index 7257c89d27..3675119ebc 100644 --- a/modules/agency/front/index/index.html +++ b/modules/agency/front/index/index.html @@ -31,7 +31,7 @@ - + {{::zone.id}} {{::zone.name}} {{::zone.agencyMode.name}} diff --git a/modules/claim/front/index/index.html b/modules/claim/front/index/index.html index a6ed8c4e02..ef65040549 100644 --- a/modules/claim/front/index/index.html +++ b/modules/claim/front/index/index.html @@ -33,7 +33,7 @@ {{::claim.id}} diff --git a/modules/client/front/index/index.html b/modules/client/front/index/index.html index 9ac8a282ee..0e5fa3f3ec 100644 --- a/modules/client/front/index/index.html +++ b/modules/client/front/index/index.html @@ -18,6 +18,7 @@ diff --git a/modules/item/front/index/index.html b/modules/item/front/index/index.html index 6cc73b7c4c..57ab0f15cc 100644 --- a/modules/item/front/index/index.html +++ b/modules/item/front/index/index.html @@ -19,6 +19,7 @@ diff --git a/modules/order/front/index/index.html b/modules/order/front/index/index.html index 9dd353a527..37f1eb9e76 100644 --- a/modules/order/front/index/index.html +++ b/modules/order/front/index/index.html @@ -30,7 +30,7 @@ - {{::order.id}} diff --git a/modules/ticket/front/index/index.html b/modules/ticket/front/index/index.html index a8d21c5cdf..1953e3cfc3 100644 --- a/modules/ticket/front/index/index.html +++ b/modules/ticket/front/index/index.html @@ -50,7 +50,7 @@ - - + {{::travel.id}} {{::travel.ref}} {{::travel.agency.name}} From 2037c3e1dd50407c2095cca2427f61d9265164c7 Mon Sep 17 00:00:00 2001 From: Carlos Jimenez Ruiz Date: Tue, 22 Jan 2019 13:53:42 +0100 Subject: [PATCH 15/37] fixed broken e2e --- e2e/helpers/selectors.js | 4 ++-- e2e/paths/ticket-module/07_edit_sale.spec.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js index e020bdf617..bbe0f219a1 100644 --- a/e2e/helpers/selectors.js +++ b/e2e/helpers/selectors.js @@ -385,7 +385,7 @@ export default { ticketTracking: { trackingButton: `vn-left-menu a[ui-sref="ticket.card.tracking.index"]`, createStateButton: `${components.vnFloatButton}`, - stateAutocomplete: 'vn-ticket-tracking-edit vn-autocomplete[field="$ctrl.ticket.stateFk"]', + stateAutocomplete: 'vn-ticket-tracking-edit vn-autocomplete[field="$ctrl.stateFk"]', saveButton: `${components.vnSubmit}`, cancelButton: `vn-ticket-tracking-edit vn-button[ui-sref="ticket.card.tracking.index"]` }, @@ -450,7 +450,7 @@ export default { claimBasicData: { basicDataButton: `vn-left-menu a[ui-sref="claim.card.basicData"]`, claimStateAutocomplete: 'vn-claim-basic-data vn-autocomplete[field="$ctrl.claim.claimStateFk"]', - isPaidWithManaCheckbox: `vn-check[field="$ctrl.claim.isChargedToMana"] > label > input`, + isPaidWithManaCheckbox: 'vn-check[field="$ctrl.claim.isChargedToMana"] > label > input', responsabilityInputRange: `vn-input-range`, observationInput: `vn-textarea[label="Observation"] textarea`, saveButton: `${components.vnSubmit}` diff --git a/e2e/paths/ticket-module/07_edit_sale.spec.js b/e2e/paths/ticket-module/07_edit_sale.spec.js index 239c0e83e1..a13afcd26b 100644 --- a/e2e/paths/ticket-module/07_edit_sale.spec.js +++ b/e2e/paths/ticket-module/07_edit_sale.spec.js @@ -11,7 +11,7 @@ describe('Ticket Edit sale path', () => { .accessToSection('ticket.card.sale'); }); - it(`should click on the first claim id to navigate over there`, async() => { + it(`should click on the second claim id to navigate over there`, async() => { const url = await nightmare .waitToClick(selectors.ticketSales.secondSaleClaimId) .wait(selectors.claimBasicData.claimStateAutocomplete) From ea0e56e6a63281edf40dafd400069f54e25d26bc Mon Sep 17 00:00:00 2001 From: Carlos Jimenez Ruiz Date: Tue, 22 Jan 2019 14:10:34 +0100 Subject: [PATCH 16/37] disabled erroHandler (Joan) --- print/lib/errorHandler.js | 6 +++--- print/server.js | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/print/lib/errorHandler.js b/print/lib/errorHandler.js index 21890a068d..ec9bc98c26 100644 --- a/print/lib/errorHandler.js +++ b/print/lib/errorHandler.js @@ -1,9 +1,9 @@ -module.exports = (app) => { - process.on('uncaughtException', (err) => { +module.exports = app => { + process.on('uncaughtException', err => { console.error(`Caught exception: ${err}`); }); - process.on('warning', (err) => { + process.on('warning', () => { console.error(`My warning err`); }); diff --git a/print/server.js b/print/server.js index 29d457d8e7..61eeb32978 100644 --- a/print/server.js +++ b/print/server.js @@ -12,7 +12,7 @@ module.exports = app => { smtp.init(); require('./lib/router')(app); - require('./lib/errorHandler')(app); + // require('./lib/errorHandler')(app); }; From dc46ede5132879d4081551675087cff2c70645df Mon Sep 17 00:00:00 2001 From: Carlos Jimenez Ruiz Date: Tue, 22 Jan 2019 15:55:58 +0100 Subject: [PATCH 17/37] #1020 modificar e2e ticket.tracking --- e2e/helpers/nightmare.js | 2 +- e2e/helpers/selectors.js | 3 +- .../05_create_new_tracking_state.spec.js | 111 +++++++++++++----- loopback/locale/en.json | 4 +- 4 files changed, 85 insertions(+), 35 deletions(-) diff --git a/e2e/helpers/nightmare.js b/e2e/helpers/nightmare.js index f88396fbff..e3b65e16bf 100644 --- a/e2e/helpers/nightmare.js +++ b/e2e/helpers/nightmare.js @@ -12,7 +12,7 @@ export default function createNightmare(width = 1280, height = 720) { nightmare.on('console', (type, message, ...args) => { if (type === 'error') - fail(message); + throw new Error(message); else console[type](message, ...args); }); diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js index bbe0f219a1..12b39939c1 100644 --- a/e2e/helpers/selectors.js +++ b/e2e/helpers/selectors.js @@ -192,7 +192,7 @@ export default { moreMenu: `vn-item-descriptor vn-icon-menu > div > vn-icon`, moreMenuRegularizeButton: `vn-item-descriptor vn-icon-menu > div > vn-drop-down > vn-popover ul > li:nth-child(1)`, regularizeQuantityInput: `vn-item-descriptor > vn-dialog > div > form > div.body > tpl-body > div > vn-textfield > div > div > div.infix > input`, - regularizeWarehouseAutocomplete: `#warehouse`, + regularizeWarehouseAutocomplete: 'vn-item-descriptor > vn-dialog vn-autocomplete[field="$ctrl.warehouseFk"]', regularizeSaveButton: `vn-item-descriptor > vn-dialog > div > form > div.buttons > tpl-buttons > button` }, itemBasicData: { @@ -439,6 +439,7 @@ export default { }, createStateView: { stateAutocomplete: `vn-autocomplete[field="$ctrl.stateFk"]`, + workerAutocomplete: `vn-autocomplete[field="$ctrl.workerFk"]`, clearStateInputButton: `vn-autocomplete[field="$ctrl.stateFk"] > div > div > div > vn-icon > i`, saveStateButton: `${components.vnSubmit}` }, diff --git a/e2e/paths/ticket-module/05_create_new_tracking_state.spec.js b/e2e/paths/ticket-module/05_create_new_tracking_state.spec.js index 8446d84fc9..8ed39f2a00 100644 --- a/e2e/paths/ticket-module/05_create_new_tracking_state.spec.js +++ b/e2e/paths/ticket-module/05_create_new_tracking_state.spec.js @@ -4,47 +4,94 @@ import createNightmare from '../../helpers/nightmare'; describe('Ticket Create new tracking state path', () => { const nightmare = createNightmare(); - beforeAll(() => { - return nightmare - .loginAndModule('production', 'ticket') - .accessToSearchResult('id:1') - .accessToSection('ticket.card.tracking.index'); + describe('as production', () => { + beforeAll(() => { + return nightmare + .loginAndModule('production', 'ticket') + .accessToSearchResult('id:1') + .accessToSection('ticket.card.tracking.index'); + }); + + it('should access to the create state view by clicking the create floating button', async() => { + let url = await nightmare + .waitToClick(selectors.ticketTracking.createStateButton) + .wait(selectors.createStateView.stateAutocomplete) + .parsedUrl(); + + expect(url.hash).toContain('tracking/edit'); + }); + + it(`should attempt create a new state but receive an error if state is empty`, async() => { + let result = await nightmare + .click(selectors.createStateView.saveStateButton) + .waitForLastSnackbar(); + + expect(result).toEqual('State cannot be blank'); + }); + + it(`should attempt create a new state then clear and save it`, async() => { + let result = await nightmare + .autocompleteSearch(selectors.createStateView.stateAutocomplete, '¿Fecha?') + .waitToClick(selectors.createStateView.clearStateInputButton) + .waitToClick(selectors.createStateView.saveStateButton) + .waitForLastSnackbar(); + + expect(result).toEqual('State cannot be blank'); + }); + + + it(`should create a new state`, async() => { + let result = await nightmare + .autocompleteSearch(selectors.createStateView.stateAutocomplete, '¿Fecha?') + .click(selectors.createStateView.saveStateButton) + .waitForLastSnackbar(); + + expect(result).toEqual('Data saved!'); + }); }); - it('should access to the create state view by clicking the create floating button', async() => { - let url = await nightmare - .waitToClick(selectors.ticketTracking.createStateButton) - .wait(selectors.createStateView.stateAutocomplete) - .parsedUrl(); + describe('as salesPerson', () => { + beforeAll(() => { + return nightmare + .loginAndModule('salesPerson', 'ticket') + .accessToSearchResult('id:1') + .accessToSection('ticket.card.tracking.index'); + }); - expect(url.hash).toContain('tracking/edit'); - }); + it('should now access to the create state view by clicking the create floating button', async() => { + let url = await nightmare + .waitToClick(selectors.ticketTracking.createStateButton) + .wait(selectors.createStateView.stateAutocomplete) + .parsedUrl(); - it(`should attempt create a new state but receive an error if state is empty`, async() => { - let result = await nightmare - .click(selectors.createStateView.saveStateButton) - .waitForLastSnackbar(); + expect(url.hash).toContain('tracking/edit'); + }); - expect(result).toEqual('State cannot be blank'); - }); + it(`should attemp to create an state for which salesPerson doesn't have permissions`, async() => { + let result = await nightmare + .autocompleteSearch(selectors.createStateView.stateAutocomplete, '¿Fecha?') + .click(selectors.createStateView.saveStateButton) + .waitForLastSnackbar(); - it(`should attempt create a new state then clear and save it`, async() => { - let result = await nightmare - .autocompleteSearch(selectors.createStateView.stateAutocomplete, '¿Fecha?') - .waitToClick(selectors.createStateView.clearStateInputButton) - .waitToClick(selectors.createStateView.saveStateButton) - .waitForLastSnackbar(); + expect(result).toEqual(`You don't have enough privileges to change the state of this ticket`); + }); - expect(result).toEqual('State cannot be blank'); - }); + it(`should attempt to create an state for the type salesPerson has rights but fail as worker is blank`, async() => { + let result = await nightmare + .autocompleteSearch(selectors.createStateView.stateAutocomplete, 'asignado') + .click(selectors.createStateView.saveStateButton) + .waitForLastSnackbar(); + expect(result).toEqual(`Worker cannot be blank`); + }); - it(`should create a new state`, async() => { - let result = await nightmare - .autocompleteSearch(selectors.createStateView.stateAutocomplete, '¿Fecha?') - .click(selectors.createStateView.saveStateButton) - .waitForLastSnackbar(); + it(`should create a new state with all it's data`, async() => { + let result = await nightmare + .autocompleteSearch(selectors.createStateView.workerAutocomplete, 'accessory') + .click(selectors.createStateView.saveStateButton) + .waitForLastSnackbar(); - expect(result).toEqual('Data saved!'); + expect(result).toEqual('Data saved!'); + }); }); }); diff --git a/loopback/locale/en.json b/loopback/locale/en.json index 9e24f2b04f..bc7db2e301 100644 --- a/loopback/locale/en.json +++ b/loopback/locale/en.json @@ -27,5 +27,7 @@ "Agency cannot be blank": "Agency cannot be blank", "The IBAN does not have the correct format": "The IBAN does not have the correct format", "You can't make changes on the basic data of an confirmed order or with rows": "You can't make changes on the basic data of an confirmed order or with rows", - "You can't create a ticket for a inactive client": "You can't create a ticket for a inactive client" + "You can't create a ticket for a inactive client": "You can't create a ticket for a inactive client", + "Worker cannot be blank": "Worker cannot be blank", + "You don't have enough privileges to change the state of this ticket": "You don't have enough privileges to change the state of this ticket" } \ No newline at end of file From abea5820145b6c9114fc21c1b30d21978a337900 Mon Sep 17 00:00:00 2001 From: Gerard Date: Tue, 22 Jan 2019 16:18:26 +0100 Subject: [PATCH 18/37] #1017 ticket.index --- modules/ticket/back/methods/ticket/filter.js | 9 +++++++++ modules/ticket/front/index/index.js | 12 +++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/modules/ticket/back/methods/ticket/filter.js b/modules/ticket/back/methods/ticket/filter.js index 16255bf82d..929ea92c90 100644 --- a/modules/ticket/back/methods/ticket/filter.js +++ b/modules/ticket/back/methods/ticket/filter.js @@ -63,6 +63,10 @@ module.exports = Self => { arg: 'myTeam', type: 'Boolean', description: `Whether to show only tickets for the current logged user team (For now it shows only the current user tickets)` + }, { + arg: 'mine', + type: 'Boolean', + description: `Whether to show only tickets for the current logged user` }, { arg: 'orderFk', type: 'Number', @@ -107,6 +111,10 @@ module.exports = Self => { teamIds = [worker && worker.id]; } + if (ctx.args && ctx.args.mine || ctx.args.myTeam) + ctx.args.teamIds = teamIds; + + let orderTickets = []; if (ctx.args && ctx.args.orderFk) { let ticketsToSearch = await Self.app.models.OrderTickets.find({where: {orderFk: filter.orderFk}}); @@ -134,6 +142,7 @@ module.exports = Self => { return {'a.provinceFk': value}; case 'stateFk': return {'ts.stateFk': value}; + case 'mine': case 'myTeam': return {'c.salesPersonFk': {inq: teamIds}}; case 'alertLevel': diff --git a/modules/ticket/front/index/index.js b/modules/ticket/front/index/index.js index ba0b6dc6cf..f52b2591be 100644 --- a/modules/ticket/front/index/index.js +++ b/modules/ticket/front/index/index.js @@ -19,9 +19,15 @@ export default class Controller { tomorrow.setHours(23, 59, 59, 999); tomorrow.setTime(tomorrow.getTime() - offset); - // FIXME: History loop - // let filter = {myTeam: true, from: today, to: tomorrow}; - // $state.go('.', {q: JSON.stringify(filter)}); + let sixDays = new Date(today); + sixDays.setDate(today.getDate() + 6); + sixDays.setHours(23, 59, 59, 999); + sixDays.setTime(sixDays.getTime() - offset); + this.filter = {mine: true, from: today, to: sixDays}; + } + + $postLink() { + this.onSearch(this.filter); } onSearch(params) { From 6612d3e3fde7464aaa529d596c96677bd7d79853 Mon Sep 17 00:00:00 2001 From: Carlos Jimenez Ruiz Date: Tue, 22 Jan 2019 16:37:23 +0100 Subject: [PATCH 19/37] traduccion --- loopback/locale/es.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/loopback/locale/es.json b/loopback/locale/es.json index de9547daa6..24f787d33b 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -63,5 +63,6 @@ "Cannot check VIES and Equalization Tax": "No puedes marcar VIES y RE al mismo", "Cannot check Equalization Tax in this NIF/CIF": "No se puede marcar RE en este NIF/CIF", "You can't make changes on the basic data of an confirmed order or with rows": "No puedes cambiar los datos basicos de una orden con artículos", - "INVALID_USER_NAME": "El nombre de usuario solo debe contener letras minúsculas o, a partir del segundo carácter, números o subguiones, no esta permitido el uso de la letra ñ" + "INVALID_USER_NAME": "El nombre de usuario solo debe contener letras minúsculas o, a partir del segundo carácter, números o subguiones, no esta permitido el uso de la letra ñ", + "You can't create a ticket for a frozen client": "No puedes crear un ticket para un cliente congelado" } \ No newline at end of file From 9ebd7a292216d1d111fff3b7f363e913f5e738c9 Mon Sep 17 00:00:00 2001 From: Gerard Date: Wed, 23 Jan 2019 08:37:52 +0100 Subject: [PATCH 20/37] unwanted property deleted --- modules/claim/front/detail/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/claim/front/detail/index.html b/modules/claim/front/detail/index.html index 63cab4f8bd..fb15bf78d1 100644 --- a/modules/claim/front/detail/index.html +++ b/modules/claim/front/detail/index.html @@ -101,7 +101,7 @@ - {{sale.saleFk}} {{$index}} + {{sale.saleFk}} {{sale.landed | dateTime: 'dd/MM/yyyy'}} {{sale.quantity}} {{sale.concept}} From 664b2f15311c5542e98d8df8076920922f296d0a Mon Sep 17 00:00:00 2001 From: Joan Sanchez Date: Wed, 23 Jan 2019 09:33:58 +0100 Subject: [PATCH 21/37] Printer: PDF stream attachments #1001 --- .gitignore | 1 + print/lib/config.js | 2 +- print/lib/emailEngine.js | 47 +++++++++--------- print/lib/errorHandler.js | 21 -------- print/lib/reportEngine.js | 22 +++++--- print/reports/delivery-note/index.js | 1 - print/reports/email-footer/index.js | 10 ++-- print/reports/email-header/index.js | 10 ++-- .../letter-debtor-nd/assets/files/model.ezp | Bin 9845 -> 0 bytes .../letter-debtor-nd/assets/files/model2.ezp | Bin 9845 -> 0 bytes print/reports/letter-debtor-nd/index.js | 3 ++ .../letter-debtor-st/assets/files/model.ezp | Bin 9845 -> 0 bytes .../letter-debtor-st/assets/files/model2.ezp | Bin 9845 -> 0 bytes print/reports/letter-debtor-st/index.js | 28 ++++++----- print/reports/printer-setup/index.js | 2 +- print/server.js | 8 +-- 16 files changed, 72 insertions(+), 83 deletions(-) delete mode 100644 print/lib/errorHandler.js delete mode 100755 print/reports/letter-debtor-nd/assets/files/model.ezp delete mode 100755 print/reports/letter-debtor-nd/assets/files/model2.ezp delete mode 100755 print/reports/letter-debtor-st/assets/files/model.ezp delete mode 100755 print/reports/letter-debtor-st/assets/files/model2.ezp diff --git a/.gitignore b/.gitignore index 9a4c04b956..50d3f3f91a 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ dist/* npm-debug.log .eslintcache datasources.*.json +print.*.json db.json \ No newline at end of file diff --git a/print/lib/config.js b/print/lib/config.js index c14538f3e0..47e58ec777 100644 --- a/print/lib/config.js +++ b/print/lib/config.js @@ -4,6 +4,7 @@ let env = process.env.NODE_ENV ? process.env.NODE_ENV : 'development'; let configPath = `/etc/salix`; let config = require('../config/print.json'); let configFiles = [ + `${appPath}/config/print.${env}.json`, `${configPath}/print.json`, `${configPath}/print.${env}.json` ]; @@ -28,5 +29,4 @@ for (let proxyFile of proxyFiles) { // config.proxy = proxyConf; config.env = env; - module.exports = config; diff --git a/print/lib/emailEngine.js b/print/lib/emailEngine.js index 0ae947137a..cf4eceba19 100644 --- a/print/lib/emailEngine.js +++ b/print/lib/emailEngine.js @@ -47,9 +47,10 @@ module.exports = { * @param {Object} ctx - Request context */ async preFetch(component, ctx) { - const preFetchData = {attachments: []}; - let params = {}; + let mergedData = {attachments: []}; + let asyncData = {}; let data = {}; + let params = {}; if (Object.keys(ctx.body).length > 0) params = ctx.body; @@ -63,36 +64,34 @@ module.exports = { data = component.data(); if (component.hasOwnProperty('asyncData')) { - const asyncData = await component.asyncData(ctx, params); + asyncData = await component.asyncData(ctx, params); if (asyncData.locale) { const locale = component.i18n.messages[asyncData.locale]; - preFetchData.subject = locale.subject; + mergedData.subject = locale.subject; } - - if (asyncData.recipient) - preFetchData.recipient = asyncData.recipient; - - const mergedData = {...data, ...asyncData}; - component.data = function data() { - return mergedData; - }; } - if (data && data.hasOwnProperty('attachments')) { - const fileNames = data.attachments; - fileNames.forEach(attachment => { + mergedData = Object.assign(mergedData, data, asyncData); + + component.data = function data() { + return mergedData; + }; + + if (data.hasOwnProperty('files')) { + const files = data.files; + files.forEach(file => { const componentPath = `${this.path}/${component.name}`; - let fileSrc = componentPath + attachment; + let fileSrc = componentPath + file; - if (attachment.slice(0, 4) === 'http' || attachment.slice(0, 4) === 'https') - fileSrc = attachment; + if (file.slice(0, 4) === 'http' || file.slice(0, 4) === 'https') + fileSrc = file; - const fileName = attachment.split('/').pop(); - preFetchData.attachments.push({ + const fileName = file.split('/').pop(); + mergedData.attachments.push({ filename: fileName, path: fileSrc, - cid: attachment, + cid: file, }); }); } @@ -108,14 +107,14 @@ module.exports = { return Promise.all(promises).then(results => { results.forEach(result => { result.attachments.forEach(atth => { - preFetchData.attachments.push(atth); + mergedData.attachments.push(atth); }); }); - return preFetchData; + return mergedData; }); } - return preFetchData; + return mergedData; }, async attachAssets(component) { diff --git a/print/lib/errorHandler.js b/print/lib/errorHandler.js deleted file mode 100644 index ec9bc98c26..0000000000 --- a/print/lib/errorHandler.js +++ /dev/null @@ -1,21 +0,0 @@ -module.exports = app => { - process.on('uncaughtException', err => { - console.error(`Caught exception: ${err}`); - }); - - process.on('warning', () => { - console.error(`My warning err`); - }); - - app.use(function(error, request, response, next) { - if (!error.httpStatusCode) - return next(error); - - response.status(error.httpStatusCode); - response.json({ - httpStatusCode: error.httpStatusCode, - name: error.name, - message: error.message, - }); - }); -}; diff --git a/print/lib/reportEngine.js b/print/lib/reportEngine.js index 23b1e199ee..0a818acd34 100644 --- a/print/lib/reportEngine.js +++ b/print/lib/reportEngine.js @@ -43,21 +43,29 @@ module.exports = { * @param {Object} ctx - Request context */ async preFetch(component, ctx) { + let mergedData = {}; + let asyncData = {}; let data = {}; + if (Object.keys(ctx.body).length > 0) + params = ctx.body; + + if (Object.keys(ctx.query).length > 0) + params = ctx.query; + await this.attachAssets(component); if (component.hasOwnProperty('data')) data = component.data(); - if (component.hasOwnProperty('asyncData')) { - const fetch = await component.asyncData(ctx, ctx.body); - const mergedData = {...data, ...fetch}; + if (component.hasOwnProperty('asyncData')) + asyncData = await component.asyncData(ctx, params); - component.data = function data() { - return mergedData; - }; - } + mergedData = Object.assign(mergedData, data, asyncData); + + component.data = function data() { + return mergedData; + }; if (component.components) { const components = component.components; diff --git a/print/reports/delivery-note/index.js b/print/reports/delivery-note/index.js index 07f77ffd0e..34c80b1f82 100755 --- a/print/reports/delivery-note/index.js +++ b/print/reports/delivery-note/index.js @@ -4,7 +4,6 @@ const UserException = require(`${appPath}/lib/exceptions/userException`); module.exports = { name: 'delivery-note', async asyncData(ctx, params) { - console.log(params); const promises = []; const dataIndex = promises.push(this.methods.fetchData()) - 1; const itemsIndex = promises.push(this.methods.fetchItems()) - 1; diff --git a/print/reports/email-footer/index.js b/print/reports/email-footer/index.js index 07fc857dde..893e7276ee 100755 --- a/print/reports/email-footer/index.js +++ b/print/reports/email-footer/index.js @@ -1,21 +1,21 @@ module.exports = { name: 'email-footer', - asyncData(ctx, params) { + asyncData(ctx) { return { isPreview: ctx.method === 'GET', }; }, created() { const embeded = []; - this.attachments.map((attachment) => { - const src = this.isPreview ? attachment : `cid:${attachment}`; - embeded[attachment] = src; + this.files.map(file => { + const src = this.isPreview ? file : `cid:${file}`; + embeded[file] = src; }); this.embeded = embeded; }, data() { return { - attachments: [ + files: [ '/assets/images/facebook.png', '/assets/images/twitter.png', '/assets/images/youtube.png', diff --git a/print/reports/email-header/index.js b/print/reports/email-header/index.js index 87b2d1aa9d..93768e86fd 100755 --- a/print/reports/email-header/index.js +++ b/print/reports/email-header/index.js @@ -1,22 +1,22 @@ module.exports = { name: 'email-header', - asyncData(ctx, params) { + asyncData(ctx) { return { isPreview: ctx.method === 'GET', }; }, created() { const embeded = []; - this.attachments.map((attachment) => { - const src = this.isPreview ? attachment : `cid:${attachment}`; - embeded[attachment] = src; + this.files.map(file => { + const src = this.isPreview ? file : `cid:${file}`; + embeded[file] = src; }); this.embeded = embeded; }, data() { return { - attachments: ['/assets/images/logo.png'], + files: ['/assets/images/logo.png'], }; }, }; diff --git a/print/reports/letter-debtor-nd/assets/files/model.ezp b/print/reports/letter-debtor-nd/assets/files/model.ezp deleted file mode 100755 index 297df3d214694a64f677aa40d7305ebddb368e28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9845 zcmeHNe@s=^9sfSKh9||2*4nYk*jse!?10BFM@dJ#3i`0vpitY_kSLZ%eeHwygm-;t z-J%gKNm*tS(`n`!+ib0!u32a6m?If!OGe*lW?J2xVv8HiY(kr?-5+dg_xAbRdkGqLA|nOmjm%q3S;iwKVX~9rJ2ct`=DvXbk6pPdZ8X zCnhhSgbjR{ygPF9yt(<_ydqCtK}q4VlKf@TWXpXUTa~J5TOciFojwVSQ7C(5%OiWG z8@chxnakL`jt^LQ@fkWntLHflI=INIF?af-?ePV#r4-{iUjH~n3!q*MCi$yF;mvg+ zi=J%Ti0mqbi|YcvMHJ?H>ISP!HR$$6j0&`q$d<+yvD&de#U;s->TsPc!zET+##TT& zkx1~z92ac=N=N(GPtg9fXCE*^F$M|!R5b^iqJd^lbs%a)kjE|H6=KX^nB_J5?lOG2 z!6T>~S|KMaK;c*;e+_;(&S|goK$^fh^#}^f?IPcR0L^Ivb=sF2k_mj^ygS+VwoiWW zOs>{Bf1kFYCs(@-^oz*lFfe6vq1Oi74_rl#9#`WD;?FY`sT{`R+q7ZiAT|<5_ zt4cP#7B`0`c{?zX(tq!ho+tc+u#K2s@gGLp=&T;s`EV+KwvpK&=FO=*hrAthZ9q5bQF@KIPJIsw zeGzIQCq2SPuE)X4eMmQQAU^_{`pRa}7Tt`=dKY9L1mV|yKKkGyPb@5e%h1^aU#x47 zY?H@qds7Hr>BE+NH}kp6743{tBr%-f5jYsZKkw<^jxHx#&%uEhKhu^|Az=R{f{1#R@k#`rqe~FnN z@tzy4wS;quG;MA=kge5cB$9so*TvdTQ7CIe{lwRnYQ2!hf!{!hUcmbun0^ROUjxv~ z%E{3<2l>6NAPqME*z7krhnzCnzJBafztUqp6S~DHTuaOxK&$mOh`B|36>}kI=Q^SM zTu(t~aBZZ$fx`9~n-~3&w;wj{%-=*w6I7oKfqw+09K21(_L{QO z&+j$k(eD~NudhRL6ggPXV(PNKuV8EJC6v|g*KA9_gndSG3shRn{ZS$09PixMFi!zK zgZC;UlGA7P&*5qGS1e#bKAO547hZ!oySQ$7dm zd(=&7y^BKu|;!#@w53}Z5DDI22EY&@Xk{?no9jW(0l|{zYTOoHrfz5 z9e~Y)6)pK*>>X?IKCXG;tT`5_d*h2+V`?p-e-FwUX^=MP5!~jl$k2(>kysZ~d^wj- zjJ$5ln7y_>ea25(xts&9 zzt8RsHr0n?o|-^wbkg5^v{yxCyvQba@7owLk4cqiYPjYe&nkUwMP-FPt{=6pWbl}6DrOOK7;vT##@KD_b16O&?L0&P)d+}V2 zH`86eP9*VOjj9>8JxB{aWB#LNb5g$mPi62+*X5y5Fw(+ay%HvB2WOwtf$F#x@hD${^P@h<(oydM&cvC5eiZkL>%&G<{rbQI7z)(o z`5%z*UTyBN+>tX2=5o6%HqS_Svf+~Q%F2qW>he769E0+S`i1F#YrUXN0OhlFWS+z=itNH7ir+hXkVE3nI7=e{Zb+5E60v?FU__Z>5F_Z?e25f zML>^tzr>C-I}?~d-;70^1e+`SVrsFbvoC_kch%>yFAA<>UrZv_boa$6^vCCJUKCz^ zUm*Rd&5KFI;@GW2;appHPx*S@5b=Moc<%jZ74Gr?wKy}RydRk7%=7Gf*bi|JTh`<^ O)c;>mciLg9iT)e;UnVyI diff --git a/print/reports/letter-debtor-nd/assets/files/model2.ezp b/print/reports/letter-debtor-nd/assets/files/model2.ezp deleted file mode 100755 index 297df3d214694a64f677aa40d7305ebddb368e28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9845 zcmeHNe@s=^9sfSKh9||2*4nYk*jse!?10BFM@dJ#3i`0vpitY_kSLZ%eeHwygm-;t z-J%gKNm*tS(`n`!+ib0!u32a6m?If!OGe*lW?J2xVv8HiY(kr?-5+dg_xAbRdkGqLA|nOmjm%q3S;iwKVX~9rJ2ct`=DvXbk6pPdZ8X zCnhhSgbjR{ygPF9yt(<_ydqCtK}q4VlKf@TWXpXUTa~J5TOciFojwVSQ7C(5%OiWG z8@chxnakL`jt^LQ@fkWntLHflI=INIF?af-?ePV#r4-{iUjH~n3!q*MCi$yF;mvg+ zi=J%Ti0mqbi|YcvMHJ?H>ISP!HR$$6j0&`q$d<+yvD&de#U;s->TsPc!zET+##TT& zkx1~z92ac=N=N(GPtg9fXCE*^F$M|!R5b^iqJd^lbs%a)kjE|H6=KX^nB_J5?lOG2 z!6T>~S|KMaK;c*;e+_;(&S|goK$^fh^#}^f?IPcR0L^Ivb=sF2k_mj^ygS+VwoiWW zOs>{Bf1kFYCs(@-^oz*lFfe6vq1Oi74_rl#9#`WD;?FY`sT{`R+q7ZiAT|<5_ zt4cP#7B`0`c{?zX(tq!ho+tc+u#K2s@gGLp=&T;s`EV+KwvpK&=FO=*hrAthZ9q5bQF@KIPJIsw zeGzIQCq2SPuE)X4eMmQQAU^_{`pRa}7Tt`=dKY9L1mV|yKKkGyPb@5e%h1^aU#x47 zY?H@qds7Hr>BE+NH}kp6743{tBr%-f5jYsZKkw<^jxHx#&%uEhKhu^|Az=R{f{1#R@k#`rqe~FnN z@tzy4wS;quG;MA=kge5cB$9so*TvdTQ7CIe{lwRnYQ2!hf!{!hUcmbun0^ROUjxv~ z%E{3<2l>6NAPqME*z7krhnzCnzJBafztUqp6S~DHTuaOxK&$mOh`B|36>}kI=Q^SM zTu(t~aBZZ$fx`9~n-~3&w;wj{%-=*w6I7oKfqw+09K21(_L{QO z&+j$k(eD~NudhRL6ggPXV(PNKuV8EJC6v|g*KA9_gndSG3shRn{ZS$09PixMFi!zK zgZC;UlGA7P&*5qGS1e#bKAO547hZ!oySQ$7dm zd(=&7y^BKu|;!#@w53}Z5DDI22EY&@Xk{?no9jW(0l|{zYTOoHrfz5 z9e~Y)6)pK*>>X?IKCXG;tT`5_d*h2+V`?p-e-FwUX^=MP5!~jl$k2(>kysZ~d^wj- zjJ$5ln7y_>ea25(xts&9 zzt8RsHr0n?o|-^wbkg5^v{yxCyvQba@7owLk4cqiYPjYe&nkUwMP-FPt{=6pWbl}6DrOOK7;vT##@KD_b16O&?L0&P)d+}V2 zH`86eP9*VOjj9>8JxB{aWB#LNb5g$mPi62+*X5y5Fw(+ay%HvB2WOwtf$F#x@hD${^P@h<(oydM&cvC5eiZkL>%&G<{rbQI7z)(o z`5%z*UTyBN+>tX2=5o6%HqS_Svf+~Q%F2qW>he769E0+S`i1F#YrUXN0OhlFWS+z=itNH7ir+hXkVE3nI7=e{Zb+5E60v?FU__Z>5F_Z?e25f zML>^tzr>C-I}?~d-;70^1e+`SVrsFbvoC_kch%>yFAA<>UrZv_boa$6^vCCJUKCz^ zUm*Rd&5KFI;@GW2;appHPx*S@5b=Moc<%jZ74Gr?wKy}RydRk7%=7Gf*bi|JTh`<^ O)c;>mciLg9iT)e;UnVyI diff --git a/print/reports/letter-debtor-nd/index.js b/print/reports/letter-debtor-nd/index.js index bcf7880544..77eec93512 100755 --- a/print/reports/letter-debtor-nd/index.js +++ b/print/reports/letter-debtor-nd/index.js @@ -13,6 +13,9 @@ module.exports = { if (!params.clientFk) throw new UserException('No client id specified'); + if (!params.companyFk) + throw new UserException('No company id specified'); + return this.methods.fetchClientData(params.clientFk, params.companyFk) .then(([result]) => { return Object.assign(data, result[0]); diff --git a/print/reports/letter-debtor-st/assets/files/model.ezp b/print/reports/letter-debtor-st/assets/files/model.ezp deleted file mode 100755 index 297df3d214694a64f677aa40d7305ebddb368e28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9845 zcmeHNe@s=^9sfSKh9||2*4nYk*jse!?10BFM@dJ#3i`0vpitY_kSLZ%eeHwygm-;t z-J%gKNm*tS(`n`!+ib0!u32a6m?If!OGe*lW?J2xVv8HiY(kr?-5+dg_xAbRdkGqLA|nOmjm%q3S;iwKVX~9rJ2ct`=DvXbk6pPdZ8X zCnhhSgbjR{ygPF9yt(<_ydqCtK}q4VlKf@TWXpXUTa~J5TOciFojwVSQ7C(5%OiWG z8@chxnakL`jt^LQ@fkWntLHflI=INIF?af-?ePV#r4-{iUjH~n3!q*MCi$yF;mvg+ zi=J%Ti0mqbi|YcvMHJ?H>ISP!HR$$6j0&`q$d<+yvD&de#U;s->TsPc!zET+##TT& zkx1~z92ac=N=N(GPtg9fXCE*^F$M|!R5b^iqJd^lbs%a)kjE|H6=KX^nB_J5?lOG2 z!6T>~S|KMaK;c*;e+_;(&S|goK$^fh^#}^f?IPcR0L^Ivb=sF2k_mj^ygS+VwoiWW zOs>{Bf1kFYCs(@-^oz*lFfe6vq1Oi74_rl#9#`WD;?FY`sT{`R+q7ZiAT|<5_ zt4cP#7B`0`c{?zX(tq!ho+tc+u#K2s@gGLp=&T;s`EV+KwvpK&=FO=*hrAthZ9q5bQF@KIPJIsw zeGzIQCq2SPuE)X4eMmQQAU^_{`pRa}7Tt`=dKY9L1mV|yKKkGyPb@5e%h1^aU#x47 zY?H@qds7Hr>BE+NH}kp6743{tBr%-f5jYsZKkw<^jxHx#&%uEhKhu^|Az=R{f{1#R@k#`rqe~FnN z@tzy4wS;quG;MA=kge5cB$9so*TvdTQ7CIe{lwRnYQ2!hf!{!hUcmbun0^ROUjxv~ z%E{3<2l>6NAPqME*z7krhnzCnzJBafztUqp6S~DHTuaOxK&$mOh`B|36>}kI=Q^SM zTu(t~aBZZ$fx`9~n-~3&w;wj{%-=*w6I7oKfqw+09K21(_L{QO z&+j$k(eD~NudhRL6ggPXV(PNKuV8EJC6v|g*KA9_gndSG3shRn{ZS$09PixMFi!zK zgZC;UlGA7P&*5qGS1e#bKAO547hZ!oySQ$7dm zd(=&7y^BKu|;!#@w53}Z5DDI22EY&@Xk{?no9jW(0l|{zYTOoHrfz5 z9e~Y)6)pK*>>X?IKCXG;tT`5_d*h2+V`?p-e-FwUX^=MP5!~jl$k2(>kysZ~d^wj- zjJ$5ln7y_>ea25(xts&9 zzt8RsHr0n?o|-^wbkg5^v{yxCyvQba@7owLk4cqiYPjYe&nkUwMP-FPt{=6pWbl}6DrOOK7;vT##@KD_b16O&?L0&P)d+}V2 zH`86eP9*VOjj9>8JxB{aWB#LNb5g$mPi62+*X5y5Fw(+ay%HvB2WOwtf$F#x@hD${^P@h<(oydM&cvC5eiZkL>%&G<{rbQI7z)(o z`5%z*UTyBN+>tX2=5o6%HqS_Svf+~Q%F2qW>he769E0+S`i1F#YrUXN0OhlFWS+z=itNH7ir+hXkVE3nI7=e{Zb+5E60v?FU__Z>5F_Z?e25f zML>^tzr>C-I}?~d-;70^1e+`SVrsFbvoC_kch%>yFAA<>UrZv_boa$6^vCCJUKCz^ zUm*Rd&5KFI;@GW2;appHPx*S@5b=Moc<%jZ74Gr?wKy}RydRk7%=7Gf*bi|JTh`<^ O)c;>mciLg9iT)e;UnVyI diff --git a/print/reports/letter-debtor-st/assets/files/model2.ezp b/print/reports/letter-debtor-st/assets/files/model2.ezp deleted file mode 100755 index 297df3d214694a64f677aa40d7305ebddb368e28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9845 zcmeHNe@s=^9sfSKh9||2*4nYk*jse!?10BFM@dJ#3i`0vpitY_kSLZ%eeHwygm-;t z-J%gKNm*tS(`n`!+ib0!u32a6m?If!OGe*lW?J2xVv8HiY(kr?-5+dg_xAbRdkGqLA|nOmjm%q3S;iwKVX~9rJ2ct`=DvXbk6pPdZ8X zCnhhSgbjR{ygPF9yt(<_ydqCtK}q4VlKf@TWXpXUTa~J5TOciFojwVSQ7C(5%OiWG z8@chxnakL`jt^LQ@fkWntLHflI=INIF?af-?ePV#r4-{iUjH~n3!q*MCi$yF;mvg+ zi=J%Ti0mqbi|YcvMHJ?H>ISP!HR$$6j0&`q$d<+yvD&de#U;s->TsPc!zET+##TT& zkx1~z92ac=N=N(GPtg9fXCE*^F$M|!R5b^iqJd^lbs%a)kjE|H6=KX^nB_J5?lOG2 z!6T>~S|KMaK;c*;e+_;(&S|goK$^fh^#}^f?IPcR0L^Ivb=sF2k_mj^ygS+VwoiWW zOs>{Bf1kFYCs(@-^oz*lFfe6vq1Oi74_rl#9#`WD;?FY`sT{`R+q7ZiAT|<5_ zt4cP#7B`0`c{?zX(tq!ho+tc+u#K2s@gGLp=&T;s`EV+KwvpK&=FO=*hrAthZ9q5bQF@KIPJIsw zeGzIQCq2SPuE)X4eMmQQAU^_{`pRa}7Tt`=dKY9L1mV|yKKkGyPb@5e%h1^aU#x47 zY?H@qds7Hr>BE+NH}kp6743{tBr%-f5jYsZKkw<^jxHx#&%uEhKhu^|Az=R{f{1#R@k#`rqe~FnN z@tzy4wS;quG;MA=kge5cB$9so*TvdTQ7CIe{lwRnYQ2!hf!{!hUcmbun0^ROUjxv~ z%E{3<2l>6NAPqME*z7krhnzCnzJBafztUqp6S~DHTuaOxK&$mOh`B|36>}kI=Q^SM zTu(t~aBZZ$fx`9~n-~3&w;wj{%-=*w6I7oKfqw+09K21(_L{QO z&+j$k(eD~NudhRL6ggPXV(PNKuV8EJC6v|g*KA9_gndSG3shRn{ZS$09PixMFi!zK zgZC;UlGA7P&*5qGS1e#bKAO547hZ!oySQ$7dm zd(=&7y^BKu|;!#@w53}Z5DDI22EY&@Xk{?no9jW(0l|{zYTOoHrfz5 z9e~Y)6)pK*>>X?IKCXG;tT`5_d*h2+V`?p-e-FwUX^=MP5!~jl$k2(>kysZ~d^wj- zjJ$5ln7y_>ea25(xts&9 zzt8RsHr0n?o|-^wbkg5^v{yxCyvQba@7owLk4cqiYPjYe&nkUwMP-FPt{=6pWbl}6DrOOK7;vT##@KD_b16O&?L0&P)d+}V2 zH`86eP9*VOjj9>8JxB{aWB#LNb5g$mPi62+*X5y5Fw(+ay%HvB2WOwtf$F#x@hD${^P@h<(oydM&cvC5eiZkL>%&G<{rbQI7z)(o z`5%z*UTyBN+>tX2=5o6%HqS_Svf+~Q%F2qW>he769E0+S`i1F#YrUXN0OhlFWS+z=itNH7ir+hXkVE3nI7=e{Zb+5E60v?FU__Z>5F_Z?e25f zML>^tzr>C-I}?~d-;70^1e+`SVrsFbvoC_kch%>yFAA<>UrZv_boa$6^vCCJUKCz^ zUm*Rd&5KFI;@GW2;appHPx*S@5b=Moc<%jZ74Gr?wKy}RydRk7%=7Gf*bi|JTh`<^ O)c;>mciLg9iT)e;UnVyI diff --git a/print/reports/letter-debtor-st/index.js b/print/reports/letter-debtor-st/index.js index 7fb41092ed..8fb51e408b 100755 --- a/print/reports/letter-debtor-st/index.js +++ b/print/reports/letter-debtor-st/index.js @@ -1,11 +1,14 @@ const database = require(`${appPath}/lib/database`); +const reportEngine = require(`${appPath}/lib/reportEngine.js`); const emailHeader = require('../email-header'); const emailFooter = require('../email-footer'); const UserException = require(`${appPath}/lib/exceptions/userException`); + module.exports = { name: 'letter-debtor-st', async asyncData(ctx, params) { + const promises = []; const data = { isPreview: ctx.method === 'GET', }; @@ -16,23 +19,24 @@ module.exports = { if (!params.companyFk) throw new UserException('No company id specified'); - return this.methods.fetchClientData(params.clientFk, params.companyFk) - .then(([[result]]) => { - if (!result) throw new UserException('Client data not found'); + promises.push(reportEngine.toPdf('delivery-note', ctx)); + promises.push(this.methods.fetchClient(params.clientFk, params.companyFk)); - return Object.assign(data, result); - }); + return Promise.all(promises).then(result => { + const stream = result[0]; + const [[client]] = result[1]; + + Object.assign(data, client); + Object.assign(data, {attachments: [{filename: 'delivery-note.pdf', content: stream}]}); + + return data; + }); }, created() { this.$i18n.locale = this.locale; }, - data() { - return { - attachments: ['http://localhost:5000/report/delivery-note'], - }; - }, methods: { - fetchClientData(clientFk, companyFk) { + fetchClient(clientFk, companyFk) { return database.pool.query(` SELECT u.lang locale, @@ -47,7 +51,7 @@ module.exports = { JOIN bankEntity be ON be.id = sa.bankEntityFk JOIN account.user u ON u.id = c.id WHERE c.id = ? AND cny.id = ?`, [clientFk, companyFk]); - }, + } }, computed: { accountAddress: function() { diff --git a/print/reports/printer-setup/index.js b/print/reports/printer-setup/index.js index d32ea9c18b..b15542fe42 100755 --- a/print/reports/printer-setup/index.js +++ b/print/reports/printer-setup/index.js @@ -23,7 +23,7 @@ module.exports = { }, data() { return { - attachments: ['/assets/files/model.ezp'], + files: ['/assets/files/model.ezp'], }; }, methods: { diff --git a/print/server.js b/print/server.js index 61eeb32978..31830009df 100644 --- a/print/server.js +++ b/print/server.js @@ -1,18 +1,14 @@ -const database = require('./lib/database'); -const smtp = require('./lib/smtp'); - module.exports = app => { global.appPath = __dirname; process.env.OPENSSL_CONF = '/etc/ssl/'; // Init database instance - database.init(); + require('./lib/database').init(); // Init SMTP Instance - smtp.init(); + require('./lib/smtp').init(); require('./lib/router')(app); - // require('./lib/errorHandler')(app); }; From 121c574ca314aea2f18d475e3f1759d7508f9c88 Mon Sep 17 00:00:00 2001 From: Joan Sanchez Date: Wed, 23 Jan 2019 09:45:35 +0100 Subject: [PATCH 22/37] install libfontconfig --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index 2b55f61d8a..510faa06b9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,6 +6,7 @@ RUN apt-get update \ curl \ ca-certificates \ gnupg2 \ + libfontconfig \ && curl -sL https://deb.nodesource.com/setup_8.x | bash - \ && apt-get install -y --no-install-recommends \ nodejs \ From 5bf430400d5edd47730cc79f3659779b2de02e82 Mon Sep 17 00:00:00 2001 From: Joan Sanchez Date: Wed, 23 Jan 2019 11:08:27 +0100 Subject: [PATCH 23/37] show results count #992 --- modules/order/front/catalog/index.html | 5 ++- modules/order/front/catalog/index.js | 3 +- modules/order/front/locale/es.yml | 1 + package-lock.json | 53 +++++++++++++++++--------- 4 files changed, 42 insertions(+), 20 deletions(-) diff --git a/modules/order/front/catalog/index.html b/modules/order/front/catalog/index.html index debf64170b..dece81ccf2 100644 --- a/modules/order/front/catalog/index.html +++ b/modules/order/front/catalog/index.html @@ -7,11 +7,12 @@ - + - + + More than {{model.limit}} results Date: Wed, 23 Jan 2019 11:17:18 +0100 Subject: [PATCH 24/37] test fixed --- modules/ticket/back/methods/ticket/filter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ticket/back/methods/ticket/filter.js b/modules/ticket/back/methods/ticket/filter.js index 929ea92c90..e21993733d 100644 --- a/modules/ticket/back/methods/ticket/filter.js +++ b/modules/ticket/back/methods/ticket/filter.js @@ -111,7 +111,7 @@ module.exports = Self => { teamIds = [worker && worker.id]; } - if (ctx.args && ctx.args.mine || ctx.args.myTeam) + if (ctx.args && (ctx.args.mine || ctx.args.myTeam)) ctx.args.teamIds = teamIds; From aeb0f65fecd7e98de27f9c3f35e100261c6bab42 Mon Sep 17 00:00:00 2001 From: Gerard Date: Wed, 23 Jan 2019 12:30:32 +0100 Subject: [PATCH 25/37] #1037 order.descriptor --- modules/order/back/model-config.json | 3 ++ modules/order/back/models/order-ticket.json | 31 ++++++++++++++++++ modules/ticket/back/methods/ticket/filter.js | 2 +- modules/ticket/front/index/index.js | 33 +++++++++++--------- 4 files changed, 54 insertions(+), 15 deletions(-) create mode 100644 modules/order/back/models/order-ticket.json diff --git a/modules/order/back/model-config.json b/modules/order/back/model-config.json index ed0b39e8d6..389c97e46d 100644 --- a/modules/order/back/model-config.json +++ b/modules/order/back/model-config.json @@ -4,5 +4,8 @@ }, "OrderRow": { "dataSource": "vn" + }, + "OrderTicket": { + "dataSource": "vn" } } diff --git a/modules/order/back/models/order-ticket.json b/modules/order/back/models/order-ticket.json new file mode 100644 index 0000000000..2875ebdfca --- /dev/null +++ b/modules/order/back/models/order-ticket.json @@ -0,0 +1,31 @@ +{ + "name": "OrderTicket", + "base": "VnModel", + "options": { + "mysql": { + "table": "orderTicket" + } + }, + "properties": { + "orderFk": { + "id": true, + "type": "Number" + }, + "ticketFk": { + "id": true, + "type": "Number" + } + }, + "relations": { + "ticket": { + "type": "belongsTo", + "model": "Ticket", + "foreignKey": "ticketFk" + }, + "order": { + "type": "belongsTo", + "model": "Order", + "foreignKey": "orderFk" + } + } +} diff --git a/modules/ticket/back/methods/ticket/filter.js b/modules/ticket/back/methods/ticket/filter.js index e21993733d..4e165f1238 100644 --- a/modules/ticket/back/methods/ticket/filter.js +++ b/modules/ticket/back/methods/ticket/filter.js @@ -117,7 +117,7 @@ module.exports = Self => { let orderTickets = []; if (ctx.args && ctx.args.orderFk) { - let ticketsToSearch = await Self.app.models.OrderTickets.find({where: {orderFk: filter.orderFk}}); + let ticketsToSearch = await Self.app.models.OrderTicket.find({where: {orderFk: ctx.args.orderFk}}); ticketsToSearch.forEach(ticket => { orderTickets.push(ticket.ticketFk); }); diff --git a/modules/ticket/front/index/index.js b/modules/ticket/front/index/index.js index f52b2591be..878f05b791 100644 --- a/modules/ticket/front/index/index.js +++ b/modules/ticket/front/index/index.js @@ -2,32 +2,37 @@ import ngModule from '../module'; import './style.scss'; export default class Controller { - constructor($scope, $state) { + constructor($scope, $state, $stateparams) { this.$ = $scope; + this.$stateparams = $stateparams; this.$state = $state; this.selectedTicket = null; this.moreOptions = [ {callback: this.goToTurns, name: 'Turns', always: true}, ]; - let today = new Date(); - let offset = today.getTimezoneOffset() * 60000; - today.setHours(0, 0, 0, 0); - today.setTime(today.getTime() - offset); + if (!$state && !$stateparams) { + let today = new Date(); + let offset = today.getTimezoneOffset() * 60000; + today.setHours(0, 0, 0, 0); + today.setTime(today.getTime() - offset); - let tomorrow = new Date(today); - tomorrow.setHours(23, 59, 59, 999); - tomorrow.setTime(tomorrow.getTime() - offset); + let tomorrow = new Date(today); + tomorrow.setHours(23, 59, 59, 999); + tomorrow.setTime(tomorrow.getTime() - offset); - let sixDays = new Date(today); - sixDays.setDate(today.getDate() + 6); - sixDays.setHours(23, 59, 59, 999); - sixDays.setTime(sixDays.getTime() - offset); - this.filter = {mine: true, from: today, to: sixDays}; + let sixDays = new Date(today); + sixDays.setDate(today.getDate() + 6); + sixDays.setHours(23, 59, 59, 999); + sixDays.setTime(sixDays.getTime() - offset); + + this.filter = {mine: true, from: today, to: sixDays}; + } } $postLink() { - this.onSearch(this.filter); + if (this.filter) + this.onSearch(this.filter); } onSearch(params) { From 05933781dc63954b9c54f9ab99d0507c199750ce Mon Sep 17 00:00:00 2001 From: Gerard Date: Wed, 23 Jan 2019 12:34:42 +0100 Subject: [PATCH 26/37] #1031 order.create que se puedan crear tickets para clientes con riesgo --- modules/order/back/methods/order/new.js | 7 ------- .../order/back/methods/order/specs/new.spec.js | 15 --------------- 2 files changed, 22 deletions(-) diff --git a/modules/order/back/methods/order/new.js b/modules/order/back/methods/order/new.js index dbbc51ad03..0375155d24 100644 --- a/modules/order/back/methods/order/new.js +++ b/modules/order/back/methods/order/new.js @@ -27,7 +27,6 @@ module.exports = Self => { {relation: 'client'} ] }); - let clientFk = address.clientFk; if (address.client().isFreezed) throw new UserError(`You can't create an order for a frozen client`); @@ -38,12 +37,6 @@ module.exports = Self => { if (!address.client().isTaxDataChecked) throw new UserError(`You can't create an order for a client that doesn't has tax data verified`); - let query = `SELECT vn.clientGetDebt(?, CURDATE()) AS debt`; - let clientDebt = await Self.rawSql(query, [clientFk]); - - if (address.client().credit - clientDebt[0].debt <= 0) - throw new UserError(`You can't create an order for a client that has a debt`); - query = `CALL vn.orderListCreate(?, ?, ?, ?);`; [result] = await Self.rawSql(query, [ params.landed, diff --git a/modules/order/back/methods/order/specs/new.spec.js b/modules/order/back/methods/order/specs/new.spec.js index 1806ec24de..93588e408e 100644 --- a/modules/order/back/methods/order/specs/new.spec.js +++ b/modules/order/back/methods/order/specs/new.spec.js @@ -44,21 +44,6 @@ describe('order new()', () => { expect(error).toEqual(new UserError(`You can't create an order for a client that doesn't has tax data verified`)); }); - it('should throw an error if the client isnt frozen and is active, has data checked but has a debt', async() => { - let error; - let params = { - addressFk: 123, - landed: new Date() - }; - - await app.models.Order.new(params) - .catch(e => { - error = e; - }); - - expect(error).toEqual(new UserError(`You can't create an order for a client that has a debt`)); - }); - it('should create a new order for the user with id 105 when all conditions are met', async() => { let params = { landed: new Date(), From 61bd8740ce979af1a5753dadb45ba6bbdc78276e Mon Sep 17 00:00:00 2001 From: Gerard Date: Wed, 23 Jan 2019 12:46:45 +0100 Subject: [PATCH 27/37] modal-form class renamed --- modules/claim/front/detail/index.html | 2 +- modules/item/front/ticket-descriptor/addStowaway.html | 2 +- modules/item/front/ticket-descriptor/removeStowaway.html | 2 +- modules/item/front/ticket-descriptor/style.scss | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/claim/front/detail/index.html b/modules/claim/front/detail/index.html index fb15bf78d1..35abfdf83c 100644 --- a/modules/claim/front/detail/index.html +++ b/modules/claim/front/detail/index.html @@ -81,7 +81,7 @@ - +
Claimable sales from ticket {{$ctrl.claim.ticketFk}}
diff --git a/modules/item/front/ticket-descriptor/addStowaway.html b/modules/item/front/ticket-descriptor/addStowaway.html index 93a09b713d..64bb65554c 100644 --- a/modules/item/front/ticket-descriptor/addStowaway.html +++ b/modules/item/front/ticket-descriptor/addStowaway.html @@ -1,6 +1,6 @@ diff --git a/modules/item/front/ticket-descriptor/removeStowaway.html b/modules/item/front/ticket-descriptor/removeStowaway.html index 481bde1950..7653d25b78 100644 --- a/modules/item/front/ticket-descriptor/removeStowaway.html +++ b/modules/item/front/ticket-descriptor/removeStowaway.html @@ -1,5 +1,5 @@ diff --git a/modules/item/front/ticket-descriptor/style.scss b/modules/item/front/ticket-descriptor/style.scss index 3d6ca7aed6..7c1a448d07 100644 --- a/modules/item/front/ticket-descriptor/style.scss +++ b/modules/item/front/ticket-descriptor/style.scss @@ -1,6 +1,6 @@ @import 'colors'; -vn-dialog.modalForm { +vn-dialog.modal-form { vn-horizontal.header{ background-color: $main-01; h5{ From cd28d559c4a6999ccae21a9e1d738753bfd7e6e1 Mon Sep 17 00:00:00 2001 From: Gerard Date: Wed, 23 Jan 2019 14:12:05 +0100 Subject: [PATCH 28/37] #1026 ticket.line --- front/core/components/fetched-tags/index.html | 2 +- front/core/components/fetched-tags/index.js | 3 ++- modules/ticket/front/sale/index.html | 2 +- modules/ticket/front/summary/index.html | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/front/core/components/fetched-tags/index.html b/front/core/components/fetched-tags/index.html index 49232862a1..3b1dc54f6d 100644 --- a/front/core/components/fetched-tags/index.html +++ b/front/core/components/fetched-tags/index.html @@ -1,5 +1,5 @@ - {{::$ctrl.item.name}} + {{::$ctrl.title}}
- + {{sale.quantity}} - + {{::sale.quantity}} {{::sale.price | currency:'€':2}} {{::sale.discount}} % From b466886adc86c3266018bab56de1fef945045491 Mon Sep 17 00:00:00 2001 From: Joan Sanchez Date: Wed, 23 Jan 2019 14:53:13 +0100 Subject: [PATCH 29/37] fixed dialog was aplying text-transform to all buttons --- front/core/components/dialog/style.scss | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/front/core/components/dialog/style.scss b/front/core/components/dialog/style.scss index a2f11b25d7..5a8457b87f 100644 --- a/front/core/components/dialog/style.scss +++ b/front/core/components/dialog/style.scss @@ -33,17 +33,12 @@ display: block; width: 20em; } - button, - input[type="button"], - input[type="submit"], - input[type="reset"] { + & > button.close { @extend %clickable; text-transform: uppercase; background-color: transparent; border: none; border-radius: .1em; - } - & > button.close { position: absolute; top: 0; right: 0; @@ -62,6 +57,11 @@ input[type="button"], input[type="submit"], input[type="reset"] { + @extend %clickable; + text-transform: uppercase; + background-color: transparent; + border: none; + border-radius: .1em; color: $main-01; font-family: vn-font-bold; padding: .7em; From 649c09c551edcbe011e164afd71c523176b0e49c Mon Sep 17 00:00:00 2001 From: Gerard Date: Wed, 23 Jan 2019 15:06:11 +0100 Subject: [PATCH 30/37] #1025 item.create al crear articulo nuevo no busca tipo ni color --- modules/item/front/create/index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/item/front/create/index.html b/modules/item/front/create/index.html index 51b83b4049..0055056c84 100644 --- a/modules/item/front/create/index.html +++ b/modules/item/front/create/index.html @@ -24,7 +24,7 @@ fields="['code', 'name']" value-field="id" field="$ctrl.item.typeFk" - search-function="{or: [{code: {regexp: $search}}, {name: {regexp: $search}}]}"> + search-function="{or: [{code: {like: '%'+ $search +'%'}}, {name: {like: '%'+ $search +'%'}}]}">
{{::code}}
{{::name}}
@@ -36,7 +36,7 @@ show-field="description" value-field="id" field="$ctrl.item.intrastatFk" - search-function="{or: [{id: {regexp: $search}}, {description: {regexp: $search}}]}"> + search-function="{or: [{id: {like: '%'+ $search +'%'}}, {description: {like: '%'+ $search +'%'}}]}">
{{::id}}
{{::description}}
From 648bd46862708ee5e672c6428fd398e81a303745 Mon Sep 17 00:00:00 2001 From: Carlos Jimenez Ruiz Date: Wed, 23 Jan 2019 15:33:25 +0100 Subject: [PATCH 31/37] small e2e refactors --- .../claim-module/01_edit_basic_data.spec.js | 4 +- e2e/paths/claim-module/03_detail.spec.js | 6 +- .../client-module/01_create_client.spec.js | 20 +++---- .../client-module/02_edit_basic_data.spec.js | 20 +++---- .../client-module/03_edit_fiscal_data.spec.js | 14 ++--- .../client-module/04_edit_pay_method.spec.js | 14 ++--- .../06_add_address_notes.spec.js | 7 +-- .../client-module/07_edit_web_access.spec.js | 2 +- e2e/paths/client-module/08_add_notes.spec.js | 2 +- e2e/paths/client-module/09_add_credit.spec.js | 2 +- e2e/paths/client-module/10_add_greuge.spec.js | 4 +- .../12_lock_of_verified_data.spec.js | 22 +++---- e2e/paths/client-module/13_log.spec.js | 3 +- e2e/paths/client-module/14_risk.spec.js | 9 ++- e2e/paths/item-module/01_item_summary.spec.js | 5 +- .../02_edit_item_basic_data.spec.js | 7 +-- .../item-module/04_create_item_tags.spec.js | 4 +- .../item-module/05_create_item_niche.spec.js | 2 +- .../06_create_item_botanical.spec.js | 5 +- .../07_create_item_barcode.spec.js | 8 +-- .../item-module/09_regularize_item.spec.js | 22 +++---- .../01_create_ticket_observations.spec.js | 2 +- .../04_create_ticket_packages.spec.js | 6 +- .../05_create_new_tracking_state.spec.js | 2 +- e2e/paths/ticket-module/07_edit_sale.spec.js | 57 +++++++------------ .../ticket-module/09_ticket_weekly.spec.js | 6 +- .../ticket-module/10_ticket_request.spec.js | 7 +-- .../ticket-module/11_ticket_diary.spec.js | 3 +- .../12_delete_ticket_from_descriptor.spec.js | 6 +- loopback/locale/es.json | 3 +- package-lock.json | 12 ++-- 31 files changed, 123 insertions(+), 163 deletions(-) diff --git a/e2e/paths/claim-module/01_edit_basic_data.spec.js b/e2e/paths/claim-module/01_edit_basic_data.spec.js index 6bc5b87ba7..283e4b7659 100644 --- a/e2e/paths/claim-module/01_edit_basic_data.spec.js +++ b/e2e/paths/claim-module/01_edit_basic_data.spec.js @@ -16,7 +16,7 @@ describe('Claim edit basic data path', () => { .autocompleteSearch(selectors.claimBasicData.claimStateAutocomplete, 'Gestionado') .waitToClick(selectors.claimBasicData.isPaidWithManaCheckbox) .clearInput(selectors.claimBasicData.observationInput) - .type(selectors.claimBasicData.observationInput, 'edited observation') + .write(selectors.claimBasicData.observationInput, 'edited observation') .click(selectors.claimBasicData.saveButton) .waitForSnackbar(); @@ -55,7 +55,7 @@ describe('Claim edit basic data path', () => { .autocompleteSearch(selectors.claimBasicData.claimStateAutocomplete, 'Pendiente') .waitToClick(selectors.claimBasicData.isPaidWithManaCheckbox) .clearInput(selectors.claimBasicData.observationInput) - .type(selectors.claimBasicData.observationInput, 'Observation one') + .write(selectors.claimBasicData.observationInput, 'Observation one') .click(selectors.claimBasicData.saveButton) .waitForSnackbar(); diff --git a/e2e/paths/claim-module/03_detail.spec.js b/e2e/paths/claim-module/03_detail.spec.js index ae27f3b348..1a7112ff8f 100644 --- a/e2e/paths/claim-module/03_detail.spec.js +++ b/e2e/paths/claim-module/03_detail.spec.js @@ -30,7 +30,7 @@ describe('Claim detail', () => { it('should edit de second item claimed quantity', async() => { const result = await nightmare .write(selectors.claimDetail.secondItemQuantityInput, 10) - .type('body', '\u000d') // simulates enter + .write('body', '\u000d') // simulates enter .waitForLastSnackbar(); expect(result).toEqual('Data saved!'); @@ -38,10 +38,10 @@ describe('Claim detail', () => { it('should confirm the second item, and the claimed total were correctly edited', async() => { const claimedQuantity = await nightmare - .getProperty(selectors.claimDetail.secondItemQuantityInput, 'value'); + .waitToGetProperty(selectors.claimDetail.secondItemQuantityInput, 'value'); const totalClaimed = await nightmare - .getProperty(selectors.claimDetail.totalClaimed, 'innerText'); + .waitToGetProperty(selectors.claimDetail.totalClaimed, 'innerText'); expect(claimedQuantity).toEqual('10'); expect(totalClaimed).toEqual('29.50 €'); diff --git a/e2e/paths/client-module/01_create_client.spec.js b/e2e/paths/client-module/01_create_client.spec.js index 06c981c15e..b6a4c54f7f 100644 --- a/e2e/paths/client-module/01_create_client.spec.js +++ b/e2e/paths/client-module/01_create_client.spec.js @@ -11,8 +11,7 @@ describe('Client create path', () => { it(`should search for the user Carol Danvers to confirm it isn't created yet`, async() => { const result = await nightmare - .wait(selectors.clientsIndex.searchClientInput) - .type(selectors.clientsIndex.searchClientInput, 'Carol Danvers') + .write(selectors.clientsIndex.searchClientInput, 'Carol Danvers') .click(selectors.clientsIndex.searchButton) .waitForNumberOfElements(selectors.clientsIndex.searchResult, 0) .countElement(selectors.clientsIndex.searchResult); @@ -39,9 +38,9 @@ describe('Client create path', () => { it('should receive an error when clicking the create button having name and Business name fields empty', async() => { const result = await nightmare - .type(selectors.createClientView.taxNumber, '74451390E') - .type(selectors.createClientView.userName, 'CaptainMarvel') - .type(selectors.createClientView.email, 'CarolDanvers@verdnatura.es') + .write(selectors.createClientView.taxNumber, '74451390E') + .write(selectors.createClientView.userName, 'CaptainMarvel') + .write(selectors.createClientView.email, 'CarolDanvers@verdnatura.es') .autocompleteSearch(selectors.createClientView.salesPersonAutocomplete, 'Accessory') .click(selectors.createClientView.createButton) .waitForLastSnackbar(); @@ -51,10 +50,10 @@ describe('Client create path', () => { it(`should attempt to create a new user with all it's data but wrong email`, async() => { const result = await nightmare - .type(selectors.createClientView.name, 'Carol Danvers') - .type(selectors.createClientView.socialName, 'AVG tax') + .write(selectors.createClientView.name, 'Carol Danvers') + .write(selectors.createClientView.socialName, 'AVG tax') .clearInput(selectors.createClientView.email) - .type(selectors.createClientView.email, 'incorrect email format') + .write(selectors.createClientView.email, 'incorrect email format') .click(selectors.createClientView.createButton) .waitForLastSnackbar(); @@ -64,7 +63,7 @@ describe('Client create path', () => { it(`should create a new user with all correct data`, async() => { const result = await nightmare .clearInput(selectors.createClientView.email) - .type(selectors.createClientView.email, 'caroldanvers@verdnatura.es') + .write(selectors.createClientView.email, 'caroldanvers@verdnatura.es') .click(selectors.createClientView.createButton) .waitForLastSnackbar(); @@ -84,8 +83,7 @@ describe('Client create path', () => { it(`should search for the user Carol Danvers to confirm it exists`, async() => { const result = await nightmare - .wait(selectors.clientsIndex.searchClientInput) - .type(selectors.clientsIndex.searchClientInput, 'Carol Danvers') + .write(selectors.clientsIndex.searchClientInput, 'Carol Danvers') .click(selectors.clientsIndex.searchButton) .waitForNumberOfElements(selectors.clientsIndex.searchResult, 1) .countElement(selectors.clientsIndex.searchResult); diff --git a/e2e/paths/client-module/02_edit_basic_data.spec.js b/e2e/paths/client-module/02_edit_basic_data.spec.js index 0f3111ab91..43a8274cd5 100644 --- a/e2e/paths/client-module/02_edit_basic_data.spec.js +++ b/e2e/paths/client-module/02_edit_basic_data.spec.js @@ -24,15 +24,15 @@ describe('Client Edit basicData path', () => { it('should edit the client basic data but leave salesPerson untainted', async() => { const result = await nightmare .clearInput(selectors.clientBasicData.nameInput) - .type(selectors.clientBasicData.nameInput, 'Ptonomy Wallace') + .write(selectors.clientBasicData.nameInput, 'Ptonomy Wallace') .clearInput(selectors.clientBasicData.contactInput) - .type(selectors.clientBasicData.contactInput, 'David Haller') + .write(selectors.clientBasicData.contactInput, 'David Haller') .clearInput(selectors.clientBasicData.phoneInput) - .type(selectors.clientBasicData.phoneInput, '987654321') + .write(selectors.clientBasicData.phoneInput, '987654321') .clearInput(selectors.clientBasicData.mobileInput) - .type(selectors.clientBasicData.mobileInput, '123456789') + .write(selectors.clientBasicData.mobileInput, '123456789') .clearInput(selectors.clientBasicData.emailInput) - .type(selectors.clientBasicData.emailInput, 'PWallace@verdnatura.es') + .write(selectors.clientBasicData.emailInput, 'PWallace@verdnatura.es') .autocompleteSearch(selectors.clientBasicData.channelAutocomplete, 'Rumors on the streets') .click(selectors.clientBasicData.saveButton) .waitForLastSnackbar(); @@ -108,15 +108,15 @@ describe('Client Edit basicData path', () => { it('should edit the client basic data including salesPerson', async() => { const result = await nightmare .clearInput(selectors.clientBasicData.nameInput) - .type(selectors.clientBasicData.nameInput, 'Ororo Munroe') + .write(selectors.clientBasicData.nameInput, 'Ororo Munroe') .clearInput(selectors.clientBasicData.contactInput) - .type(selectors.clientBasicData.contactInput, 'Black Panther') + .write(selectors.clientBasicData.contactInput, 'Black Panther') .clearInput(selectors.clientBasicData.phoneInput) - .type(selectors.clientBasicData.phoneInput, '123456789') + .write(selectors.clientBasicData.phoneInput, '123456789') .clearInput(selectors.clientBasicData.mobileInput) - .type(selectors.clientBasicData.mobileInput, '987654321') + .write(selectors.clientBasicData.mobileInput, '987654321') .clearInput(selectors.clientBasicData.emailInput) - .type(selectors.clientBasicData.emailInput, 'Storm@verdnatura.es') + .write(selectors.clientBasicData.emailInput, 'Storm@verdnatura.es') .autocompleteSearch(selectors.clientBasicData.salesPersonAutocomplete, 'Accessory') .autocompleteSearch(selectors.clientBasicData.channelAutocomplete, 'Metropolis newspaper') .click(selectors.clientBasicData.saveButton) diff --git a/e2e/paths/client-module/03_edit_fiscal_data.spec.js b/e2e/paths/client-module/03_edit_fiscal_data.spec.js index ada6adb78c..1686556916 100644 --- a/e2e/paths/client-module/03_edit_fiscal_data.spec.js +++ b/e2e/paths/client-module/03_edit_fiscal_data.spec.js @@ -67,15 +67,15 @@ describe('Client Edit fiscalData path', () => { const result = await nightmare .wait(selectors.clientFiscalData.socialNameInput) .clearInput(selectors.clientFiscalData.socialNameInput) - .type(selectors.clientFiscalData.socialNameInput, 'SMASH!') + .write(selectors.clientFiscalData.socialNameInput, 'SMASH!') .clearInput(selectors.clientFiscalData.fiscalIdInput) - .type(selectors.clientFiscalData.fiscalIdInput, '94980061C') + .write(selectors.clientFiscalData.fiscalIdInput, '94980061C') .clearInput(selectors.clientFiscalData.addressInput) - .type(selectors.clientFiscalData.addressInput, 'Somewhere edited') + .write(selectors.clientFiscalData.addressInput, 'Somewhere edited') .clearInput(selectors.clientFiscalData.postcodeInput) - .type(selectors.clientFiscalData.postcodeInput, '12345') + .write(selectors.clientFiscalData.postcodeInput, '12345') .clearInput(selectors.clientFiscalData.cityInput) - .type(selectors.clientFiscalData.cityInput, 'N/A') + .write(selectors.clientFiscalData.cityInput, 'N/A') .autocompleteSearch(selectors.clientFiscalData.countryAutocomplete, 'Francia') .autocompleteSearch(selectors.clientFiscalData.provinceAutocomplete, 'Province two') .waitToClick(selectors.clientFiscalData.activeCheckboxLabel) @@ -96,7 +96,7 @@ describe('Client Edit fiscalData path', () => { const result = await nightmare .waitToClick(selectors.clientFiscalData.viesCheckboxInput) .clearInput(selectors.clientFiscalData.fiscalIdInput) - .type(selectors.clientFiscalData.fiscalIdInput, 'A94980061C') + .write(selectors.clientFiscalData.fiscalIdInput, 'A94980061C') .waitToClick(selectors.clientFiscalData.saveButton) .waitForLastSnackbar(); @@ -106,7 +106,7 @@ describe('Client Edit fiscalData path', () => { it('should finally edit the fixcal data correctly as VIES isnt checked and fiscal id is valid for EQtax', async() => { const result = await nightmare .clearInput(selectors.clientFiscalData.fiscalIdInput) - .type(selectors.clientFiscalData.fiscalIdInput, '94980061C') + .write(selectors.clientFiscalData.fiscalIdInput, '94980061C') .waitToClick(selectors.clientFiscalData.saveButton) .waitForLastSnackbar(); diff --git a/e2e/paths/client-module/04_edit_pay_method.spec.js b/e2e/paths/client-module/04_edit_pay_method.spec.js index ee26b5cf3e..5af4c894f0 100644 --- a/e2e/paths/client-module/04_edit_pay_method.spec.js +++ b/e2e/paths/client-module/04_edit_pay_method.spec.js @@ -16,7 +16,7 @@ describe('Client Edit pay method path', () => { .autocompleteSearch(selectors.clientPayMethod.payMethodAutocomplete, 'PayMethod with IBAN') .autocompleteSearch(selectors.clientPayMethod.swiftBicAutocomplete, 'BBKKESMMMMM') .clearInput(selectors.clientPayMethod.dueDayInput) - .type(selectors.clientPayMethod.dueDayInput, '60') + .write(selectors.clientPayMethod.dueDayInput, '60') .waitForTextInInput(selectors.clientPayMethod.dueDayInput, '60') .waitToClick(selectors.clientPayMethod.receivedCoreLCRCheckbox) .waitToClick(selectors.clientPayMethod.receivedCoreVNLCheckbox) @@ -31,7 +31,7 @@ describe('Client Edit pay method path', () => { const snackbarMessage = await nightmare .waitToClick(selectors.clientPayMethod.clearswiftBicButton) .clearInput(selectors.clientPayMethod.IBANInput) - .type(selectors.clientPayMethod.IBANInput, 'FR9121000418450200051332') + .write(selectors.clientPayMethod.IBANInput, 'FR9121000418450200051332') .waitForTextInInput(selectors.clientPayMethod.IBANInput, 'FR9121000418450200051332') .wait(1000) .waitToClick(selectors.clientPayMethod.saveButton) @@ -42,10 +42,10 @@ describe('Client Edit pay method path', () => { it(`should create a new BIC code`, async() => { const newcode = await nightmare - .click(selectors.clientPayMethod.newBankEntityButton) - .type(selectors.clientPayMethod.newBankEntityName, 'Gotham City Bank') - .type(selectors.clientPayMethod.newBankEntityBIC, 'GTHMCT') - .click(selectors.clientPayMethod.acceptBankEntityButton) + .waitToClick(selectors.clientPayMethod.newBankEntityButton) + .write(selectors.clientPayMethod.newBankEntityName, 'Gotham City Bank') + .write(selectors.clientPayMethod.newBankEntityBIC, 'GTHMCT') + .waitToClick(selectors.clientPayMethod.acceptBankEntityButton) .waitToGetProperty(`${selectors.clientPayMethod.swiftBicAutocomplete} input`, 'value'); expect(newcode).toEqual('GTHMCT Gotham City Bank'); @@ -62,7 +62,7 @@ describe('Client Edit pay method path', () => { const AutomaticCode = await nightmare .clearInput(selectors.clientPayMethod.IBANInput) .waitToClick(selectors.clientPayMethod.clearswiftBicButton) - .type(selectors.clientPayMethod.IBANInput, 'ES9121000418450200051332') + .write(selectors.clientPayMethod.IBANInput, 'ES9121000418450200051332') .waitToGetProperty(`${selectors.clientPayMethod.swiftBicAutocomplete} input`, 'value'); expect(AutomaticCode).toEqual('CAIXESBB Caixa Bank'); diff --git a/e2e/paths/client-module/06_add_address_notes.spec.js b/e2e/paths/client-module/06_add_address_notes.spec.js index a27f624302..5434bfc085 100644 --- a/e2e/paths/client-module/06_add_address_notes.spec.js +++ b/e2e/paths/client-module/06_add_address_notes.spec.js @@ -24,8 +24,7 @@ describe('Client add address notes path', () => { it('should not save a description without observation type', async() => { const result = await nightmare .waitToClick(selectors.clientAddresses.addObservationButton) - .wait(selectors.clientAddresses.firstObservationDescriptionInput) - .type(selectors.clientAddresses.firstObservationDescriptionInput, 'first description') + .write(selectors.clientAddresses.firstObservationDescriptionInput, 'first description') .waitToClick(selectors.clientAddresses.saveButton) .waitForLastSnackbar(); @@ -44,10 +43,10 @@ describe('Client add address notes path', () => { it('should create two new observations', async() => { const result = await nightmare - .type(selectors.clientAddresses.firstObservationDescriptionInput, 'first description') + .write(selectors.clientAddresses.firstObservationDescriptionInput, 'first description') .waitToClick(selectors.clientAddresses.addObservationButton) .autocompleteSearch(selectors.clientAddresses.secondObservationTypeAutocomplete, 'observation one') - .type(selectors.clientAddresses.secondObservationDescriptionInput, 'second description') + .write(selectors.clientAddresses.secondObservationDescriptionInput, 'second description') .waitToClick(selectors.clientAddresses.saveButton) .waitForLastSnackbar(); diff --git a/e2e/paths/client-module/07_edit_web_access.spec.js b/e2e/paths/client-module/07_edit_web_access.spec.js index 71721d9ca1..6f8ef2843f 100644 --- a/e2e/paths/client-module/07_edit_web_access.spec.js +++ b/e2e/paths/client-module/07_edit_web_access.spec.js @@ -15,7 +15,7 @@ describe('Client Edit web access path', () => { const result = await nightmare .waitToClick(selectors.clientWebAccess.enableWebAccessCheckbox) .clearInput(selectors.clientWebAccess.userNameInput) - .type(selectors.clientWebAccess.userNameInput, 'Hulk') + .write(selectors.clientWebAccess.userNameInput, 'Hulk') .waitToClick(selectors.clientWebAccess.saveButton) .waitForLastSnackbar(); diff --git a/e2e/paths/client-module/08_add_notes.spec.js b/e2e/paths/client-module/08_add_notes.spec.js index 5a488ff676..c5c9defbc2 100644 --- a/e2e/paths/client-module/08_add_notes.spec.js +++ b/e2e/paths/client-module/08_add_notes.spec.js @@ -22,7 +22,7 @@ describe('Client Add notes path', () => { it(`should create a note`, async() => { const result = await nightmare - .type(selectors.clientNotes.noteInput, 'Meeting with Black Widow 21st 9am') + .write(selectors.clientNotes.noteInput, 'Meeting with Black Widow 21st 9am') .click(selectors.clientNotes.saveButton) .waitForLastSnackbar(); diff --git a/e2e/paths/client-module/09_add_credit.spec.js b/e2e/paths/client-module/09_add_credit.spec.js index 0cbd0c7037..a37fb0e736 100644 --- a/e2e/paths/client-module/09_add_credit.spec.js +++ b/e2e/paths/client-module/09_add_credit.spec.js @@ -23,7 +23,7 @@ describe('Client Add credit path', () => { it(`should edit the credit`, async() => { const result = await nightmare .clearInput(selectors.clientCredit.creditInput) - .type(selectors.clientCredit.creditInput, 999) + .write(selectors.clientCredit.creditInput, 999) .click(selectors.clientCredit.saveButton) .waitForLastSnackbar(); diff --git a/e2e/paths/client-module/10_add_greuge.spec.js b/e2e/paths/client-module/10_add_greuge.spec.js index c1ca1ba18f..5f845df84f 100644 --- a/e2e/paths/client-module/10_add_greuge.spec.js +++ b/e2e/paths/client-module/10_add_greuge.spec.js @@ -31,9 +31,9 @@ describe('Client Add greuge path', () => { it(`should create a new greuge with all its data`, async() => { const result = await nightmare - .type(selectors.clientGreuge.amountInput, 999) + .write(selectors.clientGreuge.amountInput, 999) .waitForTextInInput(selectors.clientGreuge.amountInput, '999') - .type(selectors.clientGreuge.descriptionInput, 'new armor for Batman!') + .write(selectors.clientGreuge.descriptionInput, 'new armor for Batman!') .click(selectors.clientGreuge.saveButton) .waitForLastSnackbar(); diff --git a/e2e/paths/client-module/12_lock_of_verified_data.spec.js b/e2e/paths/client-module/12_lock_of_verified_data.spec.js index 9026325519..ba0141a783 100644 --- a/e2e/paths/client-module/12_lock_of_verified_data.spec.js +++ b/e2e/paths/client-module/12_lock_of_verified_data.spec.js @@ -27,7 +27,7 @@ describe('Client lock verified data path', () => { const result = await nightmare .wait(selectors.clientFiscalData.socialNameInput) .clearInput(selectors.clientFiscalData.socialNameInput) - .type(selectors.clientFiscalData.socialNameInput, 'salesPerson was here') + .write(selectors.clientFiscalData.socialNameInput, 'salesPerson was here') .click(selectors.clientFiscalData.saveButton) .waitForLastSnackbar(); @@ -65,8 +65,7 @@ describe('Client lock verified data path', () => { it('should search again for the user Petter Parker', async() => { const resultCount = await nightmare - .wait(selectors.clientsIndex.searchClientInput) - .type(selectors.clientsIndex.searchClientInput, 'Petter Parker') + .write(selectors.clientsIndex.searchClientInput, 'Petter Parker') .click(selectors.clientsIndex.searchButton) .waitForNumberOfElements(selectors.clientsIndex.searchResult, 1) .countElement(selectors.clientsIndex.searchResult); @@ -130,7 +129,7 @@ describe('Client lock verified data path', () => { const result = await nightmare .wait(selectors.clientFiscalData.socialNameInput) .clearInput(selectors.clientFiscalData.socialNameInput) - .type(selectors.clientFiscalData.socialNameInput, 'administrative was here') + .write(selectors.clientFiscalData.socialNameInput, 'administrative was here') .click(selectors.clientFiscalData.saveButton) .waitForLastSnackbar(); @@ -168,8 +167,7 @@ describe('Client lock verified data path', () => { it('should again search for the user Petter Parker', async() => { const resultCount = await nightmare - .wait(selectors.clientsIndex.searchClientInput) - .type(selectors.clientsIndex.searchClientInput, 'Petter Parker') + .write(selectors.clientsIndex.searchClientInput, 'Petter Parker') .click(selectors.clientsIndex.searchButton) .waitForNumberOfElements(selectors.clientsIndex.searchResult, 1) .countElement(selectors.clientsIndex.searchResult); @@ -209,9 +207,8 @@ describe('Client lock verified data path', () => { it('should not be able to save change throwing a verified data error', async() => { const result = await nightmare - .wait(selectors.clientFiscalData.socialNameInput) .clearInput(selectors.clientFiscalData.socialNameInput) - .type(selectors.clientFiscalData.socialNameInput, 'salesPerson was here') + .write(selectors.clientFiscalData.socialNameInput, 'salesPerson was here') .click(selectors.clientFiscalData.saveButton) .waitForSnackbar(); @@ -239,8 +236,7 @@ describe('Client lock verified data path', () => { it('should now search again for the user Petter Parker', async() => { const resultCount = await nightmare - .wait(selectors.clientsIndex.searchClientInput) - .type(selectors.clientsIndex.searchClientInput, 'Petter Parker') + .write(selectors.clientsIndex.searchClientInput, 'Petter Parker') .click(selectors.clientsIndex.searchButton) .waitForNumberOfElements(selectors.clientsIndex.searchResult, 1) .countElement(selectors.clientsIndex.searchResult); @@ -280,9 +276,8 @@ describe('Client lock verified data path', () => { it('should now edit the social name', async() => { const result = await nightmare - .wait(selectors.clientFiscalData.socialNameInput) .clearInput(selectors.clientFiscalData.socialNameInput) - .type(selectors.clientFiscalData.socialNameInput, 'salesAssistant was here') + .write(selectors.clientFiscalData.socialNameInput, 'salesAssistant was here') .click(selectors.clientFiscalData.saveButton) .waitForLastSnackbar(); @@ -320,8 +315,7 @@ describe('Client lock verified data path', () => { it('should once again search for the user Petter Parker', async() => { const resultCount = await nightmare - .wait(selectors.clientsIndex.searchClientInput) - .type(selectors.clientsIndex.searchClientInput, 'Petter Parker') + .write(selectors.clientsIndex.searchClientInput, 'Petter Parker') .click(selectors.clientsIndex.searchButton) .waitForNumberOfElements(selectors.clientsIndex.searchResult, 1) .countElement(selectors.clientsIndex.searchResult); diff --git a/e2e/paths/client-module/13_log.spec.js b/e2e/paths/client-module/13_log.spec.js index 046c281fc1..2a82744ff3 100644 --- a/e2e/paths/client-module/13_log.spec.js +++ b/e2e/paths/client-module/13_log.spec.js @@ -13,9 +13,8 @@ describe('Client log path', () => { it('should update the clients name', async() => { let result = await nightmare - .wait(selectors.clientBasicData.nameInput) .clearInput(selectors.clientBasicData.nameInput) - .type(selectors.clientBasicData.nameInput, 'this is a test') + .write(selectors.clientBasicData.nameInput, 'this is a test') .waitToClick(selectors.clientBasicData.saveButton) .waitForLastSnackbar(); diff --git a/e2e/paths/client-module/14_risk.spec.js b/e2e/paths/client-module/14_risk.spec.js index 49154daeed..3f8e2eb8bf 100644 --- a/e2e/paths/client-module/14_risk.spec.js +++ b/e2e/paths/client-module/14_risk.spec.js @@ -23,7 +23,7 @@ describe('Client risk path', () => { it('should create a new payment that clears the debt', async() => { let result = await nightmare .clearInput(selectors.clientRisk.newPaymentBankInut) - .type(selectors.clientRisk.newPaymentBankInut, '2') + .write(selectors.clientRisk.newPaymentBankInut, '2') .waitToClick(selectors.clientRisk.saveButton) .waitForLastSnackbar(); @@ -49,7 +49,7 @@ describe('Client risk path', () => { it('should create a new payment that sets the balance to positive value', async() => { let result = await nightmare .clearInput(selectors.clientRisk.newPaymentAmountInput) - .type(selectors.clientRisk.newPaymentAmountInput, '100') + .write(selectors.clientRisk.newPaymentAmountInput, '100') .waitToClick(selectors.clientRisk.saveButton) .waitForLastSnackbar(); @@ -75,7 +75,7 @@ describe('Client risk path', () => { it('should create a new payment that sets the balance back to the original negative value', async() => { let result = await nightmare .clearInput(selectors.clientRisk.newPaymentAmountInput) - .type(selectors.clientRisk.newPaymentAmountInput, '-150') + .write(selectors.clientRisk.newPaymentAmountInput, '-150') .waitToClick(selectors.clientRisk.saveButton) .waitForLastSnackbar(); @@ -103,8 +103,7 @@ describe('Client risk path', () => { it('should now search for the user Petter Parker', async() => { let resultCount = await nightmare - .wait(selectors.clientsIndex.searchClientInput) - .type(selectors.clientsIndex.searchClientInput, 'Petter Parker') + .write(selectors.clientsIndex.searchClientInput, 'Petter Parker') .click(selectors.clientsIndex.searchButton) .waitForNumberOfElements(selectors.clientsIndex.searchResult, 1) .countElement(selectors.clientsIndex.searchResult); diff --git a/e2e/paths/item-module/01_item_summary.spec.js b/e2e/paths/item-module/01_item_summary.spec.js index d454ddf815..b5922be358 100644 --- a/e2e/paths/item-module/01_item_summary.spec.js +++ b/e2e/paths/item-module/01_item_summary.spec.js @@ -11,8 +11,7 @@ describe('Item summary path', () => { it('should search for an item', async() => { const result = await nightmare - .wait(selectors.itemsIndex.searchItemInput) - .type(selectors.itemsIndex.searchItemInput, 'Object1 Gem1 5') + .write(selectors.itemsIndex.searchItemInput, 'Object1 Gem1 5') .click(selectors.itemsIndex.searchButton) .waitForNumberOfElements(selectors.itemsIndex.searchResult, 1) .countElement(selectors.itemsIndex.searchResult); @@ -85,7 +84,7 @@ describe('Item summary path', () => { const result = await nightmare .clearInput('vn-item-index vn-searchbar input') .click(selectors.itemsIndex.searchButton) - .type(selectors.itemsIndex.searchItemInput, 'Object2 Gem2 3') + .write(selectors.itemsIndex.searchItemInput, 'Object2 Gem2 3') .click(selectors.itemsIndex.searchButton) .waitForNumberOfElements(selectors.itemsIndex.searchResult, 1) .countElement(selectors.itemsIndex.searchResult); diff --git a/e2e/paths/item-module/02_edit_item_basic_data.spec.js b/e2e/paths/item-module/02_edit_item_basic_data.spec.js index 0d0a397d9d..2c74400c82 100644 --- a/e2e/paths/item-module/02_edit_item_basic_data.spec.js +++ b/e2e/paths/item-module/02_edit_item_basic_data.spec.js @@ -13,17 +13,16 @@ describe('Item Edit basic data path', () => { it(`should edit the item basic data`, async() => { const result = await nightmare - .wait(selectors.itemBasicData.nameInput) .clearInput(selectors.itemBasicData.nameInput) - .type(selectors.itemBasicData.nameInput, 'Rose of Purity') + .write(selectors.itemBasicData.nameInput, 'Rose of Purity') .autocompleteSearch(selectors.itemBasicData.typeAutocomplete, 'Crisantemo') .autocompleteSearch(selectors.itemBasicData.intrastatAutocomplete, 'Coral y materiales similares') .clearInput(selectors.itemBasicData.relevancyInput) - .type(selectors.itemBasicData.relevancyInput, '1') + .write(selectors.itemBasicData.relevancyInput, '1') .autocompleteSearch(selectors.itemBasicData.originAutocomplete, 'Spain') .autocompleteSearch(selectors.itemBasicData.expenceAutocomplete, 'Alquiler VNH') .clearInput(selectors.itemBasicData.longNameInput) - .type(selectors.itemBasicData.longNameInput, 'RS Rose of Purity') + .write(selectors.itemBasicData.longNameInput, 'RS Rose of Purity') .waitToClick(selectors.itemBasicData.isActiveCheckbox) .waitToClick(selectors.itemBasicData.submitBasicDataButton) .waitForLastSnackbar(); diff --git a/e2e/paths/item-module/04_create_item_tags.spec.js b/e2e/paths/item-module/04_create_item_tags.spec.js index 2362a36c31..b4df877817 100644 --- a/e2e/paths/item-module/04_create_item_tags.spec.js +++ b/e2e/paths/item-module/04_create_item_tags.spec.js @@ -16,9 +16,9 @@ describe('Item create tags path', () => { .waitToClick(selectors.itemTags.fourthRemoveTagButton) .waitToClick(selectors.itemTags.addItemTagButton) .autocompleteSearch(selectors.itemTags.seventhTagAutocomplete, 'Ancho de la base') - .type(selectors.itemTags.seventhValueInput, '50') + .write(selectors.itemTags.seventhValueInput, '50') .clearInput(selectors.itemTags.seventhRelevancyInput) - .type(selectors.itemTags.seventhRelevancyInput, '4') + .write(selectors.itemTags.seventhRelevancyInput, '4') .click(selectors.itemTags.submitItemTagsButton) .waitForLastSnackbar(); diff --git a/e2e/paths/item-module/05_create_item_niche.spec.js b/e2e/paths/item-module/05_create_item_niche.spec.js index db63c1d3ff..1ce170f6dd 100644 --- a/e2e/paths/item-module/05_create_item_niche.spec.js +++ b/e2e/paths/item-module/05_create_item_niche.spec.js @@ -16,7 +16,7 @@ describe('Item create niche path', () => { .waitToClick(selectors.itemNiches.addNicheButton) .waitToClick(selectors.itemNiches.secondNicheRemoveButton) .autocompleteSearch(selectors.itemNiches.thirdWarehouseAutocomplete, 'Warehouse Two') - .type(selectors.itemNiches.thirdCodeInput, 'A4') + .write(selectors.itemNiches.thirdCodeInput, 'A4') .click(selectors.itemNiches.submitNichesButton) .waitForLastSnackbar(); diff --git a/e2e/paths/item-module/06_create_item_botanical.spec.js b/e2e/paths/item-module/06_create_item_botanical.spec.js index 1e7103e604..fa0f339f90 100644 --- a/e2e/paths/item-module/06_create_item_botanical.spec.js +++ b/e2e/paths/item-module/06_create_item_botanical.spec.js @@ -13,8 +13,7 @@ describe('Item Create botanical path', () => { it(`should create a new botanical for the item`, async() => { const result = await nightmare - .wait(selectors.itemBotanical.botanicalInput) - .type(selectors.itemBotanical.botanicalInput, 'Cicuta maculata') + .write(selectors.itemBotanical.botanicalInput, 'Cicuta maculata') .autocompleteSearch(selectors.itemBotanical.genusAutocomplete, 'Abelia') .autocompleteSearch(selectors.itemBotanical.speciesAutocomplete, 'dealbata') .waitToClick(selectors.itemBotanical.submitBotanicalButton) @@ -52,7 +51,7 @@ describe('Item Create botanical path', () => { it(`should edit botanical for the item`, async() => { const result = await nightmare .clearInput(selectors.itemBotanical.botanicalInput) - .type(selectors.itemBotanical.botanicalInput, 'Herp Derp') + .write(selectors.itemBotanical.botanicalInput, 'Herp Derp') .autocompleteSearch(selectors.itemBotanical.genusAutocomplete, 'Abies') .autocompleteSearch(selectors.itemBotanical.speciesAutocomplete, 'decurrens') .waitToClick(selectors.itemBotanical.submitBotanicalButton) diff --git a/e2e/paths/item-module/07_create_item_barcode.spec.js b/e2e/paths/item-module/07_create_item_barcode.spec.js index b396bd05d1..5bcfde7d1c 100644 --- a/e2e/paths/item-module/07_create_item_barcode.spec.js +++ b/e2e/paths/item-module/07_create_item_barcode.spec.js @@ -15,8 +15,7 @@ describe('Item Create barcodes path', () => { const result = await nightmare .waitToClick(selectors.itemBarcodes.firstCodeRemoveButton) .waitToClick(selectors.itemBarcodes.addBarcodeButton) - .wait(selectors.itemBarcodes.thirdCodeInput) - .type(selectors.itemBarcodes.thirdCodeInput, '5') + .write(selectors.itemBarcodes.thirdCodeInput, '5') .waitToClick(selectors.itemBarcodes.submitBarcodesButton) .waitForLastSnackbar(); @@ -25,9 +24,8 @@ describe('Item Create barcodes path', () => { it(`should confirm the barcode 5 is created and it is now the third barcode as the first was deleted`, async() => { const result = await nightmare - .click(selectors.itemBasicData.basicDataButton) - .wait(selectors.itemBasicData.nameInput) - .click(selectors.itemBarcodes.barcodeButton) + .waitToClick(selectors.itemBasicData.basicDataButton) + .waitToClick(selectors.itemBarcodes.barcodeButton) .waitForTextInInput(selectors.itemBarcodes.thirdCodeInput, '5') .waitToGetProperty(selectors.itemBarcodes.thirdCodeInput, 'value'); diff --git a/e2e/paths/item-module/09_regularize_item.spec.js b/e2e/paths/item-module/09_regularize_item.spec.js index 07ceb4e622..76879c4abf 100644 --- a/e2e/paths/item-module/09_regularize_item.spec.js +++ b/e2e/paths/item-module/09_regularize_item.spec.js @@ -10,9 +10,8 @@ describe('Item regularize path', () => { it('should search for the item', async() => { const resultCount = await nightmare - .wait(selectors.itemsIndex.searchItemInput) - .type(selectors.itemsIndex.searchItemInput, 'Object5 Weapon 50') - .click(selectors.itemsIndex.searchButton) + .write(selectors.itemsIndex.searchItemInput, 'Object5 Weapon 50') + .waitToClick(selectors.itemsIndex.searchButton) .waitForNumberOfElements(selectors.itemsIndex.searchResult, 1) .countElement(selectors.itemsIndex.searchResult); @@ -33,8 +32,7 @@ describe('Item regularize path', () => { const result = await nightmare .waitToClick(selectors.itemDescriptor.moreMenu) .waitToClick(selectors.itemDescriptor.moreMenuRegularizeButton) - .wait(selectors.itemDescriptor.regularizeQuantityInput) - .type(selectors.itemDescriptor.regularizeQuantityInput, 100) + .write(selectors.itemDescriptor.regularizeQuantityInput, 100) .autocompleteSearch(selectors.itemDescriptor.regularizeWarehouseAutocomplete, 'Warehouse One') .waitToClick(selectors.itemDescriptor.regularizeSaveButton) .waitForLastSnackbar(); @@ -55,9 +53,8 @@ describe('Item regularize path', () => { it('should search for the ticket with alias missing', async() => { const result = await nightmare - .wait(selectors.ticketsIndex.searchTicketInput) - .type(selectors.ticketsIndex.searchTicketInput, 'missing') - .click(selectors.ticketsIndex.searchButton) + .write(selectors.ticketsIndex.searchTicketInput, 'missing') + .waitToClick(selectors.ticketsIndex.searchButton) .waitForNumberOfElements(selectors.ticketsIndex.searchResult, 1) .countElement(selectors.ticketsIndex.searchResult); @@ -102,8 +99,7 @@ describe('Item regularize path', () => { it('should search for the item once again', async() => { const resultCount = await nightmare - .wait(selectors.itemsIndex.searchItemInput) - .type(selectors.itemsIndex.searchItemInput, 'Object5 Weapon 50') + .write(selectors.itemsIndex.searchItemInput, 'Object5 Weapon 50') .click(selectors.itemsIndex.searchButton) .waitForNumberOfElements(selectors.itemsIndex.searchResult, 1) .countElement(selectors.itemsIndex.searchResult); @@ -125,8 +121,7 @@ describe('Item regularize path', () => { const result = await nightmare .waitToClick(selectors.itemDescriptor.moreMenu) .waitToClick(selectors.itemDescriptor.moreMenuRegularizeButton) - .wait(selectors.itemDescriptor.regularizeQuantityInput) - .type(selectors.itemDescriptor.regularizeQuantityInput, 100) + .write(selectors.itemDescriptor.regularizeQuantityInput, 100) .autocompleteSearch(selectors.itemDescriptor.regularizeWarehouseAutocomplete, 'Warehouse One') .waitToClick(selectors.itemDescriptor.regularizeSaveButton) .waitForLastSnackbar(); @@ -147,8 +142,7 @@ describe('Item regularize path', () => { it('should search for the ticket with id 23 once again', async() => { const result = await nightmare - .wait(selectors.ticketsIndex.searchTicketInput) - .type(selectors.ticketsIndex.searchTicketInput, 'id:23') + .write(selectors.ticketsIndex.searchTicketInput, 'id:23') .click(selectors.ticketsIndex.searchButton) .waitForNumberOfElements(selectors.ticketsIndex.searchResult, 1) .countElement(selectors.ticketsIndex.searchResult); diff --git a/e2e/paths/ticket-module/01_create_ticket_observations.spec.js b/e2e/paths/ticket-module/01_create_ticket_observations.spec.js index 0beded9702..584d090aa9 100644 --- a/e2e/paths/ticket-module/01_create_ticket_observations.spec.js +++ b/e2e/paths/ticket-module/01_create_ticket_observations.spec.js @@ -16,7 +16,7 @@ describe('Ticket Create notes path', () => { .waitToClick(selectors.ticketNotes.firstNoteRemoveButton) .waitToClick(selectors.ticketNotes.addNoteButton) .autocompleteSearch(selectors.ticketNotes.firstNoteTypeAutocomplete, 'observation one') - .type(selectors.ticketNotes.firstDescriptionInput, 'description') + .write(selectors.ticketNotes.firstDescriptionInput, 'description') .click(selectors.ticketNotes.submitNotesButton) .waitForLastSnackbar(); diff --git a/e2e/paths/ticket-module/04_create_ticket_packages.spec.js b/e2e/paths/ticket-module/04_create_ticket_packages.spec.js index 39536da613..d989845052 100644 --- a/e2e/paths/ticket-module/04_create_ticket_packages.spec.js +++ b/e2e/paths/ticket-module/04_create_ticket_packages.spec.js @@ -24,7 +24,7 @@ describe('Ticket Create packages path', () => { it(`should attempt create a new package but receive an error if quantity is a string`, async() => { const result = await nightmare - .type(selectors.ticketPackages.firstQuantityInput, 'ninety 9') + .write(selectors.ticketPackages.firstQuantityInput, 'ninety 9') .click(selectors.ticketPackages.savePackagesButton) .waitForLastSnackbar(); @@ -34,7 +34,7 @@ describe('Ticket Create packages path', () => { it(`should attempt create a new package but receive an error if quantity is 0`, async() => { const result = await nightmare .clearInput(selectors.ticketPackages.firstQuantityInput) - .type(selectors.ticketPackages.firstQuantityInput, 0) + .write(selectors.ticketPackages.firstQuantityInput, 0) .click(selectors.ticketPackages.savePackagesButton) .waitForLastSnackbar(); @@ -44,7 +44,7 @@ describe('Ticket Create packages path', () => { it(`should attempt create a new package but receive an error if package is blank`, async() => { const result = await nightmare .clearInput(selectors.ticketPackages.firstQuantityInput) - .type(selectors.ticketPackages.firstQuantityInput, 99) + .write(selectors.ticketPackages.firstQuantityInput, 99) .click(selectors.ticketPackages.clearPackageAutocompleteButton) .click(selectors.ticketPackages.savePackagesButton) .waitForLastSnackbar(); diff --git a/e2e/paths/ticket-module/05_create_new_tracking_state.spec.js b/e2e/paths/ticket-module/05_create_new_tracking_state.spec.js index 8ed39f2a00..1a179b041d 100644 --- a/e2e/paths/ticket-module/05_create_new_tracking_state.spec.js +++ b/e2e/paths/ticket-module/05_create_new_tracking_state.spec.js @@ -23,7 +23,7 @@ describe('Ticket Create new tracking state path', () => { it(`should attempt create a new state but receive an error if state is empty`, async() => { let result = await nightmare - .click(selectors.createStateView.saveStateButton) + .waitToClick(selectors.createStateView.saveStateButton) .waitForLastSnackbar(); expect(result).toEqual('State cannot be blank'); diff --git a/e2e/paths/ticket-module/07_edit_sale.spec.js b/e2e/paths/ticket-module/07_edit_sale.spec.js index a13afcd26b..432ea0910d 100644 --- a/e2e/paths/ticket-module/07_edit_sale.spec.js +++ b/e2e/paths/ticket-module/07_edit_sale.spec.js @@ -34,8 +34,7 @@ describe('Ticket Edit sale path', () => { it('should again search for a specific ticket', async() => { const result = await nightmare - .wait(selectors.ticketsIndex.searchTicketInput) - .type(selectors.ticketsIndex.searchTicketInput, 'id:16') + .write(selectors.ticketsIndex.searchTicketInput, 'id:16') .click(selectors.ticketsIndex.searchButton) .waitForNumberOfElements(selectors.ticketsIndex.searchResult, 1) .countElement(selectors.ticketsIndex.searchResult); @@ -123,8 +122,7 @@ describe('Ticket Edit sale path', () => { .waitToClick(selectors.globalItems.applicationsMenuButton) .wait(selectors.globalItems.applicationsMenuVisible) .waitToClick(selectors.globalItems.ticketsButton) - .wait(selectors.ticketsIndex.searchTicketInput) - .type(selectors.ticketsIndex.searchTicketInput, 'id:16') + .write(selectors.ticketsIndex.searchTicketInput, 'id:16') .click(selectors.ticketsIndex.searchButton) .waitForNumberOfElements(selectors.ticketsIndex.searchResult, 1) .waitForTextInElement(selectors.ticketsIndex.searchResult, 'address 21') @@ -139,7 +137,7 @@ describe('Ticket Edit sale path', () => { it('should try to add a higher quantity value and then receive an error', async() => { const result = await nightmare .waitToClick(selectors.ticketSales.firstSaleQuantityClearInput) - .type(selectors.ticketSales.firstSaleQuantity, '9\u000d') + .write(selectors.ticketSales.firstSaleQuantity, '9\u000d') .waitForLastSnackbar(); expect(result).toEqual('The new quantity should be smaller than the old one'); @@ -148,7 +146,7 @@ describe('Ticket Edit sale path', () => { it('should remove 1 from quantity', async() => { const result = await nightmare .waitToClick(selectors.ticketSales.firstSaleQuantityClearInput) - .type(selectors.ticketSales.firstSaleQuantity, '4\u000d') + .write(selectors.ticketSales.firstSaleQuantity, '4\u000d') .waitForLastSnackbar(); expect(result).toEqual('Data saved!'); @@ -157,9 +155,8 @@ describe('Ticket Edit sale path', () => { it('should update the price', async() => { const result = await nightmare .waitToClick(selectors.ticketSales.firstSalePrice) - .wait(selectors.ticketSales.firstSalePriceInput) - .type(selectors.ticketSales.firstSalePriceInput, 5) - .type('body', '\u000d') // simulates enter + .write(selectors.ticketSales.firstSalePriceInput, 5) + .write('body', '\u000d') // simulates enter .waitForLastSnackbar(); expect(result).toEqual('Data saved!'); @@ -183,8 +180,8 @@ describe('Ticket Edit sale path', () => { const result = await nightmare .waitToClick(selectors.ticketSales.firstSaleDiscount) .wait('vn-textfield[label="Discount"] > div[class="container selected"]') // a function selects the text after it's loaded - .type(selectors.ticketSales.firstSaleDiscountInput, 50) - .type('body', '\u000d') // simulates enter + .write(selectors.ticketSales.firstSaleDiscountInput, 50) + .write('body', '\u000d') // simulates enter .waitForLastSnackbar(); expect(result).toEqual('Data saved!'); @@ -230,8 +227,7 @@ describe('Ticket Edit sale path', () => { it('should search for the claim with id 4', async() => { const result = await nightmare - .wait(selectors.claimsIndex.searchResult) - .type(selectors.claimsIndex.searchClaimInput, 4) + .write(selectors.claimsIndex.searchClaimInput, 4) .click(selectors.claimsIndex.searchButton) .waitForNumberOfElements(selectors.claimsIndex.searchResult, 1) .countElement(selectors.claimsIndex.searchResult); @@ -252,8 +248,7 @@ describe('Ticket Edit sale path', () => { it('should search the ticket', async() => { const result = await nightmare - .wait(selectors.ticketsIndex.searchTicketInput) - .type(selectors.ticketsIndex.searchTicketInput, 'id:16') + .write(selectors.ticketsIndex.searchTicketInput, 'id:16') .click(selectors.ticketsIndex.searchButton) .waitForNumberOfElements(selectors.ticketsIndex.searchResult, 1) .countElement(selectors.ticketsIndex.searchResult); @@ -293,8 +288,7 @@ describe('Ticket Edit sale path', () => { const result = await nightmare .waitToClick(selectors.ticketSales.thirdSaleCheckbox) .waitToClick(selectors.ticketSales.transferSaleButton) - .wait(selectors.ticketSales.moveToTicketInput) - .type(selectors.ticketSales.moveToTicketInput, 2) + .write(selectors.ticketSales.moveToTicketInput, 2) .waitToClick(selectors.ticketSales.moveToTicketButton) .waitForLastSnackbar(); @@ -304,7 +298,7 @@ describe('Ticket Edit sale path', () => { it('should transfer the sale to a valid ticket', async() => { const result = await nightmare .waitToClick(selectors.ticketSales.moveToTicketInputClearButton) - .type(selectors.ticketSales.moveToTicketInput, 12) + .write(selectors.ticketSales.moveToTicketInput, 12) .waitToClick(selectors.ticketSales.moveToTicketButton) .waitForURL('ticket/12/sale') .parsedUrl(); @@ -323,8 +317,7 @@ describe('Ticket Edit sale path', () => { it('should go back to the original ticket sales section', async() => { const url = await nightmare .waitToClick(selectors.itemsIndex.goBackToModuleIndexButton) - .wait(selectors.ticketsIndex.searchTicketInput) - .type(selectors.ticketsIndex.searchTicketInput, 'id:16') + .write(selectors.ticketsIndex.searchTicketInput, 'id:16') .click(selectors.ticketsIndex.searchButton) .waitForNumberOfElements(selectors.ticketsIndex.searchResult, 1) .waitForTextInElement(selectors.ticketsIndex.searchResult, 'address 21') @@ -347,8 +340,7 @@ describe('Ticket Edit sale path', () => { it('should go back to the receiver ticket sales section', async() => { const url = await nightmare .waitToClick(selectors.itemsIndex.goBackToModuleIndexButton) - .wait(selectors.ticketsIndex.searchTicketInput) - .type(selectors.ticketsIndex.searchTicketInput, 'id:12') + .write(selectors.ticketsIndex.searchTicketInput, 'id:12') .click(selectors.ticketsIndex.searchButton) .waitForNumberOfElements(selectors.ticketsIndex.searchResult, 1) .waitForTextInElement(selectors.ticketsIndex.searchResult, 'address 21') @@ -364,8 +356,7 @@ describe('Ticket Edit sale path', () => { const result = await nightmare .waitToClick(selectors.ticketSales.firstSaleCheckbox) .waitToClick(selectors.ticketSales.transferSaleButton) - .wait(selectors.ticketSales.moveToTicketInput) - .type(selectors.ticketSales.moveToTicketInput, 16) + .write(selectors.ticketSales.moveToTicketInput, 16) .waitToClick(selectors.ticketSales.moveToTicketButton) .waitForURL('ticket/16/sale') .parsedUrl(); @@ -384,8 +375,7 @@ describe('Ticket Edit sale path', () => { it('should now go back to the original ticket sales section', async() => { const url = await nightmare .waitToClick(selectors.itemsIndex.goBackToModuleIndexButton) - .wait(selectors.ticketsIndex.searchTicketInput) - .type(selectors.ticketsIndex.searchTicketInput, 'id:8') + .write(selectors.ticketsIndex.searchTicketInput, 'id:8') .click(selectors.ticketsIndex.searchButton) .waitForNumberOfElements(selectors.ticketsIndex.searchResult, 1) .waitForTextInElement(selectors.ticketsIndex.searchResult, 'address 24') @@ -402,6 +392,7 @@ describe('Ticket Edit sale path', () => { .waitToClick(selectors.ticketSales.firstSaleCheckbox) .waitToClick(selectors.ticketSales.transferSaleButton) .waitToClick(selectors.ticketSales.moveToNewTicketButton) + .resetLogin() .waitForLogin('salesPerson') .waitToClick(selectors.globalItems.applicationsMenuButton) .wait(selectors.globalItems.applicationsMenuVisible) @@ -414,8 +405,7 @@ describe('Ticket Edit sale path', () => { it('should search for a specific created ticket', async() => { const result = await nightmare - .wait(selectors.ticketsIndex.searchTicketInput) - .type(selectors.ticketsIndex.searchTicketInput, 'nickname:(address 24) stateFk:2') + .write(selectors.ticketsIndex.searchTicketInput, 'nickname:(address 24) stateFk:2') .click(selectors.ticketsIndex.searchButton) .waitForNumberOfElements(selectors.ticketsIndex.searchResult, 1) .countElement(selectors.ticketsIndex.searchResult); @@ -475,9 +465,8 @@ describe('Ticket Edit sale path', () => { .waitToClick(selectors.ticketSales.selectAllSalesCheckbox) .waitToClick(selectors.ticketSales.moreMenuButton) .waitToClick(selectors.ticketSales.moreMenuUpdateDiscount) - .wait(selectors.ticketSales.moreMenuUpdateDiscountInput) - .type(selectors.ticketSales.moreMenuUpdateDiscountInput, 100) - .type('body', '\u000d') // simulates enter + .write(selectors.ticketSales.moreMenuUpdateDiscountInput, 100) + .write('body', '\u000d') // simulates enter .waitForTextInElement(selectors.ticketSales.totalImport, '0.00') .waitToGetProperty(selectors.ticketSales.totalImport, 'innerText'); @@ -499,8 +488,7 @@ describe('Ticket Edit sale path', () => { it('should now search for a specific ticket', async() => { const result = await nightmare - .wait(selectors.ticketsIndex.searchTicketInput) - .type(selectors.ticketsIndex.searchTicketInput, 'id:16') + .write(selectors.ticketsIndex.searchTicketInput, 'id:16') .click(selectors.ticketsIndex.searchButton) .waitForNumberOfElements(selectors.ticketsIndex.searchResult, 1) .countElement(selectors.ticketsIndex.searchResult); @@ -587,8 +575,7 @@ describe('Ticket Edit sale path', () => { it('should once again search for a specific ticket', async() => { const result = await nightmare - .wait(selectors.ticketsIndex.searchTicketInput) - .type(selectors.ticketsIndex.searchTicketInput, 'id:16') + .write(selectors.ticketsIndex.searchTicketInput, 'id:16') .click(selectors.ticketsIndex.searchButton) .waitForNumberOfElements(selectors.ticketsIndex.searchResult, 1) .countElement(selectors.ticketsIndex.searchResult); diff --git a/e2e/paths/ticket-module/09_ticket_weekly.spec.js b/e2e/paths/ticket-module/09_ticket_weekly.spec.js index c92633d81b..1c7ed936e5 100644 --- a/e2e/paths/ticket-module/09_ticket_weekly.spec.js +++ b/e2e/paths/ticket-module/09_ticket_weekly.spec.js @@ -32,8 +32,7 @@ describe('Ticket descriptor path', () => { it('should search for the ticket 11', async() => { const result = await nightmare - .wait(selectors.ticketsIndex.searchTicketInput) - .type(selectors.ticketsIndex.searchTicketInput, 'id:11') + .write(selectors.ticketsIndex.searchTicketInput, 'id:11') .click(selectors.ticketsIndex.searchButton) .waitForNumberOfElements(selectors.ticketsIndex.searchResult, 1) .countElement(selectors.ticketsIndex.searchResult); @@ -93,8 +92,7 @@ describe('Ticket descriptor path', () => { it('should now search for the ticket 11', async() => { const result = await nightmare - .wait(selectors.ticketsIndex.searchTicketInput) - .type(selectors.ticketsIndex.searchTicketInput, 'id:11') + .write(selectors.ticketsIndex.searchTicketInput, 'id:11') .click(selectors.ticketsIndex.searchButton) .waitForNumberOfElements(selectors.ticketsIndex.searchResult, 1) .countElement(selectors.ticketsIndex.searchResult); diff --git a/e2e/paths/ticket-module/10_ticket_request.spec.js b/e2e/paths/ticket-module/10_ticket_request.spec.js index fcc7eb0a44..24d601900e 100644 --- a/e2e/paths/ticket-module/10_ticket_request.spec.js +++ b/e2e/paths/ticket-module/10_ticket_request.spec.js @@ -14,12 +14,11 @@ describe('Ticket purchase request path', () => { it(`should add a new request`, async() => { const result = await nightmare .waitToClick(selectors.ticketRequests.addRequestButton) - .wait(selectors.ticketRequests.descriptionInput) - .type(selectors.ticketRequests.descriptionInput, 'New stuff') - .type(selectors.ticketRequests.quantityInput, 99) + .write(selectors.ticketRequests.descriptionInput, 'New stuff') + .write(selectors.ticketRequests.quantityInput, 99) .waitToClick(selectors.ticketRequests.atenderSelect) .waitToClick(selectors.ticketRequests.atenderSelectSecondOption) - .type(selectors.ticketRequests.priceInput, 999) + .write(selectors.ticketRequests.priceInput, 999) .waitToClick(selectors.ticketRequests.saveButton) .waitForLastSnackbar(); diff --git a/e2e/paths/ticket-module/11_ticket_diary.spec.js b/e2e/paths/ticket-module/11_ticket_diary.spec.js index 10b05363d1..2f45b54cf8 100644 --- a/e2e/paths/ticket-module/11_ticket_diary.spec.js +++ b/e2e/paths/ticket-module/11_ticket_diary.spec.js @@ -12,8 +12,7 @@ describe('Ticket diary path', () => { it('should search for a specific ticket', async() => { const result = await nightmare - .wait(selectors.ticketsIndex.searchTicketInput) - .type(selectors.ticketsIndex.searchTicketInput, 'id:1') + .write(selectors.ticketsIndex.searchTicketInput, 'id:1') .click(selectors.ticketsIndex.searchButton) .waitForNumberOfElements(selectors.ticketsIndex.searchResult, 1) .countElement(selectors.ticketsIndex.searchResult); diff --git a/e2e/paths/ticket-module/12_delete_ticket_from_descriptor.spec.js b/e2e/paths/ticket-module/12_delete_ticket_from_descriptor.spec.js index 47951b6084..c76719ac26 100644 --- a/e2e/paths/ticket-module/12_delete_ticket_from_descriptor.spec.js +++ b/e2e/paths/ticket-module/12_delete_ticket_from_descriptor.spec.js @@ -11,8 +11,7 @@ describe('Ticket descriptor path', () => { it('should search for a specific ticket', async() => { const result = await nightmare - .wait(selectors.ticketsIndex.searchTicketInput) - .type(selectors.ticketsIndex.searchTicketInput, 'id:17') + .write(selectors.ticketsIndex.searchTicketInput, 'id:17') .click(selectors.ticketsIndex.searchButton) .waitForNumberOfElements(selectors.ticketsIndex.searchResult, 1) .countElement(selectors.ticketsIndex.searchResult); @@ -49,8 +48,7 @@ describe('Ticket descriptor path', () => { it(`should search for the deleted ticket and check it's date`, async() => { const result = await nightmare - .wait(selectors.ticketsIndex.searchTicketInput) - .type(selectors.ticketsIndex.searchTicketInput, 'id:17') + .write(selectors.ticketsIndex.searchTicketInput, 'id:17') .click(selectors.ticketsIndex.searchButton) .waitForNumberOfElements(selectors.ticketsIndex.searchResult, 1) .wait(selectors.ticketsIndex.searchResultDate) diff --git a/loopback/locale/es.json b/loopback/locale/es.json index 24f787d33b..f7f1287414 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -64,5 +64,6 @@ "Cannot check Equalization Tax in this NIF/CIF": "No se puede marcar RE en este NIF/CIF", "You can't make changes on the basic data of an confirmed order or with rows": "No puedes cambiar los datos basicos de una orden con artículos", "INVALID_USER_NAME": "El nombre de usuario solo debe contener letras minúsculas o, a partir del segundo carácter, números o subguiones, no esta permitido el uso de la letra ñ", - "You can't create a ticket for a frozen client": "No puedes crear un ticket para un cliente congelado" + "You can't create a ticket for a frozen client": "No puedes crear un ticket para un cliente congelado", + "You can't create a ticket for a inactive client": "No puedes crear un ticket para un cliente inactivo" } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index a86dbaddbb..b707709812 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4019,7 +4019,7 @@ "dot-prop": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha1-HxngwuGqDjJ5fEl5nyg3rGr2nFc=", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", "dev": true, "requires": { "is-obj": "^1.0.0" @@ -4192,7 +4192,7 @@ }, "jsonfile": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "resolved": "http://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", "dev": true, "requires": { @@ -8179,7 +8179,7 @@ "karma-chrome-launcher": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", - "integrity": "sha1-zxudBxNswY/iOTJ9JGVMPbw2is8=", + "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", "dev": true, "requires": { "fs-access": "^1.0.0", @@ -14290,7 +14290,7 @@ "split2": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", - "integrity": "sha1-GGsldbz4PoW30YRldWI47k7kJJM=", + "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", "dev": true, "requires": { "through2": "^2.0.2" @@ -15322,7 +15322,7 @@ "touch": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha1-/jZfX3XsntTlaCXgu3bSSrdK+Ds=", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", "dev": true, "requires": { "nopt": "~1.0.10" @@ -16944,7 +16944,7 @@ "write-file-atomic": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha1-H/YVdcLipOjlENb6TiQ8zhg5mas=", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", "dev": true, "requires": { "graceful-fs": "^4.1.11", From 5240a5ada616c01ab75c1572b7c40aa5fbc7c99d Mon Sep 17 00:00:00 2001 From: Carlos Jimenez Ruiz Date: Wed, 23 Jan 2019 15:34:16 +0100 Subject: [PATCH 32/37] #1021 e2e login extension v3 --- e2e/helpers/extensions.js | 30 ++++++++++---- e2e/helpers/nightmare.js | 11 +++-- e2e/helpers/selectors.js | 3 +- .../client-module/05_add_address.spec.js | 41 ++++++++----------- .../08_item_create_and_clone.spec.js | 11 ++--- .../order-module/01_edit_basic_data.spec.js | 16 +++++--- .../13_create_ticket_services.spec.js | 10 ++++- .../ticket-module/14_create_ticket.spec.js | 7 +++- 8 files changed, 75 insertions(+), 54 deletions(-) diff --git a/e2e/helpers/extensions.js b/e2e/helpers/extensions.js index 0515cf5102..d5807ba0b4 100644 --- a/e2e/helpers/extensions.js +++ b/e2e/helpers/extensions.js @@ -3,6 +3,7 @@ import config from './config.js'; import Nightmare from 'nightmare'; import {URL} from 'url'; +let currentUser; Nightmare.asyncAction = function(name, func) { @@ -19,8 +20,7 @@ Nightmare.asyncAction('clearInput', async function(selector) { for (let i = 0; i < 50; i += 1) backSpaces.push('\u0008'); - await this.wait(selector) - .type(selector, backSpaces.join('')); + await this.write(selector, backSpaces.join('')); }); let actions = { @@ -32,7 +32,18 @@ let actions = { .click(`vn-login input[type=submit]`) // FIXME: Wait for dom to be ready: https://github.com/segmentio/nightmare/issues/481 .wait(1000) - .then(done) + .then(() => { + currentUser = userName; + done(); + }) + .catch(done); + }, + + resetLogin: function(done) { + this.then(() => { + currentUser = undefined; + done(); + }) .catch(done); }, @@ -55,7 +66,13 @@ let actions = { }, waitForLogin: function(userName, done) { - this.login(userName) + if (currentUser === userName) { + return this.waitToClick('vn-topbar a[ui-sref="home"]') + .waitForURL('#!/') + .then(done) + .catch(done); + } + return this.login(userName) .waitForURL('#!/') .url() .changeLanguageToEnglish() @@ -284,8 +301,7 @@ let actions = { }, accessToSearchResult: function(searchValue, done) { - this.wait(`vn-searchbar input`) - .type(`vn-searchbar input`, searchValue) + this.write(`vn-searchbar input`, searchValue) .click(`vn-searchbar vn-icon[icon="search"]`) .waitForNumberOfElements('.searchResult', 1) .evaluate(() => { @@ -321,7 +337,7 @@ let actions = { autocompleteSearch: function(autocompleteSelector, searchValue, done) { this.wait(autocompleteSelector) .waitToClick(`${autocompleteSelector} input`) - .type(`${autocompleteSelector} vn-drop-down input`, searchValue) + .write(`${autocompleteSelector} vn-drop-down input`, searchValue) .waitToClick(`${autocompleteSelector} li.active`) .wait((autocompleteSelector, searchValue) => { return document.querySelector(`${autocompleteSelector} input`).value.toLowerCase().includes(searchValue.toLowerCase()); diff --git a/e2e/helpers/nightmare.js b/e2e/helpers/nightmare.js index e3b65e16bf..b4d0cad414 100644 --- a/e2e/helpers/nightmare.js +++ b/e2e/helpers/nightmare.js @@ -1,8 +1,12 @@ /* eslint no-console: 0 */ import Nightmare from 'nightmare'; +let nightmare; export default function createNightmare(width = 1280, height = 720) { - const nightmare = new Nightmare({ + if (nightmare) + return nightmare; + + nightmare = new Nightmare({ show: process.env.E2E_SHOW, typeInterval: 10, x: 0, @@ -19,11 +23,6 @@ export default function createNightmare(width = 1280, height = 720) { nightmare.header('Accept-Language', 'en'); - afterAll(() => { - return nightmare - .end(); - }); - return nightmare; } diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js index 12b39939c1..a7487acc08 100644 --- a/e2e/helpers/selectors.js +++ b/e2e/helpers/selectors.js @@ -115,7 +115,8 @@ export default { secondObservationDescriptionInput: `vn-client-address-edit [name=observations] :nth-child(2) [model="observation.description"] input`, addObservationButton: `vn-client-address-edit vn-icon-button[icon="add_circle"]`, saveButton: `${components.vnSubmit}`, - cancelButton: `button[ui-sref="client.card.address.index"]` + cancelCreateAddressButton: `button[ui-sref="client.card.address.index"]`, + cancelEditAddressButton: 'vn-client-address-edit > form > vn-button-bar > vn-button > button' }, clientWebAccess: { webAccessButton: `vn-left-menu a[ui-sref="client.card.webAccess"]`, diff --git a/e2e/paths/client-module/05_add_address.spec.js b/e2e/paths/client-module/05_add_address.spec.js index f7f3e361ec..dc7e615c1c 100644 --- a/e2e/paths/client-module/05_add_address.spec.js +++ b/e2e/paths/client-module/05_add_address.spec.js @@ -20,33 +20,15 @@ describe('Client Add address path', () => { expect(url.hash).toContain('address/create'); }); - it(`should return to the addreses section by clicking the cancel button`, async() => { - const url = await nightmare - .waitToClick(selectors.clientAddresses.cancelButton) - .waitForURL('address/index') - .parsedUrl(); - - expect(url.hash).toContain('address/index'); - }); - - it(`should now click on the add new address button to access to the new address form`, async() => { - const url = await nightmare - .waitToClick(selectors.clientAddresses.createAddress) - .waitForURL('address/create') - .parsedUrl(); - - expect(url.hash).toContain('address/create'); - }); - it('should receive an error after clicking save button as consignee, street and town fields are empty', async() => { const result = await nightmare .waitToClick(selectors.clientAddresses.defaultCheckboxInput) .clearInput(selectors.clientAddresses.streetAddressInput) - .type(selectors.clientAddresses.postcodeInput, '10022') + .write(selectors.clientAddresses.postcodeInput, '10022') .autocompleteSearch(selectors.clientAddresses.provinceAutocomplete, 'Province four') .autocompleteSearch(selectors.clientAddresses.agencyAutocomplete, 'Entanglement') - .type(selectors.clientAddresses.phoneInput, '999887744') - .type(selectors.clientAddresses.mobileInput, '999887744') + .write(selectors.clientAddresses.phoneInput, '999887744') + .write(selectors.clientAddresses.mobileInput, '999887744') .waitToClick(selectors.clientFiscalData.saveButton) .waitForLastSnackbar(); @@ -55,9 +37,9 @@ describe('Client Add address path', () => { it(`should create a new address with all it's data`, async() => { const result = await nightmare - .type(selectors.clientAddresses.consigneeInput, 'Bruce Bunner') - .type(selectors.clientAddresses.streetAddressInput, '320 Park Avenue New York') - .type(selectors.clientAddresses.cityInput, 'New York') + .write(selectors.clientAddresses.consigneeInput, 'Bruce Bunner') + .write(selectors.clientAddresses.streetAddressInput, '320 Park Avenue New York') + .write(selectors.clientAddresses.cityInput, 'New York') .click(selectors.clientAddresses.saveButton) .waitForLastSnackbar(); @@ -99,4 +81,15 @@ describe('Client Add address path', () => { expect(result).toEqual('The default consignee can not be unchecked'); }); + + // this "it" should be removed if the watcher doesn't prevent the navigation upon state changes + it(`should go back to the addreses section by clicking the cancel button`, async() => { + const url = await nightmare + .waitToClick(selectors.clientAddresses.cancelEditAddressButton) + .waitToClick('vn-confirm button[response="ACCEPT"]') + .waitForURL('address/index') + .parsedUrl(); + + expect(url.hash).toContain('address/index'); + }); }); diff --git a/e2e/paths/item-module/08_item_create_and_clone.spec.js b/e2e/paths/item-module/08_item_create_and_clone.spec.js index 679e32ff73..4411d7877b 100644 --- a/e2e/paths/item-module/08_item_create_and_clone.spec.js +++ b/e2e/paths/item-module/08_item_create_and_clone.spec.js @@ -11,8 +11,7 @@ describe('Item Create/Clone path', () => { it(`should search for the item Infinity Gauntlet to confirm it isn't created yet`, async() => { const result = await nightmare - .wait(selectors.itemsIndex.searchItemInput) - .type(selectors.itemsIndex.searchItemInput, 'Infinity Gauntlet') + .write(selectors.itemsIndex.searchItemInput, 'Infinity Gauntlet') .click(selectors.itemsIndex.searchButton) .waitForNumberOfElements(selectors.itemsIndex.searchResult, 0) .countElement(selectors.itemsIndex.searchResult); @@ -49,7 +48,7 @@ describe('Item Create/Clone path', () => { it('should create the Infinity Gauntlet item', async() => { const result = await nightmare - .type(selectors.itemCreateView.temporalName, 'Infinity Gauntlet') + .write(selectors.itemCreateView.temporalName, 'Infinity Gauntlet') .autocompleteSearch(selectors.itemCreateView.typeAutocomplete, 'Crisantemo') .autocompleteSearch(selectors.itemCreateView.intrastatAutocomplete, 'Coral y materiales similares') .autocompleteSearch(selectors.itemCreateView.originAutocomplete, 'Holand') @@ -96,8 +95,7 @@ describe('Item Create/Clone path', () => { it(`should search for the item Infinity Gauntlet`, async() => { const result = await nightmare - .wait(selectors.itemsIndex.searchItemInput) - .type(selectors.itemsIndex.searchItemInput, 'Infinity Gauntlet') + .write(selectors.itemsIndex.searchItemInput, 'Infinity Gauntlet') .click(selectors.itemsIndex.searchButton) .waitForNumberOfElements(selectors.itemsIndex.searchResult, 1) .countElement(selectors.itemsIndex.searchResult); @@ -119,8 +117,7 @@ describe('Item Create/Clone path', () => { it('should search for the item Infinity Gauntlet and find two', async() => { const result = await nightmare .waitToClick(selectors.itemTags.goToItemIndexButton) - .wait(selectors.itemsIndex.searchItemInput) - .type(selectors.itemsIndex.searchItemInput, 'Infinity Gauntlet') + .write(selectors.itemsIndex.searchItemInput, 'Infinity Gauntlet') .click(selectors.itemsIndex.searchButton) .waitForNumberOfElements(selectors.itemsIndex.searchResult, 2) .countElement(selectors.itemsIndex.searchResult); diff --git a/e2e/paths/order-module/01_edit_basic_data.spec.js b/e2e/paths/order-module/01_edit_basic_data.spec.js index 1b4e270c7c..222ba9f6ef 100644 --- a/e2e/paths/order-module/01_edit_basic_data.spec.js +++ b/e2e/paths/order-module/01_edit_basic_data.spec.js @@ -46,11 +46,17 @@ describe('Order edit basic data path', () => { }); describe('when new order', () => { - beforeAll(() => { - nightmare - .loginAndModule('employee', 'order') + it('should once more navigate to order index', async() => { + const url = await nightmare + .waitToClick(selectors.globalItems.returnToModuleIndexButton) + .waitToClick(selectors.globalItems.acceptVnConfirm) + .wait(selectors.ordersIndex.createOrderButton) .accessToSearchResult('18') - .accessToSection('order.card.basicData'); + .accessToSection('order.card.basicData') + .wait(selectors.orderBasicData.companyAutocomplete) + .parsedUrl(); + + expect(url.hash).toEqual('#!/order/18/basic-data'); }); it('should be able to modify all the properties', async() => { @@ -58,7 +64,7 @@ describe('Order edit basic data path', () => { .autocompleteSearch(selectors.orderBasicData.clientAutocomplete, 'Tony Stark') .autocompleteSearch(selectors.orderBasicData.companyAutocomplete, 'CCs') .clearInput(selectors.orderBasicData.observationInput) - .type(selectors.orderBasicData.observationInput, 'Observation modified') + .write(selectors.orderBasicData.observationInput, 'Observation modified') .click(selectors.orderBasicData.saveButton) .waitForLastSnackbar(); diff --git a/e2e/paths/ticket-module/13_create_ticket_services.spec.js b/e2e/paths/ticket-module/13_create_ticket_services.spec.js index 378c85ac80..a5e0e1c041 100644 --- a/e2e/paths/ticket-module/13_create_ticket_services.spec.js +++ b/e2e/paths/ticket-module/13_create_ticket_services.spec.js @@ -24,7 +24,10 @@ describe('Ticket services path', () => { .waitToClick(selectors.ticketService.saveServiceButton) .waitForLastSnackbar(); - expect(result).toEqual('Data saved!'); + expect(result).toEqual('¡Datos guardados!'); + + // #1051 Traducciones que fallan + // expect(result).toEqual('Data saved!'); }); it('should confirm the service description was edited correctly', async() => { @@ -64,7 +67,10 @@ describe('Ticket services path', () => { .waitToClick(selectors.ticketService.saveServiceButton) .waitForLastSnackbar(); - expect(result).toEqual('Data saved!'); + expect(result).toEqual('¡Datos guardados!'); + + // #1051 Traducciones que fallan + // expect(result).toEqual('Data saved!'); }); it('should confirm the service was sucessfully removed', async() => { diff --git a/e2e/paths/ticket-module/14_create_ticket.spec.js b/e2e/paths/ticket-module/14_create_ticket.spec.js index b308cabf45..3fca25c384 100644 --- a/e2e/paths/ticket-module/14_create_ticket.spec.js +++ b/e2e/paths/ticket-module/14_create_ticket.spec.js @@ -31,7 +31,7 @@ describe('Ticket create path', () => { expect(result).toEqual(`You can't create a ticket for a inactive client`); }); - it('should suceed to create a ticket for a valid client', async() => { + it('should succeed to create a ticket for a valid client', async() => { const result = await nightmare .autocompleteSearch(selectors.createTicketView.clientAutocomplete, 'Tony Stark') .autocompleteSearch(selectors.createTicketView.addressAutocomplete, 'Tony Stark') @@ -41,7 +41,10 @@ describe('Ticket create path', () => { .waitToClick(selectors.createTicketView.createButton) .waitForLastSnackbar(); - expect(result).toEqual('Data saved!'); + expect(result).toEqual('¡Datos guardados!'); + + // #1051 Traducciones que fallan + // expect(result).toEqual('Data saved!'); }); it('should check the url is now the summary of the ticket', async() => { From 2673a36578bdb3195ae7daea3aa20c70028c3703 Mon Sep 17 00:00:00 2001 From: Carlos Jimenez Ruiz Date: Wed, 23 Jan 2019 16:00:56 +0100 Subject: [PATCH 33/37] small e2e refactors --- .../claim-module/01_edit_basic_data.spec.js | 8 +++---- .../02_create_development.spec.js | 2 +- .../client-module/01_create_client.spec.js | 14 ++++++------ .../client-module/02_edit_basic_data.spec.js | 12 +++++----- .../client-module/03_edit_fiscal_data.spec.js | 2 +- .../client-module/05_add_address.spec.js | 2 +- e2e/paths/client-module/08_add_notes.spec.js | 2 +- e2e/paths/client-module/09_add_credit.spec.js | 2 +- e2e/paths/client-module/10_add_greuge.spec.js | 4 ++-- .../12_lock_of_verified_data.spec.js | 16 +++++++------- e2e/paths/client-module/14_risk.spec.js | 2 +- e2e/paths/item-module/01_item_summary.spec.js | 6 ++--- .../02_edit_item_basic_data.spec.js | 2 +- .../item-module/03_edit_item_tax.spec.js | 6 ++--- .../item-module/04_create_item_tags.spec.js | 6 ++--- .../item-module/05_create_item_niche.spec.js | 6 ++--- .../06_create_item_botanical.spec.js | 8 +++---- .../08_item_create_and_clone.spec.js | 18 +++++++-------- .../item-module/09_regularize_item.spec.js | 4 ++-- .../order-module/01_edit_basic_data.spec.js | 10 ++++----- .../01_create_ticket_observations.spec.js | 6 ++--- .../02_ticket_expeditions_and_log.spec.js | 4 ++-- .../04_create_ticket_packages.spec.js | 12 +++++----- .../05_create_new_tracking_state.spec.js | 8 +++---- .../06_edit_basic_data_steps.spec.js | 10 ++++----- e2e/paths/ticket-module/07_edit_sale.spec.js | 22 +++++++++---------- .../ticket-module/09_ticket_weekly.spec.js | 4 ++-- .../ticket-module/11_ticket_diary.spec.js | 2 +- .../12_delete_ticket_from_descriptor.spec.js | 4 ++-- .../13_create_ticket_services.spec.js | 4 ++-- e2e/smokes/01_client_path.spec.js | 6 ++--- 31 files changed, 107 insertions(+), 107 deletions(-) diff --git a/e2e/paths/claim-module/01_edit_basic_data.spec.js b/e2e/paths/claim-module/01_edit_basic_data.spec.js index 283e4b7659..15c89c690c 100644 --- a/e2e/paths/claim-module/01_edit_basic_data.spec.js +++ b/e2e/paths/claim-module/01_edit_basic_data.spec.js @@ -17,7 +17,7 @@ describe('Claim edit basic data path', () => { .waitToClick(selectors.claimBasicData.isPaidWithManaCheckbox) .clearInput(selectors.claimBasicData.observationInput) .write(selectors.claimBasicData.observationInput, 'edited observation') - .click(selectors.claimBasicData.saveButton) + .waitToClick(selectors.claimBasicData.saveButton) .waitForSnackbar(); expect(result).toEqual(jasmine.arrayContaining(['Data saved!'])); @@ -25,9 +25,9 @@ describe('Claim edit basic data path', () => { it('should confirm the claim state was edited', async() => { const result = await nightmare - .click(selectors.claimDetail.detailButton) + .waitToClick(selectors.claimDetail.detailButton) .wait(selectors.claimDetail.addItemButton) - .click(selectors.claimBasicData.basicDataButton) + .waitToClick(selectors.claimBasicData.basicDataButton) .wait(selectors.claimBasicData.claimStateAutocomplete) .waitToGetProperty(`${selectors.claimBasicData.claimStateAutocomplete} input`, 'value'); @@ -56,7 +56,7 @@ describe('Claim edit basic data path', () => { .waitToClick(selectors.claimBasicData.isPaidWithManaCheckbox) .clearInput(selectors.claimBasicData.observationInput) .write(selectors.claimBasicData.observationInput, 'Observation one') - .click(selectors.claimBasicData.saveButton) + .waitToClick(selectors.claimBasicData.saveButton) .waitForSnackbar(); expect(result).toEqual(jasmine.arrayContaining(['Data saved!'])); diff --git a/e2e/paths/claim-module/02_create_development.spec.js b/e2e/paths/claim-module/02_create_development.spec.js index bce93b7046..32b45337aa 100644 --- a/e2e/paths/claim-module/02_create_development.spec.js +++ b/e2e/paths/claim-module/02_create_development.spec.js @@ -43,7 +43,7 @@ describe('Claim development', () => { const reason = await nightmare .waitToClick(selectors.claimBasicData.basicDataButton) .wait(selectors.claimBasicData.claimStateAutocomplete) - .click(selectors.claimDevelopment.developmentButton) + .waitToClick(selectors.claimDevelopment.developmentButton) .waitToGetProperty(`${selectors.claimDevelopment.firstClaimReasonAutocomplete} input`, 'value'); const result = await nightmare diff --git a/e2e/paths/client-module/01_create_client.spec.js b/e2e/paths/client-module/01_create_client.spec.js index b6a4c54f7f..467603d70e 100644 --- a/e2e/paths/client-module/01_create_client.spec.js +++ b/e2e/paths/client-module/01_create_client.spec.js @@ -12,7 +12,7 @@ describe('Client create path', () => { it(`should search for the user Carol Danvers to confirm it isn't created yet`, async() => { const result = await nightmare .write(selectors.clientsIndex.searchClientInput, 'Carol Danvers') - .click(selectors.clientsIndex.searchButton) + .waitToClick(selectors.clientsIndex.searchButton) .waitForNumberOfElements(selectors.clientsIndex.searchResult, 0) .countElement(selectors.clientsIndex.searchResult); @@ -21,7 +21,7 @@ describe('Client create path', () => { it('should now access to the create client view by clicking the create-client floating button', async() => { const url = await nightmare - .click(selectors.clientsIndex.createClientButton) + .waitToClick(selectors.clientsIndex.createClientButton) .wait(selectors.createClientView.createButton) .parsedUrl(); @@ -30,7 +30,7 @@ describe('Client create path', () => { it('should receive an error when clicking the create button having all the form fields empty', async() => { const result = await nightmare - .click(selectors.createClientView.createButton) + .waitToClick(selectors.createClientView.createButton) .waitForLastSnackbar(); expect(result).toEqual('Some fields are invalid'); @@ -42,7 +42,7 @@ describe('Client create path', () => { .write(selectors.createClientView.userName, 'CaptainMarvel') .write(selectors.createClientView.email, 'CarolDanvers@verdnatura.es') .autocompleteSearch(selectors.createClientView.salesPersonAutocomplete, 'Accessory') - .click(selectors.createClientView.createButton) + .waitToClick(selectors.createClientView.createButton) .waitForLastSnackbar(); expect(result).toEqual('Some fields are invalid'); @@ -54,7 +54,7 @@ describe('Client create path', () => { .write(selectors.createClientView.socialName, 'AVG tax') .clearInput(selectors.createClientView.email) .write(selectors.createClientView.email, 'incorrect email format') - .click(selectors.createClientView.createButton) + .waitToClick(selectors.createClientView.createButton) .waitForLastSnackbar(); expect(result).toEqual('Some fields are invalid'); @@ -64,7 +64,7 @@ describe('Client create path', () => { const result = await nightmare .clearInput(selectors.createClientView.email) .write(selectors.createClientView.email, 'caroldanvers@verdnatura.es') - .click(selectors.createClientView.createButton) + .waitToClick(selectors.createClientView.createButton) .waitForLastSnackbar(); expect(result).toEqual('Data saved!'); @@ -84,7 +84,7 @@ describe('Client create path', () => { it(`should search for the user Carol Danvers to confirm it exists`, async() => { const result = await nightmare .write(selectors.clientsIndex.searchClientInput, 'Carol Danvers') - .click(selectors.clientsIndex.searchButton) + .waitToClick(selectors.clientsIndex.searchButton) .waitForNumberOfElements(selectors.clientsIndex.searchResult, 1) .countElement(selectors.clientsIndex.searchResult); diff --git a/e2e/paths/client-module/02_edit_basic_data.spec.js b/e2e/paths/client-module/02_edit_basic_data.spec.js index 43a8274cd5..220c0d1867 100644 --- a/e2e/paths/client-module/02_edit_basic_data.spec.js +++ b/e2e/paths/client-module/02_edit_basic_data.spec.js @@ -34,7 +34,7 @@ describe('Client Edit basicData path', () => { .clearInput(selectors.clientBasicData.emailInput) .write(selectors.clientBasicData.emailInput, 'PWallace@verdnatura.es') .autocompleteSearch(selectors.clientBasicData.channelAutocomplete, 'Rumors on the streets') - .click(selectors.clientBasicData.saveButton) + .waitToClick(selectors.clientBasicData.saveButton) .waitForLastSnackbar(); expect(result).toEqual('Data saved!'); @@ -42,9 +42,9 @@ describe('Client Edit basicData path', () => { it('should confirm the name have been edited', async() => { const result = await nightmare - .click(selectors.clientFiscalData.fiscalDataButton) + .waitToClick(selectors.clientFiscalData.fiscalDataButton) .wait(selectors.clientFiscalData.addressInput) - .click(selectors.clientBasicData.basicDataButton) + .waitToClick(selectors.clientBasicData.basicDataButton) .waitToGetProperty(selectors.clientBasicData.nameInput, 'value'); expect(result).toEqual('Ptonomy Wallace'); @@ -119,7 +119,7 @@ describe('Client Edit basicData path', () => { .write(selectors.clientBasicData.emailInput, 'Storm@verdnatura.es') .autocompleteSearch(selectors.clientBasicData.salesPersonAutocomplete, 'Accessory') .autocompleteSearch(selectors.clientBasicData.channelAutocomplete, 'Metropolis newspaper') - .click(selectors.clientBasicData.saveButton) + .waitToClick(selectors.clientBasicData.saveButton) .waitForLastSnackbar(); expect(result).toEqual('Data saved!'); @@ -127,9 +127,9 @@ describe('Client Edit basicData path', () => { it('should now confirm the name have been edited', async() => { const result = await nightmare - .click(selectors.clientFiscalData.fiscalDataButton) + .waitToClick(selectors.clientFiscalData.fiscalDataButton) .wait(selectors.clientFiscalData.addressInput) - .click(selectors.clientBasicData.basicDataButton) + .waitToClick(selectors.clientBasicData.basicDataButton) .waitToGetProperty(selectors.clientBasicData.nameInput, 'value'); expect(result).toEqual('Ororo Munroe'); diff --git a/e2e/paths/client-module/03_edit_fiscal_data.spec.js b/e2e/paths/client-module/03_edit_fiscal_data.spec.js index 1686556916..2326a1108f 100644 --- a/e2e/paths/client-module/03_edit_fiscal_data.spec.js +++ b/e2e/paths/client-module/03_edit_fiscal_data.spec.js @@ -312,7 +312,7 @@ describe('Client Edit fiscalData path', () => { const result = await nightmare .waitToClick(selectors.clientAddresses.firstEditButton) .waitToClick(selectors.clientAddresses.equalizationTaxCheckboxLabel) - .click(selectors.clientAddresses.saveButton) + .waitToClick(selectors.clientAddresses.saveButton) .waitForLastSnackbar(); expect(result).toEqual('Data saved!'); diff --git a/e2e/paths/client-module/05_add_address.spec.js b/e2e/paths/client-module/05_add_address.spec.js index dc7e615c1c..e082b6d8c9 100644 --- a/e2e/paths/client-module/05_add_address.spec.js +++ b/e2e/paths/client-module/05_add_address.spec.js @@ -40,7 +40,7 @@ describe('Client Add address path', () => { .write(selectors.clientAddresses.consigneeInput, 'Bruce Bunner') .write(selectors.clientAddresses.streetAddressInput, '320 Park Avenue New York') .write(selectors.clientAddresses.cityInput, 'New York') - .click(selectors.clientAddresses.saveButton) + .waitToClick(selectors.clientAddresses.saveButton) .waitForLastSnackbar(); expect(result).toEqual('Data saved!'); diff --git a/e2e/paths/client-module/08_add_notes.spec.js b/e2e/paths/client-module/08_add_notes.spec.js index c5c9defbc2..1528dd79b9 100644 --- a/e2e/paths/client-module/08_add_notes.spec.js +++ b/e2e/paths/client-module/08_add_notes.spec.js @@ -23,7 +23,7 @@ describe('Client Add notes path', () => { it(`should create a note`, async() => { const result = await nightmare .write(selectors.clientNotes.noteInput, 'Meeting with Black Widow 21st 9am') - .click(selectors.clientNotes.saveButton) + .waitToClick(selectors.clientNotes.saveButton) .waitForLastSnackbar(); expect(result).toEqual('Data saved!'); diff --git a/e2e/paths/client-module/09_add_credit.spec.js b/e2e/paths/client-module/09_add_credit.spec.js index a37fb0e736..60ff2d3478 100644 --- a/e2e/paths/client-module/09_add_credit.spec.js +++ b/e2e/paths/client-module/09_add_credit.spec.js @@ -24,7 +24,7 @@ describe('Client Add credit path', () => { const result = await nightmare .clearInput(selectors.clientCredit.creditInput) .write(selectors.clientCredit.creditInput, 999) - .click(selectors.clientCredit.saveButton) + .waitToClick(selectors.clientCredit.saveButton) .waitForLastSnackbar(); expect(result).toEqual('Data saved!'); diff --git a/e2e/paths/client-module/10_add_greuge.spec.js b/e2e/paths/client-module/10_add_greuge.spec.js index 5f845df84f..46fdf65e37 100644 --- a/e2e/paths/client-module/10_add_greuge.spec.js +++ b/e2e/paths/client-module/10_add_greuge.spec.js @@ -23,7 +23,7 @@ describe('Client Add greuge path', () => { it(`should receive an error if all fields are empty but date and type on submit`, async() => { const result = await nightmare .autocompleteSearch(selectors.clientGreuge.typeAutocomplete, 'Diff') - .click(selectors.clientGreuge.saveButton) + .waitToClick(selectors.clientGreuge.saveButton) .waitForLastSnackbar(); expect(result).toEqual('Some fields are invalid'); @@ -34,7 +34,7 @@ describe('Client Add greuge path', () => { .write(selectors.clientGreuge.amountInput, 999) .waitForTextInInput(selectors.clientGreuge.amountInput, '999') .write(selectors.clientGreuge.descriptionInput, 'new armor for Batman!') - .click(selectors.clientGreuge.saveButton) + .waitToClick(selectors.clientGreuge.saveButton) .waitForLastSnackbar(); expect(result).toEqual('Data saved!'); diff --git a/e2e/paths/client-module/12_lock_of_verified_data.spec.js b/e2e/paths/client-module/12_lock_of_verified_data.spec.js index ba0141a783..3677535863 100644 --- a/e2e/paths/client-module/12_lock_of_verified_data.spec.js +++ b/e2e/paths/client-module/12_lock_of_verified_data.spec.js @@ -28,7 +28,7 @@ describe('Client lock verified data path', () => { .wait(selectors.clientFiscalData.socialNameInput) .clearInput(selectors.clientFiscalData.socialNameInput) .write(selectors.clientFiscalData.socialNameInput, 'salesPerson was here') - .click(selectors.clientFiscalData.saveButton) + .waitToClick(selectors.clientFiscalData.saveButton) .waitForLastSnackbar(); expect(result).toEqual('Data saved!'); @@ -66,7 +66,7 @@ describe('Client lock verified data path', () => { it('should search again for the user Petter Parker', async() => { const resultCount = await nightmare .write(selectors.clientsIndex.searchClientInput, 'Petter Parker') - .click(selectors.clientsIndex.searchButton) + .waitToClick(selectors.clientsIndex.searchButton) .waitForNumberOfElements(selectors.clientsIndex.searchResult, 1) .countElement(selectors.clientsIndex.searchResult); @@ -130,7 +130,7 @@ describe('Client lock verified data path', () => { .wait(selectors.clientFiscalData.socialNameInput) .clearInput(selectors.clientFiscalData.socialNameInput) .write(selectors.clientFiscalData.socialNameInput, 'administrative was here') - .click(selectors.clientFiscalData.saveButton) + .waitToClick(selectors.clientFiscalData.saveButton) .waitForLastSnackbar(); expect(result).toEqual('Data saved!'); @@ -168,7 +168,7 @@ describe('Client lock verified data path', () => { it('should again search for the user Petter Parker', async() => { const resultCount = await nightmare .write(selectors.clientsIndex.searchClientInput, 'Petter Parker') - .click(selectors.clientsIndex.searchButton) + .waitToClick(selectors.clientsIndex.searchButton) .waitForNumberOfElements(selectors.clientsIndex.searchResult, 1) .countElement(selectors.clientsIndex.searchResult); @@ -209,7 +209,7 @@ describe('Client lock verified data path', () => { const result = await nightmare .clearInput(selectors.clientFiscalData.socialNameInput) .write(selectors.clientFiscalData.socialNameInput, 'salesPerson was here') - .click(selectors.clientFiscalData.saveButton) + .waitToClick(selectors.clientFiscalData.saveButton) .waitForSnackbar(); expect(result).toEqual(jasmine.arrayContaining([`You can't make changes on a client with verified data`])); @@ -237,7 +237,7 @@ describe('Client lock verified data path', () => { it('should now search again for the user Petter Parker', async() => { const resultCount = await nightmare .write(selectors.clientsIndex.searchClientInput, 'Petter Parker') - .click(selectors.clientsIndex.searchButton) + .waitToClick(selectors.clientsIndex.searchButton) .waitForNumberOfElements(selectors.clientsIndex.searchResult, 1) .countElement(selectors.clientsIndex.searchResult); @@ -278,7 +278,7 @@ describe('Client lock verified data path', () => { const result = await nightmare .clearInput(selectors.clientFiscalData.socialNameInput) .write(selectors.clientFiscalData.socialNameInput, 'salesAssistant was here') - .click(selectors.clientFiscalData.saveButton) + .waitToClick(selectors.clientFiscalData.saveButton) .waitForLastSnackbar(); expect(result).toEqual('Data saved!'); @@ -316,7 +316,7 @@ describe('Client lock verified data path', () => { it('should once again search for the user Petter Parker', async() => { const resultCount = await nightmare .write(selectors.clientsIndex.searchClientInput, 'Petter Parker') - .click(selectors.clientsIndex.searchButton) + .waitToClick(selectors.clientsIndex.searchButton) .waitForNumberOfElements(selectors.clientsIndex.searchResult, 1) .countElement(selectors.clientsIndex.searchResult); diff --git a/e2e/paths/client-module/14_risk.spec.js b/e2e/paths/client-module/14_risk.spec.js index 3f8e2eb8bf..b0613e4fb9 100644 --- a/e2e/paths/client-module/14_risk.spec.js +++ b/e2e/paths/client-module/14_risk.spec.js @@ -104,7 +104,7 @@ describe('Client risk path', () => { it('should now search for the user Petter Parker', async() => { let resultCount = await nightmare .write(selectors.clientsIndex.searchClientInput, 'Petter Parker') - .click(selectors.clientsIndex.searchButton) + .waitToClick(selectors.clientsIndex.searchButton) .waitForNumberOfElements(selectors.clientsIndex.searchResult, 1) .countElement(selectors.clientsIndex.searchResult); diff --git a/e2e/paths/item-module/01_item_summary.spec.js b/e2e/paths/item-module/01_item_summary.spec.js index b5922be358..ee6fd87853 100644 --- a/e2e/paths/item-module/01_item_summary.spec.js +++ b/e2e/paths/item-module/01_item_summary.spec.js @@ -12,7 +12,7 @@ describe('Item summary path', () => { it('should search for an item', async() => { const result = await nightmare .write(selectors.itemsIndex.searchItemInput, 'Object1 Gem1 5') - .click(selectors.itemsIndex.searchButton) + .waitToClick(selectors.itemsIndex.searchButton) .waitForNumberOfElements(selectors.itemsIndex.searchResult, 1) .countElement(selectors.itemsIndex.searchResult); @@ -83,9 +83,9 @@ describe('Item summary path', () => { it('should search for other item', async() => { const result = await nightmare .clearInput('vn-item-index vn-searchbar input') - .click(selectors.itemsIndex.searchButton) + .waitToClick(selectors.itemsIndex.searchButton) .write(selectors.itemsIndex.searchItemInput, 'Object2 Gem2 3') - .click(selectors.itemsIndex.searchButton) + .waitToClick(selectors.itemsIndex.searchButton) .waitForNumberOfElements(selectors.itemsIndex.searchResult, 1) .countElement(selectors.itemsIndex.searchResult); diff --git a/e2e/paths/item-module/02_edit_item_basic_data.spec.js b/e2e/paths/item-module/02_edit_item_basic_data.spec.js index 2c74400c82..7cdd89993a 100644 --- a/e2e/paths/item-module/02_edit_item_basic_data.spec.js +++ b/e2e/paths/item-module/02_edit_item_basic_data.spec.js @@ -32,7 +32,7 @@ describe('Item Edit basic data path', () => { it(`should confirm the item name was edited`, async() => { const result = await nightmare - .click(selectors.itemNiches.nicheButton) + .waitToClick(selectors.itemNiches.nicheButton) .wait(selectors.itemNiches.firstWarehouseDisabled) .waitToClick(selectors.itemBasicData.basicDataButton) .waitToGetProperty(selectors.itemBasicData.nameInput, 'value'); diff --git a/e2e/paths/item-module/03_edit_item_tax.spec.js b/e2e/paths/item-module/03_edit_item_tax.spec.js index 66260a69bd..f5f533db95 100644 --- a/e2e/paths/item-module/03_edit_item_tax.spec.js +++ b/e2e/paths/item-module/03_edit_item_tax.spec.js @@ -16,7 +16,7 @@ describe('Item edit tax path', () => { .autocompleteSearch(selectors.itemTax.firstClassAutocomplete, 'Reduced VAT') .autocompleteSearch(selectors.itemTax.secondClassAutocomplete, 'General VAT') .autocompleteSearch(selectors.itemTax.thirdClassAutocomplete, 'Reduced VAT') - .click(selectors.itemTax.submitTaxButton) + .waitToClick(selectors.itemTax.submitTaxButton) .waitForLastSnackbar(); expect(result).toEqual('Data saved!'); @@ -24,9 +24,9 @@ describe('Item edit tax path', () => { it(`should confirm the first item tax class was edited`, async() => { const firstVatType = await nightmare - .click(selectors.itemTags.tagsButton) + .waitToClick(selectors.itemTags.tagsButton) .wait(selectors.itemTags.firstTagDisabled) - .click(selectors.itemTax.taxButton) + .waitToClick(selectors.itemTax.taxButton) .waitToClick(selectors.itemTax.taxButton) .waitToGetProperty(`${selectors.itemTax.firstClassAutocomplete} input`, 'value'); diff --git a/e2e/paths/item-module/04_create_item_tags.spec.js b/e2e/paths/item-module/04_create_item_tags.spec.js index b4df877817..7b7e1b3a48 100644 --- a/e2e/paths/item-module/04_create_item_tags.spec.js +++ b/e2e/paths/item-module/04_create_item_tags.spec.js @@ -19,7 +19,7 @@ describe('Item create tags path', () => { .write(selectors.itemTags.seventhValueInput, '50') .clearInput(selectors.itemTags.seventhRelevancyInput) .write(selectors.itemTags.seventhRelevancyInput, '4') - .click(selectors.itemTags.submitItemTagsButton) + .waitToClick(selectors.itemTags.submitItemTagsButton) .waitForLastSnackbar(); expect(result).toEqual('Data saved!'); @@ -27,9 +27,9 @@ describe('Item create tags path', () => { it(`should confirm the fourth row data is the expected one`, async() => { let result = await nightmare - .click(selectors.itemBasicData.basicDataButton) + .waitToClick(selectors.itemBasicData.basicDataButton) .wait(selectors.itemBasicData.nameInput) - .click(selectors.itemTags.tagsButton) + .waitToClick(selectors.itemTags.tagsButton) .wait('vn-item-tags') .waitToGetProperty(`${selectors.itemTags.fourthTagAutocomplete} input`, 'value'); diff --git a/e2e/paths/item-module/05_create_item_niche.spec.js b/e2e/paths/item-module/05_create_item_niche.spec.js index 1ce170f6dd..f435006342 100644 --- a/e2e/paths/item-module/05_create_item_niche.spec.js +++ b/e2e/paths/item-module/05_create_item_niche.spec.js @@ -17,7 +17,7 @@ describe('Item create niche path', () => { .waitToClick(selectors.itemNiches.secondNicheRemoveButton) .autocompleteSearch(selectors.itemNiches.thirdWarehouseAutocomplete, 'Warehouse Two') .write(selectors.itemNiches.thirdCodeInput, 'A4') - .click(selectors.itemNiches.submitNichesButton) + .waitToClick(selectors.itemNiches.submitNichesButton) .waitForLastSnackbar(); expect(result).toEqual('Data saved!'); @@ -25,9 +25,9 @@ describe('Item create niche path', () => { it(`should confirm the first niche is the expected one`, async() => { let result = await nightmare - .click(selectors.itemBasicData.basicDataButton) + .waitToClick(selectors.itemBasicData.basicDataButton) .wait(selectors.itemBasicData.nameInput) - .click(selectors.itemNiches.nicheButton) + .waitToClick(selectors.itemNiches.nicheButton) .waitForTextInInput(`${selectors.itemNiches.firstWarehouseAutocomplete} input`, 'Warehouse One') .waitToGetProperty(`${selectors.itemNiches.firstWarehouseAutocomplete} input`, 'value'); diff --git a/e2e/paths/item-module/06_create_item_botanical.spec.js b/e2e/paths/item-module/06_create_item_botanical.spec.js index fa0f339f90..98bd38f4a3 100644 --- a/e2e/paths/item-module/06_create_item_botanical.spec.js +++ b/e2e/paths/item-module/06_create_item_botanical.spec.js @@ -24,9 +24,9 @@ describe('Item Create botanical path', () => { it(`should confirm the botanical for the item was created`, async() => { const result = await nightmare - .click(selectors.itemBasicData.basicDataButton) + .waitToClick(selectors.itemBasicData.basicDataButton) .wait(selectors.itemBasicData.nameInput) - .click(selectors.itemBotanical.botanicalButton) + .waitToClick(selectors.itemBotanical.botanicalButton) .waitForTextInInput(selectors.itemBotanical.botanicalInput, 'Cicuta maculata') .waitToGetProperty(selectors.itemBotanical.botanicalInput, 'value'); @@ -62,9 +62,9 @@ describe('Item Create botanical path', () => { it(`should confirm the botanical for the item was edited`, async() => { const result = await nightmare - .click(selectors.itemBasicData.basicDataButton) + .waitToClick(selectors.itemBasicData.basicDataButton) .wait(selectors.itemBasicData.nameInput) - .click(selectors.itemBotanical.botanicalButton) + .waitToClick(selectors.itemBotanical.botanicalButton) .waitForTextInInput(selectors.itemBotanical.botanicalInput, 'Herp Derp') .waitToGetProperty(selectors.itemBotanical.botanicalInput, 'value'); diff --git a/e2e/paths/item-module/08_item_create_and_clone.spec.js b/e2e/paths/item-module/08_item_create_and_clone.spec.js index 4411d7877b..b5e33cc4a1 100644 --- a/e2e/paths/item-module/08_item_create_and_clone.spec.js +++ b/e2e/paths/item-module/08_item_create_and_clone.spec.js @@ -12,7 +12,7 @@ describe('Item Create/Clone path', () => { it(`should search for the item Infinity Gauntlet to confirm it isn't created yet`, async() => { const result = await nightmare .write(selectors.itemsIndex.searchItemInput, 'Infinity Gauntlet') - .click(selectors.itemsIndex.searchButton) + .waitToClick(selectors.itemsIndex.searchButton) .waitForNumberOfElements(selectors.itemsIndex.searchResult, 0) .countElement(selectors.itemsIndex.searchResult); @@ -21,7 +21,7 @@ describe('Item Create/Clone path', () => { it('should access to the create item view by clicking the create floating button', async() => { const url = await nightmare - .click(selectors.itemsIndex.createItemButton) + .waitToClick(selectors.itemsIndex.createItemButton) .wait(selectors.itemCreateView.createButton) .parsedUrl(); @@ -30,7 +30,7 @@ describe('Item Create/Clone path', () => { it('should return to the item index by clickig the cancel button', async() => { const url = await nightmare - .click(selectors.itemCreateView.cancelButton) + .waitToClick(selectors.itemCreateView.cancelButton) .wait(selectors.itemsIndex.createItemButton) .parsedUrl(); @@ -39,7 +39,7 @@ describe('Item Create/Clone path', () => { it('should now access to the create item view by clicking the create floating button', async() => { const url = await nightmare - .click(selectors.itemsIndex.createItemButton) + .waitToClick(selectors.itemsIndex.createItemButton) .wait(selectors.itemCreateView.createButton) .parsedUrl(); @@ -52,7 +52,7 @@ describe('Item Create/Clone path', () => { .autocompleteSearch(selectors.itemCreateView.typeAutocomplete, 'Crisantemo') .autocompleteSearch(selectors.itemCreateView.intrastatAutocomplete, 'Coral y materiales similares') .autocompleteSearch(selectors.itemCreateView.originAutocomplete, 'Holand') - .click(selectors.itemCreateView.createButton) + .waitToClick(selectors.itemCreateView.createButton) .waitForLastSnackbar(); expect(result).toEqual('Data saved!'); @@ -85,7 +85,7 @@ describe('Item Create/Clone path', () => { describe('clone', () => { it('should return to the items index by clicking the return to items button', async() => { const url = await nightmare - .click(selectors.itemBasicData.goToItemIndexButton) + .waitToClick(selectors.itemBasicData.goToItemIndexButton) .wait(selectors.itemsIndex.createItemButton) .waitForURL('#!/item/index') .parsedUrl(); @@ -96,7 +96,7 @@ describe('Item Create/Clone path', () => { it(`should search for the item Infinity Gauntlet`, async() => { const result = await nightmare .write(selectors.itemsIndex.searchItemInput, 'Infinity Gauntlet') - .click(selectors.itemsIndex.searchButton) + .waitToClick(selectors.itemsIndex.searchButton) .waitForNumberOfElements(selectors.itemsIndex.searchResult, 1) .countElement(selectors.itemsIndex.searchResult); @@ -106,7 +106,7 @@ describe('Item Create/Clone path', () => { it(`should clone the Infinity Gauntlet`, async() => { const url = await nightmare .waitForTextInElement(selectors.itemsIndex.searchResult, 'Infinity Gauntlet') - .click(selectors.itemsIndex.searchResultCloneButton) + .waitToClick(selectors.itemsIndex.searchResultCloneButton) .waitToClick(selectors.itemsIndex.acceptClonationAlertButton) .waitForURL('tags') .parsedUrl(); @@ -118,7 +118,7 @@ describe('Item Create/Clone path', () => { const result = await nightmare .waitToClick(selectors.itemTags.goToItemIndexButton) .write(selectors.itemsIndex.searchItemInput, 'Infinity Gauntlet') - .click(selectors.itemsIndex.searchButton) + .waitToClick(selectors.itemsIndex.searchButton) .waitForNumberOfElements(selectors.itemsIndex.searchResult, 2) .countElement(selectors.itemsIndex.searchResult); diff --git a/e2e/paths/item-module/09_regularize_item.spec.js b/e2e/paths/item-module/09_regularize_item.spec.js index 76879c4abf..302a66c427 100644 --- a/e2e/paths/item-module/09_regularize_item.spec.js +++ b/e2e/paths/item-module/09_regularize_item.spec.js @@ -100,7 +100,7 @@ describe('Item regularize path', () => { it('should search for the item once again', async() => { const resultCount = await nightmare .write(selectors.itemsIndex.searchItemInput, 'Object5 Weapon 50') - .click(selectors.itemsIndex.searchButton) + .waitToClick(selectors.itemsIndex.searchButton) .waitForNumberOfElements(selectors.itemsIndex.searchResult, 1) .countElement(selectors.itemsIndex.searchResult); @@ -143,7 +143,7 @@ describe('Item regularize path', () => { it('should search for the ticket with id 23 once again', async() => { const result = await nightmare .write(selectors.ticketsIndex.searchTicketInput, 'id:23') - .click(selectors.ticketsIndex.searchButton) + .waitToClick(selectors.ticketsIndex.searchButton) .waitForNumberOfElements(selectors.ticketsIndex.searchResult, 1) .countElement(selectors.ticketsIndex.searchResult); diff --git a/e2e/paths/order-module/01_edit_basic_data.spec.js b/e2e/paths/order-module/01_edit_basic_data.spec.js index 222ba9f6ef..3a5ccdd2fb 100644 --- a/e2e/paths/order-module/01_edit_basic_data.spec.js +++ b/e2e/paths/order-module/01_edit_basic_data.spec.js @@ -14,7 +14,7 @@ describe('Order edit basic data path', () => { it('should not be able to change the client', async() => { const result = await nightmare .autocompleteSearch(selectors.orderBasicData.clientAutocomplete, 'Tony Stark') - .click(selectors.orderBasicData.saveButton) + .waitToClick(selectors.orderBasicData.saveButton) .waitForLastSnackbar(); expect(result).toEqual(`You can't make changes on the basic data of an confirmed order or with rows`); @@ -38,7 +38,7 @@ describe('Order edit basic data path', () => { it('should not be able to change the company', async() => { const result = await nightmare .autocompleteSearch(selectors.orderBasicData.companyAutocomplete, 'CCs') - .click(selectors.orderBasicData.saveButton) + .waitToClick(selectors.orderBasicData.saveButton) .waitForLastSnackbar(); expect(result).toEqual(`You can't make changes on the basic data of an confirmed order or with rows`); @@ -65,7 +65,7 @@ describe('Order edit basic data path', () => { .autocompleteSearch(selectors.orderBasicData.companyAutocomplete, 'CCs') .clearInput(selectors.orderBasicData.observationInput) .write(selectors.orderBasicData.observationInput, 'Observation modified') - .click(selectors.orderBasicData.saveButton) + .waitToClick(selectors.orderBasicData.saveButton) .waitForLastSnackbar(); expect(result).toEqual('Data saved!'); @@ -73,9 +73,9 @@ describe('Order edit basic data path', () => { it('should now confirm the client have been edited', async() => { const result = await nightmare - .click(selectors.orderCatalog.catalogButton) + .waitToClick(selectors.orderCatalog.catalogButton) .wait(selectors.orderCatalog.orderByAutocomplete) - .click(selectors.orderBasicData.basicDataButton) + .waitToClick(selectors.orderBasicData.basicDataButton) .waitToGetProperty(`${selectors.orderBasicData.clientAutocomplete} input`, 'value'); expect(result).toEqual('104: Tony Stark'); diff --git a/e2e/paths/ticket-module/01_create_ticket_observations.spec.js b/e2e/paths/ticket-module/01_create_ticket_observations.spec.js index 584d090aa9..bcfd043807 100644 --- a/e2e/paths/ticket-module/01_create_ticket_observations.spec.js +++ b/e2e/paths/ticket-module/01_create_ticket_observations.spec.js @@ -17,7 +17,7 @@ describe('Ticket Create notes path', () => { .waitToClick(selectors.ticketNotes.addNoteButton) .autocompleteSearch(selectors.ticketNotes.firstNoteTypeAutocomplete, 'observation one') .write(selectors.ticketNotes.firstDescriptionInput, 'description') - .click(selectors.ticketNotes.submitNotesButton) + .waitToClick(selectors.ticketNotes.submitNotesButton) .waitForLastSnackbar(); expect(result).toEqual('Data saved!'); @@ -25,9 +25,9 @@ describe('Ticket Create notes path', () => { it(`should confirm the note is the expected one`, async() => { let result = await nightmare - .click(selectors.ticketPackages.packagesButton) + .waitToClick(selectors.ticketPackages.packagesButton) .wait(selectors.ticketPackages.firstPackageAutocomplete) - .click(selectors.ticketNotes.notesButton) + .waitToClick(selectors.ticketNotes.notesButton) .waitToGetProperty(`${selectors.ticketNotes.firstNoteTypeAutocomplete} input`, 'value'); expect(result).toEqual('observation one'); diff --git a/e2e/paths/ticket-module/02_ticket_expeditions_and_log.spec.js b/e2e/paths/ticket-module/02_ticket_expeditions_and_log.spec.js index 8cf348320e..b6c3a44c35 100644 --- a/e2e/paths/ticket-module/02_ticket_expeditions_and_log.spec.js +++ b/e2e/paths/ticket-module/02_ticket_expeditions_and_log.spec.js @@ -16,9 +16,9 @@ xdescribe('Ticket expeditions and log path', () => { const result = await nightmare .waitToClick(selectors.ticketExpedition.secondExpeditionRemoveButton) .waitToClick(selectors.ticketExpedition.acceptDeleteRowButton) - .click(selectors.ticketPackages.packagesButton) + .waitToClick(selectors.ticketPackages.packagesButton) .wait(selectors.ticketPackages.firstPackageAutocomplete) - .click(selectors.ticketExpedition.expeditionButton) + .waitToClick(selectors.ticketExpedition.expeditionButton) .wait(selectors.ticketExpedition.expeditionRow) .countElement(selectors.ticketExpedition.expeditionRow); diff --git a/e2e/paths/ticket-module/04_create_ticket_packages.spec.js b/e2e/paths/ticket-module/04_create_ticket_packages.spec.js index d989845052..ce74601ad7 100644 --- a/e2e/paths/ticket-module/04_create_ticket_packages.spec.js +++ b/e2e/paths/ticket-module/04_create_ticket_packages.spec.js @@ -16,7 +16,7 @@ describe('Ticket Create packages path', () => { .waitToClick(selectors.ticketPackages.firstRemovePackageButton) .waitToClick(selectors.ticketPackages.addPackageButton) .autocompleteSearch(selectors.ticketPackages.firstPackageAutocomplete, 'Legendary Box') - .click(selectors.ticketPackages.savePackagesButton) + .waitToClick(selectors.ticketPackages.savePackagesButton) .waitForLastSnackbar(); expect(result).toEqual('Some fields are invalid'); @@ -25,7 +25,7 @@ describe('Ticket Create packages path', () => { it(`should attempt create a new package but receive an error if quantity is a string`, async() => { const result = await nightmare .write(selectors.ticketPackages.firstQuantityInput, 'ninety 9') - .click(selectors.ticketPackages.savePackagesButton) + .waitToClick(selectors.ticketPackages.savePackagesButton) .waitForLastSnackbar(); expect(result).toEqual('Some fields are invalid'); @@ -35,7 +35,7 @@ describe('Ticket Create packages path', () => { const result = await nightmare .clearInput(selectors.ticketPackages.firstQuantityInput) .write(selectors.ticketPackages.firstQuantityInput, 0) - .click(selectors.ticketPackages.savePackagesButton) + .waitToClick(selectors.ticketPackages.savePackagesButton) .waitForLastSnackbar(); expect(result).toEqual('Some fields are invalid'); @@ -45,8 +45,8 @@ describe('Ticket Create packages path', () => { const result = await nightmare .clearInput(selectors.ticketPackages.firstQuantityInput) .write(selectors.ticketPackages.firstQuantityInput, 99) - .click(selectors.ticketPackages.clearPackageAutocompleteButton) - .click(selectors.ticketPackages.savePackagesButton) + .waitToClick(selectors.ticketPackages.clearPackageAutocompleteButton) + .waitToClick(selectors.ticketPackages.savePackagesButton) .waitForLastSnackbar(); expect(result).toEqual('Package cannot be blank'); @@ -55,7 +55,7 @@ describe('Ticket Create packages path', () => { it(`should create a new package with correct data`, async() => { const result = await nightmare .autocompleteSearch(selectors.ticketPackages.firstPackageAutocomplete, 'Legendary Box') - .click(selectors.ticketPackages.savePackagesButton) + .waitToClick(selectors.ticketPackages.savePackagesButton) .waitForLastSnackbar(); expect(result).toEqual('Data saved!'); diff --git a/e2e/paths/ticket-module/05_create_new_tracking_state.spec.js b/e2e/paths/ticket-module/05_create_new_tracking_state.spec.js index 1a179b041d..061d67c1c8 100644 --- a/e2e/paths/ticket-module/05_create_new_tracking_state.spec.js +++ b/e2e/paths/ticket-module/05_create_new_tracking_state.spec.js @@ -43,7 +43,7 @@ describe('Ticket Create new tracking state path', () => { it(`should create a new state`, async() => { let result = await nightmare .autocompleteSearch(selectors.createStateView.stateAutocomplete, '¿Fecha?') - .click(selectors.createStateView.saveStateButton) + .waitToClick(selectors.createStateView.saveStateButton) .waitForLastSnackbar(); expect(result).toEqual('Data saved!'); @@ -70,7 +70,7 @@ describe('Ticket Create new tracking state path', () => { it(`should attemp to create an state for which salesPerson doesn't have permissions`, async() => { let result = await nightmare .autocompleteSearch(selectors.createStateView.stateAutocomplete, '¿Fecha?') - .click(selectors.createStateView.saveStateButton) + .waitToClick(selectors.createStateView.saveStateButton) .waitForLastSnackbar(); expect(result).toEqual(`You don't have enough privileges to change the state of this ticket`); @@ -79,7 +79,7 @@ describe('Ticket Create new tracking state path', () => { it(`should attempt to create an state for the type salesPerson has rights but fail as worker is blank`, async() => { let result = await nightmare .autocompleteSearch(selectors.createStateView.stateAutocomplete, 'asignado') - .click(selectors.createStateView.saveStateButton) + .waitToClick(selectors.createStateView.saveStateButton) .waitForLastSnackbar(); expect(result).toEqual(`Worker cannot be blank`); @@ -88,7 +88,7 @@ describe('Ticket Create new tracking state path', () => { it(`should create a new state with all it's data`, async() => { let result = await nightmare .autocompleteSearch(selectors.createStateView.workerAutocomplete, 'accessory') - .click(selectors.createStateView.saveStateButton) + .waitToClick(selectors.createStateView.saveStateButton) .waitForLastSnackbar(); expect(result).toEqual('Data saved!'); diff --git a/e2e/paths/ticket-module/06_edit_basic_data_steps.spec.js b/e2e/paths/ticket-module/06_edit_basic_data_steps.spec.js index 5d2e84e141..0bf4b01eab 100644 --- a/e2e/paths/ticket-module/06_edit_basic_data_steps.spec.js +++ b/e2e/paths/ticket-module/06_edit_basic_data_steps.spec.js @@ -16,7 +16,7 @@ describe('Ticket Edit basic data path', () => { .autocompleteSearch(selectors.ticketBasicData.clientAutocomplete, 'Charles Xavier') .wait(500) .autocompleteSearch(selectors.ticketBasicData.addressAutocomplete, 'Charles Xavier') - .click(selectors.ticketBasicData.nextStepButton) + .waitToClick(selectors.ticketBasicData.nextStepButton) .waitForURL('data/step-two') .parsedUrl(); @@ -32,7 +32,7 @@ describe('Ticket Edit basic data path', () => { it(`should click next to move on to step three`, async() => { let url = await nightmare - .click(selectors.ticketBasicData.nextStepButton) + .waitToClick(selectors.ticketBasicData.nextStepButton) .waitForURL('data/step-three') .parsedUrl(); @@ -61,7 +61,7 @@ describe('Ticket Edit basic data path', () => { it(`should edit the ticket agency then click next`, async() => { let url = await nightmare .autocompleteSearch(selectors.ticketBasicData.agencyAutocomplete, 'Silla247Expensive') - .click(selectors.ticketBasicData.nextStepButton) + .waitToClick(selectors.ticketBasicData.nextStepButton) .waitForURL('data/step-two') .parsedUrl(); @@ -77,7 +77,7 @@ describe('Ticket Edit basic data path', () => { it(`should then click next to move on to step three`, async() => { let url = await nightmare - .click(selectors.ticketBasicData.nextStepButton) + .waitToClick(selectors.ticketBasicData.nextStepButton) .waitForURL('data/step-three') .parsedUrl(); @@ -87,7 +87,7 @@ describe('Ticket Edit basic data path', () => { it(`should select a new reason for the changes made then click on finalize`, async() => { let url = await nightmare .autocompleteSearch(selectors.ticketBasicData.chargesReasonAutocomplete, 'Cambiar los precios en el ticket') - .click(selectors.ticketBasicData.finalizeButton) + .waitToClick(selectors.ticketBasicData.finalizeButton) .waitForURL('summary') .parsedUrl(); diff --git a/e2e/paths/ticket-module/07_edit_sale.spec.js b/e2e/paths/ticket-module/07_edit_sale.spec.js index 432ea0910d..9f6c8a748d 100644 --- a/e2e/paths/ticket-module/07_edit_sale.spec.js +++ b/e2e/paths/ticket-module/07_edit_sale.spec.js @@ -35,7 +35,7 @@ describe('Ticket Edit sale path', () => { it('should again search for a specific ticket', async() => { const result = await nightmare .write(selectors.ticketsIndex.searchTicketInput, 'id:16') - .click(selectors.ticketsIndex.searchButton) + .waitToClick(selectors.ticketsIndex.searchButton) .waitForNumberOfElements(selectors.ticketsIndex.searchResult, 1) .countElement(selectors.ticketsIndex.searchResult); @@ -123,7 +123,7 @@ describe('Ticket Edit sale path', () => { .wait(selectors.globalItems.applicationsMenuVisible) .waitToClick(selectors.globalItems.ticketsButton) .write(selectors.ticketsIndex.searchTicketInput, 'id:16') - .click(selectors.ticketsIndex.searchButton) + .waitToClick(selectors.ticketsIndex.searchButton) .waitForNumberOfElements(selectors.ticketsIndex.searchResult, 1) .waitForTextInElement(selectors.ticketsIndex.searchResult, 'address 21') .waitToClick(selectors.ticketsIndex.searchResult) @@ -228,7 +228,7 @@ describe('Ticket Edit sale path', () => { it('should search for the claim with id 4', async() => { const result = await nightmare .write(selectors.claimsIndex.searchClaimInput, 4) - .click(selectors.claimsIndex.searchButton) + .waitToClick(selectors.claimsIndex.searchButton) .waitForNumberOfElements(selectors.claimsIndex.searchResult, 1) .countElement(selectors.claimsIndex.searchResult); @@ -249,7 +249,7 @@ describe('Ticket Edit sale path', () => { it('should search the ticket', async() => { const result = await nightmare .write(selectors.ticketsIndex.searchTicketInput, 'id:16') - .click(selectors.ticketsIndex.searchButton) + .waitToClick(selectors.ticketsIndex.searchButton) .waitForNumberOfElements(selectors.ticketsIndex.searchResult, 1) .countElement(selectors.ticketsIndex.searchResult); @@ -318,7 +318,7 @@ describe('Ticket Edit sale path', () => { const url = await nightmare .waitToClick(selectors.itemsIndex.goBackToModuleIndexButton) .write(selectors.ticketsIndex.searchTicketInput, 'id:16') - .click(selectors.ticketsIndex.searchButton) + .waitToClick(selectors.ticketsIndex.searchButton) .waitForNumberOfElements(selectors.ticketsIndex.searchResult, 1) .waitForTextInElement(selectors.ticketsIndex.searchResult, 'address 21') .waitToClick(selectors.ticketsIndex.searchResult) @@ -341,7 +341,7 @@ describe('Ticket Edit sale path', () => { const url = await nightmare .waitToClick(selectors.itemsIndex.goBackToModuleIndexButton) .write(selectors.ticketsIndex.searchTicketInput, 'id:12') - .click(selectors.ticketsIndex.searchButton) + .waitToClick(selectors.ticketsIndex.searchButton) .waitForNumberOfElements(selectors.ticketsIndex.searchResult, 1) .waitForTextInElement(selectors.ticketsIndex.searchResult, 'address 21') .waitToClick(selectors.ticketsIndex.searchResult) @@ -376,7 +376,7 @@ describe('Ticket Edit sale path', () => { const url = await nightmare .waitToClick(selectors.itemsIndex.goBackToModuleIndexButton) .write(selectors.ticketsIndex.searchTicketInput, 'id:8') - .click(selectors.ticketsIndex.searchButton) + .waitToClick(selectors.ticketsIndex.searchButton) .waitForNumberOfElements(selectors.ticketsIndex.searchResult, 1) .waitForTextInElement(selectors.ticketsIndex.searchResult, 'address 24') .waitToClick(selectors.ticketsIndex.searchResult) @@ -406,7 +406,7 @@ describe('Ticket Edit sale path', () => { it('should search for a specific created ticket', async() => { const result = await nightmare .write(selectors.ticketsIndex.searchTicketInput, 'nickname:(address 24) stateFk:2') - .click(selectors.ticketsIndex.searchButton) + .waitToClick(selectors.ticketsIndex.searchButton) .waitForNumberOfElements(selectors.ticketsIndex.searchResult, 1) .countElement(selectors.ticketsIndex.searchResult); @@ -489,7 +489,7 @@ describe('Ticket Edit sale path', () => { it('should now search for a specific ticket', async() => { const result = await nightmare .write(selectors.ticketsIndex.searchTicketInput, 'id:16') - .click(selectors.ticketsIndex.searchButton) + .waitToClick(selectors.ticketsIndex.searchButton) .waitForNumberOfElements(selectors.ticketsIndex.searchResult, 1) .countElement(selectors.ticketsIndex.searchResult); @@ -519,7 +519,7 @@ describe('Ticket Edit sale path', () => { it(`should set the state of the ticket to preparation`, async() => { const url = await nightmare .autocompleteSearch(selectors.ticketTracking.stateAutocomplete, 'Preparación') - .click(selectors.ticketTracking.saveButton) + .waitToClick(selectors.ticketTracking.saveButton) .waitForURL('/tracking/index') .parsedUrl(); @@ -576,7 +576,7 @@ describe('Ticket Edit sale path', () => { it('should once again search for a specific ticket', async() => { const result = await nightmare .write(selectors.ticketsIndex.searchTicketInput, 'id:16') - .click(selectors.ticketsIndex.searchButton) + .waitToClick(selectors.ticketsIndex.searchButton) .waitForNumberOfElements(selectors.ticketsIndex.searchResult, 1) .countElement(selectors.ticketsIndex.searchResult); diff --git a/e2e/paths/ticket-module/09_ticket_weekly.spec.js b/e2e/paths/ticket-module/09_ticket_weekly.spec.js index 1c7ed936e5..4b7a5266ba 100644 --- a/e2e/paths/ticket-module/09_ticket_weekly.spec.js +++ b/e2e/paths/ticket-module/09_ticket_weekly.spec.js @@ -33,7 +33,7 @@ describe('Ticket descriptor path', () => { it('should search for the ticket 11', async() => { const result = await nightmare .write(selectors.ticketsIndex.searchTicketInput, 'id:11') - .click(selectors.ticketsIndex.searchButton) + .waitToClick(selectors.ticketsIndex.searchButton) .waitForNumberOfElements(selectors.ticketsIndex.searchResult, 1) .countElement(selectors.ticketsIndex.searchResult); @@ -93,7 +93,7 @@ describe('Ticket descriptor path', () => { it('should now search for the ticket 11', async() => { const result = await nightmare .write(selectors.ticketsIndex.searchTicketInput, 'id:11') - .click(selectors.ticketsIndex.searchButton) + .waitToClick(selectors.ticketsIndex.searchButton) .waitForNumberOfElements(selectors.ticketsIndex.searchResult, 1) .countElement(selectors.ticketsIndex.searchResult); diff --git a/e2e/paths/ticket-module/11_ticket_diary.spec.js b/e2e/paths/ticket-module/11_ticket_diary.spec.js index 2f45b54cf8..f5bb6fbc7e 100644 --- a/e2e/paths/ticket-module/11_ticket_diary.spec.js +++ b/e2e/paths/ticket-module/11_ticket_diary.spec.js @@ -13,7 +13,7 @@ describe('Ticket diary path', () => { it('should search for a specific ticket', async() => { const result = await nightmare .write(selectors.ticketsIndex.searchTicketInput, 'id:1') - .click(selectors.ticketsIndex.searchButton) + .waitToClick(selectors.ticketsIndex.searchButton) .waitForNumberOfElements(selectors.ticketsIndex.searchResult, 1) .countElement(selectors.ticketsIndex.searchResult); diff --git a/e2e/paths/ticket-module/12_delete_ticket_from_descriptor.spec.js b/e2e/paths/ticket-module/12_delete_ticket_from_descriptor.spec.js index c76719ac26..5dc2903e96 100644 --- a/e2e/paths/ticket-module/12_delete_ticket_from_descriptor.spec.js +++ b/e2e/paths/ticket-module/12_delete_ticket_from_descriptor.spec.js @@ -12,7 +12,7 @@ describe('Ticket descriptor path', () => { it('should search for a specific ticket', async() => { const result = await nightmare .write(selectors.ticketsIndex.searchTicketInput, 'id:17') - .click(selectors.ticketsIndex.searchButton) + .waitToClick(selectors.ticketsIndex.searchButton) .waitForNumberOfElements(selectors.ticketsIndex.searchResult, 1) .countElement(selectors.ticketsIndex.searchResult); @@ -49,7 +49,7 @@ describe('Ticket descriptor path', () => { it(`should search for the deleted ticket and check it's date`, async() => { const result = await nightmare .write(selectors.ticketsIndex.searchTicketInput, 'id:17') - .click(selectors.ticketsIndex.searchButton) + .waitToClick(selectors.ticketsIndex.searchButton) .waitForNumberOfElements(selectors.ticketsIndex.searchResult, 1) .wait(selectors.ticketsIndex.searchResultDate) .waitToGetProperty(selectors.ticketsIndex.searchResultDate, 'innerText'); diff --git a/e2e/paths/ticket-module/13_create_ticket_services.spec.js b/e2e/paths/ticket-module/13_create_ticket_services.spec.js index a5e0e1c041..14a1f3d7e9 100644 --- a/e2e/paths/ticket-module/13_create_ticket_services.spec.js +++ b/e2e/paths/ticket-module/13_create_ticket_services.spec.js @@ -34,7 +34,7 @@ describe('Ticket services path', () => { const result = await nightmare .waitToClick(selectors.ticketBasicData.basicDataButton) .wait(selectors.ticketBasicData.clientAutocomplete) - .click(selectors.ticketService.serviceButton) + .waitToClick(selectors.ticketService.serviceButton) .waitToGetProperty(selectors.ticketService.firstDescriptionInput, 'value'); expect(result).toEqual('my service'); @@ -77,7 +77,7 @@ describe('Ticket services path', () => { const result = await nightmare .waitToClick(selectors.ticketBasicData.basicDataButton) .wait(selectors.ticketBasicData.clientAutocomplete) - .click(selectors.ticketService.serviceButton) + .waitToClick(selectors.ticketService.serviceButton) .waitForNumberOfElements(selectors.ticketService.serviceLine, 0) .countElement(selectors.ticketService.serviceLine); diff --git a/e2e/smokes/01_client_path.spec.js b/e2e/smokes/01_client_path.spec.js index b83b6d4234..2c70ae959e 100644 --- a/e2e/smokes/01_client_path.spec.js +++ b/e2e/smokes/01_client_path.spec.js @@ -9,16 +9,16 @@ describe('create client path', () => { .loginAndModule('employee', 'client'); }); - it('should access to the create client view by clicking the create-client floating button', async () => { + it('should access to the create client view by clicking the create-client floating button', async() => { let url = await nightmare - .click(selectors.clientsIndex.createClientButton) + .waitToClick(selectors.clientsIndex.createClientButton) .wait(selectors.createClientView.createButton) .parsedUrl(); expect(url.hash).toEqual('#!/client/create'); }); - it('should cancel the client creation to go back to clients index', async () => { + it('should cancel the client creation to go back to clients index', async() => { let url = await nightmare .waitToClick(selectors.globalItems.applicationsMenuButton) .waitToClick(selectors.globalItems.clientsButton) From 23d26dec0709b9e6c0326aac3b73d95e7bff4e0e Mon Sep 17 00:00:00 2001 From: Gerard Date: Wed, 23 Jan 2019 16:32:17 +0100 Subject: [PATCH 34/37] updated issue number --- modules/client/front/billing-data/index.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/client/front/billing-data/index.spec.js b/modules/client/front/billing-data/index.spec.js index b8d0f8b116..d589b4dffc 100644 --- a/modules/client/front/billing-data/index.spec.js +++ b/modules/client/front/billing-data/index.spec.js @@ -30,7 +30,7 @@ describe('Client', () => { expect(controller.notifyChanges).toHaveBeenCalledWith(); }); }); - // Excluded due mailer changes #79 + // Excluded due mailer changes #1001 xdescribe('notifyChanges()', () => { it(`should perform a GET query`, () => { $httpBackend.when('GET', `/mailer/notification/payment-update/101`).respond(true); From 288300db41b9f9194766f53697c0de84a90cb8b1 Mon Sep 17 00:00:00 2001 From: Gerard Date: Wed, 23 Jan 2019 16:51:39 +0100 Subject: [PATCH 35/37] #1048 ticket.index quitar columnas --- modules/ticket/front/index/index.html | 4 ---- modules/ticket/front/summary/index.html | 3 +++ 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/modules/ticket/front/index/index.html b/modules/ticket/front/index/index.html index 1953e3cfc3..f2172b2457 100644 --- a/modules/ticket/front/index/index.html +++ b/modules/ticket/front/index/index.html @@ -43,8 +43,6 @@ State Agency Warehouse - Invoice - Route Total @@ -75,8 +73,6 @@ {{::ticket.state}} {{::ticket.agencyMode}} {{::ticket.warehouse}} - {{::ticket.refFk | dashIfEmpty}} - {{::ticket.routeFk | dashIfEmpty}} {{::ticket.total | currency: '€': 2}} + + Date: Thu, 24 Jan 2019 08:21:00 +0100 Subject: [PATCH 36/37] fixed default search on ticket index --- modules/ticket/front/index/index.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/ticket/front/index/index.js b/modules/ticket/front/index/index.js index 878f05b791..f22b8ad831 100644 --- a/modules/ticket/front/index/index.js +++ b/modules/ticket/front/index/index.js @@ -2,16 +2,17 @@ import ngModule from '../module'; import './style.scss'; export default class Controller { - constructor($scope, $state, $stateparams) { + constructor($scope, $state, $stateParams) { this.$ = $scope; - this.$stateparams = $stateparams; + this.$stateParams = $stateParams; this.$state = $state; this.selectedTicket = null; this.moreOptions = [ {callback: this.goToTurns, name: 'Turns', always: true}, ]; - if (!$state && !$stateparams) { + if (!$stateParams.q) { + console.log($stateParams); let today = new Date(); let offset = today.getTimezoneOffset() * 60000; today.setHours(0, 0, 0, 0); @@ -96,7 +97,7 @@ export default class Controller { } } -Controller.$inject = ['$scope', '$state']; +Controller.$inject = ['$scope', '$state', '$stateParams']; ngModule.component('vnTicketIndex', { template: require('./index.html'), From 8cbde4c1379dffe01f2ac3b8ac9de31bc8e8d613 Mon Sep 17 00:00:00 2001 From: Carlos Jimenez Ruiz Date: Thu, 24 Jan 2019 09:08:28 +0100 Subject: [PATCH 37/37] removed global variable serviceRoot --- back/methods/message/specs/send.spec.js | 2 +- back/methods/user-config/specs/getUserConfig.spec.js | 2 +- back/methods/worker-mana/specs/getCurrentWorkerMana.spec.js | 2 +- back/models/specs/account.spec.js | 2 +- back/tests.js | 2 -- loopback/common/methods/vn-model/specs/crud.spec.js | 2 +- loopback/common/methods/vn-model/specs/getSetValues.spec.js | 2 +- loopback/common/methods/vn-model/specs/rewriteDbError.spec.js | 2 +- .../methods/claim-beginning/importToNewRefundTicket.spec.js | 2 +- .../back/methods/claim-end/specs/importTicketSales.spec.js | 2 +- modules/claim/back/methods/claim/specs/createFromSales.spec.js | 2 +- modules/claim/back/methods/claim/specs/getSummary.spec.js | 2 +- modules/claim/back/methods/claim/specs/regularizeClaim.spec.js | 2 +- modules/claim/back/methods/claim/specs/updateClaim.spec.js | 2 +- .../back/methods/client/specs/activeWorkersWithRole.spec.js | 2 +- .../back/methods/client/specs/addressesPropagateRe.spec.js | 2 +- .../client/back/methods/client/specs/confirmTransaction.spec.js | 2 +- modules/client/back/methods/client/specs/createWithUser.spec.js | 2 +- .../client/back/methods/client/specs/getAverageInvoiced.spec.js | 2 +- modules/client/back/methods/client/specs/getCard.spec.js | 2 +- modules/client/back/methods/client/specs/getDebt.spec.js | 2 +- modules/client/back/methods/client/specs/getMana.spec.js | 2 +- .../client/back/methods/client/specs/getTransactions.spec.js | 2 +- .../client/back/methods/client/specs/hasCustomerRole.spec.js | 2 +- modules/client/back/methods/client/specs/isValidClient.spec.js | 2 +- modules/client/back/methods/client/specs/listWorkers.spec.js | 2 +- modules/client/back/methods/client/specs/summary.spec.js | 2 +- .../client/back/methods/client/specs/updateFiscalData.spec.js | 2 +- .../methods/credit-classification/createWithInsurance.spec.js | 2 +- modules/client/back/methods/receipt/specs/filter.spec.js | 2 +- modules/client/back/models/specs/address.spec.js | 2 +- modules/item/back/methods/item-tag/specs/filterItemTags.spec.js | 2 +- modules/item/back/methods/item/specs/clone.spec.js | 2 +- modules/item/back/methods/item/specs/filter.spec.js | 2 +- modules/item/back/methods/item/specs/getDiary.spec.js | 2 +- modules/item/back/methods/item/specs/getLastEntries.spec.js | 2 +- modules/item/back/methods/item/specs/getSummary.spec.js | 2 +- modules/item/back/methods/item/specs/new.spec.js | 2 +- modules/item/back/methods/item/specs/regularize.spec.js | 2 +- modules/item/back/methods/item/specs/updateTaxes.spec.js | 2 +- modules/item/back/models/specs/item.spec.js | 2 +- modules/order/back/methods/order-row/specs/addToOrder.spec.js | 2 +- modules/order/back/methods/order-row/specs/removes.spec.js | 2 +- modules/order/back/methods/order/specs/catalogFilter.spec.js | 2 +- modules/order/back/methods/order/specs/getTaxes.spec.js | 2 +- modules/order/back/methods/order/specs/getTotal.spec.js | 2 +- modules/order/back/methods/order/specs/getTotalVolume.spec.js | 2 +- modules/order/back/methods/order/specs/getVAT.spec.js | 2 +- modules/order/back/methods/order/specs/getVolumes.spec.js | 2 +- modules/order/back/methods/order/specs/isEditable.spec.js | 2 +- modules/order/back/methods/order/specs/new.spec.js | 2 +- modules/order/back/methods/order/specs/summary.spec.js | 2 +- modules/order/back/methods/order/specs/updateBasicData.spec.js | 2 +- .../ticket/back/methods/packaging/specs/listPackaging.spec.js | 2 +- .../back/methods/sale-tracking/specs/listSaleTracking.spec.js | 2 +- .../back/methods/sale/specs/getClaimableFromTicket.spec.js | 2 +- modules/ticket/back/methods/sale/specs/moveToTicket.spec.js | 2 +- modules/ticket/back/methods/sale/specs/priceDifference.spec.js | 2 +- modules/ticket/back/methods/sale/specs/removes.spec.js | 2 +- modules/ticket/back/methods/sale/specs/reserve.spec.js | 2 +- modules/ticket/back/methods/sale/specs/updatePrice.spec.js | 2 +- modules/ticket/back/methods/sale/specs/updateQuantity.spec.js | 2 +- .../back/methods/ticket-tracking/specs/changeState.spec.js | 2 +- .../ticket/back/methods/ticket/specs/componentUpdate.spec.js | 2 +- modules/ticket/back/methods/ticket/specs/deleted.spec.js | 2 +- modules/ticket/back/methods/ticket/specs/filter.spec.js | 2 +- modules/ticket/back/methods/ticket/specs/getLanded.spec.js | 2 +- modules/ticket/back/methods/ticket/specs/getSales.spec.js | 2 +- .../ticket/back/methods/ticket/specs/getSalespersonMana.spec.js | 2 +- modules/ticket/back/methods/ticket/specs/getShipped.spec.js | 2 +- modules/ticket/back/methods/ticket/specs/getTaxes.spec.js | 2 +- modules/ticket/back/methods/ticket/specs/getTotal.spec.js | 2 +- modules/ticket/back/methods/ticket/specs/getTotalVolume.spec.js | 2 +- modules/ticket/back/methods/ticket/specs/getVAT.spec.js | 2 +- modules/ticket/back/methods/ticket/specs/getVolume.spec.js | 2 +- modules/ticket/back/methods/ticket/specs/isEditable.spec.js | 2 +- modules/ticket/back/methods/ticket/specs/new.spec.js | 2 +- modules/ticket/back/methods/ticket/specs/summary.spec.js | 2 +- .../ticket/back/methods/ticket/specs/threeLastActive.spec.js | 2 +- modules/ticket/back/models/specs/state.spec.js | 2 +- modules/ticket/back/models/specs/ticket-packaging.spec.js | 2 +- 81 files changed, 80 insertions(+), 82 deletions(-) diff --git a/back/methods/message/specs/send.spec.js b/back/methods/message/specs/send.spec.js index 49a4ae5ff6..079595b129 100644 --- a/back/methods/message/specs/send.spec.js +++ b/back/methods/message/specs/send.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('message send()', () => { it('should call the send method and return the response', async() => { diff --git a/back/methods/user-config/specs/getUserConfig.spec.js b/back/methods/user-config/specs/getUserConfig.spec.js index 2d2c4ab972..da3fc958f6 100644 --- a/back/methods/user-config/specs/getUserConfig.spec.js +++ b/back/methods/user-config/specs/getUserConfig.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('userConfig getUserConfig()', () => { it(`should return the configuration data of a given user`, async() => { diff --git a/back/methods/worker-mana/specs/getCurrentWorkerMana.spec.js b/back/methods/worker-mana/specs/getCurrentWorkerMana.spec.js index 29f848e8a9..1d48eef580 100644 --- a/back/methods/worker-mana/specs/getCurrentWorkerMana.spec.js +++ b/back/methods/worker-mana/specs/getCurrentWorkerMana.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('workerMana getCurrentWorkerMana()', () => { it('should get the mana of the logged worker', async() => { diff --git a/back/models/specs/account.spec.js b/back/models/specs/account.spec.js index b9d561074a..c52bc43782 100644 --- a/back/models/specs/account.spec.js +++ b/back/models/specs/account.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('loopback model Account', () => { it('should return true if the user has the given role', async() => { diff --git a/back/tests.js b/back/tests.js index ac3372d805..8e21985c51 100644 --- a/back/tests.js +++ b/back/tests.js @@ -11,8 +11,6 @@ let verbose = false; if (process.argv[2] === '--v') verbose = true; -serviceRoot = `${__dirname}/../loopback`; - let Jasmine = require('jasmine'); let jasmine = new Jasmine(); let SpecReporter = require('jasmine-spec-reporter').SpecReporter; diff --git a/loopback/common/methods/vn-model/specs/crud.spec.js b/loopback/common/methods/vn-model/specs/crud.spec.js index 60ca69732c..f4db987f31 100644 --- a/loopback/common/methods/vn-model/specs/crud.spec.js +++ b/loopback/common/methods/vn-model/specs/crud.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('Model crud()', () => { let insertId; diff --git a/loopback/common/methods/vn-model/specs/getSetValues.spec.js b/loopback/common/methods/vn-model/specs/getSetValues.spec.js index a217a52118..d14a9113f2 100644 --- a/loopback/common/methods/vn-model/specs/getSetValues.spec.js +++ b/loopback/common/methods/vn-model/specs/getSetValues.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('Model getSetValues()', () => { it('should extend getSetValues properties to any model passed', () => { diff --git a/loopback/common/methods/vn-model/specs/rewriteDbError.spec.js b/loopback/common/methods/vn-model/specs/rewriteDbError.spec.js index 961d30e58b..48b67528ac 100644 --- a/loopback/common/methods/vn-model/specs/rewriteDbError.spec.js +++ b/loopback/common/methods/vn-model/specs/rewriteDbError.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('Model rewriteDbError()', () => { it('should extend rewriteDbError properties to any model passed', () => { diff --git a/modules/claim/back/methods/claim-beginning/importToNewRefundTicket.spec.js b/modules/claim/back/methods/claim-beginning/importToNewRefundTicket.spec.js index 30a6a534b1..da5d824802 100644 --- a/modules/claim/back/methods/claim-beginning/importToNewRefundTicket.spec.js +++ b/modules/claim/back/methods/claim-beginning/importToNewRefundTicket.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); // xcluded waiting for fixtures xdescribe('claimBeginning', () => { let ticket; diff --git a/modules/claim/back/methods/claim-end/specs/importTicketSales.spec.js b/modules/claim/back/methods/claim-end/specs/importTicketSales.spec.js index 120abff9e8..37ad9f95f1 100644 --- a/modules/claim/back/methods/claim-end/specs/importTicketSales.spec.js +++ b/modules/claim/back/methods/claim-end/specs/importTicketSales.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('Claim importTicketSales()', () => { let claimEnds; diff --git a/modules/claim/back/methods/claim/specs/createFromSales.spec.js b/modules/claim/back/methods/claim/specs/createFromSales.spec.js index ebe35705f7..3fd305a0bc 100644 --- a/modules/claim/back/methods/claim/specs/createFromSales.spec.js +++ b/modules/claim/back/methods/claim/specs/createFromSales.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('Claim Create', () => { let newDate = new Date(); diff --git a/modules/claim/back/methods/claim/specs/getSummary.spec.js b/modules/claim/back/methods/claim/specs/getSummary.spec.js index 39645b379f..4459033772 100644 --- a/modules/claim/back/methods/claim/specs/getSummary.spec.js +++ b/modules/claim/back/methods/claim/specs/getSummary.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('claim getSummary()', () => { it('should return summary with claim, salesClaimed, developments and actions defined ', async() => { diff --git a/modules/claim/back/methods/claim/specs/regularizeClaim.spec.js b/modules/claim/back/methods/claim/specs/regularizeClaim.spec.js index 817cbf5781..0054c56977 100644 --- a/modules/claim/back/methods/claim/specs/regularizeClaim.spec.js +++ b/modules/claim/back/methods/claim/specs/regularizeClaim.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); // xcluded waiting for fixtures xdescribe('regularizeClaim()', () => { const claimFk = 1; diff --git a/modules/claim/back/methods/claim/specs/updateClaim.spec.js b/modules/claim/back/methods/claim/specs/updateClaim.spec.js index 9e9c8aa40f..a3c91aef2e 100644 --- a/modules/claim/back/methods/claim/specs/updateClaim.spec.js +++ b/modules/claim/back/methods/claim/specs/updateClaim.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('Update Claim', () => { let newDate = new Date(); diff --git a/modules/client/back/methods/client/specs/activeWorkersWithRole.spec.js b/modules/client/back/methods/client/specs/activeWorkersWithRole.spec.js index 0070d05735..91742695cb 100644 --- a/modules/client/back/methods/client/specs/activeWorkersWithRole.spec.js +++ b/modules/client/back/methods/client/specs/activeWorkersWithRole.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('Client activeWorkersWithRole', () => { it('should return the sales people as result', async() => { diff --git a/modules/client/back/methods/client/specs/addressesPropagateRe.spec.js b/modules/client/back/methods/client/specs/addressesPropagateRe.spec.js index 7c84d60724..007d5ef0fd 100644 --- a/modules/client/back/methods/client/specs/addressesPropagateRe.spec.js +++ b/modules/client/back/methods/client/specs/addressesPropagateRe.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('Client addressesPropagateRe', () => { let client; diff --git a/modules/client/back/methods/client/specs/confirmTransaction.spec.js b/modules/client/back/methods/client/specs/confirmTransaction.spec.js index 9a2beb387b..ec06e9b5c1 100644 --- a/modules/client/back/methods/client/specs/confirmTransaction.spec.js +++ b/modules/client/back/methods/client/specs/confirmTransaction.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('Client confirmTransaction', () => { const transactionId = 2; diff --git a/modules/client/back/methods/client/specs/createWithUser.spec.js b/modules/client/back/methods/client/specs/createWithUser.spec.js index b9fc8aa3c4..be69ce5154 100644 --- a/modules/client/back/methods/client/specs/createWithUser.spec.js +++ b/modules/client/back/methods/client/specs/createWithUser.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('Client Create', () => { const clientName = 'Wade'; diff --git a/modules/client/back/methods/client/specs/getAverageInvoiced.spec.js b/modules/client/back/methods/client/specs/getAverageInvoiced.spec.js index fc26ed0dc2..e1eef01245 100644 --- a/modules/client/back/methods/client/specs/getAverageInvoiced.spec.js +++ b/modules/client/back/methods/client/specs/getAverageInvoiced.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('client getAverageInvoiced()', () => { it('should call the getAverageInvoiced method', done => { diff --git a/modules/client/back/methods/client/specs/getCard.spec.js b/modules/client/back/methods/client/specs/getCard.spec.js index f06b2110ac..8965850963 100644 --- a/modules/client/back/methods/client/specs/getCard.spec.js +++ b/modules/client/back/methods/client/specs/getCard.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('Client card', () => { it('should call the card() method to receive a formated card of Bruce Wayne', async() => { diff --git a/modules/client/back/methods/client/specs/getDebt.spec.js b/modules/client/back/methods/client/specs/getDebt.spec.js index 7a4902978b..19f7cd485f 100644 --- a/modules/client/back/methods/client/specs/getDebt.spec.js +++ b/modules/client/back/methods/client/specs/getDebt.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); xdescribe('client getDebt()', () => { it('should return the client debt', async () => { diff --git a/modules/client/back/methods/client/specs/getMana.spec.js b/modules/client/back/methods/client/specs/getMana.spec.js index acded26618..4ac200a722 100644 --- a/modules/client/back/methods/client/specs/getMana.spec.js +++ b/modules/client/back/methods/client/specs/getMana.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('client getMana()', () => { it('should call the getMana method', async() => { diff --git a/modules/client/back/methods/client/specs/getTransactions.spec.js b/modules/client/back/methods/client/specs/getTransactions.spec.js index 7c415b351f..f04cf90507 100644 --- a/modules/client/back/methods/client/specs/getTransactions.spec.js +++ b/modules/client/back/methods/client/specs/getTransactions.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('Client getTransations', () => { it('should call getTransations() method to receive a list of Web Payments from Bruce Wayne', async() => { diff --git a/modules/client/back/methods/client/specs/hasCustomerRole.spec.js b/modules/client/back/methods/client/specs/hasCustomerRole.spec.js index f620278055..87306afa7e 100644 --- a/modules/client/back/methods/client/specs/hasCustomerRole.spec.js +++ b/modules/client/back/methods/client/specs/hasCustomerRole.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('Client hasCustomerRole', () => { it('should call the hasCustomerRole() method with a customer id', done => { diff --git a/modules/client/back/methods/client/specs/isValidClient.spec.js b/modules/client/back/methods/client/specs/isValidClient.spec.js index 6794c5cc67..f995bb7abd 100644 --- a/modules/client/back/methods/client/specs/isValidClient.spec.js +++ b/modules/client/back/methods/client/specs/isValidClient.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('Client isValidClient', () => { it('should call the isValidClient() method with a client id and receive true', done => { diff --git a/modules/client/back/methods/client/specs/listWorkers.spec.js b/modules/client/back/methods/client/specs/listWorkers.spec.js index d14903a186..545e004817 100644 --- a/modules/client/back/methods/client/specs/listWorkers.spec.js +++ b/modules/client/back/methods/client/specs/listWorkers.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('Client listWorkers', () => { it('should call the listWorkers()', done => { diff --git a/modules/client/back/methods/client/specs/summary.spec.js b/modules/client/back/methods/client/specs/summary.spec.js index 1e2e5de700..16527227f8 100644 --- a/modules/client/back/methods/client/specs/summary.spec.js +++ b/modules/client/back/methods/client/specs/summary.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('client summary()', () => { it('should return a summary object containing data', async() => { diff --git a/modules/client/back/methods/client/specs/updateFiscalData.spec.js b/modules/client/back/methods/client/specs/updateFiscalData.spec.js index 93a19ccc5d..84d6b9bad5 100644 --- a/modules/client/back/methods/client/specs/updateFiscalData.spec.js +++ b/modules/client/back/methods/client/specs/updateFiscalData.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('Client updateFiscalData', () => { afterAll(async() => { diff --git a/modules/client/back/methods/credit-classification/createWithInsurance.spec.js b/modules/client/back/methods/credit-classification/createWithInsurance.spec.js index 69d492bf36..7fcbdb6683 100644 --- a/modules/client/back/methods/credit-classification/createWithInsurance.spec.js +++ b/modules/client/back/methods/credit-classification/createWithInsurance.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('Client createWithInsurance', () => { let classificationId; diff --git a/modules/client/back/methods/receipt/specs/filter.spec.js b/modules/client/back/methods/receipt/specs/filter.spec.js index e29ee6126c..b0422bb285 100644 --- a/modules/client/back/methods/receipt/specs/filter.spec.js +++ b/modules/client/back/methods/receipt/specs/filter.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('receipt filter()', () => { it('should call the filter method', async () => { diff --git a/modules/client/back/models/specs/address.spec.js b/modules/client/back/models/specs/address.spec.js index 5f950aa3a7..67e0e8e500 100644 --- a/modules/client/back/models/specs/address.spec.js +++ b/modules/client/back/models/specs/address.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('loopback model address', () => { let createdAddressId; diff --git a/modules/item/back/methods/item-tag/specs/filterItemTags.spec.js b/modules/item/back/methods/item-tag/specs/filterItemTags.spec.js index f85539df5f..e1bfdb4c14 100644 --- a/modules/item/back/methods/item-tag/specs/filterItemTags.spec.js +++ b/modules/item/back/methods/item-tag/specs/filterItemTags.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('item filterItemTags()', () => { it('should filter ItemTags table', async () => { diff --git a/modules/item/back/methods/item/specs/clone.spec.js b/modules/item/back/methods/item/specs/clone.spec.js index be1281b357..8bae14133a 100644 --- a/modules/item/back/methods/item/specs/clone.spec.js +++ b/modules/item/back/methods/item/specs/clone.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('item clone()', () => { let nextItemId; diff --git a/modules/item/back/methods/item/specs/filter.spec.js b/modules/item/back/methods/item/specs/filter.spec.js index 6667622652..3e08e764d0 100644 --- a/modules/item/back/methods/item/specs/filter.spec.js +++ b/modules/item/back/methods/item/specs/filter.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('item filter()', () => { it('should return 1 result using filter and tags', async() => { diff --git a/modules/item/back/methods/item/specs/getDiary.spec.js b/modules/item/back/methods/item/specs/getDiary.spec.js index d7e155c9e1..17045b30b1 100644 --- a/modules/item/back/methods/item/specs/getDiary.spec.js +++ b/modules/item/back/methods/item/specs/getDiary.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('item getShipped()', () => { it('should return 3 entries, the first one with the property balance -100', async() => { diff --git a/modules/item/back/methods/item/specs/getLastEntries.spec.js b/modules/item/back/methods/item/specs/getLastEntries.spec.js index 7b26ac78dc..26d82a253d 100644 --- a/modules/item/back/methods/item/specs/getLastEntries.spec.js +++ b/modules/item/back/methods/item/specs/getLastEntries.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('item getLastEntries()', () => { it('should return one entry for a given item', async () => { diff --git a/modules/item/back/methods/item/specs/getSummary.spec.js b/modules/item/back/methods/item/specs/getSummary.spec.js index 0a4103ef25..2dfa0cd996 100644 --- a/modules/item/back/methods/item/specs/getSummary.spec.js +++ b/modules/item/back/methods/item/specs/getSummary.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('item getSummary()', () => { it('should return summary with item, tags, botanical, niches, available and visible defined ', async() => { diff --git a/modules/item/back/methods/item/specs/new.spec.js b/modules/item/back/methods/item/specs/new.spec.js index 3f0f57b4d6..27a459f12f 100644 --- a/modules/item/back/methods/item/specs/new.spec.js +++ b/modules/item/back/methods/item/specs/new.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('item new()', () => { let item; diff --git a/modules/item/back/methods/item/specs/regularize.spec.js b/modules/item/back/methods/item/specs/regularize.spec.js index 5f9725adc5..ce31f6d800 100644 --- a/modules/item/back/methods/item/specs/regularize.spec.js +++ b/modules/item/back/methods/item/specs/regularize.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('regularize()', () => { const itemFk = 1; diff --git a/modules/item/back/methods/item/specs/updateTaxes.spec.js b/modules/item/back/methods/item/specs/updateTaxes.spec.js index 69fa3068ed..5176302ae1 100644 --- a/modules/item/back/methods/item/specs/updateTaxes.spec.js +++ b/modules/item/back/methods/item/specs/updateTaxes.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('item updateTaxes()', () => { afterAll(async() => { diff --git a/modules/item/back/models/specs/item.spec.js b/modules/item/back/models/specs/item.spec.js index f6e82645b6..9038c2e56f 100644 --- a/modules/item/back/models/specs/item.spec.js +++ b/modules/item/back/models/specs/item.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('loopback model Item', () => { describe('availableId()', () => { diff --git a/modules/order/back/methods/order-row/specs/addToOrder.spec.js b/modules/order/back/methods/order-row/specs/addToOrder.spec.js index 12c2bf29a5..e938cb859c 100644 --- a/modules/order/back/methods/order-row/specs/addToOrder.spec.js +++ b/modules/order/back/methods/order-row/specs/addToOrder.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('order addToOrder()', () => { let rowToDelete; diff --git a/modules/order/back/methods/order-row/specs/removes.spec.js b/modules/order/back/methods/order-row/specs/removes.spec.js index f8d144f991..510676aa0a 100644 --- a/modules/order/back/methods/order-row/specs/removes.spec.js +++ b/modules/order/back/methods/order-row/specs/removes.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('order removes()', () => { let row; diff --git a/modules/order/back/methods/order/specs/catalogFilter.spec.js b/modules/order/back/methods/order/specs/catalogFilter.spec.js index a2c1455337..f36f9457b6 100644 --- a/modules/order/back/methods/order/specs/catalogFilter.spec.js +++ b/modules/order/back/methods/order/specs/catalogFilter.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('order catalogFilter()', () => { it('should return an array of items', async() => { let filter = { diff --git a/modules/order/back/methods/order/specs/getTaxes.spec.js b/modules/order/back/methods/order/specs/getTaxes.spec.js index e715515c59..5a14d3bdd6 100644 --- a/modules/order/back/methods/order/specs/getTaxes.spec.js +++ b/modules/order/back/methods/order/specs/getTaxes.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('order getTaxes()', () => { it('should call the getTaxes method and return undefined if its called with a string', async() => { diff --git a/modules/order/back/methods/order/specs/getTotal.spec.js b/modules/order/back/methods/order/specs/getTotal.spec.js index a34faaca67..b5a9420245 100644 --- a/modules/order/back/methods/order/specs/getTotal.spec.js +++ b/modules/order/back/methods/order/specs/getTotal.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('order getTotal()', () => { it('should return the total', async() => { diff --git a/modules/order/back/methods/order/specs/getTotalVolume.spec.js b/modules/order/back/methods/order/specs/getTotalVolume.spec.js index 3334f65d21..cad72fd8ce 100644 --- a/modules/order/back/methods/order/specs/getTotalVolume.spec.js +++ b/modules/order/back/methods/order/specs/getTotalVolume.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('order getTotalVolume()', () => { it('should return the total', async() => { diff --git a/modules/order/back/methods/order/specs/getVAT.spec.js b/modules/order/back/methods/order/specs/getVAT.spec.js index 1c2979d1d7..6f9b3d55db 100644 --- a/modules/order/back/methods/order/specs/getVAT.spec.js +++ b/modules/order/back/methods/order/specs/getVAT.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('order getVAT()', () => { it('should call the getVAT method and return the response', async() => { diff --git a/modules/order/back/methods/order/specs/getVolumes.spec.js b/modules/order/back/methods/order/specs/getVolumes.spec.js index 9919c00c5c..881d17e93f 100644 --- a/modules/order/back/methods/order/specs/getVolumes.spec.js +++ b/modules/order/back/methods/order/specs/getVolumes.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('order getVolumes()', () => { it('should return the volumes of a given order id', async() => { diff --git a/modules/order/back/methods/order/specs/isEditable.spec.js b/modules/order/back/methods/order/specs/isEditable.spec.js index 7d04f8870a..2a7b54225a 100644 --- a/modules/order/back/methods/order/specs/isEditable.spec.js +++ b/modules/order/back/methods/order/specs/isEditable.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('order isEditable()', () => { it('should return false when the given order is not editable', async() => { diff --git a/modules/order/back/methods/order/specs/new.spec.js b/modules/order/back/methods/order/specs/new.spec.js index 93588e408e..f98cf6e407 100644 --- a/modules/order/back/methods/order/specs/new.spec.js +++ b/modules/order/back/methods/order/specs/new.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); let UserError = require('vn-loopback/util/user-error'); describe('order new()', () => { diff --git a/modules/order/back/methods/order/specs/summary.spec.js b/modules/order/back/methods/order/specs/summary.spec.js index 48c41462d6..b0b142a897 100644 --- a/modules/order/back/methods/order/specs/summary.spec.js +++ b/modules/order/back/methods/order/specs/summary.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('order summary()', () => { it('should return a summary object containing data from 1 order', async() => { diff --git a/modules/order/back/methods/order/specs/updateBasicData.spec.js b/modules/order/back/methods/order/specs/updateBasicData.spec.js index 13ec9a7d16..0ef73f8877 100644 --- a/modules/order/back/methods/order/specs/updateBasicData.spec.js +++ b/modules/order/back/methods/order/specs/updateBasicData.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('Order updateBasicData', () => { afterAll(async () => { diff --git a/modules/ticket/back/methods/packaging/specs/listPackaging.spec.js b/modules/ticket/back/methods/packaging/specs/listPackaging.spec.js index 86a0202a8f..40ee40fb00 100644 --- a/modules/ticket/back/methods/packaging/specs/listPackaging.spec.js +++ b/modules/ticket/back/methods/packaging/specs/listPackaging.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('ticket listPackaging()', () => { it('should call the listPackaging method and return the response', async () => { diff --git a/modules/ticket/back/methods/sale-tracking/specs/listSaleTracking.spec.js b/modules/ticket/back/methods/sale-tracking/specs/listSaleTracking.spec.js index 396fa42d07..eb8ea615ce 100644 --- a/modules/ticket/back/methods/sale-tracking/specs/listSaleTracking.spec.js +++ b/modules/ticket/back/methods/sale-tracking/specs/listSaleTracking.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('ticket listSaleTracking()', () => { it('should call the listSaleTracking method and return the response', async() => { diff --git a/modules/ticket/back/methods/sale/specs/getClaimableFromTicket.spec.js b/modules/ticket/back/methods/sale/specs/getClaimableFromTicket.spec.js index 486af39e00..7fed64ba2f 100644 --- a/modules/ticket/back/methods/sale/specs/getClaimableFromTicket.spec.js +++ b/modules/ticket/back/methods/sale/specs/getClaimableFromTicket.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('sale getClaimableFromTicket()', () => { it('should return the claimable sales of a given ticket', async() => { diff --git a/modules/ticket/back/methods/sale/specs/moveToTicket.spec.js b/modules/ticket/back/methods/sale/specs/moveToTicket.spec.js index db4156b252..535df182a7 100644 --- a/modules/ticket/back/methods/sale/specs/moveToTicket.spec.js +++ b/modules/ticket/back/methods/sale/specs/moveToTicket.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('sale moveToTicket()', () => { it('should throw an error if the ticket is not editable', async () => { diff --git a/modules/ticket/back/methods/sale/specs/priceDifference.spec.js b/modules/ticket/back/methods/sale/specs/priceDifference.spec.js index 106bb60aa4..7f7867e301 100644 --- a/modules/ticket/back/methods/sale/specs/priceDifference.spec.js +++ b/modules/ticket/back/methods/sale/specs/priceDifference.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('sale priceDifference()', () => { it('should return ticket price differences', async() => { diff --git a/modules/ticket/back/methods/sale/specs/removes.spec.js b/modules/ticket/back/methods/sale/specs/removes.spec.js index 4f64ad4eb7..fad607107a 100644 --- a/modules/ticket/back/methods/sale/specs/removes.spec.js +++ b/modules/ticket/back/methods/sale/specs/removes.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('sale removes()', () => { let sale; diff --git a/modules/ticket/back/methods/sale/specs/reserve.spec.js b/modules/ticket/back/methods/sale/specs/reserve.spec.js index baee4b62b5..076c093032 100644 --- a/modules/ticket/back/methods/sale/specs/reserve.spec.js +++ b/modules/ticket/back/methods/sale/specs/reserve.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('sale reserve()', () => { afterAll(async() => { diff --git a/modules/ticket/back/methods/sale/specs/updatePrice.spec.js b/modules/ticket/back/methods/sale/specs/updatePrice.spec.js index ab75014fe2..6d84781e7c 100644 --- a/modules/ticket/back/methods/sale/specs/updatePrice.spec.js +++ b/modules/ticket/back/methods/sale/specs/updatePrice.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('sale updatePrice()', () => { it('should throw an error if the price is not a number', async() => { diff --git a/modules/ticket/back/methods/sale/specs/updateQuantity.spec.js b/modules/ticket/back/methods/sale/specs/updateQuantity.spec.js index 74306aaeb9..ccb73d7799 100644 --- a/modules/ticket/back/methods/sale/specs/updateQuantity.spec.js +++ b/modules/ticket/back/methods/sale/specs/updateQuantity.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('sale updateQuantity()', () => { it('should throw an error if the quantity is not a number', async() => { diff --git a/modules/ticket/back/methods/ticket-tracking/specs/changeState.spec.js b/modules/ticket/back/methods/ticket-tracking/specs/changeState.spec.js index 1ac4ec14b0..8e51a08ac1 100644 --- a/modules/ticket/back/methods/ticket-tracking/specs/changeState.spec.js +++ b/modules/ticket/back/methods/ticket-tracking/specs/changeState.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('ticket changeState()', () => { let ticket; diff --git a/modules/ticket/back/methods/ticket/specs/componentUpdate.spec.js b/modules/ticket/back/methods/ticket/specs/componentUpdate.spec.js index 242d2c1235..e997a260d2 100644 --- a/modules/ticket/back/methods/ticket/specs/componentUpdate.spec.js +++ b/modules/ticket/back/methods/ticket/specs/componentUpdate.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('ticket componentUpdate()', () => { let firstvalueBeforeChange; diff --git a/modules/ticket/back/methods/ticket/specs/deleted.spec.js b/modules/ticket/back/methods/ticket/specs/deleted.spec.js index f8e9d7dbc1..84cf5d57d6 100644 --- a/modules/ticket/back/methods/ticket/specs/deleted.spec.js +++ b/modules/ticket/back/methods/ticket/specs/deleted.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('ticket deleted()', () => { let ticket; diff --git a/modules/ticket/back/methods/ticket/specs/filter.spec.js b/modules/ticket/back/methods/ticket/specs/filter.spec.js index 1be814b86b..3add4446bb 100644 --- a/modules/ticket/back/methods/ticket/specs/filter.spec.js +++ b/modules/ticket/back/methods/ticket/specs/filter.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('ticket filter()', () => { it('should call the filter method', async () => { diff --git a/modules/ticket/back/methods/ticket/specs/getLanded.spec.js b/modules/ticket/back/methods/ticket/specs/getLanded.spec.js index 6a1dc11234..d943f2cafe 100644 --- a/modules/ticket/back/methods/ticket/specs/getLanded.spec.js +++ b/modules/ticket/back/methods/ticket/specs/getLanded.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('ticket getLanded()', () => { it('should return a landing date', async() => { diff --git a/modules/ticket/back/methods/ticket/specs/getSales.spec.js b/modules/ticket/back/methods/ticket/specs/getSales.spec.js index b70d4ce283..121b021953 100644 --- a/modules/ticket/back/methods/ticket/specs/getSales.spec.js +++ b/modules/ticket/back/methods/ticket/specs/getSales.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('ticket getSales()', () => { it('should return the sales of a ticket', async () => { diff --git a/modules/ticket/back/methods/ticket/specs/getSalespersonMana.spec.js b/modules/ticket/back/methods/ticket/specs/getSalespersonMana.spec.js index 8d03f6c628..3d7e084be7 100644 --- a/modules/ticket/back/methods/ticket/specs/getSalespersonMana.spec.js +++ b/modules/ticket/back/methods/ticket/specs/getSalespersonMana.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('ticket getSalesPersonMana()', () => { it('should get the mana of a salesperson of a given ticket', async() => { diff --git a/modules/ticket/back/methods/ticket/specs/getShipped.spec.js b/modules/ticket/back/methods/ticket/specs/getShipped.spec.js index 0dc3e2ff65..9e431eab16 100644 --- a/modules/ticket/back/methods/ticket/specs/getShipped.spec.js +++ b/modules/ticket/back/methods/ticket/specs/getShipped.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('ticket getShipped()', () => { it('should return a shipment date', async() => { diff --git a/modules/ticket/back/methods/ticket/specs/getTaxes.spec.js b/modules/ticket/back/methods/ticket/specs/getTaxes.spec.js index 2e650468ce..fe0c91e929 100644 --- a/modules/ticket/back/methods/ticket/specs/getTaxes.spec.js +++ b/modules/ticket/back/methods/ticket/specs/getTaxes.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('ticket getTaxes()', () => { it('should return the tax of a given ticket', async() => { diff --git a/modules/ticket/back/methods/ticket/specs/getTotal.spec.js b/modules/ticket/back/methods/ticket/specs/getTotal.spec.js index 210b721fb2..4bf10539e5 100644 --- a/modules/ticket/back/methods/ticket/specs/getTotal.spec.js +++ b/modules/ticket/back/methods/ticket/specs/getTotal.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('ticket getTotal()', () => { it('should return the total of a ticket', async() => { diff --git a/modules/ticket/back/methods/ticket/specs/getTotalVolume.spec.js b/modules/ticket/back/methods/ticket/specs/getTotalVolume.spec.js index 73ec6e912a..d1ba56e84a 100644 --- a/modules/ticket/back/methods/ticket/specs/getTotalVolume.spec.js +++ b/modules/ticket/back/methods/ticket/specs/getTotalVolume.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('ticket getTotalVolume()', () => { it('should return the total volume of a ticket', async() => { diff --git a/modules/ticket/back/methods/ticket/specs/getVAT.spec.js b/modules/ticket/back/methods/ticket/specs/getVAT.spec.js index 5b67839441..8f80d95125 100644 --- a/modules/ticket/back/methods/ticket/specs/getVAT.spec.js +++ b/modules/ticket/back/methods/ticket/specs/getVAT.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('ticket getVAT()', () => { it('should call the getVAT method and return the response', async() => { diff --git a/modules/ticket/back/methods/ticket/specs/getVolume.spec.js b/modules/ticket/back/methods/ticket/specs/getVolume.spec.js index ca6c838e0a..b512a978bf 100644 --- a/modules/ticket/back/methods/ticket/specs/getVolume.spec.js +++ b/modules/ticket/back/methods/ticket/specs/getVolume.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('ticket getVolume()', () => { it('should call the getVolume method', async() => { diff --git a/modules/ticket/back/methods/ticket/specs/isEditable.spec.js b/modules/ticket/back/methods/ticket/specs/isEditable.spec.js index 35c8de4b81..87523dbf1c 100644 --- a/modules/ticket/back/methods/ticket/specs/isEditable.spec.js +++ b/modules/ticket/back/methods/ticket/specs/isEditable.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('ticket isEditable()', () => { it('should return false if the ticket given is not editable', async () => { diff --git a/modules/ticket/back/methods/ticket/specs/new.spec.js b/modules/ticket/back/methods/ticket/specs/new.spec.js index 4e180e3753..ff5fa9d895 100644 --- a/modules/ticket/back/methods/ticket/specs/new.spec.js +++ b/modules/ticket/back/methods/ticket/specs/new.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('ticket new()', () => { let ticket; diff --git a/modules/ticket/back/methods/ticket/specs/summary.spec.js b/modules/ticket/back/methods/ticket/specs/summary.spec.js index 85a38ad0cb..34e6affba7 100644 --- a/modules/ticket/back/methods/ticket/specs/summary.spec.js +++ b/modules/ticket/back/methods/ticket/specs/summary.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('ticket summary()', () => { it('should return a summary object containing data from 1 ticket', async() => { diff --git a/modules/ticket/back/methods/ticket/specs/threeLastActive.spec.js b/modules/ticket/back/methods/ticket/specs/threeLastActive.spec.js index 988a42304e..6e6416d78c 100644 --- a/modules/ticket/back/methods/ticket/specs/threeLastActive.spec.js +++ b/modules/ticket/back/methods/ticket/specs/threeLastActive.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('ticket threeLastActive()', () => { it('should return the last three active tickets', async() => { diff --git a/modules/ticket/back/models/specs/state.spec.js b/modules/ticket/back/models/specs/state.spec.js index 0bbb361e15..e6239c8bcf 100644 --- a/modules/ticket/back/models/specs/state.spec.js +++ b/modules/ticket/back/models/specs/state.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('loopback model State', () => { describe('isAlertLevelZero()', () => { diff --git a/modules/ticket/back/models/specs/ticket-packaging.spec.js b/modules/ticket/back/models/specs/ticket-packaging.spec.js index 5b1dd02d72..f2834643dd 100644 --- a/modules/ticket/back/models/specs/ticket-packaging.spec.js +++ b/modules/ticket/back/models/specs/ticket-packaging.spec.js @@ -1,4 +1,4 @@ -const app = require(`${serviceRoot}/server/server`); +const app = require('vn-loopback/server/server'); describe('ticket model TicketTracking', () => { let ticketTrackingId;