From 3a2fc984dd6f6ab905b4344196461ba5191ceb45 Mon Sep 17 00:00:00 2001 From: alexm Date: Wed, 26 Oct 2022 15:18:14 +0200 Subject: [PATCH 01/33] refs #4564 --- print/core/report.js | 54 ++++++++++--------- .../claim-pickup-order/claim-pickup-order.js | 2 + 2 files changed, 31 insertions(+), 25 deletions(-) diff --git a/print/core/report.js b/print/core/report.js index c5182d1a8..d37b79c6d 100644 --- a/print/core/report.js +++ b/print/core/report.js @@ -23,39 +23,43 @@ class Report extends Component { } async toPdfStream() { - const template = await this.render(); - const defaultOptions = Object.assign({}, config.pdf); + try { + const template = await this.render(); + const defaultOptions = Object.assign({}, config.pdf); - const optionsPath = `${this.path}/options.json`; - const fullPath = path.resolve(__dirname, optionsPath); - let options = defaultOptions; - if (fs.existsSync(fullPath)) - options = require(optionsPath); + const optionsPath = `${this.path}/options.json`; + const fullPath = path.resolve(__dirname, optionsPath); + let options = defaultOptions; + if (fs.existsSync(fullPath)) + options = require(optionsPath); - return new Promise(resolve => { - Cluster.pool.queue({}, async({page}) => { - await page.emulateMediaType('screen'); - await page.setContent(template); + return new Promise(resolve => { + Cluster.pool.queue({}, async({page}) => { + await page.emulateMediaType('screen'); + await page.setContent(template); - const element = await page.$('#pageFooter'); + const element = await page.$('#pageFooter'); - let footer = '\n'; - if (element) { - footer = await page.evaluate(el => { - const html = el.innerHTML; - el.remove(); - return html; - }, element); - } + let footer = '\n'; + if (element) { + footer = await page.evaluate(el => { + const html = el.innerHTML; + el.remove(); + return html; + }, element); + } - options.headerTemplate = '\n'; - options.footerTemplate = footer; + options.headerTemplate = '\n'; + options.footerTemplate = footer; - const stream = await page.pdf(options); + const stream = await page.pdf(options); - resolve(stream); + resolve(stream); + }); }); - }); + } catch (e) { + console.log('ERROR CATCHED:', e); + } } /** diff --git a/print/templates/reports/claim-pickup-order/claim-pickup-order.js b/print/templates/reports/claim-pickup-order/claim-pickup-order.js index f7d21a2d3..2982379db 100755 --- a/print/templates/reports/claim-pickup-order/claim-pickup-order.js +++ b/print/templates/reports/claim-pickup-order/claim-pickup-order.js @@ -5,6 +5,8 @@ const reportFooter = new Component('report-footer'); module.exports = { name: 'claim-pickup-order', async serverPrefetch() { + // FORCE FAIL FOR TEST + throw new Error('Something went wrong'); this.client = await this.fetchClient(this.id); this.sales = await this.fetchSales(this.id); this.claimConfig = await this.fetchClaimConfig(); From 84a5f3986b5aaa838a6882cfbdd24dff1e0d8561 Mon Sep 17 00:00:00 2001 From: alexm Date: Wed, 2 Nov 2022 13:24:35 +0100 Subject: [PATCH 02/33] feat(worker): createWorker refs #4658 --- modules/worker/back/methods/worker/new.js | 197 ++++++++++++++++++++++ modules/worker/back/models/worker.js | 1 + 2 files changed, 198 insertions(+) create mode 100644 modules/worker/back/methods/worker/new.js diff --git a/modules/worker/back/methods/worker/new.js b/modules/worker/back/methods/worker/new.js new file mode 100644 index 000000000..481011563 --- /dev/null +++ b/modules/worker/back/methods/worker/new.js @@ -0,0 +1,197 @@ +const md5 = require('md5'); +const {Email} = require('vn-print'); + +module.exports = Self => { + Self.remoteMethodCtx('new', { + description: 'Creates a new ticket and returns the id', + accessType: 'WRITE', + accepts: [ + { + arg: 'fi', + type: 'number', + description: `The fi of worker`, + required: true + }, + { + arg: 'name', + type: 'string', + description: `REPLACE!`, + required: true + }, + { + arg: 'firstName', + type: 'string', + description: `REPLACE!`, + required: true + }, + { + arg: 'lastNames', + type: 'string', + description: `REPLACE!`, + required: true + }, + { + arg: 'password', + type: 'string', + description: `REPLACE!`, + required: true + }, + { + arg: 'email', + type: 'string', + description: `REPLACE!`, + required: true + }, + { + arg: 'role', + type: 'number', + description: `REPLACE!` + }, + { + arg: 'street', + type: 'string', + description: `REPLACE!` + }, + { + arg: 'string', + type: 'number', + description: `REPLACE!` + }, + { + arg: 'provinceFk', + type: 'number', + description: `REPLACE!` + }, + { + arg: 'postalCode', + type: 'number', + description: `REPLACE!` + }, + { + arg: 'phone', + type: 'number', + description: `REPLACE!` + }, + { + arg: 'workerCode', + type: 'string', + description: `REPLACE!` + }, + { + arg: 'bossFk', + type: 'number', + description: `REPLACE!` + }, + { + arg: 'birth', + type: 'date', + description: `REPLACE!` + } + ], + returns: { + type: 'number', + root: true + }, + http: { + path: `/new`, + verb: 'POST' + } + }); + + Self.new = async(ctx, options) => { + const models = Self.app.models; + const myOptions = {}; + const args = ctx.args; + + let tx; + + if (typeof options == 'object') + Object.assign(myOptions, options); + + if (!myOptions.transaction) { + tx = await Self.beginTransaction({}); + myOptions.transaction = tx; + } + + let client; + try { + client = await models.Client.findOne({ + where: {fi: fi}, + }, myOptions); + + if (!client) { + const nickname = args.firstName.concat(' ', args.lastNames); + const user = await models.Account.create({ + name: args.name, + nickname, + password: md5(args.password), + email: args.email, + role: args.role + }, myOptions); + + await models.UserAccount.create({ + id: user.id + }, myOptions); + + await models.Worker.rawSql('CALL vn.clientCreate(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', + [ + args.firstName, + args.lastNames, + args.fi, + args.address, + args.postalCode, + args.town, + args.province, + args.company, + args.phone, + args.email, + user.id + ] + , myOptions); + + const address = await models.Address.create({ + clientFk: user.id, + address: args.street, + town: args.town, + provinceFk: args.provinceFk, + postalCode: args.postalCode, + mobile: args.phone, + nickname: 'TR ' + nickname, + isDefaultAddress: true + }, myOptions); + + client = await models.Sale.findById(user.id, null, myOptions); + await client.updateAttribute('defaultAddressFk ', address.id); + } + + await models.Worker.rawSql('CALL vn.workerCreate(?, ?, ?, ?, ?, ?, ?)', + [ + args.firstName, + args.lastNames, + args.workerCode, + args.bossFk, + user.id, + args.fi, + args.birth + ] + , myOptions); + + if (tx) await tx.commit(); + } catch (e) { + if (tx) await tx.rollback(); + throw e; + } + + // TODO: create this email, use client-welcome as template. And view CALL mail_insert in redmine for the body + // TODO: or use same funcionality back/methods/account/recover-password.js + const email = new Email('worker-welcome', { + recipient: args.email, + lang: ctx.req.getLocale() + }); + + await email.send(); + + // return id, and in front use for redirection + return client.id; + }; +}; diff --git a/modules/worker/back/models/worker.js b/modules/worker/back/models/worker.js index ec6c4af28..e66259cd0 100644 --- a/modules/worker/back/models/worker.js +++ b/modules/worker/back/models/worker.js @@ -13,4 +13,5 @@ module.exports = Self => { require('../methods/worker/contracts')(Self); require('../methods/worker/holidays')(Self); require('../methods/worker/activeContract')(Self); + require('../methods/worker/new')(Self); }; From db3a6df23d3bb04fb398d6d02748323fe1454d14 Mon Sep 17 00:00:00 2001 From: alexm Date: Mon, 14 Nov 2022 15:19:16 +0100 Subject: [PATCH 03/33] feat(worker): new worker --- .../10503-november/00-aclProfileType.sql | 18 ++ db/dump/fixtures.sql | 8 + modules/worker/back/methods/worker/new.js | 102 ++++++--- modules/worker/back/model-config.json | 18 +- .../worker/back/models/new-worker-config.json | 39 ++++ modules/worker/back/models/profile-type.json | 19 ++ modules/worker/back/models/worker.json | 5 +- modules/worker/front/create/index.html | 208 ++++++++++++++++++ modules/worker/front/create/index.js | 98 +++++++++ modules/worker/front/create/index.spec.js | 122 ++++++++++ modules/worker/front/create/locale/es.yml | 12 + modules/worker/front/index.js | 1 + modules/worker/front/index/index.html | 6 + modules/worker/front/routes.json | 11 +- .../email/worker-welcome/assets/css/import.js | 11 + .../email/worker-welcome/client-welcome.html | 10 + .../email/worker-welcome/client-welcome.js | 23 ++ .../email/worker-welcome/locale/es.yml | 7 + .../email/worker-welcome/sql/client.sql | 11 + 19 files changed, 684 insertions(+), 45 deletions(-) create mode 100644 db/changes/10503-november/00-aclProfileType.sql create mode 100644 modules/worker/back/models/new-worker-config.json create mode 100644 modules/worker/back/models/profile-type.json create mode 100644 modules/worker/front/create/index.html create mode 100644 modules/worker/front/create/index.js create mode 100644 modules/worker/front/create/index.spec.js create mode 100644 modules/worker/front/create/locale/es.yml create mode 100644 print/templates/email/worker-welcome/assets/css/import.js create mode 100644 print/templates/email/worker-welcome/client-welcome.html create mode 100755 print/templates/email/worker-welcome/client-welcome.js create mode 100644 print/templates/email/worker-welcome/locale/es.yml create mode 100644 print/templates/email/worker-welcome/sql/client.sql diff --git a/db/changes/10503-november/00-aclProfileType.sql b/db/changes/10503-november/00-aclProfileType.sql new file mode 100644 index 000000000..638b3d580 --- /dev/null +++ b/db/changes/10503-november/00-aclProfileType.sql @@ -0,0 +1,18 @@ + +INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`) + VALUES + ('ProfileType', '*', '*', 'ALLOW', 'ROLE', 'employee'); + +CREATE TABLE `vn`.`newWorkerConfig` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `street` VARCHAR(25) NULL, + `provinceFk` smallint(6) unsigned NULL, + `companyFk` smallint(5) unsigned NULL, + `profileTypeFk` INT(11) NULL, + `roleFk` int(10) unsigned NULL, + PRIMARY KEY (`id`), + CONSTRAINT `newWorkerConfig_province_fk` FOREIGN KEY (`provinceFk`) REFERENCES `vn`.`province` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `newWorkerConfig_company_fk` FOREIGN KEY (`companyFk`) REFERENCES `vn`.`company` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `newWorkerConfig_profileType_fk` FOREIGN KEY (`profileTypeFk`) REFERENCES `vn`.`profileType` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `newWorkerConfig_role_fk` FOREIGN KEY (`roleFk`) REFERENCES `account`.`role` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +); diff --git a/db/dump/fixtures.sql b/db/dump/fixtures.sql index 6624e99f4..a6fb9cbbb 100644 --- a/db/dump/fixtures.sql +++ b/db/dump/fixtures.sql @@ -2719,3 +2719,11 @@ UPDATE `account`.`user` INSERT INTO `vn`.`osTicketConfig` (`id`, `host`, `user`, `password`, `oldStatus`, `newStatusId`, `day`, `comment`, `hostDb`, `userDb`, `passwordDb`, `portDb`, `responseType`, `fromEmailId`, `replyTo`) VALUES (0, 'http://localhost:56596/scp', 'ostadmin', 'Admin1', 'open', 3, 60, 'Este CAU se ha cerrado automáticamente. Si el problema persiste responda a este mensaje.', 'localhost', 'osticket', 'osticket', 40003, 'reply', 1, 'all'); + +INSERT INTO `vn`.`profileType` (`id`, `name`) + VALUES + (1, 'working'); + +INSERT INTO `vn`.`newWorkerConfig` (`id`, `street`, `provinceFk`, `companyFk`, `profileTypeFk`, `roleFk`) + VALUES + (1, 'S/ ', 1, 442, 1, 1); diff --git a/modules/worker/back/methods/worker/new.js b/modules/worker/back/methods/worker/new.js index 481011563..bdab1335a 100644 --- a/modules/worker/back/methods/worker/new.js +++ b/modules/worker/back/methods/worker/new.js @@ -8,7 +8,7 @@ module.exports = Self => { accepts: [ { arg: 'fi', - type: 'number', + type: 'string', description: `The fi of worker`, required: true }, @@ -30,12 +30,6 @@ module.exports = Self => { description: `REPLACE!`, required: true }, - { - arg: 'password', - type: 'string', - description: `REPLACE!`, - required: true - }, { arg: 'email', type: 'string', @@ -43,49 +37,76 @@ module.exports = Self => { required: true }, { - arg: 'role', + arg: 'roleFk', type: 'number', - description: `REPLACE!` + description: `REPLACE!`, + required: true }, { arg: 'street', type: 'string', - description: `REPLACE!` + description: `REPLACE!`, + required: true }, { - arg: 'string', - type: 'number', - description: `REPLACE!` + arg: 'city', + type: 'string', + description: `REPLACE!`, + required: true }, { arg: 'provinceFk', type: 'number', - description: `REPLACE!` + description: `REPLACE!`, + required: true }, { - arg: 'postalCode', + arg: 'iban', + type: 'string', + description: `REPLACE!`, + required: true + }, + { + arg: 'bankEntityFk', type: 'number', - description: `REPLACE!` + description: `REPLACE!`, + required: true + }, + { + arg: 'companyFk', + type: 'number', + description: `REPLACE!`, + required: true + }, + { + arg: 'postcode', + type: 'string', + description: `REPLACE!`, + required: true }, { arg: 'phone', - type: 'number', - description: `REPLACE!` + type: 'string', + description: `REPLACE!`, + required: true }, { - arg: 'workerCode', + arg: 'code', type: 'string', - description: `REPLACE!` + description: `REPLACE!`, + required: true }, { arg: 'bossFk', type: 'number', - description: `REPLACE!` + description: `REPLACE!`, + required: true }, { arg: 'birth', type: 'date', - description: `REPLACE!` + description: `REPLACE!`, + required: true } ], returns: { @@ -104,7 +125,7 @@ module.exports = Self => { const args = ctx.args; let tx; - + console.log(args); if (typeof options == 'object') Object.assign(myOptions, options); @@ -116,15 +137,16 @@ module.exports = Self => { let client; try { client = await models.Client.findOne({ - where: {fi: fi}, + where: {fi: args.fi}, }, myOptions); if (!client) { const nickname = args.firstName.concat(' ', args.lastNames); + const randomPassword = await models.Worker.rawSql('SELECT account.passwordGenerate();'); const user = await models.Account.create({ name: args.name, nickname, - password: md5(args.password), + password: md5(randomPassword), email: args.email, role: args.role }, myOptions); @@ -138,11 +160,11 @@ module.exports = Self => { args.firstName, args.lastNames, args.fi, - args.address, + args.street, args.postalCode, - args.town, - args.province, - args.company, + args.city, + args.provinceFk, + args.companyFk, args.phone, args.email, user.id @@ -151,8 +173,8 @@ module.exports = Self => { const address = await models.Address.create({ clientFk: user.id, - address: args.street, - town: args.town, + street: args.street, + city: args.city, provinceFk: args.provinceFk, postalCode: args.postalCode, mobile: args.phone, @@ -160,17 +182,22 @@ module.exports = Self => { isDefaultAddress: true }, myOptions); - client = await models.Sale.findById(user.id, null, myOptions); - await client.updateAttribute('defaultAddressFk ', address.id); - } + client = await models.Client.findById(user.id, null, myOptions); + console.log(address.id); + await client.updateAttributes({ + iban: args.iban, + bankEntityFk: args.bankEntityFk, + defaultAddressFk: address.id + }, myOptions); + } await models.Worker.rawSql('CALL vn.workerCreate(?, ?, ?, ?, ?, ?, ?)', [ args.firstName, args.lastNames, - args.workerCode, + args.code, args.bossFk, - user.id, + client.id, args.fi, args.birth ] @@ -184,6 +211,9 @@ module.exports = Self => { // TODO: create this email, use client-welcome as template. And view CALL mail_insert in redmine for the body // TODO: or use same funcionality back/methods/account/recover-password.js + + // TODO: call worerWelcomeEmail, and this is who create the url for change password + const email = new Email('worker-welcome', { recipient: args.email, lang: ctx.req.getLocale() diff --git a/modules/worker/back/model-config.json b/modules/worker/back/model-config.json index 3f3416504..de8aadd41 100644 --- a/modules/worker/back/model-config.json +++ b/modules/worker/back/model-config.json @@ -1,7 +1,7 @@ { "AbsenceType": { "dataSource": "vn" - }, + }, "Calendar": { "dataSource": "vn" }, @@ -16,13 +16,22 @@ }, "Department": { "dataSource": "vn" - }, + }, + "Device": { + "dataSource": "vn" + }, "EducationLevel": { "dataSource": "vn" }, "Journey": { "dataSource": "vn" }, + "NewWorkerConfig":{ + "dataSource": "vn" + }, + "ProfileType":{ + "dataSource": "vn" + }, "Time": { "dataSource": "vn" }, @@ -55,11 +64,8 @@ }, "WorkerDepartment": { "dataSource": "vn" - }, - "WorkerTimeControl": { - "dataSource": "vn" }, - "Device": { + "WorkerTimeControl": { "dataSource": "vn" }, "WorkerLog": { diff --git a/modules/worker/back/models/new-worker-config.json b/modules/worker/back/models/new-worker-config.json new file mode 100644 index 000000000..2102d236c --- /dev/null +++ b/modules/worker/back/models/new-worker-config.json @@ -0,0 +1,39 @@ +{ + "name": "NewWorkerConfig", + "base": "VnModel", + "options": { + "mysql": { + "table": "newWorkerConfig" + } + }, + "properties": { + "id": { + "type": "number", + "id": true, + "description": "Identifier" + }, + "street": { + "type": "string" + }, + "provinceFk": { + "type": "number" + }, + "companyFk": { + "type": "number" + }, + "profileTypeFk": { + "type": "number" + }, + "roleFk": { + "type": "number" + } + }, + "acls": [ + { + "accessType": "READ", + "principalType": "ROLE", + "principalId": "$everyone", + "permission": "ALLOW" + } + ] +} diff --git a/modules/worker/back/models/profile-type.json b/modules/worker/back/models/profile-type.json new file mode 100644 index 000000000..d1d750de8 --- /dev/null +++ b/modules/worker/back/models/profile-type.json @@ -0,0 +1,19 @@ +{ + "name": "ProfileType", + "base": "VnModel", + "options": { + "mysql": { + "table": "profileType" + } + }, + "properties": { + "id": { + "type": "number", + "id": true, + "description": "Identifier" + }, + "name": { + "type": "string" + } + } +} diff --git a/modules/worker/back/models/worker.json b/modules/worker/back/models/worker.json index 3d41707ce..e3a941dd3 100644 --- a/modules/worker/back/models/worker.json +++ b/modules/worker/back/models/worker.json @@ -52,6 +52,9 @@ }, "mobileExtension": { "type" : "number" + }, + "code": { + "type" : "string" } }, "relations": { @@ -91,4 +94,4 @@ "foreignKey": "sectorFk" } } -} \ No newline at end of file +} diff --git a/modules/worker/front/create/index.html b/modules/worker/front/create/index.html new file mode 100644 index 000000000..58b4da060 --- /dev/null +++ b/modules/worker/front/create/index.html @@ -0,0 +1,208 @@ + + +
+ + + + + + + + + + + + + + + + + + + + {{name}} ({{country.country}}) + + + + {{name}}, {{province.name}} + ({{province.country.country}}) + + + + + + + {{code}} - {{town.name}} ({{town.province.name}}, + {{town.province.country.country}}) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{bic}} {{name}} + + + + + + + + + + + + + +
+ + + diff --git a/modules/worker/front/create/index.js b/modules/worker/front/create/index.js new file mode 100644 index 000000000..a068b2006 --- /dev/null +++ b/modules/worker/front/create/index.js @@ -0,0 +1,98 @@ +import ngModule from '../module'; +import Section from 'salix/components/section'; + +export default class Controller extends Section { + constructor($element, $) { + super($element, $); + this.$http.get('NewWorkerConfigs/findOne').then(res => { + return this.worker = Object.assign({}, res.data); + }); + } + + onSubmit() { + return this.$.watcher.submit().then(json => { + this.$state.go('client.card.basicData', {id: json.data.id}); + this.$http.get(`Clients/${this.client.id}/checkDuplicatedData`); + }); + } + + autofillBic() { + if (!this.worker || !this.worker.iban) return; + + let bankEntityId = parseInt(this.worker.iban.substr(4, 4)); + let filter = {where: {id: bankEntityId}}; + + if (this.ibanCountry != 'ES') return; + + this.$http.get(`BankEntities`, {filter}).then(response => { + const hasData = response.data && response.data[0]; + + if (hasData) + this.worker.bankEntityFk = response.data[0].id; + else if (!hasData) + this.worker.bankEntityFk = null; + }); + } + + get province() { + return this._province; + } + + // Province auto complete + set province(selection) { + this._province = selection; + } + + get town() { + return this._town; + } + + // Town auto complete + set town(selection) { + this._town = selection; + + if (!selection) return; + + const province = selection.province; + const postcodes = selection.postcodes; + + if (!this.client.provinceFk) + this.client.provinceFk = province.id; + + if (postcodes.length === 1) + this.client.postcode = postcodes[0].code; + } + + get postcode() { + return this._postcode; + } + + // Postcode auto complete + set postcode(selection) { + this._postcode = selection; + + if (!selection) return; + + const town = selection.town; + const province = town.province; + + if (!this.client.city) + this.client.city = town.name; + + if (!this.client.provinceFk) + this.client.provinceFk = province.id; + } + + onResponse(response) { + this.client.postcode = response.code; + this.client.city = response.city; + this.client.provinceFk = response.provinceFk; + } +} + +Controller.$inject = ['$element', '$scope']; + +ngModule.vnComponent('vnWorkerCreate', { + template: require('./index.html'), + controller: Controller +}); diff --git a/modules/worker/front/create/index.spec.js b/modules/worker/front/create/index.spec.js new file mode 100644 index 000000000..24fc80d21 --- /dev/null +++ b/modules/worker/front/create/index.spec.js @@ -0,0 +1,122 @@ +import './index'; + +describe('Client', () => { + describe('Component vnClientCreate', () => { + let $scope; + let $state; + let controller; + + beforeEach(ngModule('client')); + + beforeEach(inject(($componentController, $rootScope, _$state_) => { + $scope = $rootScope.$new(); + $state = _$state_; + $scope.watcher = { + submit: () => { + return { + then: callback => { + callback({data: {id: '1234'}}); + } + }; + } + }; + const $element = angular.element(''); + controller = $componentController('vnClientCreate', {$element, $scope}); + })); + + it('should define and set scope, state and client properties', () => { + expect(controller.$).toBe($scope); + expect(controller.$state).toBe($state); + expect(controller.client.active).toBe(true); + }); + + describe('onSubmit()', () => { + it(`should call submit() on the watcher then expect a callback`, () => { + jest.spyOn($state, 'go'); + controller.onSubmit(); + + expect(controller.$state.go).toHaveBeenCalledWith('client.card.basicData', {id: '1234'}); + }); + }); + + describe('province() setter', () => { + it(`should set countryFk property`, () => { + controller.client.countryFk = null; + controller.province = { + id: 1, + name: 'New york', + country: { + id: 2, + name: 'USA' + } + }; + + expect(controller.client.countryFk).toEqual(2); + }); + }); + + describe('town() setter', () => { + it(`should set provinceFk property`, () => { + controller.town = { + provinceFk: 1, + code: 46001, + province: { + id: 1, + name: 'New york', + country: { + id: 2, + name: 'USA' + } + }, + postcodes: [] + }; + + expect(controller.client.provinceFk).toEqual(1); + }); + + it(`should set provinceFk property and fill the postalCode if there's just one`, () => { + controller.town = { + provinceFk: 1, + code: 46001, + province: { + id: 1, + name: 'New york', + country: { + id: 2, + name: 'USA' + } + }, + postcodes: [{code: '46001'}] + }; + + expect(controller.client.provinceFk).toEqual(1); + expect(controller.client.postcode).toEqual('46001'); + }); + }); + + describe('postcode() setter', () => { + it(`should set the town, provinceFk and contryFk properties`, () => { + controller.postcode = { + townFk: 1, + code: 46001, + town: { + id: 1, + name: 'New York', + province: { + id: 1, + name: 'New york', + country: { + id: 2, + name: 'USA' + } + } + } + }; + + expect(controller.client.city).toEqual('New York'); + expect(controller.client.provinceFk).toEqual(1); + expect(controller.client.countryFk).toEqual(2); + }); + }); + }); +}); diff --git a/modules/worker/front/create/locale/es.yml b/modules/worker/front/create/locale/es.yml new file mode 100644 index 000000000..afe3feaa6 --- /dev/null +++ b/modules/worker/front/create/locale/es.yml @@ -0,0 +1,12 @@ +Name: Nombre +Tax number: NIF/CIF +Business name: Razón social +Web user: Usuario Web +Email: E-mail +Create and edit: Crear y editar +You can save multiple emails: >- + Puede guardar varios correos electrónicos encadenándolos mediante comas + sin espacios, ejemplo: user@dominio.com, user2@dominio.com siendo el primer + correo electrónico el principal +The type of business must be filled in basic data: El tipo de negocio debe estar rellenado en datos básicos +Access permission: Permiso de acceso diff --git a/modules/worker/front/index.js b/modules/worker/front/index.js index f703e7c21..97126407c 100644 --- a/modules/worker/front/index.js +++ b/modules/worker/front/index.js @@ -4,6 +4,7 @@ import './main'; import './index/'; import './summary'; import './card'; +import './create'; import './descriptor'; import './descriptor-popover'; import './search-panel'; diff --git a/modules/worker/front/index/index.html b/modules/worker/front/index/index.html index 98df416b4..b48a84854 100644 --- a/modules/worker/front/index/index.html +++ b/modules/worker/front/index/index.html @@ -42,6 +42,12 @@ + + + diff --git a/modules/worker/front/routes.json b/modules/worker/front/routes.json index ca33eaa76..dad55512b 100644 --- a/modules/worker/front/routes.json +++ b/modules/worker/front/routes.json @@ -16,7 +16,7 @@ {"state": "worker.card.timeControl", "icon": "access_time"}, {"state": "worker.card.dms.index", "icon": "cloud_upload"}, { - "icon": "icon-wiki", + "icon": "icon-wiki", "external":true, "url": "http://wiki.verdnatura.es", "description": "Wikipedia" @@ -134,6 +134,13 @@ "worker": "$ctrl.worker" }, "acl": ["hr"] + }, + { + "url": "/create", + "state": "worker.create", + "component": "vn-worker-create", + "description": "New worker", + "acl": ["hr"] } ] -} \ No newline at end of file +} diff --git a/print/templates/email/worker-welcome/assets/css/import.js b/print/templates/email/worker-welcome/assets/css/import.js new file mode 100644 index 000000000..4b4bb7086 --- /dev/null +++ b/print/templates/email/worker-welcome/assets/css/import.js @@ -0,0 +1,11 @@ +const Stylesheet = require(`vn-print/core/stylesheet`); + +const path = require('path'); +const vnPrintPath = path.resolve('print'); + +module.exports = new Stylesheet([ + `${vnPrintPath}/common/css/spacing.css`, + `${vnPrintPath}/common/css/misc.css`, + `${vnPrintPath}/common/css/layout.css`, + `${vnPrintPath}/common/css/email.css`]) + .mergeStyles(); diff --git a/print/templates/email/worker-welcome/client-welcome.html b/print/templates/email/worker-welcome/client-welcome.html new file mode 100644 index 000000000..6aaee6120 --- /dev/null +++ b/print/templates/email/worker-welcome/client-welcome.html @@ -0,0 +1,10 @@ + +
+
+

{{ $t('title', [id]) }}

+

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

+

+

{{ $t('workerData', this.user.name, this.url) }}

+
+
+
diff --git a/print/templates/email/worker-welcome/client-welcome.js b/print/templates/email/worker-welcome/client-welcome.js new file mode 100755 index 000000000..9fbcf86a6 --- /dev/null +++ b/print/templates/email/worker-welcome/client-welcome.js @@ -0,0 +1,23 @@ +const Component = require(`vn-print/core/component`); +const emailBody = new Component('email-body'); + +module.exports = { + name: 'client-welcome', + async serverPrefetch() { + this.client = await this.fetchClient(this.id); + }, + methods: { + fetchClient(id) { + return this.findOneFromDef('client', [id]); + }, + }, + components: { + 'email-body': emailBody.build(), + }, + props: { + id: { + type: Number, + required: true + } + } +}; diff --git a/print/templates/email/worker-welcome/locale/es.yml b/print/templates/email/worker-welcome/locale/es.yml new file mode 100644 index 000000000..769df453e --- /dev/null +++ b/print/templates/email/worker-welcome/locale/es.yml @@ -0,0 +1,7 @@ +subject: Bienvenido a Verdnatura +title: "¡Te damos la bienvenida!" +dearWorker: Estimado trabajador +workerData: 'Bienvenido a Verdnatura SL, este es tu usuario: {0}. Pero primero debes + cambiar tu contraseña. + ' diff --git a/print/templates/email/worker-welcome/sql/client.sql b/print/templates/email/worker-welcome/sql/client.sql new file mode 100644 index 000000000..49e1d4bf6 --- /dev/null +++ b/print/templates/email/worker-welcome/sql/client.sql @@ -0,0 +1,11 @@ +SELECT + c.id, + u.name AS userName, + CONCAT(w.lastName, ' ', 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 = ? \ No newline at end of file From 6113ea398d3465424f066d0633741f7576bf1b39 Mon Sep 17 00:00:00 2001 From: alexm Date: Mon, 14 Nov 2022 15:19:38 +0100 Subject: [PATCH 04/33] feat: worker-welcome --- .../worker-welcome/{client-welcome.html => worker-welcome.html} | 0 .../email/worker-welcome/{client-welcome.js => worker-welcome.js} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename print/templates/email/worker-welcome/{client-welcome.html => worker-welcome.html} (100%) rename print/templates/email/worker-welcome/{client-welcome.js => worker-welcome.js} (100%) diff --git a/print/templates/email/worker-welcome/client-welcome.html b/print/templates/email/worker-welcome/worker-welcome.html similarity index 100% rename from print/templates/email/worker-welcome/client-welcome.html rename to print/templates/email/worker-welcome/worker-welcome.html diff --git a/print/templates/email/worker-welcome/client-welcome.js b/print/templates/email/worker-welcome/worker-welcome.js similarity index 100% rename from print/templates/email/worker-welcome/client-welcome.js rename to print/templates/email/worker-welcome/worker-welcome.js From 7a7da9508f7dbdfc0fbee318d29fe2c3a8c65afb Mon Sep 17 00:00:00 2001 From: alexm Date: Tue, 15 Nov 2022 12:56:30 +0100 Subject: [PATCH 05/33] feat: workerWelcomeEmail --- modules/worker/back/methods/worker/new.js | 156 +++++++++--------- .../back/methods/worker/workerWelcomeEmail.js | 78 +++++++++ .../email/worker-welcome/worker-welcome.html | 1 - 3 files changed, 159 insertions(+), 76 deletions(-) create mode 100644 modules/worker/back/methods/worker/workerWelcomeEmail.js diff --git a/modules/worker/back/methods/worker/new.js b/modules/worker/back/methods/worker/new.js index bdab1335a..a57ca8c21 100644 --- a/modules/worker/back/methods/worker/new.js +++ b/modules/worker/back/methods/worker/new.js @@ -1,5 +1,4 @@ const md5 = require('md5'); -const {Email} = require('vn-print'); module.exports = Self => { Self.remoteMethodCtx('new', { @@ -10,113 +9,113 @@ module.exports = Self => { arg: 'fi', type: 'string', description: `The fi of worker`, - required: true + required: true, }, { arg: 'name', type: 'string', description: `REPLACE!`, - required: true + required: true, }, { arg: 'firstName', type: 'string', description: `REPLACE!`, - required: true + required: true, }, { arg: 'lastNames', type: 'string', description: `REPLACE!`, - required: true + required: true, }, { arg: 'email', type: 'string', description: `REPLACE!`, - required: true + required: true, }, { arg: 'roleFk', type: 'number', description: `REPLACE!`, - required: true + required: true, }, { arg: 'street', type: 'string', description: `REPLACE!`, - required: true + required: true, }, { arg: 'city', type: 'string', description: `REPLACE!`, - required: true + required: true, }, { arg: 'provinceFk', type: 'number', description: `REPLACE!`, - required: true + required: true, }, { arg: 'iban', type: 'string', description: `REPLACE!`, - required: true + required: true, }, { arg: 'bankEntityFk', type: 'number', description: `REPLACE!`, - required: true + required: true, }, { arg: 'companyFk', type: 'number', description: `REPLACE!`, - required: true + required: true, }, { arg: 'postcode', type: 'string', description: `REPLACE!`, - required: true + required: true, }, { arg: 'phone', type: 'string', description: `REPLACE!`, - required: true + required: true, }, { arg: 'code', type: 'string', description: `REPLACE!`, - required: true + required: true, }, { arg: 'bossFk', type: 'number', description: `REPLACE!`, - required: true + required: true, }, { arg: 'birth', type: 'date', description: `REPLACE!`, - required: true - } + required: true, + }, ], returns: { type: 'number', - root: true + root: true, }, http: { path: `/new`, - verb: 'POST' - } + verb: 'POST', + }, }); Self.new = async(ctx, options) => { @@ -126,8 +125,7 @@ module.exports = Self => { let tx; console.log(args); - if (typeof options == 'object') - Object.assign(myOptions, options); + if (typeof options == 'object') Object.assign(myOptions, options); if (!myOptions.transaction) { tx = await Self.beginTransaction({}); @@ -136,26 +134,38 @@ module.exports = Self => { let client; try { - client = await models.Client.findOne({ - where: {fi: args.fi}, - }, myOptions); + client = await models.Client.findOne( + { + where: {fi: args.fi}, + }, + myOptions + ); if (!client) { const nickname = args.firstName.concat(' ', args.lastNames); - const randomPassword = await models.Worker.rawSql('SELECT account.passwordGenerate();'); - const user = await models.Account.create({ - name: args.name, - nickname, - password: md5(randomPassword), - email: args.email, - role: args.role - }, myOptions); + const randomPassword = await models.Worker.rawSql( + 'SELECT account.passwordGenerate();' + ); + const user = await models.Account.create( + { + name: args.name, + nickname, + password: md5(randomPassword), + email: args.email, + role: args.role, + }, + myOptions + ); - await models.UserAccount.create({ - id: user.id - }, myOptions); + await models.UserAccount.create( + { + id: user.id, + }, + myOptions + ); - await models.Worker.rawSql('CALL vn.clientCreate(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', + await models.Worker.rawSql( + 'CALL vn.clientCreate(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', [ args.firstName, args.lastNames, @@ -167,31 +177,38 @@ module.exports = Self => { args.companyFk, args.phone, args.email, - user.id - ] - , myOptions); + user.id, + ], + myOptions + ); - const address = await models.Address.create({ - clientFk: user.id, - street: args.street, - city: args.city, - provinceFk: args.provinceFk, - postalCode: args.postalCode, - mobile: args.phone, - nickname: 'TR ' + nickname, - isDefaultAddress: true - }, myOptions); + const address = await models.Address.create( + { + clientFk: user.id, + street: args.street, + city: args.city, + provinceFk: args.provinceFk, + postalCode: args.postalCode, + mobile: args.phone, + nickname: 'TR ' + nickname, + isDefaultAddress: true, + }, + myOptions + ); client = await models.Client.findById(user.id, null, myOptions); - console.log(address.id); - await client.updateAttributes({ - iban: args.iban, - bankEntityFk: args.bankEntityFk, - defaultAddressFk: address.id - }, myOptions); + await client.updateAttributes( + { + iban: args.iban, + bankEntityFk: args.bankEntityFk, + defaultAddressFk: address.id, + }, + myOptions + ); } - await models.Worker.rawSql('CALL vn.workerCreate(?, ?, ?, ?, ?, ?, ?)', + await models.Worker.rawSql( + 'CALL vn.workerCreate(?, ?, ?, ?, ?, ?, ?)', [ args.firstName, args.lastNames, @@ -199,9 +216,10 @@ module.exports = Self => { args.bossFk, client.id, args.fi, - args.birth - ] - , myOptions); + args.birth, + ], + myOptions + ); if (tx) await tx.commit(); } catch (e) { @@ -209,19 +227,7 @@ module.exports = Self => { throw e; } - // TODO: create this email, use client-welcome as template. And view CALL mail_insert in redmine for the body - // TODO: or use same funcionality back/methods/account/recover-password.js - - // TODO: call worerWelcomeEmail, and this is who create the url for change password - - const email = new Email('worker-welcome', { - recipient: args.email, - lang: ctx.req.getLocale() - }); - - await email.send(); - - // return id, and in front use for redirection + await models.Worker.workerWelcomeEmail(client.id); return client.id; }; }; diff --git a/modules/worker/back/methods/worker/workerWelcomeEmail.js b/modules/worker/back/methods/worker/workerWelcomeEmail.js new file mode 100644 index 000000000..7462df34d --- /dev/null +++ b/modules/worker/back/methods/worker/workerWelcomeEmail.js @@ -0,0 +1,78 @@ +const {Email} = require('vn-print'); + +module.exports = Self => { + Self.remoteMethodCtx('workerWelcomeEmail', { + description: + 'Sends the welcome email to the new worker', + accessType: 'WRITE', + accepts: [ + { + arg: 'id', + type: 'number', + required: true, + description: 'The worker id', + http: {source: 'path'}, + } + ], + returns: { + type: ['object'], + root: true, + }, + http: { + path: '/:id/worker-welcome-email', + verb: 'POST', + }, + }); + + Self.workerWelcomeEmail = async ctx => { + const models = Self.app.models; + const userId = ctx.req.accessToken.userId; + const $t = ctx.req.__; // $translate + const origin = ctx.req.headers.origin; + + const args = Object.assign({}, ctx.args); + const params = { + recipient: args.recipient, + lang: ctx.req.getLocale(), + }; + + delete args.ctx; + for (const param in args) params[param] = args[param]; + + const claim = await models.Claim.findById(args.id, { + fields: ['id', 'clientFk'], + include: { + relation: 'client', + scope: { + fields: ['name', 'salesPersonFk'], + }, + }, + }); + + const message = $t('Claim pickup order sent', { + claimId: args.id, + clientName: claim.client().name, + claimUrl: `${origin}/#!/claim/${args.id}/summary`, + }); + + const salesPersonId = claim.client().salesPersonFk; + if (salesPersonId) + await models.Chat.sendCheckingPresence(ctx, salesPersonId, message); + + await models.ClaimLog.create({ + originFk: args.id, + userFk: userId, + action: 'insert', + description: 'Claim-pickup-order sent', + changedModel: 'Mail', + }); + + const email = new Email('worker-welcome', { + recipient: args.email, + lang: ctx.req.getLocale(), + }); + + await email.send(); + // TODO: or use same funcionality back/methods/account/recover-password.js + }; +}; diff --git a/print/templates/email/worker-welcome/worker-welcome.html b/print/templates/email/worker-welcome/worker-welcome.html index 6aaee6120..f91c9941d 100644 --- a/print/templates/email/worker-welcome/worker-welcome.html +++ b/print/templates/email/worker-welcome/worker-welcome.html @@ -3,7 +3,6 @@

{{ $t('title', [id]) }}

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

-

{{ $t('workerData', this.user.name, this.url) }}

From 7c75eaadce02044fe970a7565fbc7ced641abdbd Mon Sep 17 00:00:00 2001 From: alexm Date: Mon, 21 Nov 2022 15:15:25 +0100 Subject: [PATCH 06/33] feat: worker-welcome --- print/templates/email/worker-welcome/sql/client.sql | 11 ----------- print/templates/email/worker-welcome/sql/worker.sql | 7 +++++++ .../email/worker-welcome/worker-welcome.html | 2 +- .../templates/email/worker-welcome/worker-welcome.js | 8 ++++---- 4 files changed, 12 insertions(+), 16 deletions(-) delete mode 100644 print/templates/email/worker-welcome/sql/client.sql create mode 100644 print/templates/email/worker-welcome/sql/worker.sql diff --git a/print/templates/email/worker-welcome/sql/client.sql b/print/templates/email/worker-welcome/sql/client.sql deleted file mode 100644 index 49e1d4bf6..000000000 --- a/print/templates/email/worker-welcome/sql/client.sql +++ /dev/null @@ -1,11 +0,0 @@ -SELECT - c.id, - u.name AS userName, - CONCAT(w.lastName, ' ', 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 = ? \ No newline at end of file diff --git a/print/templates/email/worker-welcome/sql/worker.sql b/print/templates/email/worker-welcome/sql/worker.sql new file mode 100644 index 000000000..99377fec9 --- /dev/null +++ b/print/templates/email/worker-welcome/sql/worker.sql @@ -0,0 +1,7 @@ +SELECT + u.id, + u.name AS userName, + e.email +FROM account.user u + LEFT JOIN account.emailUser e ON e.userFk = u.id +WHERE u.id = ?; diff --git a/print/templates/email/worker-welcome/worker-welcome.html b/print/templates/email/worker-welcome/worker-welcome.html index f91c9941d..28e5689f1 100644 --- a/print/templates/email/worker-welcome/worker-welcome.html +++ b/print/templates/email/worker-welcome/worker-welcome.html @@ -3,7 +3,7 @@

{{ $t('title', [id]) }}

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

-

{{ $t('workerData', this.user.name, this.url) }}

+

{{ $t('workerData', this.worker.name, this.url) }}

diff --git a/print/templates/email/worker-welcome/worker-welcome.js b/print/templates/email/worker-welcome/worker-welcome.js index 9fbcf86a6..b9bf2ca28 100755 --- a/print/templates/email/worker-welcome/worker-welcome.js +++ b/print/templates/email/worker-welcome/worker-welcome.js @@ -2,13 +2,13 @@ const Component = require(`vn-print/core/component`); const emailBody = new Component('email-body'); module.exports = { - name: 'client-welcome', + name: 'worker-welcome', async serverPrefetch() { - this.client = await this.fetchClient(this.id); + this.worker = await this.fetchWorker(this.id); }, methods: { - fetchClient(id) { - return this.findOneFromDef('client', [id]); + fetchWorker(id) { + return this.findOneFromDef('worker', [id]); }, }, components: { From f70a9cb78588a139ff37ce115d6b3c7bbdc9857d Mon Sep 17 00:00:00 2001 From: alexm Date: Wed, 23 Nov 2022 14:46:25 +0100 Subject: [PATCH 07/33] feat(worker_new): use resetPassword funcionality --- modules/worker/back/methods/worker/new.js | 7 +- .../back/methods/worker/workerWelcomeEmail.js | 78 ------------------- 2 files changed, 6 insertions(+), 79 deletions(-) delete mode 100644 modules/worker/back/methods/worker/workerWelcomeEmail.js diff --git a/modules/worker/back/methods/worker/new.js b/modules/worker/back/methods/worker/new.js index a57ca8c21..7a61434f0 100644 --- a/modules/worker/back/methods/worker/new.js +++ b/modules/worker/back/methods/worker/new.js @@ -227,7 +227,12 @@ module.exports = Self => { throw e; } - await models.Worker.workerWelcomeEmail(client.id); + await models.user.resetPassword({ + email: args.email, + emailTemplate: 'worker-welcome', + id: client.id + }); + return client.id; }; }; diff --git a/modules/worker/back/methods/worker/workerWelcomeEmail.js b/modules/worker/back/methods/worker/workerWelcomeEmail.js deleted file mode 100644 index 7462df34d..000000000 --- a/modules/worker/back/methods/worker/workerWelcomeEmail.js +++ /dev/null @@ -1,78 +0,0 @@ -const {Email} = require('vn-print'); - -module.exports = Self => { - Self.remoteMethodCtx('workerWelcomeEmail', { - description: - 'Sends the welcome email to the new worker', - accessType: 'WRITE', - accepts: [ - { - arg: 'id', - type: 'number', - required: true, - description: 'The worker id', - http: {source: 'path'}, - } - ], - returns: { - type: ['object'], - root: true, - }, - http: { - path: '/:id/worker-welcome-email', - verb: 'POST', - }, - }); - - Self.workerWelcomeEmail = async ctx => { - const models = Self.app.models; - const userId = ctx.req.accessToken.userId; - const $t = ctx.req.__; // $translate - const origin = ctx.req.headers.origin; - - const args = Object.assign({}, ctx.args); - const params = { - recipient: args.recipient, - lang: ctx.req.getLocale(), - }; - - delete args.ctx; - for (const param in args) params[param] = args[param]; - - const claim = await models.Claim.findById(args.id, { - fields: ['id', 'clientFk'], - include: { - relation: 'client', - scope: { - fields: ['name', 'salesPersonFk'], - }, - }, - }); - - const message = $t('Claim pickup order sent', { - claimId: args.id, - clientName: claim.client().name, - claimUrl: `${origin}/#!/claim/${args.id}/summary`, - }); - - const salesPersonId = claim.client().salesPersonFk; - if (salesPersonId) - await models.Chat.sendCheckingPresence(ctx, salesPersonId, message); - - await models.ClaimLog.create({ - originFk: args.id, - userFk: userId, - action: 'insert', - description: 'Claim-pickup-order sent', - changedModel: 'Mail', - }); - - const email = new Email('worker-welcome', { - recipient: args.email, - lang: ctx.req.getLocale(), - }); - - await email.send(); - // TODO: or use same funcionality back/methods/account/recover-password.js - }; -}; From 42adba35387ea784fb115c984198d908ec25181f Mon Sep 17 00:00:00 2001 From: alexm Date: Wed, 23 Nov 2022 15:11:46 +0100 Subject: [PATCH 08/33] mail content --- print/templates/email/worker-welcome/locale/es.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/print/templates/email/worker-welcome/locale/es.yml b/print/templates/email/worker-welcome/locale/es.yml index 769df453e..d95f37bd6 100644 --- a/print/templates/email/worker-welcome/locale/es.yml +++ b/print/templates/email/worker-welcome/locale/es.yml @@ -1,7 +1,8 @@ subject: Bienvenido a Verdnatura title: "¡Te damos la bienvenida!" dearWorker: Estimado trabajador -workerData: 'Bienvenido a Verdnatura SL, este es tu usuario: {0}. Pero primero debes - cambiar tu contraseña. - ' +workerData: 'Estos son los datos de tu usuario de Verdnatura. + Usuario: {0}. Haz click aquí para + establecer tu contraseña. + .' From 7822a6cac81b25cd2559cf4e95f01d9f3c8d144e Mon Sep 17 00:00:00 2001 From: alexm Date: Mon, 12 Dec 2022 13:48:20 +0100 Subject: [PATCH 09/33] change folder --- db/changes/225001/.gitkeep | 1 - db/changes/{224903 => 225001}/00-aclProfileType.sql | 0 2 files changed, 1 deletion(-) delete mode 100644 db/changes/225001/.gitkeep rename db/changes/{224903 => 225001}/00-aclProfileType.sql (100%) diff --git a/db/changes/225001/.gitkeep b/db/changes/225001/.gitkeep deleted file mode 100644 index 7a4187c02..000000000 --- a/db/changes/225001/.gitkeep +++ /dev/null @@ -1 +0,0 @@ -Delete this file diff --git a/db/changes/224903/00-aclProfileType.sql b/db/changes/225001/00-aclProfileType.sql similarity index 100% rename from db/changes/224903/00-aclProfileType.sql rename to db/changes/225001/00-aclProfileType.sql From bb944f9fee9b0a4928a03068b20e3006a6fd6556 Mon Sep 17 00:00:00 2001 From: alexm Date: Mon, 12 Dec 2022 15:05:49 +0100 Subject: [PATCH 10/33] feat(newWorker): use worker-welcome --- front/salix/components/app/app.js | 2 +- modules/worker/back/methods/worker/new.js | 5 +++-- modules/worker/front/create/index.js | 3 +-- modules/worker/front/index/locale/es.yml | 1 + print/templates/email/email-verify/email-verify.js | 2 +- print/templates/email/recover-password/recover-password.js | 2 +- print/templates/email/worker-welcome/locale/es.yml | 4 ++-- print/templates/email/worker-welcome/sql/worker.sql | 2 +- print/templates/email/worker-welcome/worker-welcome.html | 4 ++-- print/templates/email/worker-welcome/worker-welcome.js | 5 +++++ 10 files changed, 18 insertions(+), 12 deletions(-) create mode 100644 modules/worker/front/index/locale/es.yml diff --git a/front/salix/components/app/app.js b/front/salix/components/app/app.js index 20f0ad969..91a8d2215 100644 --- a/front/salix/components/app/app.js +++ b/front/salix/components/app/app.js @@ -21,7 +21,7 @@ export default class App extends Component { get showLayout() { const state = this.$state.current.name || this.$location.$$path.substring(1).replace('/', '.'); - const outLayout = ['login', 'recoverPassword', 'resetPassword']; + const outLayout = ['login', 'recoverPassword', 'resetPassword', 'reset-password']; return state && !outLayout.some(ol => ol == state); } diff --git a/modules/worker/back/methods/worker/new.js b/modules/worker/back/methods/worker/new.js index 7a61434f0..97fdc1033 100644 --- a/modules/worker/back/methods/worker/new.js +++ b/modules/worker/back/methods/worker/new.js @@ -124,7 +124,7 @@ module.exports = Self => { const args = ctx.args; let tx; - console.log(args); + if (typeof options == 'object') Object.assign(myOptions, options); if (!myOptions.transaction) { @@ -224,6 +224,7 @@ module.exports = Self => { if (tx) await tx.commit(); } catch (e) { if (tx) await tx.rollback(); + console.log(e); throw e; } @@ -233,6 +234,6 @@ module.exports = Self => { id: client.id }); - return client.id; + return {id: client.id}; }; }; diff --git a/modules/worker/front/create/index.js b/modules/worker/front/create/index.js index a068b2006..fdc02361d 100644 --- a/modules/worker/front/create/index.js +++ b/modules/worker/front/create/index.js @@ -11,8 +11,7 @@ export default class Controller extends Section { onSubmit() { return this.$.watcher.submit().then(json => { - this.$state.go('client.card.basicData', {id: json.data.id}); - this.$http.get(`Clients/${this.client.id}/checkDuplicatedData`); + this.$state.go('worker.card.basicData', {id: json.data.id}); }); } diff --git a/modules/worker/front/index/locale/es.yml b/modules/worker/front/index/locale/es.yml new file mode 100644 index 000000000..df6383273 --- /dev/null +++ b/modules/worker/front/index/locale/es.yml @@ -0,0 +1 @@ +New worker: Nuevo trabajador diff --git a/print/templates/email/email-verify/email-verify.js b/print/templates/email/email-verify/email-verify.js index 7f0b80a13..4f2b29266 100755 --- a/print/templates/email/email-verify/email-verify.js +++ b/print/templates/email/email-verify/email-verify.js @@ -10,7 +10,7 @@ module.exports = { }, props: { url: { - type: [String], + type: String, required: true } } diff --git a/print/templates/email/recover-password/recover-password.js b/print/templates/email/recover-password/recover-password.js index b589411a9..d8448f370 100755 --- a/print/templates/email/recover-password/recover-password.js +++ b/print/templates/email/recover-password/recover-password.js @@ -10,7 +10,7 @@ module.exports = { }, props: { url: { - type: [String], + type: String, required: true } } diff --git a/print/templates/email/worker-welcome/locale/es.yml b/print/templates/email/worker-welcome/locale/es.yml index d95f37bd6..d53a4e1f0 100644 --- a/print/templates/email/worker-welcome/locale/es.yml +++ b/print/templates/email/worker-welcome/locale/es.yml @@ -3,6 +3,6 @@ title: "¡Te damos la bienvenida!" dearWorker: Estimado trabajador workerData: 'Estos son los datos de tu usuario de Verdnatura. Usuario: {0}. Haz click aquí para - establecer tu contraseña. + establecer tu contraseña .' diff --git a/print/templates/email/worker-welcome/sql/worker.sql b/print/templates/email/worker-welcome/sql/worker.sql index 99377fec9..f75d135d9 100644 --- a/print/templates/email/worker-welcome/sql/worker.sql +++ b/print/templates/email/worker-welcome/sql/worker.sql @@ -1,6 +1,6 @@ SELECT u.id, - u.name AS userName, + u.name, e.email FROM account.user u LEFT JOIN account.emailUser e ON e.userFk = u.id diff --git a/print/templates/email/worker-welcome/worker-welcome.html b/print/templates/email/worker-welcome/worker-welcome.html index 28e5689f1..fbb05d149 100644 --- a/print/templates/email/worker-welcome/worker-welcome.html +++ b/print/templates/email/worker-welcome/worker-welcome.html @@ -2,8 +2,8 @@

{{ $t('title', [id]) }}

-

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

-

{{ $t('workerData', this.worker.name, this.url) }}

+

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

+

diff --git a/print/templates/email/worker-welcome/worker-welcome.js b/print/templates/email/worker-welcome/worker-welcome.js index b9bf2ca28..3fc9b4706 100755 --- a/print/templates/email/worker-welcome/worker-welcome.js +++ b/print/templates/email/worker-welcome/worker-welcome.js @@ -5,6 +5,7 @@ module.exports = { name: 'worker-welcome', async serverPrefetch() { this.worker = await this.fetchWorker(this.id); + console.log(this.url); }, methods: { fetchWorker(id) { @@ -18,6 +19,10 @@ module.exports = { id: { type: Number, required: true + }, + url: { + type: String, + required: true } } }; From 156f2b9129c02b8ed928f72007b05d977625573a Mon Sep 17 00:00:00 2001 From: alexm Date: Wed, 14 Dec 2022 15:03:55 +0100 Subject: [PATCH 11/33] feat: handle errors and autogenerate user and code --- loopback/locale/es.json | 9 ++-- modules/worker/back/methods/worker/new.js | 54 ++++++++++++++--------- modules/worker/front/create/index.html | 9 ++-- modules/worker/front/create/index.js | 14 ++++++ modules/worker/front/create/locale/es.yml | 20 ++++----- 5 files changed, 69 insertions(+), 37 deletions(-) diff --git a/loopback/locale/es.json b/loopback/locale/es.json index 932dfe98f..41dfff73a 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -247,7 +247,10 @@ "Empty data source": "Origen de datos vacio", "Email verify": "Correo de verificación", "Landing cannot be lesser than shipment": "Landing cannot be lesser than shipment", - "Receipt's bank was not found": "No se encontró el banco del recibo", - "This receipt was not compensated": "Este recibo no ha sido compensado", - "Client's email was not found": "No se encontró el email del cliente" + "Receipt's bank was not found": "No se encontró el banco del recibo", + "This receipt was not compensated": "Este recibo no ha sido compensado", + "Client's email was not found": "No se encontró el email del cliente", + "This worker code already exists": "Este codigo de trabajador ya existe", + "This personal mail already exists": "Este correo personal ya existe", + "This worker already exists": "Este trabajador ya existe" } diff --git a/modules/worker/back/methods/worker/new.js b/modules/worker/back/methods/worker/new.js index 97fdc1033..07a091693 100644 --- a/modules/worker/back/methods/worker/new.js +++ b/modules/worker/back/methods/worker/new.js @@ -1,4 +1,5 @@ const md5 = require('md5'); +const UserError = require('vn-loopback/util/user-error'); module.exports = Self => { Self.remoteMethodCtx('new', { @@ -8,103 +9,103 @@ module.exports = Self => { { arg: 'fi', type: 'string', - description: `The fi of worker`, + description: `The worker fi`, required: true, }, { arg: 'name', type: 'string', - description: `REPLACE!`, + description: `The user name`, required: true, }, { arg: 'firstName', type: 'string', - description: `REPLACE!`, + description: `The worker firstname`, required: true, }, { arg: 'lastNames', type: 'string', - description: `REPLACE!`, + description: `The worker lastnames`, required: true, }, { arg: 'email', type: 'string', - description: `REPLACE!`, + description: `The worker email`, required: true, }, { arg: 'roleFk', type: 'number', - description: `REPLACE!`, + description: `The worker role`, required: true, }, { arg: 'street', type: 'string', - description: `REPLACE!`, + description: `The worker address`, required: true, }, { arg: 'city', type: 'string', - description: `REPLACE!`, + description: `The worker city`, required: true, }, { arg: 'provinceFk', type: 'number', - description: `REPLACE!`, + description: `The worker province`, required: true, }, { arg: 'iban', type: 'string', - description: `REPLACE!`, + description: `The worker iban`, required: true, }, { arg: 'bankEntityFk', type: 'number', - description: `REPLACE!`, + description: `The worker bank entity`, required: true, }, { arg: 'companyFk', type: 'number', - description: `REPLACE!`, + description: `The worker company`, required: true, }, { arg: 'postcode', type: 'string', - description: `REPLACE!`, + description: `The worker postcode`, required: true, }, { arg: 'phone', type: 'string', - description: `REPLACE!`, + description: `The worker phone`, required: true, }, { arg: 'code', type: 'string', - description: `REPLACE!`, + description: `The worker code`, required: true, }, { arg: 'bossFk', type: 'number', - description: `REPLACE!`, + description: `The worker boss`, required: true, }, { arg: 'birth', type: 'date', - description: `REPLACE!`, + description: `The worker birth`, required: true, }, ], @@ -152,7 +153,7 @@ module.exports = Self => { nickname, password: md5(randomPassword), email: args.email, - role: args.role, + role: args.roleFk, }, myOptions ); @@ -222,10 +223,21 @@ module.exports = Self => { ); if (tx) await tx.commit(); - } catch (e) { + } catch (err) { if (tx) await tx.rollback(); - console.log(e); - throw e; + const code = err.code; + const message = err.sqlMessage; + + if (code === 'ER_DUP_ENTRY' && message.includes(`for key 'mail'`)) + throw new UserError(`This personal mail already exists`); + + if (code === 'ER_DUP_ENTRY' && message.includes(`CodigoTrabajador_UNIQUE`)) + throw new UserError(`This worker code already exists`); + + if (code === 'ER_DUP_ENTRY' && message.includes(`PRIMARY`)) + throw new UserError(`This worker already exists`); + + throw err; } await models.user.resetPassword({ diff --git a/modules/worker/front/create/index.html b/modules/worker/front/create/index.html index 58b4da060..a86a4e899 100644 --- a/modules/worker/front/create/index.html +++ b/modules/worker/front/create/index.html @@ -13,11 +13,13 @@ label="Firstname" ng-model="$ctrl.worker.firstName" rule + on-change="$ctrl.generateCodeUser()" vn-focus> @@ -38,6 +40,8 @@ vn-one label="Code" ng-model="$ctrl.worker.code" + maxLength="3" + on-change="$ctrl.worker.code = $ctrl.worker.code.toUpperCase()" rule> + rule> - - Puede guardar varios correos electrónicos encadenándolos mediante comas - sin espacios, ejemplo: user@dominio.com, user2@dominio.com siendo el primer - correo electrónico el principal -The type of business must be filled in basic data: El tipo de negocio debe estar rellenado en datos básicos Access permission: Permiso de acceso From aa5cfde1ae85e01be945fa6e5d92e44d42c6773f Mon Sep 17 00:00:00 2001 From: alexm Date: Mon, 2 Jan 2023 14:52:03 +0100 Subject: [PATCH 12/33] test(worker_new): add back tests --- CHANGELOG.md | 1 + db/dump/fixtures.sql | 14 +- .../components/reset-password/locale/es.yml | 2 +- modules/worker/back/methods/worker/new.js | 27 +++- .../back/methods/worker/specs/new.spec.js | 140 ++++++++++++++++++ modules/worker/front/create/index.js | 20 +++ .../email/worker-welcome/worker-welcome.js | 1 - 7 files changed, 188 insertions(+), 17 deletions(-) create mode 100644 modules/worker/back/methods/worker/specs/new.spec.js diff --git a/CHANGELOG.md b/CHANGELOG.md index bafedc760..897774716 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - [General](Inicio) Permite recuperar la contraseña +- [Trabajadores](Nuevo trabajador) Nueva sección ### Changed diff --git a/db/dump/fixtures.sql b/db/dump/fixtures.sql index 03a0f8b50..933651f06 100644 --- a/db/dump/fixtures.sql +++ b/db/dump/fixtures.sql @@ -934,10 +934,10 @@ INSERT INTO `vn`.`expedition`(`id`, `agencyModeFk`, `ticketFk`, `freightItemFk`, (7, 2, 4, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -3 MONTH), 1, 18, NULL, 94, NULL,NULL), (8, 3, 5, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -4 MONTH), 1, 18, NULL, 94, 1, NULL), (9, 3, 6, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 18, NULL, 94, 2, NULL), - (10, 7, 7, 71, NOW(), 1, 18, NULL, 94, 3, NULL), - (11, 7, 8, 71, NOW(), 1, 18, NULL, 94, 3, NULL), - (12, 7, 9, 71, NOW(), 1, 18, NULL, 94, 3, NULL), - (13, 1, 10,71, NOW(), 1, 18, NULL, 94, 3, NULL); + (10, 7, 7, 71, util.VN_NOW(), 1, 18, NULL, 94, 3, NULL), + (11, 7, 8, 71, util.VN_NOW(), 1, 18, NULL, 94, 3, NULL), + (12, 7, 9, 71, util.VN_NOW(), 1, 18, NULL, 94, 3, NULL), + (13, 1, 10,71, util.VN_NOW(), 1, 18, NULL, 94, 3, NULL); INSERT INTO `vn`.`expeditionState`(`id`, `created`, `expeditionFk`, `typeFk`, `userFk`) @@ -1910,7 +1910,7 @@ DROP TEMPORARY TABLE IF EXISTS tmp.worker; CREATE TEMPORARY TABLE tmp.worker (PRIMARY KEY (id)) ENGINE = MEMORY - SELECT w.id, w.id as `workerFk`, 'VNL', CONCAT(YEAR(DATE_ADD(CURDATE(), INTERVAL -1 YEAR)), '-12-25'), CONCAT(YEAR(DATE_ADD(CURDATE(), INTERVAL +1 YEAR)), '-12-25'), CONCAT('E-46-', RPAD(CONCAT(w.id, 9), 8, w.id)), NULL as `notes`, NULL as `departmentFk`, 23, 1 as `workerBusinessProfessionalCategoryFk`, 1 as `calendarTypeFk`, 1 as `isHourlyLabor`, 1 as `workerBusinessAgreementFk`, 1 as `workcenterFk` + SELECT w.id, w.id as `workerFk`, 'VNL', CONCAT(YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 YEAR)), '-12-25'), CONCAT(YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL +1 YEAR)), '-12-25'), CONCAT('E-46-', RPAD(CONCAT(w.id, 9), 8, w.id)), NULL as `notes`, NULL as `departmentFk`, 23, 1 as `workerBusinessProfessionalCategoryFk`, 1 as `calendarTypeFk`, 1 as `isHourlyLabor`, 1 as `workerBusinessAgreementFk`, 1 as `workcenterFk` FROM `vn`.`worker` `w`; INSERT INTO `vn`.`business`(`id`, `workerFk`, `companyCodeFk`, `started`, `ended`, `workerBusiness`, `reasonEndFk`, `notes`, `departmentFk`, `workerBusinessProfessionalCategoryFk`, `calendarTypeFk`, `isHourlyLabor`, `workerBusinessAgreementFk`, `workcenterFk`) @@ -1920,7 +1920,7 @@ DROP TEMPORARY TABLE IF EXISTS tmp.worker; CREATE TEMPORARY TABLE tmp.worker (PRIMARY KEY (id)) ENGINE = MEMORY - SELECT '1111' as 'id', w.id as `workerFk`, 'VNL', CONCAT(YEAR(DATE_ADD(CURDATE(), INTERVAL -2 YEAR)), '-12-25'), CONCAT(YEAR(DATE_ADD(CURDATE(), INTERVAL -1 YEAR)), '-12-24'), CONCAT('E-46-', RPAD(CONCAT(w.id, 9), 8, w.id)), NULL as `notes`, NULL as `departmentFk`, 23, 1 as `workerBusinessProfessionalCategoryFk`, 1 as `calendarTypeFk`, 1 as `isHourlyLabor`, 1 as `workerBusinessAgreementFk`, 1 as `workcenterFk` + SELECT '1111' as 'id', w.id as `workerFk`, 'VNL', CONCAT(YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -2 YEAR)), '-12-25'), CONCAT(YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 YEAR)), '-12-24'), CONCAT('E-46-', RPAD(CONCAT(w.id, 9), 8, w.id)), NULL as `notes`, NULL as `departmentFk`, 23, 1 as `workerBusinessProfessionalCategoryFk`, 1 as `calendarTypeFk`, 1 as `isHourlyLabor`, 1 as `workerBusinessAgreementFk`, 1 as `workcenterFk` FROM `vn`.`worker` `w` WHERE `w`.`id` = 1109; @@ -2633,7 +2633,7 @@ INSERT INTO `vn`.`machineWorker` (`workerFk`, `machineFk`, `inTimed`, `outTimed` INSERT INTO `vn`.`zoneExclusion` (`id`, `zoneFk`, `dated`, `created`, `userFk`) VALUES - (1, 1, DATE_ADD(CURDATE(), INTERVAL (IF(DAYOFWEEK(CURDATE())<=7, 7, 14) - DAYOFWEEK(util.VN_CURDATE())) DAY), util.VN_CURDATE(), 100), + (1, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL (IF(DAYOFWEEK(util.VN_CURDATE())<=7, 7, 14) - DAYOFWEEK(util.VN_CURDATE())) DAY), util.VN_CURDATE(), 100), (2, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL (IF(DAYOFWEEK(util.VN_CURDATE())<=8, 8, 15) - DAYOFWEEK(util.VN_CURDATE())) DAY), util.VN_CURDATE(), 100); INSERT INTO `vn`.`zoneExclusionGeo` (`zoneExclusionFk`, `geoFk`) diff --git a/front/salix/components/reset-password/locale/es.yml b/front/salix/components/reset-password/locale/es.yml index 0771d5dc3..30893a152 100644 --- a/front/salix/components/reset-password/locale/es.yml +++ b/front/salix/components/reset-password/locale/es.yml @@ -1,6 +1,6 @@ Reset password: Restrablecer contraseña New password: Nueva contraseña -Repeat password: Repetir contraseñaç +Repeat password: Repetir contraseña Password changed!: ¡Contraseña cambiada! Password requirements: > La contraseña debe tener al menos {{ length }} caracteres de longitud, diff --git a/modules/worker/back/methods/worker/new.js b/modules/worker/back/methods/worker/new.js index 07a091693..b6da3301a 100644 --- a/modules/worker/back/methods/worker/new.js +++ b/modules/worker/back/methods/worker/new.js @@ -1,4 +1,3 @@ -const md5 = require('md5'); const UserError = require('vn-loopback/util/user-error'); module.exports = Self => { @@ -108,6 +107,12 @@ module.exports = Self => { description: `The worker birth`, required: true, }, + { + arg: 'profileTypeFk', + type: 'number', + description: `The worker profile type ¿DELETE?`, + required: true, + } ], returns: { type: 'number', @@ -134,6 +139,7 @@ module.exports = Self => { } let client; + try { client = await models.Client.findOne( { @@ -144,14 +150,15 @@ module.exports = Self => { if (!client) { const nickname = args.firstName.concat(' ', args.lastNames); - const randomPassword = await models.Worker.rawSql( - 'SELECT account.passwordGenerate();' + const [randomPassword] = await models.Worker.rawSql( + 'SELECT account.passwordGenerate() as password;' ); + const user = await models.Account.create( { name: args.name, nickname, - password: md5(randomPassword), + password: randomPassword.password, email: args.email, role: args.roleFk, }, @@ -208,6 +215,10 @@ module.exports = Self => { myOptions ); } + + const user = await models.Account.findById(client.id, null, myOptions); + await user.updateAttribute('email', args.email, myOptions); + await models.Worker.rawSql( 'CALL vn.workerCreate(?, ?, ?, ?, ?, ?, ?)', [ @@ -223,10 +234,10 @@ module.exports = Self => { ); if (tx) await tx.commit(); - } catch (err) { + } catch (error) { if (tx) await tx.rollback(); - const code = err.code; - const message = err.sqlMessage; + const code = error.code; + const message = error.sqlMessage; if (code === 'ER_DUP_ENTRY' && message.includes(`for key 'mail'`)) throw new UserError(`This personal mail already exists`); @@ -237,7 +248,7 @@ module.exports = Self => { if (code === 'ER_DUP_ENTRY' && message.includes(`PRIMARY`)) throw new UserError(`This worker already exists`); - throw err; + throw error; } await models.user.resetPassword({ diff --git a/modules/worker/back/methods/worker/specs/new.spec.js b/modules/worker/back/methods/worker/specs/new.spec.js new file mode 100644 index 000000000..2cb8bebef --- /dev/null +++ b/modules/worker/back/methods/worker/specs/new.spec.js @@ -0,0 +1,140 @@ +const models = require('vn-loopback/server/server').models; +const LoopBackContext = require('loopback-context'); + +describe('Worker new', () => { + beforeAll(async() => { + const activeCtx = { + accessToken: {userId: 9}, + http: { + req: { + headers: {origin: 'http://localhost'} + } + } + }; + + spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({ + active: activeCtx + }); + }); + + const employeeId = 1; + const defaultWorker = { + fi: '78457139E', + name: 'defaultWorker', + firstName: 'default', + lastNames: 'worker', + email: 'defaultWorker@mydomain.com', + roleFk: 1, + street: 'S/ defaultWorkerStreet', + city: 'defaultWorkerCity', + provinceFk: 1, + iban: 'ES8304879798578129532677', + bankEntityFk: 128, + companyFk: 442, + postcode: '46680', + phone: '633342693', + code: 'DWW', + bossFk: 9, + birth: '2022-12-11T23:00:00.000Z' + }; + + it('should return error if personal mail already exists', async() => { + const user = await models.Account.findById(employeeId, {fields: ['email']}); + + const tx = await models.Worker.beginTransaction({}); + + let error; + try { + const options = {transaction: tx}; + const ctx = { + args: Object.assign({}, defaultWorker, {email: user.email}) + }; + + await models.Worker.new(ctx, options); + + await tx.rollback(); + } catch (e) { + error = e; + await tx.rollback(); + } + + expect(error.message).toEqual('This personal mail already exists'); + }); + + it('should return error if worker code already exists', async() => { + const worker = await models.Worker.findById(employeeId, {fields: ['code']}); + + const tx = await models.Worker.beginTransaction({}); + + let error; + try { + const options = {transaction: tx}; + const ctx = { + args: Object.assign({}, defaultWorker, {code: worker.code}) + }; + + await models.Worker.new(ctx, options); + + await tx.rollback(); + } catch (e) { + error = e; + await tx.rollback(); + } + + expect(error.message).toEqual('This worker code already exists'); + }); + + it('should return error if worker already exists', async() => { + const worker = await models.Client.findById(employeeId, {fields: ['fi']}); + + const tx = await models.Worker.beginTransaction({}); + + let error; + try { + const options = {transaction: tx}; + const ctx = { + args: Object.assign({}, defaultWorker, {fi: worker.fi}) + }; + await models.Worker.new(ctx, options); + + await tx.rollback(); + } catch (e) { + error = e; + await tx.rollback(); + } + + expect(error.message).toEqual('This worker already exists'); + }); + + it('should create a new worker', async() => { + const newWorker = await models.Worker.new({args: defaultWorker}); + + await models.Worker.destroyById(newWorker.id); + await models.Address.destroyAll({clientFk: newWorker.id}); + await models.Mandate.destroyAll({clientFk: newWorker.id}); + await models.Client.destroyById(newWorker.id); + await models.Account.destroyById(newWorker.id); + + expect(newWorker.id).toBeDefined(); + }); + + it('should create a new worker in client', async() => { + const bruceWayneId = 1101; + const client = await models.Client.findById(bruceWayneId, {fields: ['fi', 'email']}); + + const newWorkerData = { + args: Object.assign( + {}, + defaultWorker, + { + fi: client.fi, + email: client.email + }) + }; + const newWorker = await models.Worker.new(newWorkerData); + + await models.Worker.destroyById(newWorker.id); + + expect(newWorker.id).toEqual(bruceWayneId); + }); +}); diff --git a/modules/worker/front/create/index.js b/modules/worker/front/create/index.js index 3314a4b10..b09fde94f 100644 --- a/modules/worker/front/create/index.js +++ b/modules/worker/front/create/index.js @@ -7,6 +7,26 @@ export default class Controller extends Section { this.$http.get('NewWorkerConfigs/findOne').then(res => { return this.worker = Object.assign({}, res.data); }); + // DELETE + this.worker = { + fi: '73226971P', + name: 'ASDASD', + firstName: 'Test', + lastNames: 'Test', + email: 'developer4@mydomain.com', + roleFk: 1, + street: 'S/ ', + city: 'asd', + provinceFk: 1, + iban: 'ES2420386579855387888566', + bankEntityFk: 128, + companyFk: 442, + postcode: 'asd', + phone: '633342693', + code: 'ASD', + bossFk: 34, + birth: '2022-12-11T23:00:00.000Z' + }; } onSubmit() { diff --git a/print/templates/email/worker-welcome/worker-welcome.js b/print/templates/email/worker-welcome/worker-welcome.js index 3fc9b4706..043a172a1 100755 --- a/print/templates/email/worker-welcome/worker-welcome.js +++ b/print/templates/email/worker-welcome/worker-welcome.js @@ -5,7 +5,6 @@ module.exports = { name: 'worker-welcome', async serverPrefetch() { this.worker = await this.fetchWorker(this.id); - console.log(this.url); }, methods: { fetchWorker(id) { From 46c3d87dabce836faf4a21003d6a9ac9d6551493 Mon Sep 17 00:00:00 2001 From: alexm Date: Tue, 3 Jan 2023 08:09:46 +0100 Subject: [PATCH 13/33] feat(worker_create): add vn-acl --- modules/worker/front/index/index.html | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/modules/worker/front/index/index.html b/modules/worker/front/index/index.html index b48a84854..7044ca551 100644 --- a/modules/worker/front/index/index.html +++ b/modules/worker/front/index/index.html @@ -6,23 +6,23 @@ class="vn-w-sm"> - @@ -52,4 +54,4 @@ -
\ No newline at end of file + From ef437f2feec1209691e1f365c3a394ac6008ea00 Mon Sep 17 00:00:00 2001 From: alexm Date: Tue, 3 Jan 2023 14:50:29 +0100 Subject: [PATCH 14/33] test: e2e and backTest --- .../{225001 => 230201}/00-aclProfileType.sql | 25 +++++++ db/dump/fixtures.sql | 26 +++---- e2e/helpers/selectors.js | 20 ++++++ e2e/helpers/tests.js | 26 +++---- e2e/paths/03-worker/06_create.spec.js | 72 +++++++++++++++++++ modules/worker/front/create/index.html | 30 ++++---- modules/worker/front/create/index.js | 41 +++++++---- 7 files changed, 186 insertions(+), 54 deletions(-) rename db/changes/{225001 => 230201}/00-aclProfileType.sql (54%) create mode 100644 e2e/paths/03-worker/06_create.spec.js diff --git a/db/changes/225001/00-aclProfileType.sql b/db/changes/230201/00-aclProfileType.sql similarity index 54% rename from db/changes/225001/00-aclProfileType.sql rename to db/changes/230201/00-aclProfileType.sql index 638b3d580..cae7166c9 100644 --- a/db/changes/225001/00-aclProfileType.sql +++ b/db/changes/230201/00-aclProfileType.sql @@ -16,3 +16,28 @@ CREATE TABLE `vn`.`newWorkerConfig` ( CONSTRAINT `newWorkerConfig_profileType_fk` FOREIGN KEY (`profileTypeFk`) REFERENCES `vn`.`profileType` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `newWorkerConfig_role_fk` FOREIGN KEY (`roleFk`) REFERENCES `account`.`role` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ); + +UPDATE `salix`.`ACL` +SET accessType='READ' +WHERE model='Worker' + AND property='*' + AND accessType='*' + AND permission='ALLOW' + AND principalType='ROLE' + AND principalId='employee'; + + +INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`) + VALUES + ('Worker', 'updateAttributes', 'WRITE', 'ALLOW', 'ROLE', 'hr'), + ('Worker', 'createAbsence', '*', 'ALLOW', 'ROLE', 'employee'), + ('Worker', 'updateAbsence', '*', 'ALLOW', 'ROLE', 'employee'), + ('Worker', 'deleteAbsence', '*', 'ALLOW', 'ROLE', 'employee'), + ('Worker', 'new', 'WRITE', 'ALLOW', 'ROLE', 'hr'), + ('Role', '*', 'READ', 'ALLOW', 'ROLE', 'hr'); + +/* +INSERT INTO `vn`.`newWorkerConfig` (`id`, `street`, `provinceFk`, `companyFk`, `profileTypeFk`, `roleFk`) + VALUES + (1, 'C/ ', 57, 442, 1, 1); +*/ diff --git a/db/dump/fixtures.sql b/db/dump/fixtures.sql index 90cc19d01..8f1648048 100644 --- a/db/dump/fixtures.sql +++ b/db/dump/fixtures.sql @@ -934,10 +934,10 @@ INSERT INTO `vn`.`expedition`(`id`, `agencyModeFk`, `ticketFk`, `freightItemFk`, (7, 2, 4, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -3 MONTH), 1, 18, NULL, 94, NULL,NULL), (8, 3, 5, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -4 MONTH), 1, 18, NULL, 94, 1, NULL), (9, 3, 6, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 18, NULL, 94, 2, NULL), - (10, 7, 7, 71, util.VN_NOW(), 1, 18, NULL, 94, 3, NULL), - (11, 7, 8, 71, util.VN_NOW(), 1, 18, NULL, 94, 3, NULL), - (12, 7, 9, 71, util.VN_NOW(), 1, 18, NULL, 94, 3, NULL), - (13, 1, 10,71, util.VN_NOW(), 1, 18, NULL, 94, 3, NULL); + (10, 7, 7, 71, NOW(), 1, 18, NULL, 94, 3, NULL), + (11, 7, 8, 71, NOW(), 1, 18, NULL, 94, 3, NULL), + (12, 7, 9, 71, NOW(), 1, 18, NULL, 94, 3, NULL), + (13, 1, 10,71, NOW(), 1, 18, NULL, 94, 3, NULL); INSERT INTO `vn`.`expeditionState`(`id`, `created`, `expeditionFk`, `typeFk`, `userFk`) @@ -1910,7 +1910,7 @@ DROP TEMPORARY TABLE IF EXISTS tmp.worker; CREATE TEMPORARY TABLE tmp.worker (PRIMARY KEY (id)) ENGINE = MEMORY - SELECT w.id, w.id as `workerFk`, 'VNL', CONCAT(YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 YEAR)), '-12-25'), CONCAT(YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL +1 YEAR)), '-12-25'), CONCAT('E-46-', RPAD(CONCAT(w.id, 9), 8, w.id)), NULL as `notes`, NULL as `departmentFk`, 23, 1 as `workerBusinessProfessionalCategoryFk`, 1 as `calendarTypeFk`, 1 as `isHourlyLabor`, 1 as `workerBusinessAgreementFk`, 1 as `workcenterFk` + SELECT w.id, w.id as `workerFk`, 'VNL', CONCAT(YEAR(DATE_ADD(CURDATE(), INTERVAL -1 YEAR)), '-12-25'), CONCAT(YEAR(DATE_ADD(CURDATE(), INTERVAL +1 YEAR)), '-12-25'), CONCAT('E-46-', RPAD(CONCAT(w.id, 9), 8, w.id)), NULL as `notes`, NULL as `departmentFk`, 23, 1 as `workerBusinessProfessionalCategoryFk`, 1 as `calendarTypeFk`, 1 as `isHourlyLabor`, 1 as `workerBusinessAgreementFk`, 1 as `workcenterFk` FROM `vn`.`worker` `w`; INSERT INTO `vn`.`business`(`id`, `workerFk`, `companyCodeFk`, `started`, `ended`, `workerBusiness`, `reasonEndFk`, `notes`, `departmentFk`, `workerBusinessProfessionalCategoryFk`, `calendarTypeFk`, `isHourlyLabor`, `workerBusinessAgreementFk`, `workcenterFk`) @@ -1920,7 +1920,7 @@ DROP TEMPORARY TABLE IF EXISTS tmp.worker; CREATE TEMPORARY TABLE tmp.worker (PRIMARY KEY (id)) ENGINE = MEMORY - SELECT '1111' as 'id', w.id as `workerFk`, 'VNL', CONCAT(YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -2 YEAR)), '-12-25'), CONCAT(YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 YEAR)), '-12-24'), CONCAT('E-46-', RPAD(CONCAT(w.id, 9), 8, w.id)), NULL as `notes`, NULL as `departmentFk`, 23, 1 as `workerBusinessProfessionalCategoryFk`, 1 as `calendarTypeFk`, 1 as `isHourlyLabor`, 1 as `workerBusinessAgreementFk`, 1 as `workcenterFk` + SELECT '1111' as 'id', w.id as `workerFk`, 'VNL', CONCAT(YEAR(DATE_ADD(CURDATE(), INTERVAL -2 YEAR)), '-12-25'), CONCAT(YEAR(DATE_ADD(CURDATE(), INTERVAL -1 YEAR)), '-12-24'), CONCAT('E-46-', RPAD(CONCAT(w.id, 9), 8, w.id)), NULL as `notes`, NULL as `departmentFk`, 23, 1 as `workerBusinessProfessionalCategoryFk`, 1 as `calendarTypeFk`, 1 as `isHourlyLabor`, 1 as `workerBusinessAgreementFk`, 1 as `workcenterFk` FROM `vn`.`worker` `w` WHERE `w`.`id` = 1109; @@ -2741,13 +2741,6 @@ INSERT INTO `vn`.`ticketLog` (`originFk`, userFk, `action`, changedModel, oldIns (7, 18, 'update', 'Sale', '{"price":3}', '{"price":5}', 1, NULL), (7, 18, 'update', NULL, NULL, NULL, NULL, "Cambio cantidad Melee weapon heavy shield 1x0.5m de '5' a '10'"); -INSERT INTO `vn`.`profileType` (`id`, `name`) - VALUES - (1, 'working'); - -INSERT INTO `vn`.`newWorkerConfig` (`id`, `street`, `provinceFk`, `companyFk`, `profileTypeFk`, `roleFk`) - VALUES - (1, 'S/ ', 1, 442, 1, 1); INSERT INTO `vn`.`osTicketConfig` (`id`, `host`, `user`, `password`, `oldStatus`, `newStatusId`, `day`, `comment`, `hostDb`, `userDb`, `passwordDb`, `portDb`, `responseType`, `fromEmailId`, `replyTo`) VALUES @@ -2758,6 +2751,13 @@ INSERT INTO `vn`.`mdbApp` (`app`, `baselineBranchFk`, `userFk`, `locked`) ('foo', 'master', NULL, NULL), ('bar', 'test', 9, util.VN_NOW()); +INSERT INTO `vn`.`profileType` (`id`, `name`) + VALUES + (1, 'working'); + +INSERT INTO `vn`.`newWorkerConfig` (`id`, `street`, `provinceFk`, `companyFk`, `profileTypeFk`, `roleFk`) + VALUES + (1, 'S/ ', 1, 442, 1, 1); INSERT INTO `salix`.`url` (`appName`, `environment`, `url`) VALUES diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js index e1792ea7b..134e41796 100644 --- a/e2e/helpers/selectors.js +++ b/e2e/helpers/selectors.js @@ -964,6 +964,7 @@ export default { confirmButton: '.vn-confirm.shown button[response="accept"]' }, workerSummary: { + summaryIcon: 'vn-worker-descriptor a[title="Go to module summary"]', header: 'vn-worker-summary h5', id: 'vn-worker-summary vn-one:nth-child(1) > vn-label-value:nth-child(3) > section > span', email: 'vn-worker-summary vn-one:nth-child(1) > vn-label-value:nth-child(4) > section > span', @@ -1016,6 +1017,25 @@ export default { furlough: 'vn-worker-calendar > vn-side-menu [name="absenceTypes"] > vn-chip:nth-child(4)', halfFurlough: 'vn-worker-calendar > vn-side-menu [name="absenceTypes"] > vn-chip:nth-child(5)', }, + workerCreate: { + newWorkerButton: 'vn-worker-index a[ui-sref="worker.create"]', + firstname: 'vn-worker-create vn-textfield[ng-model="$ctrl.worker.firstName"]', + lastname: 'vn-worker-create vn-textfield[ng-model="$ctrl.worker.lastNames"]', + birth: 'vn-worker-create vn-date-picker[ng-model="$ctrl.worker.birth"]', + fi: 'vn-worker-create vn-textfield[ng-model="$ctrl.worker.fi"]', + code: 'vn-worker-create vn-textfield[ng-model="$ctrl.worker.code"]', + phone: 'vn-worker-create vn-textfield[ng-model="$ctrl.worker.phone"]', + city: 'vn-worker-create vn-textfield[ng-model="$ctrl.worker.city"]', + postcode: 'vn-worker-create vn-datalist[ng-model="$ctrl.worker.postcode"]', + street: 'vn-worker-create vn-textfield[ng-model="$ctrl.worker.street"]', + user: 'vn-worker-create vn-textfield[ng-model="$ctrl.worker.name"]', + email: 'vn-worker-create vn-textfield[ng-model="$ctrl.worker.email"]', + boss: 'vn-worker-create vn-autocomplete[ng-model="$ctrl.worker.bossFk"]', + role: 'vn-worker-create vn-autocomplete[ng-model="$ctrl.worker.roleFk"]', + iban: 'vn-worker-create vn-textfield[ng-model="$ctrl.worker.iban"]', + switft: 'vn-worker-create vn-autocomplete[ng-model="$ctrl.worker.bankEntityFk"]', + createButton: 'vn-worker-create vn-submit[label="Create"]', + }, invoiceOutIndex: { topbarSearch: 'vn-searchbar', searchResult: 'vn-invoice-out-index vn-card > vn-table > div > vn-tbody > a.vn-tr', diff --git a/e2e/helpers/tests.js b/e2e/helpers/tests.js index aac9963dd..9ac616011 100644 --- a/e2e/helpers/tests.js +++ b/e2e/helpers/tests.js @@ -25,20 +25,20 @@ async function test() { const jasmine = new Jasmine(); const specFiles = [ - `./e2e/paths/01*/*[sS]pec.js`, - `./e2e/paths/02*/*[sS]pec.js`, + // `./e2e/paths/01*/*[sS]pec.js`, + // `./e2e/paths/02*/*[sS]pec.js`, `./e2e/paths/03*/*[sS]pec.js`, - `./e2e/paths/04*/*[sS]pec.js`, - `./e2e/paths/05*/*[sS]pec.js`, - `./e2e/paths/06*/*[sS]pec.js`, - `./e2e/paths/07*/*[sS]pec.js`, - `./e2e/paths/08*/*[sS]pec.js`, - `./e2e/paths/09*/*[sS]pec.js`, - `./e2e/paths/10*/*[sS]pec.js`, - `./e2e/paths/11*/*[sS]pec.js`, - `./e2e/paths/12*/*[sS]pec.js`, - `./e2e/paths/13*/*[sS]pec.js`, - `./e2e/paths/**/*[sS]pec.js` + // `./e2e/paths/04*/*[sS]pec.js`, + // `./e2e/paths/05*/*[sS]pec.js`, + // `./e2e/paths/06*/*[sS]pec.js`, + // `./e2e/paths/07*/*[sS]pec.js`, + // `./e2e/paths/08*/*[sS]pec.js`, + // `./e2e/paths/09*/*[sS]pec.js`, + // `./e2e/paths/10*/*[sS]pec.js`, + // `./e2e/paths/11*/*[sS]pec.js`, + // `./e2e/paths/12*/*[sS]pec.js`, + // `./e2e/paths/13*/*[sS]pec.js`, + // `./e2e/paths/**/*[sS]pec.js` ]; jasmine.loadConfig({ diff --git a/e2e/paths/03-worker/06_create.spec.js b/e2e/paths/03-worker/06_create.spec.js new file mode 100644 index 000000000..b93dace88 --- /dev/null +++ b/e2e/paths/03-worker/06_create.spec.js @@ -0,0 +1,72 @@ +import selectors from '../../helpers/selectors.js'; +import getBrowser from '../../helpers/puppeteer'; + +xdescribe('Worker calendar path', () => { + let browser; + let page; + let newWorker; + beforeAll(async() => { + browser = await getBrowser(); + page = browser.page; + await page.loginAndModule('hr', 'worker'); + await page.waitToClick(selectors.workerCreate.newWorkerButton); + await page.waitForState('worker.create'); + }); + + afterAll(async() => { + await browser.close(); + }); + + it('should insert default data', async() => { + await page.write(selectors.workerCreate.firstname, 'Victor'); + await page.write(selectors.workerCreate.lastname, 'Von Doom'); + await page.write(selectors.workerCreate.fi, '78457139E'); + await page.write(selectors.workerCreate.phone, '12356789'); + await page.write(selectors.workerCreate.postcode, '46680'); + await page.write(selectors.workerCreate.street, 'Doomstadt'); + await page.write(selectors.workerCreate.email, 'doctorDoom@marvel.com'); + await page.write(selectors.workerCreate.iban, 'ES9121000418450200051332'); + await page.autocompleteSearch(selectors.workerCreate.switft, 'BBKKESMMMMM'); + }); + + it('should check for autocompleted worker code and worker user name', async() => { + const workerCode = await page + .waitToGetProperty(selectors.workerCreate.code, 'value'); + + newWorker = await page + .waitToGetProperty(selectors.workerCreate.user, 'value'); + + expect(workerCode).toEqual('VVD'); + expect(newWorker).toContain('victorvd'); + }); + + it('should fail if necessary data is void', async() => { + await page.waitToClick(selectors.workerCreate.createButton); + const message = await page.waitForSnackbar(); + + expect(message.text).toContain('is a required argument'); + }); + + it('should create a new worker and go to worker basic data', async() => { + await page.pickDate(selectors.workerCreate.birth, new Date(1962, 8, 5)); + await page.autocompleteSearch(selectors.workerCreate.role, 'Jefe de personal de reparto'); + await page.autocompleteSearch(selectors.workerCreate.boss, 'deliveryBoss'); + await page.waitToClick(selectors.workerCreate.createButton); + const message = await page.waitForSnackbar(); + await page.waitForState('worker.card.basicData'); + + expect(message.text).toContain('Data saved!'); + }); + + xit('rollback', async() => { + await page.loginAndModule('sysadmin', 'account'); + await page.accessToSearchResult(newWorker); + await page.accessToSection('account.card.summary'); + await page.waitToClick(selectors.accountDescriptor.menuButton); + await page.waitToClick(selectors.accountDescriptor.deleteAccount); + await page.waitToClick(selectors.accountDescriptor.acceptButton); + const message = await page.waitForSnackbar(); + + expect(message.text).toContain('User removed'); + }); +}); diff --git a/modules/worker/front/create/index.html b/modules/worker/front/create/index.html index a86a4e899..c09930b80 100644 --- a/modules/worker/front/create/index.html +++ b/modules/worker/front/create/index.html @@ -62,21 +62,6 @@ rule> {{name}} ({{country.country}}) - - - {{name}}, {{province.name}} - ({{province.country.country}}) - - - - + + + + + {{name}}, {{province.name}} + ({{province.country.country}}) + + { - return this.worker = Object.assign({}, res.data); - }); + // this.$http.get('NewWorkerConfigs/findOne').then(res => { + // return this.worker = Object.assign({}, res.data); + // }); // DELETE this.worker = { fi: '73226971P', @@ -74,6 +74,13 @@ export default class Controller extends Section { // Province auto complete set province(selection) { this._province = selection; + + if (!selection) return; + + const country = selection.country; + + if (!this.worker.countryFk) + this.worker.countryFk = country.id; } get town() { @@ -87,13 +94,17 @@ export default class Controller extends Section { if (!selection) return; const province = selection.province; + const country = province.country; const postcodes = selection.postcodes; - if (!this.client.provinceFk) - this.client.provinceFk = province.id; + if (!this.worker.provinceFk) + this.worker.provinceFk = province.id; + + if (!this.worker.countryFk) + this.worker.countryFk = country.id; if (postcodes.length === 1) - this.client.postcode = postcodes[0].code; + this.worker.postcode = postcodes[0].code; } get postcode() { @@ -108,18 +119,22 @@ export default class Controller extends Section { const town = selection.town; const province = town.province; + const country = province.country; - if (!this.client.city) - this.client.city = town.name; + if (!this.worker.city) + this.worker.city = town.name; - if (!this.client.provinceFk) - this.client.provinceFk = province.id; + if (!this.worker.provinceFk) + this.worker.provinceFk = province.id; + + if (!this.worker.countryFk) + this.worker.countryFk = country.id; } onResponse(response) { - this.client.postcode = response.code; - this.client.city = response.city; - this.client.provinceFk = response.provinceFk; + this.worker.postcode = response.code; + this.worker.city = response.city; + this.worker.provinceFk = response.provinceFk; } } From 9b9824939835b2fa6de8ca618c2e40e3590c07aa Mon Sep 17 00:00:00 2001 From: alexm Date: Wed, 4 Jan 2023 09:23:18 +0100 Subject: [PATCH 15/33] test: front test and e2e --- ...aclProfileType.sql => 00-createWorker.sql} | 2 +- e2e/helpers/selectors.js | 1 + e2e/helpers/tests.js | 26 +++++----- e2e/paths/03-worker/06_create.spec.js | 23 ++++++--- modules/worker/front/create/index.js | 26 ++-------- modules/worker/front/create/index.spec.js | 49 +++++++++++-------- 6 files changed, 62 insertions(+), 65 deletions(-) rename db/changes/230201/{00-aclProfileType.sql => 00-createWorker.sql} (96%) diff --git a/db/changes/230201/00-aclProfileType.sql b/db/changes/230201/00-createWorker.sql similarity index 96% rename from db/changes/230201/00-aclProfileType.sql rename to db/changes/230201/00-createWorker.sql index cae7166c9..d4118b4fa 100644 --- a/db/changes/230201/00-aclProfileType.sql +++ b/db/changes/230201/00-createWorker.sql @@ -31,7 +31,7 @@ INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `pri VALUES ('Worker', 'updateAttributes', 'WRITE', 'ALLOW', 'ROLE', 'hr'), ('Worker', 'createAbsence', '*', 'ALLOW', 'ROLE', 'employee'), - ('Worker', 'updateAbsence', '*', 'ALLOW', 'ROLE', 'employee'), + ('Worker', 'updateAbsence', 'WRITE', 'ALLOW', 'ROLE', 'employee'), ('Worker', 'deleteAbsence', '*', 'ALLOW', 'ROLE', 'employee'), ('Worker', 'new', 'WRITE', 'ALLOW', 'ROLE', 'hr'), ('Role', '*', 'READ', 'ALLOW', 'ROLE', 'hr'); diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js index 134e41796..6bfb38e5d 100644 --- a/e2e/helpers/selectors.js +++ b/e2e/helpers/selectors.js @@ -58,6 +58,7 @@ export default { deleteAccount: '.vn-menu [name="deleteUser"]', setPassword: '.vn-menu [name="setPassword"]', activateAccount: '.vn-menu [name="enableAccount"]', + disableAccount: '.vn-menu [name="disableAccount"]', activateUser: '.vn-menu [name="activateUser"]', deactivateUser: '.vn-menu [name="deactivateUser"]', newPassword: 'vn-textfield[ng-model="$ctrl.newPassword"]', diff --git a/e2e/helpers/tests.js b/e2e/helpers/tests.js index 9ac616011..aac9963dd 100644 --- a/e2e/helpers/tests.js +++ b/e2e/helpers/tests.js @@ -25,20 +25,20 @@ async function test() { const jasmine = new Jasmine(); const specFiles = [ - // `./e2e/paths/01*/*[sS]pec.js`, - // `./e2e/paths/02*/*[sS]pec.js`, + `./e2e/paths/01*/*[sS]pec.js`, + `./e2e/paths/02*/*[sS]pec.js`, `./e2e/paths/03*/*[sS]pec.js`, - // `./e2e/paths/04*/*[sS]pec.js`, - // `./e2e/paths/05*/*[sS]pec.js`, - // `./e2e/paths/06*/*[sS]pec.js`, - // `./e2e/paths/07*/*[sS]pec.js`, - // `./e2e/paths/08*/*[sS]pec.js`, - // `./e2e/paths/09*/*[sS]pec.js`, - // `./e2e/paths/10*/*[sS]pec.js`, - // `./e2e/paths/11*/*[sS]pec.js`, - // `./e2e/paths/12*/*[sS]pec.js`, - // `./e2e/paths/13*/*[sS]pec.js`, - // `./e2e/paths/**/*[sS]pec.js` + `./e2e/paths/04*/*[sS]pec.js`, + `./e2e/paths/05*/*[sS]pec.js`, + `./e2e/paths/06*/*[sS]pec.js`, + `./e2e/paths/07*/*[sS]pec.js`, + `./e2e/paths/08*/*[sS]pec.js`, + `./e2e/paths/09*/*[sS]pec.js`, + `./e2e/paths/10*/*[sS]pec.js`, + `./e2e/paths/11*/*[sS]pec.js`, + `./e2e/paths/12*/*[sS]pec.js`, + `./e2e/paths/13*/*[sS]pec.js`, + `./e2e/paths/**/*[sS]pec.js` ]; jasmine.loadConfig({ diff --git a/e2e/paths/03-worker/06_create.spec.js b/e2e/paths/03-worker/06_create.spec.js index b93dace88..c1a555cbb 100644 --- a/e2e/paths/03-worker/06_create.spec.js +++ b/e2e/paths/03-worker/06_create.spec.js @@ -1,7 +1,7 @@ import selectors from '../../helpers/selectors.js'; import getBrowser from '../../helpers/puppeteer'; -xdescribe('Worker calendar path', () => { +describe('Worker calendar path', () => { let browser; let page; let newWorker; @@ -58,15 +58,22 @@ xdescribe('Worker calendar path', () => { expect(message.text).toContain('Data saved!'); }); - xit('rollback', async() => { + it('rollback', async() => { await page.loginAndModule('sysadmin', 'account'); await page.accessToSearchResult(newWorker); - await page.accessToSection('account.card.summary'); - await page.waitToClick(selectors.accountDescriptor.menuButton); - await page.waitToClick(selectors.accountDescriptor.deleteAccount); - await page.waitToClick(selectors.accountDescriptor.acceptButton); - const message = await page.waitForSnackbar(); - expect(message.text).toContain('User removed'); + await page.waitToClick(selectors.accountDescriptor.menuButton); + await page.waitToClick(selectors.accountDescriptor.deactivateUser); + await page.waitToClick(selectors.accountDescriptor.acceptButton); + let message = await page.waitForSnackbar(); + + expect(message.text).toContain('User deactivated!'); + + await page.waitToClick(selectors.accountDescriptor.menuButton); + await page.waitToClick(selectors.accountDescriptor.disableAccount); + await page.waitToClick(selectors.accountDescriptor.acceptButton); + message = await page.waitForSnackbar(); + + expect(message.text).toContain('Account disabled!'); }); }); diff --git a/modules/worker/front/create/index.js b/modules/worker/front/create/index.js index 7965ab7e7..b80b3ae94 100644 --- a/modules/worker/front/create/index.js +++ b/modules/worker/front/create/index.js @@ -4,29 +4,9 @@ import Section from 'salix/components/section'; export default class Controller extends Section { constructor($element, $) { super($element, $); - // this.$http.get('NewWorkerConfigs/findOne').then(res => { - // return this.worker = Object.assign({}, res.data); - // }); - // DELETE - this.worker = { - fi: '73226971P', - name: 'ASDASD', - firstName: 'Test', - lastNames: 'Test', - email: 'developer4@mydomain.com', - roleFk: 1, - street: 'S/ ', - city: 'asd', - provinceFk: 1, - iban: 'ES2420386579855387888566', - bankEntityFk: 128, - companyFk: 442, - postcode: 'asd', - phone: '633342693', - code: 'ASD', - bossFk: 34, - birth: '2022-12-11T23:00:00.000Z' - }; + this.$http.get('NewWorkerConfigs/findOne').then(res => { + return this.worker = Object.assign({}, res.data); + }); } onSubmit() { diff --git a/modules/worker/front/create/index.spec.js b/modules/worker/front/create/index.spec.js index 24fc80d21..eac6c8bf0 100644 --- a/modules/worker/front/create/index.spec.js +++ b/modules/worker/front/create/index.spec.js @@ -1,12 +1,12 @@ import './index'; -describe('Client', () => { - describe('Component vnClientCreate', () => { +describe('Worker', () => { + describe('Component vnWorkerCreate', () => { let $scope; let $state; let controller; - beforeEach(ngModule('client')); + beforeEach(ngModule('worker')); beforeEach(inject(($componentController, $rootScope, _$state_) => { $scope = $rootScope.$new(); @@ -20,28 +20,23 @@ describe('Client', () => { }; } }; - const $element = angular.element(''); - controller = $componentController('vnClientCreate', {$element, $scope}); + const $element = angular.element(''); + controller = $componentController('vnWorkerCreate', {$element, $scope}); + controller.worker = {}; })); - it('should define and set scope, state and client properties', () => { - expect(controller.$).toBe($scope); - expect(controller.$state).toBe($state); - expect(controller.client.active).toBe(true); - }); - describe('onSubmit()', () => { it(`should call submit() on the watcher then expect a callback`, () => { jest.spyOn($state, 'go'); controller.onSubmit(); - expect(controller.$state.go).toHaveBeenCalledWith('client.card.basicData', {id: '1234'}); + expect(controller.$state.go).toHaveBeenCalledWith('worker.card.basicData', {id: '1234'}); }); }); describe('province() setter', () => { it(`should set countryFk property`, () => { - controller.client.countryFk = null; + controller.worker.countryFk = null; controller.province = { id: 1, name: 'New york', @@ -51,7 +46,7 @@ describe('Client', () => { } }; - expect(controller.client.countryFk).toEqual(2); + expect(controller.worker.countryFk).toEqual(2); }); }); @@ -71,7 +66,7 @@ describe('Client', () => { postcodes: [] }; - expect(controller.client.provinceFk).toEqual(1); + expect(controller.worker.provinceFk).toEqual(1); }); it(`should set provinceFk property and fill the postalCode if there's just one`, () => { @@ -89,8 +84,8 @@ describe('Client', () => { postcodes: [{code: '46001'}] }; - expect(controller.client.provinceFk).toEqual(1); - expect(controller.client.postcode).toEqual('46001'); + expect(controller.worker.provinceFk).toEqual(1); + expect(controller.worker.postcode).toEqual('46001'); }); }); @@ -113,9 +108,23 @@ describe('Client', () => { } }; - expect(controller.client.city).toEqual('New York'); - expect(controller.client.provinceFk).toEqual(1); - expect(controller.client.countryFk).toEqual(2); + expect(controller.worker.city).toEqual('New York'); + expect(controller.worker.provinceFk).toEqual(1); + expect(controller.worker.countryFk).toEqual(2); + }); + }); + + describe('generateCodeUser()', () => { + it(`should generate worker code and name `, () => { + controller.worker = { + firstName: 'default', + lastNames: 'generate worker' + }; + + controller.generateCodeUser(); + + expect(controller.worker.code).toEqual('DGW'); + expect(controller.worker.name).toEqual('defaultgw'); }); }); }); From 9c044dc95b71cc1d2da391a4a28209485d74d7f3 Mon Sep 17 00:00:00 2001 From: alexm Date: Wed, 4 Jan 2023 09:38:43 +0100 Subject: [PATCH 16/33] fix: phone --- modules/worker/back/methods/worker/specs/new.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/worker/back/methods/worker/specs/new.spec.js b/modules/worker/back/methods/worker/specs/new.spec.js index 2cb8bebef..d6b226ad2 100644 --- a/modules/worker/back/methods/worker/specs/new.spec.js +++ b/modules/worker/back/methods/worker/specs/new.spec.js @@ -32,7 +32,7 @@ describe('Worker new', () => { bankEntityFk: 128, companyFk: 442, postcode: '46680', - phone: '633342693', + phone: '123456789', code: 'DWW', bossFk: 9, birth: '2022-12-11T23:00:00.000Z' From ecfad940571fef9ecfb2c855dc8a63369d4acbe7 Mon Sep 17 00:00:00 2001 From: alexm Date: Mon, 16 Jan 2023 12:19:03 +0100 Subject: [PATCH 17/33] refactor(worker_new): remove roleFk and profileType --- db/changes/230201/00-createWorker.sql | 29 +++----------- db/dump/fixtures.sql | 4 ++ e2e/paths/03-worker/06_create.spec.js | 23 +++++------ modules/worker/back/methods/worker/new.js | 26 +++++-------- .../back/methods/worker/specs/new.spec.js | 1 - modules/worker/back/model-config.json | 34 ++++++++-------- ...-worker-config.json => worker-config.json} | 16 +------- modules/worker/front/create/index.html | 39 ++++++------------- modules/worker/front/create/index.js | 7 ++-- modules/worker/front/create/index.spec.js | 4 +- 10 files changed, 65 insertions(+), 118 deletions(-) rename modules/worker/back/models/{new-worker-config.json => worker-config.json} (58%) diff --git a/db/changes/230201/00-createWorker.sql b/db/changes/230201/00-createWorker.sql index d4118b4fa..7ca2c41ee 100644 --- a/db/changes/230201/00-createWorker.sql +++ b/db/changes/230201/00-createWorker.sql @@ -1,22 +1,3 @@ - -INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`) - VALUES - ('ProfileType', '*', '*', 'ALLOW', 'ROLE', 'employee'); - -CREATE TABLE `vn`.`newWorkerConfig` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `street` VARCHAR(25) NULL, - `provinceFk` smallint(6) unsigned NULL, - `companyFk` smallint(5) unsigned NULL, - `profileTypeFk` INT(11) NULL, - `roleFk` int(10) unsigned NULL, - PRIMARY KEY (`id`), - CONSTRAINT `newWorkerConfig_province_fk` FOREIGN KEY (`provinceFk`) REFERENCES `vn`.`province` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `newWorkerConfig_company_fk` FOREIGN KEY (`companyFk`) REFERENCES `vn`.`company` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `newWorkerConfig_profileType_fk` FOREIGN KEY (`profileTypeFk`) REFERENCES `vn`.`profileType` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `newWorkerConfig_role_fk` FOREIGN KEY (`roleFk`) REFERENCES `account`.`role` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -); - UPDATE `salix`.`ACL` SET accessType='READ' WHERE model='Worker' @@ -36,8 +17,8 @@ INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `pri ('Worker', 'new', 'WRITE', 'ALLOW', 'ROLE', 'hr'), ('Role', '*', 'READ', 'ALLOW', 'ROLE', 'hr'); -/* -INSERT INTO `vn`.`newWorkerConfig` (`id`, `street`, `provinceFk`, `companyFk`, `profileTypeFk`, `roleFk`) - VALUES - (1, 'C/ ', 57, 442, 1, 1); -*/ +ALTER TABLE `vn`.`workerConfig` ADD roleFk int(10) unsigned NOT NULL COMMENT 'Rol por defecto al dar de alta un trabajador nuevo'; +UPDATE `vn`.`workerConfig` + SET roleFk = 1 + WHERE id = 1; + diff --git a/db/dump/fixtures.sql b/db/dump/fixtures.sql index eae831aea..3fc40f75f 100644 --- a/db/dump/fixtures.sql +++ b/db/dump/fixtures.sql @@ -2769,3 +2769,7 @@ INSERT INTO `vn`.`payDemDetail` (`id`, `detail`) VALUES (1, 1); +INSERT INTO `vn`.`workerConfig` (`id`, `businessUpdated`, `roleFk`) + VALUES + (1, NULL, 1); + diff --git a/e2e/paths/03-worker/06_create.spec.js b/e2e/paths/03-worker/06_create.spec.js index c1a555cbb..5f6f5cf9f 100644 --- a/e2e/paths/03-worker/06_create.spec.js +++ b/e2e/paths/03-worker/06_create.spec.js @@ -1,7 +1,7 @@ import selectors from '../../helpers/selectors.js'; import getBrowser from '../../helpers/puppeteer'; -describe('Worker calendar path', () => { +describe('Worker create path', () => { let browser; let page; let newWorker; @@ -23,13 +23,12 @@ describe('Worker calendar path', () => { await page.write(selectors.workerCreate.fi, '78457139E'); await page.write(selectors.workerCreate.phone, '12356789'); await page.write(selectors.workerCreate.postcode, '46680'); - await page.write(selectors.workerCreate.street, 'Doomstadt'); + await page.write(selectors.workerCreate.street, 'S/ Doomstadt'); await page.write(selectors.workerCreate.email, 'doctorDoom@marvel.com'); await page.write(selectors.workerCreate.iban, 'ES9121000418450200051332'); await page.autocompleteSearch(selectors.workerCreate.switft, 'BBKKESMMMMM'); - }); - it('should check for autocompleted worker code and worker user name', async() => { + // should check for autocompleted worker code and worker user name const workerCode = await page .waitToGetProperty(selectors.workerCreate.code, 'value'); @@ -38,34 +37,30 @@ describe('Worker calendar path', () => { expect(workerCode).toEqual('VVD'); expect(newWorker).toContain('victorvd'); - }); - it('should fail if necessary data is void', async() => { + // should fail if necessary data is void await page.waitToClick(selectors.workerCreate.createButton); - const message = await page.waitForSnackbar(); + let message = await page.waitForSnackbar(); expect(message.text).toContain('is a required argument'); - }); - it('should create a new worker and go to worker basic data', async() => { + // should create a new worker and go to worker basic data' await page.pickDate(selectors.workerCreate.birth, new Date(1962, 8, 5)); - await page.autocompleteSearch(selectors.workerCreate.role, 'Jefe de personal de reparto'); await page.autocompleteSearch(selectors.workerCreate.boss, 'deliveryBoss'); await page.waitToClick(selectors.workerCreate.createButton); - const message = await page.waitForSnackbar(); + message = await page.waitForSnackbar(); await page.waitForState('worker.card.basicData'); expect(message.text).toContain('Data saved!'); - }); - it('rollback', async() => { + // 'rollback' await page.loginAndModule('sysadmin', 'account'); await page.accessToSearchResult(newWorker); await page.waitToClick(selectors.accountDescriptor.menuButton); await page.waitToClick(selectors.accountDescriptor.deactivateUser); await page.waitToClick(selectors.accountDescriptor.acceptButton); - let message = await page.waitForSnackbar(); + message = await page.waitForSnackbar(); expect(message.text).toContain('User deactivated!'); diff --git a/modules/worker/back/methods/worker/new.js b/modules/worker/back/methods/worker/new.js index b6da3301a..a7bb883cd 100644 --- a/modules/worker/back/methods/worker/new.js +++ b/modules/worker/back/methods/worker/new.js @@ -1,8 +1,9 @@ +/* eslint max-len: ["error", { "code": 130 }]*/ const UserError = require('vn-loopback/util/user-error'); module.exports = Self => { Self.remoteMethodCtx('new', { - description: 'Creates a new ticket and returns the id', + description: 'Creates a new worker and returns the id', accessType: 'WRITE', accepts: [ { @@ -35,12 +36,6 @@ module.exports = Self => { description: `The worker email`, required: true, }, - { - arg: 'roleFk', - type: 'number', - description: `The worker role`, - required: true, - }, { arg: 'street', type: 'string', @@ -106,12 +101,6 @@ module.exports = Self => { type: 'date', description: `The worker birth`, required: true, - }, - { - arg: 'profileTypeFk', - type: 'number', - description: `The worker profile type ¿DELETE?`, - required: true, } ], returns: { @@ -150,6 +139,7 @@ module.exports = Self => { if (!client) { const nickname = args.firstName.concat(' ', args.lastNames); + const workerConfig = await models.WorkerConfig.findOne({fields: ['roleFk']}); const [randomPassword] = await models.Worker.rawSql( 'SELECT account.passwordGenerate() as password;' ); @@ -160,7 +150,7 @@ module.exports = Self => { nickname, password: randomPassword.password, email: args.email, - role: args.roleFk, + roleFk: workerConfig.roleFk, }, myOptions ); @@ -198,13 +188,17 @@ module.exports = Self => { provinceFk: args.provinceFk, postalCode: args.postalCode, mobile: args.phone, - nickname: 'TR ' + nickname, + nickname: nickname, isDefaultAddress: true, }, myOptions ); - client = await models.Client.findById(user.id, null, myOptions); + client = await models.Client.findById( + user.id, + {fields: ['id', 'name', 'socialName', 'street', 'city', 'iban', 'bankEntityFk', 'defaultAddressFk']}, + myOptions + ); await client.updateAttributes( { diff --git a/modules/worker/back/methods/worker/specs/new.spec.js b/modules/worker/back/methods/worker/specs/new.spec.js index d6b226ad2..f695ab80e 100644 --- a/modules/worker/back/methods/worker/specs/new.spec.js +++ b/modules/worker/back/methods/worker/specs/new.spec.js @@ -24,7 +24,6 @@ describe('Worker new', () => { firstName: 'default', lastNames: 'worker', email: 'defaultWorker@mydomain.com', - roleFk: 1, street: 'S/ defaultWorkerStreet', city: 'defaultWorkerCity', provinceFk: 1, diff --git a/modules/worker/back/model-config.json b/modules/worker/back/model-config.json index de8aadd41..7e03c8a23 100644 --- a/modules/worker/back/model-config.json +++ b/modules/worker/back/model-config.json @@ -26,9 +26,6 @@ "Journey": { "dataSource": "vn" }, - "NewWorkerConfig":{ - "dataSource": "vn" - }, "ProfileType":{ "dataSource": "vn" }, @@ -41,36 +38,42 @@ "WorkCenterHoliday": { "dataSource": "vn" }, - "WorkerDms": { + "Worker": { "dataSource": "vn" }, - "Worker": { + "WorkerConfig": { + "dataSource": "vn" + }, + "WorkerDepartment": { + "dataSource": "vn" + }, + "WorkerDisableExcluded": { + "dataSource": "vn" + }, + "WorkerDms": { "dataSource": "vn" }, "WorkerLabour": { "dataSource": "vn" }, + "WorkerLog": { + "dataSource": "vn" + }, "WorkerMana": { "dataSource": "vn" }, + "WorkerMedia": { + "dataSource": "vn" + }, "WorkerTeam": { "dataSource": "vn" }, "WorkerTeamCollegues": { "dataSource": "vn" }, - "WorkerMedia": { - "dataSource": "vn" - }, - "WorkerDepartment": { - "dataSource": "vn" - }, "WorkerTimeControl": { "dataSource": "vn" }, - "WorkerLog": { - "dataSource": "vn" - }, "WorkerTimeControlConfig": { "dataSource": "vn" }, @@ -79,9 +82,6 @@ }, "WorkerTimeControlMail": { "dataSource": "vn" - }, - "WorkerDisableExcluded": { - "dataSource": "vn" } } diff --git a/modules/worker/back/models/new-worker-config.json b/modules/worker/back/models/worker-config.json similarity index 58% rename from modules/worker/back/models/new-worker-config.json rename to modules/worker/back/models/worker-config.json index 2102d236c..05cdfef42 100644 --- a/modules/worker/back/models/new-worker-config.json +++ b/modules/worker/back/models/worker-config.json @@ -1,9 +1,9 @@ { - "name": "NewWorkerConfig", + "name": "WorkerConfig", "base": "VnModel", "options": { "mysql": { - "table": "newWorkerConfig" + "table": "workerConfig" } }, "properties": { @@ -12,18 +12,6 @@ "id": true, "description": "Identifier" }, - "street": { - "type": "string" - }, - "provinceFk": { - "type": "number" - }, - "companyFk": { - "type": "number" - }, - "profileTypeFk": { - "type": "number" - }, "roleFk": { "type": "number" } diff --git a/modules/worker/front/create/index.html b/modules/worker/front/create/index.html index c09930b80..5f5ab9d07 100644 --- a/modules/worker/front/create/index.html +++ b/modules/worker/front/create/index.html @@ -52,19 +52,9 @@ - - {{name}} ({{country.country}}) - + + {{name}} ({{country.country}}) + - - - - { - return this.worker = Object.assign({}, res.data); - }); + this.worker = {companyFk: this.vnConfig.user.companyFk}; } onSubmit() { @@ -45,6 +43,9 @@ export default class Controller extends Section { this.worker.code = newCode.toUpperCase().slice(0, 3); this.worker.name = totalNameArray[0] + newCode.slice(1); + + if (!this.worker.companyFk) + this.worker.companyFk = this.vnConfig.user.companyFk; } get province() { diff --git a/modules/worker/front/create/index.spec.js b/modules/worker/front/create/index.spec.js index eac6c8bf0..c2e9acce0 100644 --- a/modules/worker/front/create/index.spec.js +++ b/modules/worker/front/create/index.spec.js @@ -23,6 +23,7 @@ describe('Worker', () => { const $element = angular.element(''); controller = $componentController('vnWorkerCreate', {$element, $scope}); controller.worker = {}; + controller.vnConfig = {user: {companyFk: 1}}; })); describe('onSubmit()', () => { @@ -115,7 +116,7 @@ describe('Worker', () => { }); describe('generateCodeUser()', () => { - it(`should generate worker code and name `, () => { + it(`should generate worker code, name and company `, () => { controller.worker = { firstName: 'default', lastNames: 'generate worker' @@ -125,6 +126,7 @@ describe('Worker', () => { expect(controller.worker.code).toEqual('DGW'); expect(controller.worker.name).toEqual('defaultgw'); + expect(controller.worker.companyFk).toEqual(controller.vnConfig.user.companyFk); }); }); }); From 4e1c43eb4df7aa003f3353c194263de2dca1932c Mon Sep 17 00:00:00 2001 From: alexandre Date: Tue, 17 Jan 2023 10:01:49 +0100 Subject: [PATCH 18/33] refs #4945 nombre temporal removed --- e2e/helpers/selectors.js | 3 ++- e2e/paths/04-item/07_create.spec.js | 11 ++++++++++- e2e/paths/04-item/10_item_log.spec.js | 10 +++++----- modules/item/back/methods/item/new.js | 17 ++++++++++++----- .../item/back/methods/item/specs/new.spec.js | 7 ++++--- modules/item/front/create/index.html | 16 ++++++++++++++-- modules/item/front/create/index.js | 4 +++- 7 files changed, 50 insertions(+), 18 deletions(-) diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js index b8f0813ed..04f2d4569 100644 --- a/e2e/helpers/selectors.js +++ b/e2e/helpers/selectors.js @@ -428,6 +428,7 @@ export default { }, itemCreateView: { temporalName: 'vn-item-create vn-textfield[ng-model="$ctrl.item.provisionalName"]', + priority: 'vn-input-number[ng-model="$ctrl.item.priority"]', type: 'vn-autocomplete[ng-model="$ctrl.item.typeFk"]', intrastat: 'vn-autocomplete[ng-model="$ctrl.item.intrastatFk"]', origin: 'vn-autocomplete[ng-model="$ctrl.item.originFk"]', @@ -521,7 +522,7 @@ export default { }, itemLog: { anyLineCreated: 'vn-item-log > vn-log vn-tbody > vn-tr', - fifthLineCreatedProperty: 'vn-item-log > vn-log vn-tbody > vn-tr:nth-child(5) table tr:nth-child(3) td.after', + fourthLineCreatedProperty: 'vn-item-log > vn-log vn-tbody > vn-tr:nth-child(4) table tr:nth-child(3) td.after', }, ticketSummary: { header: 'vn-ticket-summary > vn-card > h5', diff --git a/e2e/paths/04-item/07_create.spec.js b/e2e/paths/04-item/07_create.spec.js index 0820f2db7..8319a8dff 100644 --- a/e2e/paths/04-item/07_create.spec.js +++ b/e2e/paths/04-item/07_create.spec.js @@ -36,11 +36,20 @@ describe('Item Create', () => { await page.waitForState('item.create'); }); - it('should create the Infinity Gauntlet item', async() => { + it('should throw an error when insert an invalid priority', async() => { await page.write(selectors.itemCreateView.temporalName, 'Infinity Gauntlet'); await page.autocompleteSearch(selectors.itemCreateView.type, 'Crisantemo'); await page.autocompleteSearch(selectors.itemCreateView.intrastat, 'Coral y materiales similares'); await page.autocompleteSearch(selectors.itemCreateView.origin, 'Holand'); + await page.overwrite(selectors.itemCreateView.priority, '100'); + await page.waitToClick(selectors.itemCreateView.createButton); + const message = await page.waitForSnackbar(); + + expect(message.text).toContain('Valid priorities'); + }); + + it('should create the Infinity Gauntlet item', async() => { + await page.overwrite(selectors.itemCreateView.priority, '2'); await page.waitToClick(selectors.itemCreateView.createButton); const message = await page.waitForSnackbar(); diff --git a/e2e/paths/04-item/10_item_log.spec.js b/e2e/paths/04-item/10_item_log.spec.js index 2a885fe6f..f3ff6001c 100644 --- a/e2e/paths/04-item/10_item_log.spec.js +++ b/e2e/paths/04-item/10_item_log.spec.js @@ -48,17 +48,17 @@ describe('Item log path', () => { await page.accessToSection('item.card.log'); }); - it(`should confirm the log is showing 5 entries`, async() => { + it(`should confirm the log is showing 4 entries`, async() => { await page.waitForSelector(selectors.itemLog.anyLineCreated); const anyLineCreatedCount = await page.countElement(selectors.itemLog.anyLineCreated); - expect(anyLineCreatedCount).toEqual(5); + expect(anyLineCreatedCount).toEqual(4); }); it(`should confirm the log is showing the intrastat for the created item`, async() => { - const fifthLineCreatedProperty = await page - .waitToGetProperty(selectors.itemLog.fifthLineCreatedProperty, 'innerText'); + const fourthLineCreatedProperty = await page + .waitToGetProperty(selectors.itemLog.fourthLineCreatedProperty, 'innerText'); - expect(fifthLineCreatedProperty).toEqual('Coral y materiales similares'); + expect(fourthLineCreatedProperty).toEqual('Coral y materiales similares'); }); }); diff --git a/modules/item/back/methods/item/new.js b/modules/item/back/methods/item/new.js index fae37836f..b84072a8a 100644 --- a/modules/item/back/methods/item/new.js +++ b/modules/item/back/methods/item/new.js @@ -37,7 +37,9 @@ module.exports = Self => { 'typeFk', 'intrastatFk', 'originFk', - 'relevancy' + 'relevancy', + 'priority', + 'tag' ]; for (const key in params) { @@ -46,10 +48,14 @@ module.exports = Self => { } try { + const validPriorities = new Set([1, 2, 3]); + if (!validPriorities.has(params.priority)) + throw new UserError(`Valid priorities: ${[...validPriorities]}`); + const provisionalName = params.provisionalName; delete params.provisionalName; - const itemType = await models.ItemType.findById(params.typeFk, myOptions); + const itemType = await models.ItemType.findById(params.typeFk, {fields: ['isLaid']}, myOptions); params.isLaid = itemType.isLaid; @@ -63,13 +69,14 @@ module.exports = Self => { await Self.rawSql(query, null, myOptions); - let nameTag = await models.Tag.findOne({where: {name: 'Nombre temporal'}}); + const nameTag = await models.Tag.findById(params.tag, {fields: ['id']}, myOptions); let newTags = []; - newTags.push({itemFk: item.id, tagFk: nameTag.id, value: provisionalName, priority: '2'}); + newTags.push({itemFk: item.id, tagFk: nameTag.id, value: provisionalName, priority: item.priority}); typeTags.forEach(typeTag => { - newTags.push({itemFk: item.id, tagFk: typeTag.tagFk, value: '', priority: typeTag.priority}); + if (nameTag.id != typeTag.tagFk) + newTags.push({itemFk: item.id, tagFk: typeTag.tagFk, value: '', priority: typeTag.priority}); }); await models.ItemTag.create(newTags, myOptions); diff --git a/modules/item/back/methods/item/specs/new.spec.js b/modules/item/back/methods/item/specs/new.spec.js index 7364faa7d..e34ab2cf5 100644 --- a/modules/item/back/methods/item/specs/new.spec.js +++ b/modules/item/back/methods/item/specs/new.spec.js @@ -11,7 +11,8 @@ describe('item new()', () => { originFk: 1, provisionalName: 'planta', typeFk: 2, - relevancy: 0 + priority: 2, + tag: 1 }; let item = await models.Item.new(itemParams, options); @@ -20,7 +21,7 @@ describe('item new()', () => { item.isLaid = itemType.isLaid; - const temporalNameTag = await models.Tag.findOne({where: {name: 'Nombre temporal'}}, options); + const temporalNameTag = await models.Tag.findById(itemParams.tag, {fields: ['id']}, options); const temporalName = await models.ItemTag.findOne({ where: { @@ -31,7 +32,7 @@ describe('item new()', () => { item = await models.Item.findById(item.id, null, options); - itemType = await models.ItemType.findById(item.typeFk, options); + itemType = await models.ItemType.findById(item.typeFk, {fields: ['isLaid']}, options); item.isLaid = itemType.isLaid; diff --git a/modules/item/front/create/index.html b/modules/item/front/create/index.html index 6deaab1cd..806d0cb62 100644 --- a/modules/item/front/create/index.html +++ b/modules/item/front/create/index.html @@ -16,10 +16,22 @@ + + + + Date: Wed, 18 Jan 2023 13:14:49 +0100 Subject: [PATCH 19/33] refs #4945 added defaultTag, validPriorities, defaultPriority in itemConfig --- .../230201/00-validPriorities_ItemConfig.sql | 8 ++++++++ db/dump/fixtures.sql | 4 ++++ e2e/helpers/selectors.js | 2 +- e2e/paths/04-item/10_item_log.spec.js | 10 +++++----- modules/item/back/methods/item/new.js | 7 +++---- modules/item/back/models/item-config.json | 18 +++++++++++++++++- modules/item/front/create/index.js | 19 ++++++++++++++----- 7 files changed, 52 insertions(+), 16 deletions(-) create mode 100644 db/changes/230201/00-validPriorities_ItemConfig.sql diff --git a/db/changes/230201/00-validPriorities_ItemConfig.sql b/db/changes/230201/00-validPriorities_ItemConfig.sql new file mode 100644 index 000000000..2e22352fe --- /dev/null +++ b/db/changes/230201/00-validPriorities_ItemConfig.sql @@ -0,0 +1,8 @@ +ALTER TABLE `vn`.`itemConfig` ADD defaultTag INT DEFAULT 56 NOT NULL; +ALTER TABLE `vn`.`itemConfig` ADD CONSTRAINT itemConfig_FK FOREIGN KEY (defaultTag) REFERENCES vn.tag(id); +ALTER TABLE `vn`.`itemConfig` ADD validPriorities varchar(50) DEFAULT '[1,2,3]' NOT NULL; +ALTER TABLE `vn`.`itemConfig` ADD defaultPriority INT DEFAULT 2 NOT NULL; + +INSERT INTO `salix`.`ACL` +(model, property, accessType, permission, principalType, principalId) +VALUES('ItemConfig', '*', 'READ', 'ALLOW', 'ROLE', 'buyer'); diff --git a/db/dump/fixtures.sql b/db/dump/fixtures.sql index fba094ef4..5d6849cef 100644 --- a/db/dump/fixtures.sql +++ b/db/dump/fixtures.sql @@ -2719,6 +2719,10 @@ INSERT INTO `vn`.`collection` (`id`, `created`, `workerFk`, `stateFk`, `itemPack VALUES (3, util.VN_NOW(), 1107, 5, NULL, 0, 0, 1, NULL, NULL); +INSERT INTO `vn`.`itemConfig` (`id`, `isItemTagTriggerDisabled`, `monthToDeactivate`, `wasteRecipients`, `validPriorities`, `defaultPriority`, `defaultTag`) + VALUES + (0, 0, 24, '', '[1,2,3]', 2, 56); + INSERT INTO `vn`.`ticketCollection` (`ticketFk`, `collectionFk`, `created`, `level`, `wagon`, `smartTagFk`, `usedShelves`, `itemCount`, `liters`) VALUES (9, 3, util.VN_NOW(), NULL, 0, NULL, NULL, NULL, NULL); diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js index 04f2d4569..c2ad63484 100644 --- a/e2e/helpers/selectors.js +++ b/e2e/helpers/selectors.js @@ -522,7 +522,7 @@ export default { }, itemLog: { anyLineCreated: 'vn-item-log > vn-log vn-tbody > vn-tr', - fourthLineCreatedProperty: 'vn-item-log > vn-log vn-tbody > vn-tr:nth-child(4) table tr:nth-child(3) td.after', + fifthLineCreatedProperty: 'vn-item-log > vn-log vn-tbody > vn-tr:nth-child(5) table tr:nth-child(2) td.after', }, ticketSummary: { header: 'vn-ticket-summary > vn-card > h5', diff --git a/e2e/paths/04-item/10_item_log.spec.js b/e2e/paths/04-item/10_item_log.spec.js index f3ff6001c..2a885fe6f 100644 --- a/e2e/paths/04-item/10_item_log.spec.js +++ b/e2e/paths/04-item/10_item_log.spec.js @@ -48,17 +48,17 @@ describe('Item log path', () => { await page.accessToSection('item.card.log'); }); - it(`should confirm the log is showing 4 entries`, async() => { + it(`should confirm the log is showing 5 entries`, async() => { await page.waitForSelector(selectors.itemLog.anyLineCreated); const anyLineCreatedCount = await page.countElement(selectors.itemLog.anyLineCreated); - expect(anyLineCreatedCount).toEqual(4); + expect(anyLineCreatedCount).toEqual(5); }); it(`should confirm the log is showing the intrastat for the created item`, async() => { - const fourthLineCreatedProperty = await page - .waitToGetProperty(selectors.itemLog.fourthLineCreatedProperty, 'innerText'); + const fifthLineCreatedProperty = await page + .waitToGetProperty(selectors.itemLog.fifthLineCreatedProperty, 'innerText'); - expect(fourthLineCreatedProperty).toEqual('Coral y materiales similares'); + expect(fifthLineCreatedProperty).toEqual('Coral y materiales similares'); }); }); diff --git a/modules/item/back/methods/item/new.js b/modules/item/back/methods/item/new.js index b84072a8a..0057cb50f 100644 --- a/modules/item/back/methods/item/new.js +++ b/modules/item/back/methods/item/new.js @@ -37,7 +37,6 @@ module.exports = Self => { 'typeFk', 'intrastatFk', 'originFk', - 'relevancy', 'priority', 'tag' ]; @@ -48,9 +47,9 @@ module.exports = Self => { } try { - const validPriorities = new Set([1, 2, 3]); - if (!validPriorities.has(params.priority)) - throw new UserError(`Valid priorities: ${[...validPriorities]}`); + const itemConfig = await models.ItemConfig.findOne({fields: ['validPriorities']}, myOptions); + if (!itemConfig.validPriorities.includes(params.priority)) + throw new UserError(`Valid priorities: ${[...itemConfig.validPriorities]}`); const provisionalName = params.provisionalName; delete params.provisionalName; diff --git a/modules/item/back/models/item-config.json b/modules/item/back/models/item-config.json index 364879986..36d25e0bb 100644 --- a/modules/item/back/models/item-config.json +++ b/modules/item/back/models/item-config.json @@ -16,6 +16,22 @@ "wasteRecipients": { "type": "string", "description": "Buyers waste report recipients" + }, + "validPriorities": { + "type": "array" + }, + "defaultPriority": { + "type": "int" + }, + "defaultTag": { + "type": "int" + } + }, + "relations": { + "tag": { + "type": "belongsTo", + "model": "Tag", + "foreignKey": "defaultTag" } } -} \ No newline at end of file +} diff --git a/modules/item/front/create/index.js b/modules/item/front/create/index.js index c3082ffd7..c9a121cd4 100644 --- a/modules/item/front/create/index.js +++ b/modules/item/front/create/index.js @@ -4,11 +4,20 @@ import Section from 'salix/components/section'; class Controller extends Section { constructor($element, $) { super($element, $); - this.item = { - relevancy: 0, - priority: 2, - tag: 1 - }; + this.fetchDefaultPriorityTag(); + } + + fetchDefaultPriorityTag() { + const filter = {fields: ['defaultPriority', 'defaultTag'], limit: 1}; + this.$http.get(`ItemConfigs`, {filter}) + .then(res => { + if (res.data) { + this.item = { + priority: res.data[0].defaultPriority, + tag: res.data[0].defaultTag + }; + } + }); } onSubmit() { From 89a7aa58877fb420a6ee0453b3e18a0320b40282 Mon Sep 17 00:00:00 2001 From: alexandre Date: Wed, 18 Jan 2023 14:51:03 +0100 Subject: [PATCH 20/33] refs #4945 refresh structure --- db/dump/structure.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/db/dump/structure.sql b/db/dump/structure.sql index 4626279e4..772d6055d 100644 --- a/db/dump/structure.sql +++ b/db/dump/structure.sql @@ -80203,3 +80203,4 @@ USE `vncontrol`; -- Dump completed on 2022-11-21 7:57:28 + From 91e27d76be6caadc75982049b240b8d2a408c1d0 Mon Sep 17 00:00:00 2001 From: joan Date: Fri, 20 Jan 2023 07:44:04 +0100 Subject: [PATCH 21/33] Updated version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9633751a0..bd9dfe017 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "salix-back", - "version": "9.0.0", + "version": "230203", "author": "Verdnatura Levante SL", "description": "Salix backend", "license": "GPL-3.0", From a3b580e27d43511c2a29e6aaccf07c7c0c97402e Mon Sep 17 00:00:00 2001 From: alexandre Date: Fri, 20 Jan 2023 08:01:19 +0100 Subject: [PATCH 22/33] refs #4945 item.relevancy comment --- db/changes/230201/00-validPriorities_ItemConfig.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/db/changes/230201/00-validPriorities_ItemConfig.sql b/db/changes/230201/00-validPriorities_ItemConfig.sql index 2e22352fe..a793997d0 100644 --- a/db/changes/230201/00-validPriorities_ItemConfig.sql +++ b/db/changes/230201/00-validPriorities_ItemConfig.sql @@ -2,6 +2,7 @@ ALTER TABLE `vn`.`itemConfig` ADD defaultTag INT DEFAULT 56 NOT NULL; ALTER TABLE `vn`.`itemConfig` ADD CONSTRAINT itemConfig_FK FOREIGN KEY (defaultTag) REFERENCES vn.tag(id); ALTER TABLE `vn`.`itemConfig` ADD validPriorities varchar(50) DEFAULT '[1,2,3]' NOT NULL; ALTER TABLE `vn`.`itemConfig` ADD defaultPriority INT DEFAULT 2 NOT NULL; +ALTER TABLE `vn`.`item` MODIFY COLUMN relevancy tinyint(1) DEFAULT 0 NOT NULL COMMENT 'La web ordena de forma descendiente por este campo para mostrar los artículos'; INSERT INTO `salix`.`ACL` (model, property, accessType, permission, principalType, principalId) From ace7a5939ece2caeb159351e86f3bd966fa4e0c6 Mon Sep 17 00:00:00 2001 From: alexm Date: Fri, 20 Jan 2023 08:33:59 +0100 Subject: [PATCH 23/33] move to changes 230401 --- db/changes/230401/.gitkeep | 0 db/changes/{230201 => 230401}/00-createWorker.sql | 0 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 db/changes/230401/.gitkeep rename db/changes/{230201 => 230401}/00-createWorker.sql (100%) diff --git a/db/changes/230401/.gitkeep b/db/changes/230401/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/db/changes/230201/00-createWorker.sql b/db/changes/230401/00-createWorker.sql similarity index 100% rename from db/changes/230201/00-createWorker.sql rename to db/changes/230401/00-createWorker.sql From a473d3a6f9809848449abb43295ebe682b0da303 Mon Sep 17 00:00:00 2001 From: alexandre Date: Fri, 20 Jan 2023 12:01:13 +0100 Subject: [PATCH 24/33] refs #4945 changed input-number for autocomplete --- e2e/helpers/selectors.js | 2 +- e2e/paths/04-item/07_create.spec.js | 4 ++-- modules/item/front/create/index.html | 12 +++++++----- modules/item/front/create/index.js | 11 ++++++++--- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js index a8131a458..e9d9d0580 100644 --- a/e2e/helpers/selectors.js +++ b/e2e/helpers/selectors.js @@ -428,7 +428,7 @@ export default { }, itemCreateView: { temporalName: 'vn-item-create vn-textfield[ng-model="$ctrl.item.provisionalName"]', - priority: 'vn-input-number[ng-model="$ctrl.item.priority"]', + priority: 'vn-autocomplete[ng-model="$ctrl.item.priority"]', type: 'vn-autocomplete[ng-model="$ctrl.item.typeFk"]', intrastat: 'vn-autocomplete[ng-model="$ctrl.item.intrastatFk"]', origin: 'vn-autocomplete[ng-model="$ctrl.item.originFk"]', diff --git a/e2e/paths/04-item/07_create.spec.js b/e2e/paths/04-item/07_create.spec.js index 8319a8dff..33324cdba 100644 --- a/e2e/paths/04-item/07_create.spec.js +++ b/e2e/paths/04-item/07_create.spec.js @@ -41,7 +41,7 @@ describe('Item Create', () => { await page.autocompleteSearch(selectors.itemCreateView.type, 'Crisantemo'); await page.autocompleteSearch(selectors.itemCreateView.intrastat, 'Coral y materiales similares'); await page.autocompleteSearch(selectors.itemCreateView.origin, 'Holand'); - await page.overwrite(selectors.itemCreateView.priority, '100'); + await page.clearInput(selectors.itemCreateView.priority); await page.waitToClick(selectors.itemCreateView.createButton); const message = await page.waitForSnackbar(); @@ -49,7 +49,7 @@ describe('Item Create', () => { }); it('should create the Infinity Gauntlet item', async() => { - await page.overwrite(selectors.itemCreateView.priority, '2'); + await page.autocompleteSearch(selectors.itemCreateView.priority, '2'); await page.waitToClick(selectors.itemCreateView.createButton); const message = await page.waitForSnackbar(); diff --git a/modules/item/front/create/index.html b/modules/item/front/create/index.html index 806d0cb62..15e212250 100644 --- a/modules/item/front/create/index.html +++ b/modules/item/front/create/index.html @@ -16,22 +16,24 @@ - - + ng-model="$ctrl.item.priority" + show-field="priority" + value-field="priority"> + { if (res.data) { + const dataRow = res.data[0]; + dataRow.validPriorities.forEach(priority => { + this.validPriorities.push({priority}); + }); this.item = { - priority: res.data[0].defaultPriority, - tag: res.data[0].defaultTag + priority: dataRow.defaultPriority, + tag: dataRow.defaultTag }; } }); From b1be6addd12cbe5d1eb6db09a49b38e73b43f91a Mon Sep 17 00:00:00 2001 From: vicent Date: Fri, 20 Jan 2023 12:16:06 +0100 Subject: [PATCH 25/33] fix: delete unnecessary code --- .../methods/sale-tracking/listSaleTracking.js | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/modules/ticket/back/methods/sale-tracking/listSaleTracking.js b/modules/ticket/back/methods/sale-tracking/listSaleTracking.js index c0d63ef62..653703596 100644 --- a/modules/ticket/back/methods/sale-tracking/listSaleTracking.js +++ b/modules/ticket/back/methods/sale-tracking/listSaleTracking.js @@ -48,24 +48,6 @@ module.exports = Self => { const trackings = await Self.rawStmt(stmt, myOptions); - const salesFilter = { - include: [ - { - relation: 'item' - } - ], - where: {ticketFk: filter.where.ticketFk} - }; - - const sales = await Self.app.models.Sale.find(salesFilter, myOptions); - - for (const tracking of trackings) { - for (const sale of sales) { - if (tracking.itemFk == sale.itemFk) - tracking.item = sale.item(); - } - } - return trackings; }; }; From ab1a9389cb8b06d4f37b21838202370397721ed8 Mon Sep 17 00:00:00 2001 From: vicent Date: Fri, 20 Jan 2023 12:37:41 +0100 Subject: [PATCH 26/33] fix: cambiados de donde coge el item id --- modules/ticket/front/sale-tracking/index.html | 28 ++++++++----------- modules/ticket/front/sale-tracking/index.js | 4 +-- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/modules/ticket/front/sale-tracking/index.html b/modules/ticket/front/sale-tracking/index.html index 851817551..86f81c75c 100644 --- a/modules/ticket/front/sale-tracking/index.html +++ b/modules/ticket/front/sale-tracking/index.html @@ -30,12 +30,12 @@ - - {{::sale.itemFk | zeroFill:6}} + {{::sale.item.id}} - +
{{::sale.item.name}} @@ -96,27 +96,23 @@ - - {{::sale.quantity}} - {{::sale.originalQuantity}} + + {{::saleTracking.quantity}} + {{::saleTracking.originalQuantity}} - {{::sale.userNickname | dashIfEmpty}} + ng-click="itemDescriptor.show($event, sale.item.id)" + class="link"> + {{::sale.item.id}} - {{::sale.state}} - {{::sale.created | date: 'dd/MM/yyyy HH:mm'}} + {{::saleTracking.state}} + {{::saleTracking.created | date: 'dd/MM/yyyy HH:mm'}} - - diff --git a/modules/ticket/front/sale-tracking/index.js b/modules/ticket/front/sale-tracking/index.js index 60e42a461..d1c80f30f 100644 --- a/modules/ticket/front/sale-tracking/index.js +++ b/modules/ticket/front/sale-tracking/index.js @@ -45,14 +45,14 @@ class Controller extends Section { btnThree: { icon: 'icon-transaction', state: `item.card.diary({ - id: ${sale.itemFk}, + id: ${sale.item.id}, warehouseFk: ${this.ticket.warehouseFk}, lineFk: ${sale.id} })`, tooltip: 'Item diary' } }; - this.$.itemDescriptor.show(event.target, sale.itemFk); + this.$.itemDescriptor.show(event.target, sale.item.id); } chipHasSaleGroupDetail(hasSaleGroupDetail) { From 9523991b04c9628dd7e64f98f2c106ca3dc17bb2 Mon Sep 17 00:00:00 2001 From: vicent Date: Fri, 20 Jan 2023 12:45:02 +0100 Subject: [PATCH 27/33] fix: mostrar descriptor worker en vez de item --- .../ticket/back/methods/sale-tracking/listSaleTracking.js | 2 +- modules/ticket/front/sale-tracking/index.html | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/ticket/back/methods/sale-tracking/listSaleTracking.js b/modules/ticket/back/methods/sale-tracking/listSaleTracking.js index 653703596..98743d8cc 100644 --- a/modules/ticket/back/methods/sale-tracking/listSaleTracking.js +++ b/modules/ticket/back/methods/sale-tracking/listSaleTracking.js @@ -36,7 +36,7 @@ module.exports = Self => { st.originalQuantity, st.created, st.workerFk, - u.nickname userNickname, + u.name, ste.name AS state FROM saleTracking st JOIN sale s ON s.id = st.saleFk diff --git a/modules/ticket/front/sale-tracking/index.html b/modules/ticket/front/sale-tracking/index.html index 86f81c75c..c21eaa46a 100644 --- a/modules/ticket/front/sale-tracking/index.html +++ b/modules/ticket/front/sale-tracking/index.html @@ -101,9 +101,9 @@ {{::saleTracking.originalQuantity}} - {{::sale.item.id}} + class="link" + ng-click="workerDescriptor.show($event, saleTracking.workerFk)"> + {{::saleTracking.name | dashIfEmpty}} {{::saleTracking.state}} From 30885a499ee19016ec87dc55609fc2a83b35d608 Mon Sep 17 00:00:00 2001 From: jgallego Date: Sat, 21 Jan 2023 07:29:27 +0100 Subject: [PATCH 28/33] link --- print/templates/email/printer-setup/locale/es.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/print/templates/email/printer-setup/locale/es.yml b/print/templates/email/printer-setup/locale/es.yml index 77a3a7299..7361e5ed3 100644 --- a/print/templates/email/printer-setup/locale/es.yml +++ b/print/templates/email/printer-setup/locale/es.yml @@ -8,8 +8,8 @@ description: 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 https://godex.s3-accelerate.amazonaws.com/gGnOPoojkP6vC1lgmrbEqQ.file?v01 + downloadFrom: Puedes descargarlo desde este enlace https://cdn.verdnatura.es/public/QLabel_IV_V1.37_Install_en.exe downloadDriver: En este enlace puedes descargar el driver de la impresora https://es.seagullscientific.com/support/downloads/drivers/godex/download/ sections: From 6b6f27c2f234f933ec98b370416a9ebca454040e Mon Sep 17 00:00:00 2001 From: alexm Date: Mon, 23 Jan 2023 08:44:58 +0100 Subject: [PATCH 29/33] fix: typo --- front/salix/components/reset-password/locale/es.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/front/salix/components/reset-password/locale/es.yml b/front/salix/components/reset-password/locale/es.yml index 0771d5dc3..30893a152 100644 --- a/front/salix/components/reset-password/locale/es.yml +++ b/front/salix/components/reset-password/locale/es.yml @@ -1,6 +1,6 @@ Reset password: Restrablecer contraseña New password: Nueva contraseña -Repeat password: Repetir contraseñaç +Repeat password: Repetir contraseña Password changed!: ¡Contraseña cambiada! Password requirements: > La contraseña debe tener al menos {{ length }} caracteres de longitud, From 96becec9d3450c847184c091b8a10ea84eaaa9ea Mon Sep 17 00:00:00 2001 From: alexandre Date: Mon, 23 Jan 2023 10:12:34 +0100 Subject: [PATCH 30/33] refs #4564 mixin vn-report created --- loopback/util/not-found-error.js | 9 ++++++ print/core/mixins/vn-report.js | 22 +++++++++++++ print/core/report.js | 54 +++++++++++++++----------------- 3 files changed, 56 insertions(+), 29 deletions(-) create mode 100644 loopback/util/not-found-error.js create mode 100644 print/core/mixins/vn-report.js diff --git a/loopback/util/not-found-error.js b/loopback/util/not-found-error.js new file mode 100644 index 000000000..7a05254f9 --- /dev/null +++ b/loopback/util/not-found-error.js @@ -0,0 +1,9 @@ +module.exports = class NotFoundError extends Error { + constructor(message = 'Not found', code = 'NOT_FOUND', ...translateArgs) { + super(message); + this.name = 'NotFoundError'; + this.statusCode = 404; + this.code = code; + this.translateArgs = translateArgs; + } +}; diff --git a/print/core/mixins/vn-report.js b/print/core/mixins/vn-report.js new file mode 100644 index 000000000..66b9704e7 --- /dev/null +++ b/print/core/mixins/vn-report.js @@ -0,0 +1,22 @@ +const Component = require(`vn-print/core/component`); +const reportHeader = new Component('report-header'); +const reportFooter = new Component('report-footer'); +const reportBody = new Component('report-body'); +const NotFoundError = require('vn-loopback/util/not-found-error'); + +module.exports = { + components: { + 'report-body': reportBody.build(), + 'report-header': reportHeader.build(), + 'report-footer': reportFooter.build() + }, + methods: { + checkMainEntity: function(entity) { + if (entity == null) + throw new NotFoundError(); + }, + dated: function(filters, date, format) { + return filters.date(date, format); + } + }, +}; diff --git a/print/core/report.js b/print/core/report.js index d37b79c6d..c5182d1a8 100644 --- a/print/core/report.js +++ b/print/core/report.js @@ -23,43 +23,39 @@ class Report extends Component { } async toPdfStream() { - try { - const template = await this.render(); - const defaultOptions = Object.assign({}, config.pdf); + const template = await this.render(); + const defaultOptions = Object.assign({}, config.pdf); - const optionsPath = `${this.path}/options.json`; - const fullPath = path.resolve(__dirname, optionsPath); - let options = defaultOptions; - if (fs.existsSync(fullPath)) - options = require(optionsPath); + const optionsPath = `${this.path}/options.json`; + const fullPath = path.resolve(__dirname, optionsPath); + let options = defaultOptions; + if (fs.existsSync(fullPath)) + options = require(optionsPath); - return new Promise(resolve => { - Cluster.pool.queue({}, async({page}) => { - await page.emulateMediaType('screen'); - await page.setContent(template); + return new Promise(resolve => { + Cluster.pool.queue({}, async({page}) => { + await page.emulateMediaType('screen'); + await page.setContent(template); - const element = await page.$('#pageFooter'); + const element = await page.$('#pageFooter'); - let footer = '\n'; - if (element) { - footer = await page.evaluate(el => { - const html = el.innerHTML; - el.remove(); - return html; - }, element); - } + let footer = '\n'; + if (element) { + footer = await page.evaluate(el => { + const html = el.innerHTML; + el.remove(); + return html; + }, element); + } - options.headerTemplate = '\n'; - options.footerTemplate = footer; + options.headerTemplate = '\n'; + options.footerTemplate = footer; - const stream = await page.pdf(options); + const stream = await page.pdf(options); - resolve(stream); - }); + resolve(stream); }); - } catch (e) { - console.log('ERROR CATCHED:', e); - } + }); } /** From 765e4ed3328047a433fbbac188659694c10c5755 Mon Sep 17 00:00:00 2001 From: alexandre Date: Mon, 23 Jan 2023 13:15:30 +0100 Subject: [PATCH 31/33] refs #4564 all reports refactored --- print/core/mixins/vn-report.js | 3 +- .../balance-compensation.html | 4 +- .../balance-compensation.js | 26 ++------- .../campaign-metrics/campaign-metrics.html | 4 +- .../campaign-metrics/campaign-metrics.js | 25 ++------- .../claim-pickup-order.html | 2 +- .../claim-pickup-order/claim-pickup-order.js | 36 ++---------- .../client-debt-statement.html | 4 +- .../client-debt-statement.js | 42 ++------------ .../collection-label/collection-label.js | 11 +--- .../credit-request/credit-request.html | 2 +- .../reports/credit-request/credit-request.js | 19 +------ .../reports/delivery-note/delivery-note.html | 4 +- .../reports/delivery-note/delivery-note.js | 56 ++++--------------- .../reports/driver-route/driver-route.html | 4 +- .../reports/driver-route/driver-route.js | 24 ++------ .../reports/entry-order/entry-order.html | 2 +- .../reports/entry-order/entry-order.js | 30 ++-------- .../expedition-pallet-label.js | 11 +--- .../reports/exportation/exportation.html | 4 +- .../reports/exportation/exportation.js | 28 ++-------- .../extra-community/extra-community.html | 4 +- .../extra-community/extra-community.js | 41 ++++---------- .../incoterms-authorization.js | 17 +----- .../invoice-incoterms/invoice-incoterms.html | 2 +- .../invoice-incoterms/invoice-incoterms.js | 33 ++--------- print/templates/reports/invoice/invoice.html | 6 +- print/templates/reports/invoice/invoice.js | 53 ++++-------------- .../reports/invoiceIn/invoiceIn.html | 4 +- .../templates/reports/invoiceIn/invoiceIn.js | 37 +++--------- .../reports/item-label/item-label.html | 2 +- .../reports/item-label/item-label.js | 21 ++----- .../reports/letter-debtor/letter-debtor.html | 4 +- .../reports/letter-debtor/letter-debtor.js | 33 ++--------- .../reports/previa-label/previa-label.js | 22 ++------ print/templates/reports/receipt/receipt.js | 25 ++------- .../reports/sepa-core/sepa-core.html | 2 +- .../templates/reports/sepa-core/sepa-core.js | 46 ++------------- .../supplier-campaign-metrics.html | 6 +- .../supplier-campaign-metrics.js | 29 ++-------- .../vehicle-event-expired.html | 2 +- .../vehicle-event-expired.js | 19 ++----- print/templates/reports/zone/zone.html | 2 +- print/templates/reports/zone/zone.js | 18 ++---- 44 files changed, 169 insertions(+), 600 deletions(-) diff --git a/print/core/mixins/vn-report.js b/print/core/mixins/vn-report.js index 66b9704e7..4831d8cd9 100644 --- a/print/core/mixins/vn-report.js +++ b/print/core/mixins/vn-report.js @@ -15,7 +15,8 @@ module.exports = { if (entity == null) throw new NotFoundError(); }, - dated: function(filters, date, format) { + formatDate: function(date, format) { + const filters = this.$options.filters; return filters.date(date, format); } }, diff --git a/print/templates/reports/balance-compensation/balance-compensation.html b/print/templates/reports/balance-compensation/balance-compensation.html index 59af1bd11..1e9aa5661 100644 --- a/print/templates/reports/balance-compensation/balance-compensation.html +++ b/print/templates/reports/balance-compensation/balance-compensation.html @@ -3,7 +3,7 @@
-

{{$t('Place')}} {{currentDate()}}

+

{{$t('Place')}} {{formatDate(new Date(), '%d-%m-%Y')}}

{{$t('Compensation') | uppercase}}

{{$t('In one hand')}}:

@@ -17,7 +17,7 @@

{{$t('Agree') | uppercase}}

- {{$t('Date')}} {{client.payed | date('%d-%m-%Y')}} {{$t('Compensate')}} {{client.amountPaid}} € + {{$t('Date')}} {{formatDate(client.payed, '%d-%m-%Y')}} {{$t('Compensate')}} {{client.amountPaid}} € {{$t('From client')}} {{client.name}} {{$t('Toclient')}} {{company.name}}.

diff --git a/print/templates/reports/balance-compensation/balance-compensation.js b/print/templates/reports/balance-compensation/balance-compensation.js index 98a9cf577..bae7c5c3c 100644 --- a/print/templates/reports/balance-compensation/balance-compensation.js +++ b/print/templates/reports/balance-compensation/balance-compensation.js @@ -1,28 +1,12 @@ -const Component = require(`vn-print/core/component`); -const reportBody = new Component('report-body'); +const vnReport = require('../../../core/mixins/vn-report.js'); module.exports = { name: 'balance-compensation', + mixins: [vnReport], async serverPrefetch() { - this.client = await this.fetchClient(this.id); - this.company = await this.fetchCompany(this.id); - }, - methods: { - fetchClient(id) { - return this.findOneFromDef('client', [id]); - }, - fetchCompany(id) { - return this.findOneFromDef('company', [id]); - }, - - currentDate() { - const current = new Date(); - const date = `${current.getDate()}/${current.getMonth() + 1}/${current.getFullYear()}`; - return date; - } - }, - components: { - 'report-body': reportBody.build() + this.client = await this.findOneFromDef('client', [this.id]); + this.checkMainEntity(this.client); + this.company = await this.findOneFromDef('company', [this.id]); }, props: { id: { diff --git a/print/templates/reports/campaign-metrics/campaign-metrics.html b/print/templates/reports/campaign-metrics/campaign-metrics.html index e86d4cd3b..57d616a29 100644 --- a/print/templates/reports/campaign-metrics/campaign-metrics.html +++ b/print/templates/reports/campaign-metrics/campaign-metrics.html @@ -13,11 +13,11 @@ {{$t('From')}} - {{from | date('%d-%m-%Y')}} + {{formatDate(from, '%d-%m-%Y')}} {{$t('To')}} - {{to | date('%d-%m-%Y')}} + {{formatDate(to, '%d-%m-%Y')}} diff --git a/print/templates/reports/campaign-metrics/campaign-metrics.js b/print/templates/reports/campaign-metrics/campaign-metrics.js index 14a4b6a9b..45bca88dc 100755 --- a/print/templates/reports/campaign-metrics/campaign-metrics.js +++ b/print/templates/reports/campaign-metrics/campaign-metrics.js @@ -1,27 +1,12 @@ -const Component = require(`vn-print/core/component`); -const reportBody = new Component('report-body'); -const reportFooter = new Component('report-footer'); +const vnReport = require('../../../core/mixins/vn-report.js'); module.exports = { name: 'campaign-metrics', + mixins: [vnReport], async serverPrefetch() { - this.client = await this.fetchClient(this.id); - this.sales = await this.fetchSales(this.id, this.from, this.to); - - if (!this.client) - throw new Error('Something went wrong'); - }, - methods: { - fetchClient(id) { - return this.findOneFromDef('client', [id]); - }, - fetchSales(id, from, to) { - return this.rawSqlFromDef('sales', [id, from, to]); - }, - }, - components: { - 'report-body': reportBody.build(), - 'report-footer': reportFooter.build() + this.client = await this.findOneFromDef('client', [this.id]); + this.checkMainEntity(this.client); + this.sales = await this.rawSqlFromDef('sales', [this.id, this.from, this.to]); }, props: { id: { diff --git a/print/templates/reports/claim-pickup-order/claim-pickup-order.html b/print/templates/reports/claim-pickup-order/claim-pickup-order.html index b14f5410c..000568ef2 100644 --- a/print/templates/reports/claim-pickup-order/claim-pickup-order.html +++ b/print/templates/reports/claim-pickup-order/claim-pickup-order.html @@ -20,7 +20,7 @@ {{$t('date')}} - {{dated}} + {{formatDate(new Date(), '%d-%m-%Y')}} diff --git a/print/templates/reports/claim-pickup-order/claim-pickup-order.js b/print/templates/reports/claim-pickup-order/claim-pickup-order.js index fc82ee518..cc5cec1ea 100755 --- a/print/templates/reports/claim-pickup-order/claim-pickup-order.js +++ b/print/templates/reports/claim-pickup-order/claim-pickup-order.js @@ -1,36 +1,12 @@ -const Component = require(`vn-print/core/component`); -const reportBody = new Component('report-body'); -const reportFooter = new Component('report-footer'); +const vnReport = require('../../../core/mixins/vn-report.js'); module.exports = { name: 'claim-pickup-order', + mixins: [vnReport], async serverPrefetch() { - // FORCE FAIL FOR TEST - throw new Error('Something went wrong'); - this.client = await this.fetchClient(this.id); - this.sales = await this.fetchSales(this.id); - - if (!this.client) - throw new Error('Something went wrong'); - }, - computed: { - dated: function() { - const filters = this.$options.filters; - - return filters.date(new Date(), '%d-%m-%Y'); - } - }, - methods: { - fetchClient(id) { - return this.findOneFromDef('client', [id]); - }, - fetchSales(id) { - return this.rawSqlFromDef('sales', [id]); - } - }, - components: { - 'report-body': reportBody.build(), - 'report-footer': reportFooter.build() + this.client = await this.findOneFromDef('client', [this.id]); + this.checkMainEntity(this.client); + this.sales = await this.rawSqlFromDef('sales', [this.id]); }, props: { id: { @@ -38,5 +14,5 @@ module.exports = { required: true, description: 'The claim id' } - } + }, }; diff --git a/print/templates/reports/client-debt-statement/client-debt-statement.html b/print/templates/reports/client-debt-statement/client-debt-statement.html index 962af021d..fb7bfd625 100644 --- a/print/templates/reports/client-debt-statement/client-debt-statement.html +++ b/print/templates/reports/client-debt-statement/client-debt-statement.html @@ -13,7 +13,7 @@ {{$t('date')}} - {{dated}} + {{formatDate(new Date(), '%d-%m-%Y');}} @@ -44,7 +44,7 @@ - {{sale.issued | date('%d-%m-%Y')}} + {{formatDate(sale.issued, '%d-%m-%Y');}} {{sale.ref}} {{sale.debtOut}} {{sale.debtIn}} diff --git a/print/templates/reports/client-debt-statement/client-debt-statement.js b/print/templates/reports/client-debt-statement/client-debt-statement.js index 45b97518f..a74595200 100755 --- a/print/templates/reports/client-debt-statement/client-debt-statement.js +++ b/print/templates/reports/client-debt-statement/client-debt-statement.js @@ -1,44 +1,18 @@ -const Component = require(`vn-print/core/component`); -const reportBody = new Component('report-body'); -const reportFooter = new Component('report-footer'); +const vnReport = require('../../../core/mixins/vn-report.js'); module.exports = { name: 'client-debt-statement', + mixins: [vnReport], async serverPrefetch() { - this.client = await this.fetchClient(this.id); - this.sales = await this.fetchSales(this.id, this.from); - - if (!this.client) - throw new Error('Something went wrong'); - }, - computed: { - dated: function() { - const filters = this.$options.filters; - - return filters.date(new Date(), '%d-%m-%Y'); - } + this.client = await this.findOneFromDef('client', [this.id]); + this.checkMainEntity(this.client); + this.sales = await this.rawSqlFromDef('sales', + [this.from, this.id, this.from, this.id, this.from, this.id, this.from, this.id, this.from, this.id]); }, data() { return {totalBalance: 0.00}; }, methods: { - fetchClient(id) { - return this.findOneFromDef('client', [id]); - }, - fetchSales(id, from) { - return this.rawSqlFromDef('sales', [ - from, - id, - from, - id, - from, - id, - from, - id, - from, - id - ]); - }, getBalance(sale) { if (sale.debtOut) this.totalBalance += parseFloat(sale.debtOut); @@ -63,10 +37,6 @@ module.exports = { return debtIn.toFixed(2); }, }, - components: { - 'report-body': reportBody.build(), - 'report-footer': reportFooter.build() - }, props: { id: { type: Number, diff --git a/print/templates/reports/collection-label/collection-label.js b/print/templates/reports/collection-label/collection-label.js index e73afaeea..74024bb56 100644 --- a/print/templates/reports/collection-label/collection-label.js +++ b/print/templates/reports/collection-label/collection-label.js @@ -1,11 +1,10 @@ -const Component = require(`vn-print/core/component`); -const reportBody = new Component('report-body'); const jsBarcode = require('jsbarcode'); const {DOMImplementation, XMLSerializer} = require('xmldom'); -const UserError = require('vn-loopback/util/user-error'); +const vnReport = require('../../../core/mixins/vn-report.js'); module.exports = { name: 'collection-label', + mixins: [vnReport], props: { id: { type: Number, @@ -30,8 +29,7 @@ module.exports = { ticketIds = [this.id]; this.labelsData = await this.rawSqlFromDef('labelsData', [ticketIds]); - if (!this.labelsData.length) - throw new UserError('Empty data source'); + this.checkMainEntity(this.labelsData); }, methods: { getBarcode(id) { @@ -62,7 +60,4 @@ module.exports = { return value; }, }, - components: { - 'report-body': reportBody.build() - }, }; diff --git a/print/templates/reports/credit-request/credit-request.html b/print/templates/reports/credit-request/credit-request.html index d5e336809..c8e3f8c34 100644 --- a/print/templates/reports/credit-request/credit-request.html +++ b/print/templates/reports/credit-request/credit-request.html @@ -159,6 +159,6 @@

diff --git a/print/templates/reports/credit-request/credit-request.js b/print/templates/reports/credit-request/credit-request.js index c1aa74e1b..75e0b2263 100755 --- a/print/templates/reports/credit-request/credit-request.js +++ b/print/templates/reports/credit-request/credit-request.js @@ -1,20 +1,7 @@ -const Component = require(`vn-print/core/component`); -const reportBody = new Component('report-body') -const reportFooter = new Component('report-footer'); +const vnReport = require('../../../core/mixins/vn-report.js'); -const rptCreditRequest = { +module.exports = { name: 'credit-request', - computed: { - dated: function() { - const filters = this.$options.filters; - - return filters.date(new Date(), '%d-%m-%Y'); - } - }, - components: { - 'report-body': reportBody.build(), - 'report-footer': reportFooter.build() - } + mixins: [vnReport], }; -module.exports = rptCreditRequest; diff --git a/print/templates/reports/delivery-note/delivery-note.html b/print/templates/reports/delivery-note/delivery-note.html index 06653c949..9f217ba22 100644 --- a/print/templates/reports/delivery-note/delivery-note.html +++ b/print/templates/reports/delivery-note/delivery-note.html @@ -20,7 +20,7 @@ {{$t('date')}} - {{ticket.shipped | date('%d-%m-%Y')}} + {{formatDate(ticket.shipped, '%d-%m-%Y')}} {{$t('packages')}} @@ -231,7 +231,7 @@
{{$t('digitalSignature')}}
-
{{signature.created | date('%d-%m-%Y')}}
+
{{formatDate(signature.created, '%d-%m-%Y')}}
diff --git a/print/templates/reports/delivery-note/delivery-note.js b/print/templates/reports/delivery-note/delivery-note.js index 1a1a57c59..d9544a58c 100755 --- a/print/templates/reports/delivery-note/delivery-note.js +++ b/print/templates/reports/delivery-note/delivery-note.js @@ -1,25 +1,21 @@ const config = require(`vn-print/core/config`); -const Component = require(`vn-print/core/component`); -const reportBody = new Component('report-body'); -const reportHeader = new Component('report-header'); -const reportFooter = new Component('report-footer'); +const vnReport = require('../../../core/mixins/vn-report.js'); const md5 = require('md5'); const fs = require('fs-extra'); module.exports = { name: 'delivery-note', + mixins: [vnReport], async serverPrefetch() { - this.client = await this.fetchClient(this.id); - this.ticket = await this.fetchTicket(this.id); - this.sales = await this.fetchSales(this.id); - this.address = await this.fetchAddress(this.id); - this.services = await this.fetchServices(this.id); - this.taxes = await this.fetchTaxes(this.id); - this.packagings = await this.fetchPackagings(this.id); - this.signature = await this.fetchSignature(this.id); - - if (!this.ticket) - throw new Error('Something went wrong'); + this.ticket = await this.findOneFromDef('ticket', [this.id]); + this.checkMainEntity(this.ticket); + this.client = await this.findOneFromDef('client', [this.id]); + this.sales = await this.rawSqlFromDef('sales', [this.id]); + this.address = await this.findOneFromDef(`address`, [this.id]); + this.services = await this.rawSqlFromDef('services', [this.id]); + this.taxes = await this.rawSqlFromDef('taxes', [this.id]); + this.packagings = await this.rawSqlFromDef('packagings', [this.id]); + this.signature = await this.findOneFromDef('signature', [this.id]); }, data() { return {totalBalance: 0.00}; @@ -61,31 +57,6 @@ module.exports = { } }, methods: { - fetchClient(id) { - return this.findOneFromDef('client', [id]); - }, - fetchTicket(id) { - return this.findOneFromDef('ticket', [id]); - }, - fetchAddress(id) { - return this.findOneFromDef(`address`, [id]); - }, - fetchSignature(id) { - return this.findOneFromDef('signature', [id]); - }, - fetchTaxes(id) { - return this.findOneFromDef(`taxes`, [id]); - }, - fetchSales(id) { - return this.rawSqlFromDef('sales', [id]); - }, - fetchPackagings(id) { - return this.rawSqlFromDef('packagings', [id]); - }, - fetchServices(id) { - return this.rawSqlFromDef('services', [id]); - }, - getSubTotal() { let subTotal = 0.00; this.sales.forEach(sale => { @@ -125,11 +96,6 @@ module.exports = { ).join(', '); } }, - components: { - 'report-body': reportBody.build(), - 'report-header': reportHeader.build(), - 'report-footer': reportFooter.build() - }, props: { id: { type: Number, diff --git a/print/templates/reports/driver-route/driver-route.html b/print/templates/reports/driver-route/driver-route.html index 48489de6f..1475b8e77 100644 --- a/print/templates/reports/driver-route/driver-route.html +++ b/print/templates/reports/driver-route/driver-route.html @@ -16,13 +16,13 @@ {{$t('date')}} - {{route.created | date('%d-%m-%Y')}} + {{formatDate(route.created, '%d-%m-%Y')}} {{$t('vehicle')}} {{route.vehicleTradeMark}} {{route.vehicleModel}} {{$t('time')}} - {{route.time | date('%H:%M')}} + {{formatDate(route.time, '%H:%M')}} {{route.plateNumber}} diff --git a/print/templates/reports/driver-route/driver-route.js b/print/templates/reports/driver-route/driver-route.js index 1b2e8871a..c166e3809 100755 --- a/print/templates/reports/driver-route/driver-route.js +++ b/print/templates/reports/driver-route/driver-route.js @@ -1,9 +1,8 @@ -const Component = require(`vn-print/core/component`); -const reportBody = new Component('report-body'); -const reportFooter = new Component('report-footer'); +const vnReport = require('../../../core/mixins/vn-report.js'); module.exports = { name: 'driver-route', + mixins: [vnReport], async serverPrefetch() { let ids = this.id; @@ -11,8 +10,8 @@ module.exports = { if (hasMultipleRoutes) ids = this.id.split(','); - const routes = await this.fetchRoutes(ids); - const tickets = await this.fetchTickets(ids); + const routes = await this.rawSqlFromDef('routes', [ids]); + const tickets = await this.rawSqlFromDef('tickets', [ids, ids]); const map = new Map(); @@ -27,20 +26,7 @@ module.exports = { this.routes = routes; - if (!this.routes) - throw new Error('Something went wrong'); - }, - methods: { - fetchRoutes(ids) { - return this.rawSqlFromDef('routes', [ids]); - }, - fetchTickets(ids) { - return this.rawSqlFromDef('tickets', [ids, ids]); - } - }, - components: { - 'report-body': reportBody.build(), - 'report-footer': reportFooter.build() + this.checkMainEntity(this.routes); }, props: { id: { diff --git a/print/templates/reports/entry-order/entry-order.html b/print/templates/reports/entry-order/entry-order.html index 26294787b..5d362dea9 100644 --- a/print/templates/reports/entry-order/entry-order.html +++ b/print/templates/reports/entry-order/entry-order.html @@ -16,7 +16,7 @@ {{$t('date')}} - {{entry.landed | date('%d-%m-%Y')}} + {{formatDate(entry.landed,'%d-%m-%Y')}} {{$t('ref')}} diff --git a/print/templates/reports/entry-order/entry-order.js b/print/templates/reports/entry-order/entry-order.js index 22c5b55fe..d31ad1a36 100755 --- a/print/templates/reports/entry-order/entry-order.js +++ b/print/templates/reports/entry-order/entry-order.js @@ -1,31 +1,18 @@ -const Component = require(`vn-print/core/component`); -const reportBody = new Component('report-body'); -const reportHeader = new Component('report-header'); -const reportFooter = new Component('report-footer'); +const vnReport = require('../../../core/mixins/vn-report.js'); module.exports = { name: 'entry-order', + mixins: [vnReport], async serverPrefetch() { - this.supplier = await this.fetchSupplier(this.id); - this.entry = await this.fetchEntry(this.id); - this.buys = await this.fetchBuys(this.id); - - if (!this.entry) - throw new Error('Something went wrong'); + this.entry = await this.findOneFromDef('entry', [this.id]); + this.checkMainEntity(this.entry); + this.supplier = await this.findOneFromDef('supplier', [this.id]); + this.buys = await this.rawSqlFromDef('buys', [this.id]); }, data() { return {totalBalance: 0.00}; }, methods: { - fetchSupplier(id) { - return this.findOneFromDef('supplier', [id]); - }, - fetchEntry(id) { - return this.findOneFromDef('entry', [id]); - }, - fetchBuys(id) { - return this.rawSqlFromDef('buys', [id]); - }, getTotal() { let total = 0.00; this.buys.forEach(buy => { @@ -35,11 +22,6 @@ module.exports = { return total; } }, - components: { - 'report-body': reportBody.build(), - 'report-header': reportHeader.build(), - 'report-footer': reportFooter.build() - }, props: { id: { type: Number, diff --git a/print/templates/reports/expedition-pallet-label/expedition-pallet-label.js b/print/templates/reports/expedition-pallet-label/expedition-pallet-label.js index 0e8c297e8..321862671 100644 --- a/print/templates/reports/expedition-pallet-label/expedition-pallet-label.js +++ b/print/templates/reports/expedition-pallet-label/expedition-pallet-label.js @@ -1,12 +1,11 @@ -const Component = require(`vn-print/core/component`); -const reportBody = new Component('report-body'); +const vnReport = require('../../../core/mixins/vn-report.js'); const jsBarcode = require('jsbarcode'); const {DOMImplementation, XMLSerializer} = require('xmldom'); -const UserError = require('vn-loopback/util/user-error'); const qrcode = require('qrcode'); module.exports = { name: 'expedition-pallet-label', + mixins: [vnReport], props: { id: { type: Number, @@ -33,8 +32,7 @@ module.exports = { }); this.QR = await this.getQR(QRdata); - if (!this.labelsData.length) - throw new UserError('Empty data source'); + this.checkMainEntity(this.labelsData); }, methods: { getQR(id) { @@ -56,7 +54,4 @@ module.exports = { return xmlSerializer.serializeToString(svgNode); }, }, - components: { - 'report-body': reportBody.build() - }, }; diff --git a/print/templates/reports/exportation/exportation.html b/print/templates/reports/exportation/exportation.html index 920e32a48..0800c024d 100644 --- a/print/templates/reports/exportation/exportation.html +++ b/print/templates/reports/exportation/exportation.html @@ -3,7 +3,7 @@

{{$t('title')}}

{{$t('toAttention')}}

-

+

  • @@ -32,4 +32,4 @@ - \ No newline at end of file + diff --git a/print/templates/reports/exportation/exportation.js b/print/templates/reports/exportation/exportation.js index 9f39aa1a1..123b350ee 100755 --- a/print/templates/reports/exportation/exportation.js +++ b/print/templates/reports/exportation/exportation.js @@ -1,33 +1,13 @@ -const Component = require(`vn-print/core/component`); -const reportBody = new Component('report-body'); -const reportFooter = new Component('report-footer'); +const vnReport = require('../../../core/mixins/vn-report.js'); module.exports = { name: 'exportation', + mixins: [vnReport], async serverPrefetch() { - this.invoice = await this.fetchInvoice(this.reference); - - if (!this.invoice) - throw new Error('Something went wrong'); - + this.invoice = await this.findOneFromDef('invoice', [this.reference]); + this.checkMainEntity(this.invoice); this.company = await this.findOneFromDef('company', [this.invoice.companyFk]); }, - methods: { - fetchInvoice(reference) { - return this.findOneFromDef('invoice', [reference]); - } - }, - computed: { - issued: function() { - const filters = this.$options.filters; - - return filters.date(this.invoice.issued, '%d-%m-%Y'); - } - }, - components: { - 'report-body': reportBody.build(), - 'report-footer': reportFooter.build() - }, props: { reference: { type: Number, diff --git a/print/templates/reports/extra-community/extra-community.html b/print/templates/reports/extra-community/extra-community.html index 6a46cc689..cd61a4f4d 100644 --- a/print/templates/reports/extra-community/extra-community.html +++ b/print/templates/reports/extra-community/extra-community.html @@ -26,7 +26,7 @@ {{$t('shipped')}} - {{travel.shipped | date('%d-%m-%Y')}} + {{formatDate(travel.shipped, '%d-%m-%Y')}} {{$t('physicalKg')}} {{travel.loadedKg | number($i18n.locale)}} @@ -62,6 +62,6 @@
diff --git a/print/templates/reports/extra-community/extra-community.js b/print/templates/reports/extra-community/extra-community.js index 4dfe6e278..9941faa35 100755 --- a/print/templates/reports/extra-community/extra-community.js +++ b/print/templates/reports/extra-community/extra-community.js @@ -1,12 +1,10 @@ -const Component = require(`vn-print/core/component`); -const reportBody = new Component('report-body'); -const reportFooter = new Component('report-footer'); +const vnReport = require('../../../core/mixins/vn-report.js'); const db = require(`vn-print/core/database`); module.exports = { name: 'extra-community', + mixins: [vnReport], async serverPrefetch() { - this.filters = this.$options.filters; const args = { landedTo: this.landedEnd, shippedFrom: this.shippedStart, @@ -21,8 +19,9 @@ module.exports = { }; const travels = await this.fetchTravels(args); + this.checkMainEntity(travels); const travelIds = travels.map(travel => travel.id); - const entries = await this.fetchEntries(travelIds); + const entries = await this.rawSqlFromDef('entries', [travelIds]); const map = new Map(); for (let travel of travels) @@ -35,23 +34,15 @@ module.exports = { } this.travels = travels; - - if (!this.travels) - throw new Error('Something went wrong'); }, computed: { - dated: function() { - return this.filters.date(new Date(), '%d-%m-%Y'); - }, landedEnd: function() { if (!this.landedTo) return; - - return this.filters.date(this.landedTo, '%Y-%m-%d'); + return formatDate(this.landedTo, '%Y-%m-%d'); }, shippedStart: function() { if (!this.shippedFrom) return; - - return this.filters.date(this.shippedFrom, '%Y-%m-%d'); + return formatDate(this.shippedFrom, '%Y-%m-%d'); } }, methods: { @@ -83,25 +74,17 @@ module.exports = { query = db.merge(query, where); query = db.merge(query, 'GROUP BY t.id'); query = db.merge(query, ` - ORDER BY - shipped ASC, - landed ASC, - travelFk, - loadPriority, - agencyModeFk, + ORDER BY + shipped ASC, + landed ASC, + travelFk, + loadPriority, + agencyModeFk, evaNotes `); return this.rawSql(query); }, - - fetchEntries(travelIds) { - return this.rawSqlFromDef('entries', [travelIds]); - } - }, - components: { - 'report-body': reportBody.build(), - 'report-footer': reportFooter.build() }, props: [ 'landedTo', diff --git a/print/templates/reports/incoterms-authorization/incoterms-authorization.js b/print/templates/reports/incoterms-authorization/incoterms-authorization.js index bfe675985..53425487e 100755 --- a/print/templates/reports/incoterms-authorization/incoterms-authorization.js +++ b/print/templates/reports/incoterms-authorization/incoterms-authorization.js @@ -1,23 +1,12 @@ -const Component = require(`vn-print/core/component`); -const reportBody = new Component('report-body'); -const reportFooter = new Component('report-footer'); +const vnReport = require('../../../core/mixins/vn-report.js'); module.exports = { name: 'incoterms-authorization', + mixins: [vnReport], async serverPrefetch() { this.client = await this.findOneFromDef('client', [this.id]); + this.checkMainEntity(this.client); this.company = await this.findOneFromDef('company', [this.companyId]); - if (!this.client) - throw new Error('Something went wrong'); - }, - computed: { - issued: function() { - return new Date(); - } - }, - components: { - 'report-body': reportBody.build(), - 'report-footer': reportFooter.build() }, props: { id: { diff --git a/print/templates/reports/invoice-incoterms/invoice-incoterms.html b/print/templates/reports/invoice-incoterms/invoice-incoterms.html index 20c9ad440..1915828ba 100644 --- a/print/templates/reports/invoice-incoterms/invoice-incoterms.html +++ b/print/templates/reports/invoice-incoterms/invoice-incoterms.html @@ -20,7 +20,7 @@ {{$t('date')}} - {{invoice.issued | date('%d-%m-%Y')}} + {{formatDate(invoice.issued, '%d-%m-%Y')}} diff --git a/print/templates/reports/invoice-incoterms/invoice-incoterms.js b/print/templates/reports/invoice-incoterms/invoice-incoterms.js index 3afc50376..fcaffe5de 100755 --- a/print/templates/reports/invoice-incoterms/invoice-incoterms.js +++ b/print/templates/reports/invoice-incoterms/invoice-incoterms.js @@ -1,34 +1,13 @@ -const Component = require(`vn-print/core/component`); -const reportBody = new Component('report-body'); -const reportHeader = new Component('report-header'); +const vnReport = require('../../../core/mixins/vn-report.js'); module.exports = { name: 'invoice-incoterms', + mixins: [vnReport], async serverPrefetch() { - this.invoice = await this.fetchInvoice(this.reference); - this.client = await this.fetchClient(this.reference); - this.incoterms = await this.fetchIncoterms(this.reference); - - if (!this.invoice) - throw new Error('Something went wrong'); - }, - computed: { - - }, - methods: { - fetchInvoice(reference) { - return this.findOneFromDef('invoice', [reference]); - }, - fetchClient(reference) { - return this.findOneFromDef('client', [reference]); - }, - fetchIncoterms(reference) { - return this.findOneFromDef('incoterms', [reference, reference, reference]); - } - }, - components: { - 'report-body': reportBody.build(), - 'report-header': reportHeader.build() + this.invoice = await this.findOneFromDef('invoice', [this.reference]); + this.checkMainEntity(this.invoice); + this.client = await this.findOneFromDef('client', [this.reference]); + this.incoterms = await this.findOneFromDef('incoterms', [this.reference, this.reference, this.reference]); }, props: { reference: { diff --git a/print/templates/reports/invoice/invoice.html b/print/templates/reports/invoice/invoice.html index d23bba1e9..60d06d528 100644 --- a/print/templates/reports/invoice/invoice.html +++ b/print/templates/reports/invoice/invoice.html @@ -21,7 +21,7 @@ {{$t('date')}} - {{invoice.issued | date('%d-%m-%Y')}} + {{formatDate(invoice.issued, '%d-%m-%Y')}} @@ -53,7 +53,7 @@ {{row.ref}} - {{row.issued | date}} + {{formatDate(row.issued, '%d-%m-%Y')}} {{row.amount | currency('EUR', $i18n.locale)}} {{row.description}} @@ -75,7 +75,7 @@
- {{ticket.shipped | date}} + {{formatDate(ticket.shipped, '%d-%m-%Y')}}
diff --git a/print/templates/reports/invoice/invoice.js b/print/templates/reports/invoice/invoice.js index f7011ad81..7b572d970 100755 --- a/print/templates/reports/invoice/invoice.js +++ b/print/templates/reports/invoice/invoice.js @@ -1,22 +1,21 @@ -const Component = require(`vn-print/core/component`); const Report = require(`vn-print/core/report`); -const reportBody = new Component('report-body'); -const reportHeader = new Component('report-header'); -const reportFooter = new Component('report-footer'); +const vnReport = require('../../../core/mixins/vn-report.js'); const invoiceIncoterms = new Report('invoice-incoterms'); module.exports = { name: 'invoice', + mixins: [vnReport], async serverPrefetch() { - this.invoice = await this.fetchInvoice(this.reference); - this.client = await this.fetchClient(this.reference); - this.taxes = await this.fetchTaxes(this.reference); - this.intrastat = await this.fetchIntrastat(this.reference); - this.rectified = await this.fetchRectified(this.reference); - this.hasIncoterms = await this.fetchHasIncoterms(this.reference); + this.invoice = await this.findOneFromDef('invoice', [this.reference]); + this.checkMainEntity(this.invoice); + this.client = await this.findOneFromDef('client', [this.reference]); + this.taxes = await this.rawSqlFromDef(`taxes`, [this.reference]); + this.intrastat = await this.rawSqlFromDef(`intrastat`, [this.reference, this.reference, this.reference]); + this.rectified = await this.rawSqlFromDef(`rectified`, [this.reference]); + this.hasIncoterms = await this.findValueFromDef(`hasIncoterms`, [this.reference]); - const tickets = await this.fetchTickets(this.reference); - const sales = await this.fetchSales(this.reference); + const tickets = await this.rawSqlFromDef('tickets', [this.reference]); + const sales = await this.rawSqlFromDef('sales', [this.reference, this.reference]); const map = new Map(); @@ -33,9 +32,6 @@ module.exports = { } this.tickets = tickets; - - if (!this.invoice) - throw new Error('Something went wrong'); }, data() { return {totalBalance: 0.00}; @@ -66,30 +62,6 @@ module.exports = { } }, methods: { - fetchInvoice(reference) { - return this.findOneFromDef('invoice', [reference]); - }, - fetchClient(reference) { - return this.findOneFromDef('client', [reference]); - }, - fetchTickets(reference) { - return this.rawSqlFromDef('tickets', [reference]); - }, - fetchSales(reference) { - return this.rawSqlFromDef('sales', [reference, reference]); - }, - fetchTaxes(reference) { - return this.rawSqlFromDef(`taxes`, [reference]); - }, - fetchIntrastat(reference) { - return this.rawSqlFromDef(`intrastat`, [reference, reference, reference]); - }, - fetchRectified(reference) { - return this.rawSqlFromDef(`rectified`, [reference]); - }, - fetchHasIncoterms(reference) { - return this.findValueFromDef(`hasIncoterms`, [reference]); - }, saleImport(sale) { const price = sale.quantity * sale.price; @@ -111,9 +83,6 @@ module.exports = { } }, components: { - 'report-body': reportBody.build(), - 'report-header': reportHeader.build(), - 'report-footer': reportFooter.build(), 'invoice-incoterms': invoiceIncoterms.build() }, props: { diff --git a/print/templates/reports/invoiceIn/invoiceIn.html b/print/templates/reports/invoiceIn/invoiceIn.html index f101f7408..22988b654 100644 --- a/print/templates/reports/invoiceIn/invoiceIn.html +++ b/print/templates/reports/invoiceIn/invoiceIn.html @@ -19,7 +19,7 @@ {{$t('date')}} - {{invoice.created | date('%d-%m-%Y')}} + {{formatDate(invoice.created, '%d-%m-%Y')}} @@ -54,7 +54,7 @@
- {{entry.landed | date}} + {{formatDate(entry.landed, '%d-%m-%Y')}}
diff --git a/print/templates/reports/invoiceIn/invoiceIn.js b/print/templates/reports/invoiceIn/invoiceIn.js index 03549c276..c59f4da7d 100755 --- a/print/templates/reports/invoiceIn/invoiceIn.js +++ b/print/templates/reports/invoiceIn/invoiceIn.js @@ -1,15 +1,14 @@ -const Component = require(`vn-print/core/component`); -const reportBody = new Component('report-body'); -const reportHeader = new Component('report-header'); -const reportFooter = new Component('report-footer'); +const vnReport = require('../../../core/mixins/vn-report.js'); module.exports = { name: 'invoiceIn', + mixins: [vnReport], async serverPrefetch() { - this.invoice = await this.fetchInvoice(this.id); + this.invoice = await this.findOneFromDef('invoice', [this.id]); + this.checkMainEntity(this.invoice); this.taxes = await this.fetchTaxes(this.id); - let defaultTax = await this.fetchDefaultTax(); + let defaultTax = await this.findOneFromDef('defaultTax'); if (defaultTax) { defaultTax = Object.assign(defaultTax, { @@ -19,11 +18,8 @@ module.exports = { this.taxes.push(defaultTax); } - if (!this.invoice) - throw new Error('Something went wrong'); - - const entries = await this.fetchEntry(this.id); - const buys = await this.fetchBuy(this.id); + const entries = await this.rawSqlFromDef('entry', [this.id]); + const buys = await this.rawSqlFromDef('buy', [this.id]); const map = new Map(); @@ -41,21 +37,7 @@ module.exports = { this.entries = entries; }, - computed: { - }, methods: { - fetchInvoice(id) { - return this.findOneFromDef('invoice', [id]); - }, - fetchEntry(id) { - return this.rawSqlFromDef('entry', [id]); - }, - fetchBuy(id) { - return this.rawSqlFromDef('buy', [id]); - }, - fetchDefaultTax() { - return this.findOneFromDef('defaultTax'); - }, async fetchTaxes(id) { const taxes = await this.rawSqlFromDef(`taxes`, [id]); return this.taxVat(taxes); @@ -95,11 +77,6 @@ module.exports = { return base + vat; } }, - components: { - 'report-body': reportBody.build(), - 'report-header': reportHeader.build(), - 'report-footer': reportFooter.build(), - }, props: { id: { type: Number, diff --git a/print/templates/reports/item-label/item-label.html b/print/templates/reports/item-label/item-label.html index 49593f7dd..66509ab38 100644 --- a/print/templates/reports/item-label/item-label.html +++ b/print/templates/reports/item-label/item-label.html @@ -16,7 +16,7 @@
{{packing()}}
-
{{dated}}
+
{{formatDate(new Date(), '%W/%d')}}
{{labelPage}}
{{item.size}}
diff --git a/print/templates/reports/item-label/item-label.js b/print/templates/reports/item-label/item-label.js index 6341bd11a..c5b9cdfd7 100755 --- a/print/templates/reports/item-label/item-label.js +++ b/print/templates/reports/item-label/item-label.js @@ -1,24 +1,17 @@ -const Component = require(`vn-print/core/component`); -const reportBody = new Component('report-body'); +const vnReport = require('../../../core/mixins/vn-report.js'); const qrcode = require('qrcode'); module.exports = { name: 'item-label', + mixins: [vnReport], async serverPrefetch() { - this.item = await this.fetchItem(this.id, this.warehouseId); + this.item = await this.findOneFromDef('item', [this.id, this.warehouseId]); + this.checkMainEntity(this.item); this.tags = await this.fetchItemTags(this.id); this.barcode = await this.getBarcodeBase64(this.id); - - if (!this.item) - throw new Error('Something went wrong'); }, computed: { - dated() { - const filters = this.$options.filters; - - return filters.date(new Date(), '%W/%d'); - }, labelPage() { const labelNumber = this.labelNumber ? this.labelNumber : 1; const totalLabels = this.totalLabels ? this.totalLabels : 1; @@ -27,9 +20,6 @@ module.exports = { } }, methods: { - fetchItem(id, warehouseId) { - return this.findOneFromDef('item', [id, warehouseId]); - }, fetchItemTags(id) { return this.rawSqlFromDef('itemTags', [id]).then(rows => { const tags = {}; @@ -48,9 +38,6 @@ module.exports = { return `${this.item.packing}x${stems}`; } }, - components: { - 'report-body': reportBody.build() - }, props: { id: { type: Number, diff --git a/print/templates/reports/letter-debtor/letter-debtor.html b/print/templates/reports/letter-debtor/letter-debtor.html index 962af021d..30fbbe003 100644 --- a/print/templates/reports/letter-debtor/letter-debtor.html +++ b/print/templates/reports/letter-debtor/letter-debtor.html @@ -13,7 +13,7 @@ {{$t('date')}} - {{dated}} + {{formatDate(new Date(), '%d-%m-%Y')}} @@ -44,7 +44,7 @@ - {{sale.issued | date('%d-%m-%Y')}} + {{formatDate(sale.issued, '%d-%m-%Y')}} {{sale.ref}} {{sale.debtOut}} {{sale.debtIn}} diff --git a/print/templates/reports/letter-debtor/letter-debtor.js b/print/templates/reports/letter-debtor/letter-debtor.js index 749fde4ed..4446b13ae 100755 --- a/print/templates/reports/letter-debtor/letter-debtor.js +++ b/print/templates/reports/letter-debtor/letter-debtor.js @@ -1,36 +1,17 @@ -const Component = require(`vn-print/core/component`); -const reportBody = new Component('report-body'); -const reportFooter = new Component('report-footer'); +const vnReport = require('../../../core/mixins/vn-report.js'); module.exports = { name: 'letter-debtor', + mixins: [vnReport], async serverPrefetch() { - this.client = await this.fetchClient(this.id); - this.sales = await this.fetchSales(this.id, this.companyId); - - if (!this.client) - throw new Error('Something went wrong'); - }, - computed: { - dated: function() { - const filters = this.$options.filters; - - return filters.date(new Date(), '%d-%m-%Y'); - } + this.client = await this.findOneFromDef('client', [this.id]); + this.checkMainEntity(this.client); + this.sales = await this.findOneFromDef('sales', [this.id, this.companyId]); }, data() { return {totalBalance: 0.00}; }, methods: { - fetchClient(id) { - return this.findOneFromDef('client', [id]); - }, - fetchSales(id, companyId) { - return this.findOneFromDef('sales', [ - id, - companyId - ]); - }, getBalance(sale) { if (sale.debtOut) this.totalBalance += parseFloat(sale.debtOut); @@ -57,10 +38,6 @@ module.exports = { return debtIn.toFixed(2); }, }, - components: { - 'report-body': reportBody.build(), - 'report-footer': reportFooter.build() - }, props: { id: { type: Number, diff --git a/print/templates/reports/previa-label/previa-label.js b/print/templates/reports/previa-label/previa-label.js index 7ad5ea961..833a15499 100755 --- a/print/templates/reports/previa-label/previa-label.js +++ b/print/templates/reports/previa-label/previa-label.js @@ -1,36 +1,24 @@ -const Component = require(`vn-print/core/component`); -const reportBody = new Component('report-body'); +const vnReport = require('../../../core/mixins/vn-report.js'); const qrcode = require('qrcode'); -const UserError = require('vn-loopback/util/user-error'); module.exports = { name: 'previa-label', + mixins: [vnReport], async serverPrefetch() { - this.previa = await this.fetchPrevia(this.id); - this.sector = await this.fetchSector(this.id); + this.sector = await this.findOneFromDef('sector', [this.id]); + this.checkMainEntity(this.sector); + this.previa = await this.findOneFromDef('previa', [this.id]); this.barcode = await this.getBarcodeBase64(this.id); if (this.previa) this.previa = this.previa[0]; - - if (!this.sector) - throw new UserError('Something went wrong - no sector found'); }, methods: { - fetchPrevia(id) { - return this.findOneFromDef('previa', [id]); - }, getBarcodeBase64(id) { const data = String(id); return qrcode.toDataURL(data, {margin: 0}); }, - fetchSector(id) { - return this.findOneFromDef('sector', [id]); - } - }, - components: { - 'report-body': reportBody.build() }, props: { id: { diff --git a/print/templates/reports/receipt/receipt.js b/print/templates/reports/receipt/receipt.js index 9a9ccd452..89a431adf 100755 --- a/print/templates/reports/receipt/receipt.js +++ b/print/templates/reports/receipt/receipt.js @@ -1,27 +1,12 @@ -const Component = require(`vn-print/core/component`); -const reportBody = new Component('report-body'); -const reportFooter = new Component('report-footer'); +const vnReport = require('../../../core/mixins/vn-report.js'); module.exports = { name: 'receipt', + mixins: [vnReport], async serverPrefetch() { - this.client = await this.fetchClient(this.id); - this.receipt = await this.fetchReceipt(this.id); - - if (!this.receipt) - throw new Error('Something went wrong'); - }, - methods: { - fetchClient(id) { - return this.findOneFromDef('client', [id]); - }, - fetchReceipt(id) { - return this.findOneFromDef('receipt', [id]); - } - }, - components: { - 'report-body': reportBody.build(), - 'report-footer': reportFooter.build() + this.receipt = await this.findOneFromDef('receipt', [this.id]); + this.checkMainEntity(this.receipt); + this.client = await this.findOneFromDef('client', [this.id]); }, props: { id: { diff --git a/print/templates/reports/sepa-core/sepa-core.html b/print/templates/reports/sepa-core/sepa-core.html index f2326e43c..a8c270ad5 100644 --- a/print/templates/reports/sepa-core/sepa-core.html +++ b/print/templates/reports/sepa-core/sepa-core.html @@ -147,7 +147,7 @@ {{$t('client.signLocation')}} - {{dated}}, {{client.province}} + {{formatDate(new Date(), '%d-%m-%Y')}}, {{client.province}} {{$t('client.sign')}} diff --git a/print/templates/reports/sepa-core/sepa-core.js b/print/templates/reports/sepa-core/sepa-core.js index ee8a64842..0e19d2a6a 100755 --- a/print/templates/reports/sepa-core/sepa-core.js +++ b/print/templates/reports/sepa-core/sepa-core.js @@ -1,44 +1,12 @@ -const Component = require(`vn-print/core/component`); -const reportBody = new Component('report-body'); -const reportHeader = new Component('report-header'); -const reportFooter = new Component('report-footer'); +const vnReport = require('../../../core/mixins/vn-report.js'); -const rptSepaCore = { +module.exports = { name: 'sepa-core', + mixins: [vnReport], async serverPrefetch() { - this.client = await this.fetchClient(this.id, this.companyId); - this.supplier = await this.fetchSupplier(this.id, this.companyId); - - if (!this.client) - throw new Error('Something went wrong'); - }, - computed: { - dated: function() { - const filters = this.$options.filters; - - return filters.date(new Date(), '%d-%m-%Y'); - } - }, - methods: { - fetchClient(id, companyId) { - return this.findOneFromDef('client', [ - companyId, - companyId, - id - ]); - }, - fetchSupplier(id, companyId) { - return this.findOneFromDef('supplier', [ - companyId, - companyId, - id - ]); - } - }, - components: { - 'report-body': reportBody.build(), - 'report-header': reportHeader.build(), - 'report-footer': reportFooter.build() + this.client = await this.findOneFromDef('client', [this.companyId, this.companyId, this.id]); + this.checkMainEntity(this.client); + this.supplier = await this.findOneFromDef('supplier', [this.companyId, this.companyId, this.id]); }, props: { id: { @@ -52,5 +20,3 @@ const rptSepaCore = { } } }; - -module.exports = rptSepaCore; diff --git a/print/templates/reports/supplier-campaign-metrics/supplier-campaign-metrics.html b/print/templates/reports/supplier-campaign-metrics/supplier-campaign-metrics.html index baff51bfe..08b27d0bd 100644 --- a/print/templates/reports/supplier-campaign-metrics/supplier-campaign-metrics.html +++ b/print/templates/reports/supplier-campaign-metrics/supplier-campaign-metrics.html @@ -13,11 +13,11 @@ {{$t('From')}} - {{from | date('%d-%m-%Y')}} + {{formatDate(from, '%d-%m-%Y')}} {{$t('To')}} - {{to | date('%d-%m-%Y')}} + {{formatDate(to, '%d-%m-%Y')}} @@ -38,7 +38,7 @@

{{$t('entry')}} {{entry.id}} - {{$t('dated')}} {{entry.shipped | date('%d-%m-%Y')}} + {{$t('dated')}} {{formatDate(entry.shipped, '%d-%m-%Y')}} {{$t('reference')}} {{entry.reference}}

diff --git a/print/templates/reports/supplier-campaign-metrics/supplier-campaign-metrics.js b/print/templates/reports/supplier-campaign-metrics/supplier-campaign-metrics.js index f6fb4bd4e..32a7e9b0a 100755 --- a/print/templates/reports/supplier-campaign-metrics/supplier-campaign-metrics.js +++ b/print/templates/reports/supplier-campaign-metrics/supplier-campaign-metrics.js @@ -1,19 +1,19 @@ -const Component = require(`vn-print/core/component`); -const reportBody = new Component('report-body'); -const reportFooter = new Component('report-footer'); +const vnReport = require('../../../core/mixins/vn-report.js'); module.exports = { name: 'supplier-campaign-metrics', + mixins: [vnReport], async serverPrefetch() { - this.supplier = await this.fetchSupplier(this.id); - let entries = await this.fetchEntries(this.id, this.from, this.to); + this.supplier = await this.findOneFromDef('supplier', [this.id]); + this.checkMainEntity(this.supplier); + let entries = await this.rawSqlFromDef('entries', [this.id, this.from, this.to]); const entriesId = []; for (let entry of entries) entriesId.push(entry.id); - const buys = await this.fetchBuys(entriesId); + const buys = await this.rawSqlFromDef('buys', [entriesId]); const entriesMap = new Map(); for (let entry of entries) @@ -29,23 +29,6 @@ module.exports = { } this.entries = entries; - if (!this.supplier) - throw new Error('Something went wrong'); - }, - methods: { - fetchSupplier(supplierId) { - return this.findOneFromDef('supplier', [supplierId]); - }, - fetchEntries(supplierId, from, to) { - return this.rawSqlFromDef('entries', [supplierId, from, to]); - }, - fetchBuys(entriesId) { - return this.rawSqlFromDef('buys', [entriesId]); - } - }, - components: { - 'report-body': reportBody.build(), - 'report-footer': reportFooter.build() }, props: { id: { diff --git a/print/templates/reports/vehicle-event-expired/vehicle-event-expired.html b/print/templates/reports/vehicle-event-expired/vehicle-event-expired.html index 65776851d..7435f272d 100644 --- a/print/templates/reports/vehicle-event-expired/vehicle-event-expired.html +++ b/print/templates/reports/vehicle-event-expired/vehicle-event-expired.html @@ -16,7 +16,7 @@ - +
{{vehicleEvent.numberPlate}} {{vehicleEvent.description}}{{vehicleEvent.finished | date('%d-%m-%Y')}}{{formatDate(vehicleEvent.finished, '%d-%m-%Y')}}
diff --git a/print/templates/reports/vehicle-event-expired/vehicle-event-expired.js b/print/templates/reports/vehicle-event-expired/vehicle-event-expired.js index ab6cffc00..b49e770a5 100755 --- a/print/templates/reports/vehicle-event-expired/vehicle-event-expired.js +++ b/print/templates/reports/vehicle-event-expired/vehicle-event-expired.js @@ -1,21 +1,10 @@ -const Component = require(`vn-print/core/component`); -const reportBody = new Component('report-body'); - +const vnReport = require('../../../core/mixins/vn-report.js'); module.exports = { name: 'vehicle-event-expired', + mixins: [vnReport], async serverPrefetch() { - this.vehicleEvents = await this.fetchVehicleEvent(this.eventIds); - - if (!this.vehicleEvents) - throw new Error('Something went wrong'); - }, - methods: { - fetchVehicleEvent(vehicleEventIds) { - return this.rawSqlFromDef('vehicleEvents', [vehicleEventIds]); - }, - }, - components: { - 'report-body': reportBody.build() + this.vehicleEvents = await this.rawSqlFromDef('vehicleEvents', [this.eventIds]); + this.checkMainEntity(this.vehicleEvents); }, props: { eventIds: { diff --git a/print/templates/reports/zone/zone.html b/print/templates/reports/zone/zone.html index 54c55e168..fe42fb2ad 100644 --- a/print/templates/reports/zone/zone.html +++ b/print/templates/reports/zone/zone.html @@ -1,5 +1,5 @@
{{zone.agencyName}}
{{zone.id}}
-
{{zone.plateNumber}} {{zone.time | date('%H:%M')}}
+
{{zone.plateNumber}} {{formatDate(zone.time, '%H:%M')}}
diff --git a/print/templates/reports/zone/zone.js b/print/templates/reports/zone/zone.js index 720542cd6..5baa41b8e 100755 --- a/print/templates/reports/zone/zone.js +++ b/print/templates/reports/zone/zone.js @@ -1,21 +1,11 @@ -const Component = require(`vn-print/core/component`); -const reportBody = new Component('report-body'); +const vnReport = require('../../../core/mixins/vn-report.js'); module.exports = { name: 'zone', + mixins: [vnReport], async serverPrefetch() { - this.zone = await this.fetchZone(this.id); - - if (!this.zone) - throw new Error('Something went wrong'); - }, - methods: { - fetchZone(id) { - return this.findOneFromDef('zone', [id]); - } - }, - components: { - 'report-body': reportBody.build() + this.zone = await this.findOneFromDef('zone', [this.id]); + this.checkMainEntity(this.zone); }, props: { id: { From ca7154bff1f8f32432ef8992b2ba7df97e86e437 Mon Sep 17 00:00:00 2001 From: alexandre Date: Tue, 24 Jan 2023 12:16:10 +0100 Subject: [PATCH 32/33] hotfix itemName --- modules/order/front/catalog/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/order/front/catalog/index.js b/modules/order/front/catalog/index.js index 5fdd2e238..c0777ebc9 100644 --- a/modules/order/front/catalog/index.js +++ b/modules/order/front/catalog/index.js @@ -157,7 +157,7 @@ class Controller extends Section { * Apply order to model */ applyOrder() { - if (this.typeId || this.tagGroups.length > 0) + if (this.typeId || this.tagGroups.length > 0 || this.itemName) this.$.model.addFilter(null, {orderBy: this.getOrderBy()}); } From 3ed04211fd82d788e018994abeccf12238d4c407 Mon Sep 17 00:00:00 2001 From: joan Date: Thu, 26 Jan 2023 13:05:12 +0100 Subject: [PATCH 33/33] Updated package version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2031da475..46b7d4ffc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "salix-back", - "version": "23.02.03", + "version": "23.04.01", "author": "Verdnatura Levante SL", "description": "Salix backend", "license": "GPL-3.0",