+Please enter the verification code that we have sent to your email address within 5 minutes.
+
+
\ No newline at end of file
diff --git a/front/salix/components/validate-email/index.js b/front/salix/components/validate-email/index.js
index c10e1b2b0..f337ab8af 100644
--- a/front/salix/components/validate-email/index.js
+++ b/front/salix/components/validate-email/index.js
@@ -2,47 +2,42 @@ import ngModule from '../../module';
import './style.scss';
export default class Controller {
- constructor($scope, $element, $http, vnApp, $translate, $state, $location) {
+ constructor($scope, $element, vnAuth, $state) {
Object.assign(this, {
$scope,
$element,
- $http,
- vnApp,
- $translate,
- $state,
- $location
+ vnAuth,
+ user: localStorage.getItem('lastUser'),
+ remember: true,
+ $state
});
}
$onInit() {
- this.$http.get('UserPasswords/findOne')
- .then(res => {
- this.passRequirements = res.data;
- });
+ this.loginData = this.outLayout.login;
+ if (!this.loginData)
+ this.$state.go('login');
}
submit() {
- if (!this.newPassword)
- throw new UserError(`You must enter a new password`);
- if (this.newPassword != this.repeatPassword)
- throw new UserError(`Passwords don't match`);
-
- const headers = {
- Authorization: this.$location.$$search.access_token
- };
-
- const newPassword = this.newPassword;
-
- this.$http.post('users/reset-password', {newPassword}, {headers})
+ this.loading = true;
+ this.vnAuth.validateCode(this.loginData.user, this.loginData.password, this.code, this.loginData.remember)
.then(() => {
- this.vnApp.showSuccess(this.$translate.instant('Password changed!'));
- this.$state.go('login');
+ localStorage.setItem('lastUser', this.user);
+ this.loading = false;
+ })
+ .catch(error => {
+ this.loading = false;
+ throw error;
});
}
}
-Controller.$inject = ['$scope', '$element', '$http', 'vnApp', '$translate', '$state', '$location'];
+Controller.$inject = ['$scope', '$element', 'vnAuth', '$state'];
ngModule.vnComponent('vnValidateEmail', {
template: require('./index.html'),
- controller: Controller
+ controller: Controller,
+ require: {
+ outLayout: '^vnOutLayout'
+ }
});
diff --git a/loopback/locale/es.json b/loopback/locale/es.json
index 42276efe7..70ba15098 100644
--- a/loopback/locale/es.json
+++ b/loopback/locale/es.json
@@ -273,6 +273,8 @@
"Not exist this branch": "La rama no existe",
"This ticket cannot be signed because it has not been boxed": "Este ticket no puede firmarse porque no ha sido encajado",
"Insert a date range": "Inserte un rango de fechas",
- "Added observation": "{{user}} añadió esta observacion: {{text}}",
- "Comment added to client": "Observación añadida al cliente {{clientFk}}"
-}
+ "Added observation": "{{user}} añadió esta observacion: {{text}}",
+ "Comment added to client": "Observación añadida al cliente {{clientFk}}",
+ "Invalid auth code": "Invalid auth code",
+ "Invalid or expired verification code": "Invalid or expired verification code"
+}
\ No newline at end of file
diff --git a/loopback/util/forbiddenError.js b/loopback/util/forbiddenError.js
new file mode 100644
index 000000000..998cb4593
--- /dev/null
+++ b/loopback/util/forbiddenError.js
@@ -0,0 +1,9 @@
+module.exports = class ForbiddenError extends Error {
+ constructor(message, code, ...translateArgs) {
+ super(message);
+ this.name = 'ForbiddenError';
+ this.statusCode = 403;
+ this.code = code;
+ this.translateArgs = translateArgs;
+ }
+};
diff --git a/print/templates/email/auth-code/assets/css/import.js b/print/templates/email/auth-code/assets/css/import.js
new file mode 100644
index 000000000..7360587f7
--- /dev/null
+++ b/print/templates/email/auth-code/assets/css/import.js
@@ -0,0 +1,13 @@
+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`,
+ `${__dirname}/style.css`])
+ .mergeStyles();
+
diff --git a/print/templates/email/auth-code/assets/css/style.css b/print/templates/email/auth-code/assets/css/style.css
new file mode 100644
index 000000000..d3bfa2aea
--- /dev/null
+++ b/print/templates/email/auth-code/assets/css/style.css
@@ -0,0 +1,5 @@
+.code {
+ border: 2px dashed #8dba25;
+ border-radius: 3px;
+ text-align: center
+}
\ No newline at end of file
diff --git a/print/templates/email/auth-code/auth-code.html b/print/templates/email/auth-code/auth-code.html
new file mode 100644
index 000000000..ea87e6c66
--- /dev/null
+++ b/print/templates/email/auth-code/auth-code.html
@@ -0,0 +1,17 @@
+
+
+
+
{{ $t('title') }}
+
+
+
+
+
+
{{$t('Enter the following code to continue to your account')}}
+
+ {{ code }}
+
+
{{$t('It expires in 5 minutes.')}}
+
+
+
\ No newline at end of file
diff --git a/print/templates/email/auth-code/auth-code.js b/print/templates/email/auth-code/auth-code.js
new file mode 100755
index 000000000..7ddd1c2db
--- /dev/null
+++ b/print/templates/email/auth-code/auth-code.js
@@ -0,0 +1,15 @@
+const Component = require(`vn-print/core/component`);
+const emailBody = new Component('email-body');
+
+module.exports = {
+ name: 'auth-code',
+ components: {
+ 'email-body': emailBody.build(),
+ },
+ props: {
+ code: {
+ type: String,
+ required: true
+ }
+ }
+};
diff --git a/print/templates/email/auth-code/locale/es.yml b/print/templates/email/auth-code/locale/es.yml
new file mode 100644
index 000000000..b77937468
--- /dev/null
+++ b/print/templates/email/auth-code/locale/es.yml
@@ -0,0 +1,5 @@
+subject: Código de verificación
+title: Código de verificación
+description: Alguien ha solicitado un código de verificación para poder iniciar sesión. Si no lo has solicitado tu, ignora este email.
+Enter the following code to continue to your account: Introduce el siguiente código para poder continuar con tu cuenta
+It expires in 5 minutes.: Expira en 5 minutos
From b9e48f2102e3e4214f910e9f402bf977d0e04c77 Mon Sep 17 00:00:00 2001
From: joan
Date: Tue, 11 Apr 2023 07:39:43 +0200
Subject: [PATCH 0007/1087] Added translations & enable through departments
---
db/changes/231401/00-authCode.sql | 4 ++--
db/changes/231401/00-department.sql | 24 +++++++++++++++++++
db/changes/231401/00-user.sql | 3 +--
.../components/validate-email/index.html | 2 +-
.../components/validate-email/locale/en.yml | 4 ----
.../components/validate-email/locale/es.yml | 12 ++++------
.../components/validate-email/style.scss | 2 +-
print/templates/email/auth-code/locale/fr.yml | 5 ++++
print/templates/email/auth-code/locale/pt.yml | 5 ++++
9 files changed, 43 insertions(+), 18 deletions(-)
create mode 100644 db/changes/231401/00-department.sql
delete mode 100644 front/salix/components/validate-email/locale/en.yml
create mode 100644 print/templates/email/auth-code/locale/fr.yml
create mode 100644 print/templates/email/auth-code/locale/pt.yml
diff --git a/db/changes/231401/00-authCode.sql b/db/changes/231401/00-authCode.sql
index 7f742d4af..0415c90f0 100644
--- a/db/changes/231401/00-authCode.sql
+++ b/db/changes/231401/00-authCode.sql
@@ -8,7 +8,7 @@ create table `salix`.`authCode`
constraint authCode_unique
unique (code),
constraint authCode_user_id_fk
- foreign key (userFk) references account.user (id)
+ foreign key (userFk) references `account`.`user` (id)
on update cascade on delete cascade
);
@@ -22,6 +22,6 @@ create table `salix`.`userAccess`
constraint userAccess_pk
primary key (userFk),
constraint userAccess_user_null_fk
- foreign key (userFk) references account.user (id)
+ foreign key (userFk) references `account`.`user` (id)
)
auto_increment = 0;
\ No newline at end of file
diff --git a/db/changes/231401/00-department.sql b/db/changes/231401/00-department.sql
new file mode 100644
index 000000000..ffc3a1622
--- /dev/null
+++ b/db/changes/231401/00-department.sql
@@ -0,0 +1,24 @@
+alter table `vn`.`department`
+ add `twoFactor` ENUM ('email') null comment 'Default user tow-factor auth type';
+
+drop trigger `vn`.`department_afterUpdate`;
+
+DELIMITER $$
+$$
+create definer = root@localhost trigger department_afterUpdate
+ after update
+ on department
+ for each row
+BEGIN
+ IF !(OLD.parentFk <=> NEW.parentFk) THEN
+ UPDATE vn.department_recalc SET isChanged = TRUE;
+ END IF;
+
+ IF !(OLD.twoFactor <=> NEW.twoFactor) THEN
+ UPDATE account.user u
+ JOIN vn.workerDepartment wd ON wd.workerFk = u.id
+ SET u.twoFactor = NEW.twoFactor
+ WHERE wd.departmentFk = NEW.id;
+ END IF;
+END;$$
+DELIMITER ;
diff --git a/db/changes/231401/00-user.sql b/db/changes/231401/00-user.sql
index 1427d0460..2a2a522c5 100644
--- a/db/changes/231401/00-user.sql
+++ b/db/changes/231401/00-user.sql
@@ -1,3 +1,2 @@
alter table `account`.`user`
- add `twoFactor` ENUM ('email') null comment 'Two factor auth type';
-
+ add `twoFactor` ENUM ('email') null comment 'Two-factor auth type';
\ No newline at end of file
diff --git a/front/salix/components/validate-email/index.html b/front/salix/components/validate-email/index.html
index e03cb9dcb..3607e1a76 100644
--- a/front/salix/components/validate-email/index.html
+++ b/front/salix/components/validate-email/index.html
@@ -1,5 +1,5 @@
Enter verification code
-Please enter the verification code that we have sent to your email address within 5 minutes.
+Please enter the verification code that we have sent to your email address within 5 minutes
\ No newline at end of file
diff --git a/print/templates/email/auth-code/locale/en.yml b/print/templates/email/auth-code/locale/en.yml
new file mode 100644
index 000000000..5f63d280f
--- /dev/null
+++ b/print/templates/email/auth-code/locale/en.yml
@@ -0,0 +1,5 @@
+subject: Verification code
+title: Verification code
+description: Somebody did request a verification code for login. If you didn't request it, please ignore this email.
+Enter the following code to continue to your account: Enter the following code to continue to your account
+It expires in 5 minutes: It expires in 5 minutes
diff --git a/print/templates/email/auth-code/locale/es.yml b/print/templates/email/auth-code/locale/es.yml
index b77937468..31952891b 100644
--- a/print/templates/email/auth-code/locale/es.yml
+++ b/print/templates/email/auth-code/locale/es.yml
@@ -2,4 +2,4 @@ subject: Código de verificación
title: Código de verificación
description: Alguien ha solicitado un código de verificación para poder iniciar sesión. Si no lo has solicitado tu, ignora este email.
Enter the following code to continue to your account: Introduce el siguiente código para poder continuar con tu cuenta
-It expires in 5 minutes.: Expira en 5 minutos
+It expires in 5 minutes: Expira en 5 minutos
diff --git a/print/templates/email/auth-code/locale/fr.yml b/print/templates/email/auth-code/locale/fr.yml
index 34fee9d1e..e435a2487 100644
--- a/print/templates/email/auth-code/locale/fr.yml
+++ b/print/templates/email/auth-code/locale/fr.yml
@@ -2,4 +2,4 @@ subject: Code de vérification
title: Code de vérification
description: Quelqu'un a demandé un code de vérification pour se connecter. Si ce n'était pas toi, ignore cet email.
Enter the following code to continue to your account: Entrez le code suivant pour continuer avec votre compte
-It expires in 5 minutes.: Il expire dans 5 minutes.
+It expires in 5 minutes: Il expire dans 5 minutes.
diff --git a/print/templates/email/auth-code/locale/pt.yml b/print/templates/email/auth-code/locale/pt.yml
index 9ffa1b2f6..940b03c4d 100644
--- a/print/templates/email/auth-code/locale/pt.yml
+++ b/print/templates/email/auth-code/locale/pt.yml
@@ -2,4 +2,4 @@ subject: Código de verificação
title: Código de verificação
description: Alguém solicitou um código de verificação para entrar. Se você não fez essa solicitação, ignore este e-mail.
Enter the following code to continue to your account: Insira o seguinte código para continuar com sua conta.
-It expires in 5 minutes.: Expira em 5 minutos.
+It expires in 5 minutes: Expira em 5 minutos.
From 4807fcb394327905ff82ca36aa8151e52dfe6a83 Mon Sep 17 00:00:00 2001
From: joan
Date: Tue, 11 Apr 2023 09:01:59 +0200
Subject: [PATCH 0010/1087] Removed focus
---
back/methods/account/specs/login.spec.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/back/methods/account/specs/login.spec.js b/back/methods/account/specs/login.spec.js
index 9f6c0c17d..074d74789 100644
--- a/back/methods/account/specs/login.spec.js
+++ b/back/methods/account/specs/login.spec.js
@@ -1,6 +1,6 @@
const {models} = require('vn-loopback/server/server');
-fdescribe('account login()', () => {
+describe('account login()', () => {
const employeeId = 1;
const unauthCtx = {
req: {
From b5f2cf3711ffcca96603273aec2fdd29595531b3 Mon Sep 17 00:00:00 2001
From: joan
Date: Thu, 13 Apr 2023 11:54:56 +0200
Subject: [PATCH 0011/1087] Added unit test & translation fixes
---
.../account/specs/validate-auth.spec.js | 41 +++++++++++++++++++
back/methods/account/validate-auth.js | 2 +-
db/changes/231401/00-department.sql | 2 +-
loopback/locale/es.json | 2 +-
4 files changed, 44 insertions(+), 3 deletions(-)
create mode 100644 back/methods/account/specs/validate-auth.spec.js
diff --git a/back/methods/account/specs/validate-auth.spec.js b/back/methods/account/specs/validate-auth.spec.js
new file mode 100644
index 000000000..44ea96320
--- /dev/null
+++ b/back/methods/account/specs/validate-auth.spec.js
@@ -0,0 +1,41 @@
+const {models} = require('vn-loopback/server/server');
+
+fdescribe('account validateAuth()', () => {
+ const developerId = 9;
+
+ it('should throw an error for a non existent code', async() => {
+ const ctx = {req: {accessToken: {userId: developerId}}};
+
+ let error;
+ try {
+ await models.Account.validateAuth(ctx, 'developer', 'nightmare', '123456');
+ } catch (e) {
+ error = e;
+ }
+
+ expect(error).toBeDefined();
+ expect(error.statusCode).toBe(400);
+ expect(error.message).toEqual('Invalid or expired verification code');
+ });
+
+ it('should throw an error when a code doesn`t match the login username', async() => {
+ const ctx = {req: {accessToken: {userId: developerId}}};
+
+ let error;
+ try {
+ const authCode = await models.AuthCode.create({
+ userFk: 1,
+ code: '555555',
+ expires: Date.vnNow() + (60 * 1000)
+ });
+ await models.Account.validateAuth(ctx, 'developer', 'nightmare', '555555');
+ await authCode.destroy();
+ } catch (e) {
+ error = e;
+ }
+
+ expect(error).toBeDefined();
+ expect(error.statusCode).toBe(400);
+ expect(error.message).toEqual('Authentication failed');
+ });
+});
diff --git a/back/methods/account/validate-auth.js b/back/methods/account/validate-auth.js
index ba1c6a3bb..6745b8838 100644
--- a/back/methods/account/validate-auth.js
+++ b/back/methods/account/validate-auth.js
@@ -40,7 +40,7 @@ module.exports = Self => {
}
});
- const expired = Date.now() > authCode.expires;
+ const expired = authCode && Date.vnNow() > authCode.expires;
if (!authCode || expired)
throw new UserError('Invalid or expired verification code');
diff --git a/db/changes/231401/00-department.sql b/db/changes/231401/00-department.sql
index ffc3a1622..d9a91ee30 100644
--- a/db/changes/231401/00-department.sql
+++ b/db/changes/231401/00-department.sql
@@ -1,5 +1,5 @@
alter table `vn`.`department`
- add `twoFactor` ENUM ('email') null comment 'Default user tow-factor auth type';
+ add `twoFactor` ENUM ('email') null comment 'Default user two-factor auth type';
drop trigger `vn`.`department_afterUpdate`;
diff --git a/loopback/locale/es.json b/loopback/locale/es.json
index 70ba15098..be9b0036a 100644
--- a/loopback/locale/es.json
+++ b/loopback/locale/es.json
@@ -275,6 +275,6 @@
"Insert a date range": "Inserte un rango de fechas",
"Added observation": "{{user}} añadió esta observacion: {{text}}",
"Comment added to client": "Observación añadida al cliente {{clientFk}}",
- "Invalid auth code": "Invalid auth code",
+ "Invalid auth code": "Código de verificación incorrecto",
"Invalid or expired verification code": "Invalid or expired verification code"
}
\ No newline at end of file
From 9aaea7e8ed75499d285ac3e0754d1271dbc4cb50 Mon Sep 17 00:00:00 2001
From: joan
Date: Thu, 13 Apr 2023 12:01:51 +0200
Subject: [PATCH 0012/1087] Changed to new SQL version
---
back/methods/account/specs/validate-auth.spec.js | 2 +-
db/changes/{231401 => 231601}/00-authCode.sql | 0
db/changes/{231401 => 231601}/00-department.sql | 0
db/changes/{231401 => 231601}/00-user.sql | 0
4 files changed, 1 insertion(+), 1 deletion(-)
rename db/changes/{231401 => 231601}/00-authCode.sql (100%)
rename db/changes/{231401 => 231601}/00-department.sql (100%)
rename db/changes/{231401 => 231601}/00-user.sql (100%)
diff --git a/back/methods/account/specs/validate-auth.spec.js b/back/methods/account/specs/validate-auth.spec.js
index 44ea96320..cc2eea092 100644
--- a/back/methods/account/specs/validate-auth.spec.js
+++ b/back/methods/account/specs/validate-auth.spec.js
@@ -1,6 +1,6 @@
const {models} = require('vn-loopback/server/server');
-fdescribe('account validateAuth()', () => {
+describe('account validateAuth()', () => {
const developerId = 9;
it('should throw an error for a non existent code', async() => {
diff --git a/db/changes/231401/00-authCode.sql b/db/changes/231601/00-authCode.sql
similarity index 100%
rename from db/changes/231401/00-authCode.sql
rename to db/changes/231601/00-authCode.sql
diff --git a/db/changes/231401/00-department.sql b/db/changes/231601/00-department.sql
similarity index 100%
rename from db/changes/231401/00-department.sql
rename to db/changes/231601/00-department.sql
diff --git a/db/changes/231401/00-user.sql b/db/changes/231601/00-user.sql
similarity index 100%
rename from db/changes/231401/00-user.sql
rename to db/changes/231601/00-user.sql
From ef87dcc0f5e0f58cb05bb8679f625c016ff2140b Mon Sep 17 00:00:00 2001
From: joan
Date: Tue, 18 Apr 2023 07:38:40 +0200
Subject: [PATCH 0013/1087] require authentication on every login
---
back/methods/account/login.js | 37 +++-------------
back/methods/account/sign-in.js | 63 +++++++++++++++++++++++++++
back/methods/account/validate-auth.js | 2 +-
back/models/account.js | 1 +
back/models/account.json | 2 +-
front/core/services/auth.js | 2 +-
6 files changed, 72 insertions(+), 35 deletions(-)
create mode 100644 back/methods/account/sign-in.js
diff --git a/back/methods/account/login.js b/back/methods/account/login.js
index 2eeb5a1c4..116836068 100644
--- a/back/methods/account/login.js
+++ b/back/methods/account/login.js
@@ -1,9 +1,8 @@
const md5 = require('md5');
const UserError = require('vn-loopback/util/user-error');
-const ForbiddenError = require('vn-loopback/util/forbiddenError');
module.exports = Self => {
- Self.remoteMethodCtx('login', {
+ Self.remoteMethod('login', {
description: 'Login a user with username/email and password',
accepts: [
{
@@ -27,11 +26,13 @@ module.exports = Self => {
}
});
- Self.login = async function(ctx, user, password) {
+ Self.login = async function(user, password) {
let $ = Self.app.models;
let token;
let usesEmail = user.indexOf('@') !== -1;
+ console.log(user, password);
+
let userInfo = usesEmail
? {email: user}
: {username: user};
@@ -44,7 +45,7 @@ module.exports = Self => {
? {email: user}
: {name: user};
let account = await Self.findOne({
- fields: ['id', 'active', 'email', 'password', 'twoFactor'],
+ fields: ['id', 'active', 'password'],
where
});
@@ -64,34 +65,6 @@ module.exports = Self => {
}
}
- if (account && account.twoFactor === 'email') {
- const authAccess = await $.UserAccess.findOne({
- where: {
- userFk: account.id,
- ip: ctx.req.connection.remoteAddress
- }
- });
- if (!authAccess) {
- const code = String(Math.floor(Math.random() * 999999));
- const maxTTL = ((60 * 1000) * 5); // 5 min
- await $.AuthCode.upsertWithWhere({userFk: account.id}, {
- userFk: account.id,
- code: code,
- expires: Date.now() + maxTTL
- });
-
- const params = {
- recipientId: account.id,
- recipient: account.email,
- code: code
- };
- ctx.args = {...ctx.args, ...params};
- await Self.sendTemplate(ctx, 'auth-code');
-
- throw new ForbiddenError('REQUIRES_2FA');
- }
- }
-
let loginInfo = Object.assign({password}, userInfo);
token = await $.User.login(loginInfo, 'user');
return {token: token.id};
diff --git a/back/methods/account/sign-in.js b/back/methods/account/sign-in.js
new file mode 100644
index 000000000..9a4f30cd4
--- /dev/null
+++ b/back/methods/account/sign-in.js
@@ -0,0 +1,63 @@
+const ForbiddenError = require('vn-loopback/util/forbiddenError');
+
+module.exports = Self => {
+ Self.remoteMethodCtx('signin', {
+ description: 'Login a user with username/email and password',
+ accepts: [
+ {
+ arg: 'user',
+ type: 'String',
+ description: 'The user name or email',
+ required: true
+ }, {
+ arg: 'password',
+ type: 'String',
+ description: 'The password'
+ }
+ ],
+ returns: {
+ type: 'object',
+ root: true
+ },
+ http: {
+ path: `/signin`,
+ verb: 'POST'
+ }
+ });
+
+ Self.signin = async function(ctx, user, password) {
+ const $ = Self.app.models;
+ const usesEmail = user.indexOf('@') !== -1;
+
+ const where = usesEmail
+ ? {email: user}
+ : {name: user};
+
+ const account = await Self.findOne({
+ fields: ['id', 'active', 'email', 'password', 'twoFactor'],
+ where
+ });
+
+ if (account && account.twoFactor === 'email') {
+ const code = String(Math.floor(Math.random() * 999999));
+ const maxTTL = ((60 * 1000) * 5); // 5 min
+ await $.AuthCode.upsertWithWhere({userFk: account.id}, {
+ userFk: account.id,
+ code: code,
+ expires: Date.now() + maxTTL
+ });
+
+ const params = {
+ recipientId: account.id,
+ recipient: account.email,
+ code: code
+ };
+ ctx.args = {...ctx.args, ...params};
+ await Self.sendTemplate(ctx, 'auth-code');
+
+ throw new ForbiddenError('REQUIRES_2FA');
+ }
+
+ return $.models.login(user, password);
+ };
+};
diff --git a/back/methods/account/validate-auth.js b/back/methods/account/validate-auth.js
index 6745b8838..1f906f4a6 100644
--- a/back/methods/account/validate-auth.js
+++ b/back/methods/account/validate-auth.js
@@ -68,6 +68,6 @@ module.exports = Self => {
await authCode.destroy();
- return Self.login(ctx, username, password);
+ return Self.login(username, password);
};
};
diff --git a/back/models/account.js b/back/models/account.js
index fb9c95005..28f7c467f 100644
--- a/back/models/account.js
+++ b/back/models/account.js
@@ -4,6 +4,7 @@ const LoopBackContext = require('loopback-context');
const {Email} = require('vn-print');
module.exports = Self => {
+ require('../methods/account/sign-in')(Self);
require('../methods/account/login')(Self);
require('../methods/account/logout')(Self);
require('../methods/account/acl')(Self);
diff --git a/back/models/account.json b/back/models/account.json
index 3b3e2cca5..30f8acab1 100644
--- a/back/models/account.json
+++ b/back/models/account.json
@@ -89,7 +89,7 @@
},
"acls": [
{
- "property": "login",
+ "property": "signin",
"accessType": "EXECUTE",
"principalType": "ROLE",
"principalId": "$everyone",
diff --git a/front/core/services/auth.js b/front/core/services/auth.js
index 479696931..b90b52112 100644
--- a/front/core/services/auth.js
+++ b/front/core/services/auth.js
@@ -59,7 +59,7 @@ export default class Auth {
password: password || undefined
};
- return this.$http.post('Accounts/login', params).then(
+ return this.$http.post('Accounts/signin', params).then(
json => this.onLoginOk(json, remember));
}
From c2af40edb5309f37b2c46a6e4a260e40b9ac75de Mon Sep 17 00:00:00 2001
From: joan
Date: Tue, 18 Apr 2023 13:15:04 +0200
Subject: [PATCH 0014/1087] changes
---
back/methods/vn-user/sign-in.js | 14 +++---
back/methods/vn-user/signIn.js | 68 ---------------------------
back/methods/vn-user/specs/signIn.js | 2 +-
back/methods/vn-user/specs/signOut.js | 4 +-
back/methods/vn-user/validate-auth.js | 2 +-
back/models/vn-user.js | 44 ++++++++++++++++-
db/changes/231601/00-userAcl.sql | 3 +-
7 files changed, 55 insertions(+), 82 deletions(-)
delete mode 100644 back/methods/vn-user/signIn.js
diff --git a/back/methods/vn-user/sign-in.js b/back/methods/vn-user/sign-in.js
index 9a4f30cd4..0a0133b82 100644
--- a/back/methods/vn-user/sign-in.js
+++ b/back/methods/vn-user/sign-in.js
@@ -33,23 +33,23 @@ module.exports = Self => {
? {email: user}
: {name: user};
- const account = await Self.findOne({
+ const vnUser = await Self.findOne({
fields: ['id', 'active', 'email', 'password', 'twoFactor'],
where
});
- if (account && account.twoFactor === 'email') {
+ if (vnUser && vnUser.twoFactor === 'email') {
const code = String(Math.floor(Math.random() * 999999));
const maxTTL = ((60 * 1000) * 5); // 5 min
- await $.AuthCode.upsertWithWhere({userFk: account.id}, {
- userFk: account.id,
+ await $.AuthCode.upsertWithWhere({userFk: vnUser.id}, {
+ userFk: vnUser.id,
code: code,
expires: Date.now() + maxTTL
});
const params = {
- recipientId: account.id,
- recipient: account.email,
+ recipientId: vnUser.id,
+ recipient: vnUser.email,
code: code
};
ctx.args = {...ctx.args, ...params};
@@ -58,6 +58,6 @@ module.exports = Self => {
throw new ForbiddenError('REQUIRES_2FA');
}
- return $.models.login(user, password);
+ return Self.validateLogin(user, password);
};
};
diff --git a/back/methods/vn-user/signIn.js b/back/methods/vn-user/signIn.js
deleted file mode 100644
index 5f6c7f699..000000000
--- a/back/methods/vn-user/signIn.js
+++ /dev/null
@@ -1,68 +0,0 @@
-const UserError = require('vn-loopback/util/user-error');
-
-module.exports = Self => {
- Self.remoteMethod('signIn', {
- description: 'Login a user with username/email and password',
- accepts: [
- {
- arg: 'user',
- type: 'String',
- description: 'The user name or email',
- http: {source: 'form'},
- required: true
- }, {
- arg: 'password',
- type: 'String',
- description: 'The password'
- }
- ],
- returns: {
- type: 'object',
- root: true
- },
- http: {
- path: `/signIn`,
- verb: 'POST'
- }
- });
-
- Self.signIn = async function(user, password) {
- let models = Self.app.models;
- let token;
- let usesEmail = user.indexOf('@') !== -1;
-
- let userInfo = usesEmail
- ? {email: user}
- : {username: user};
- let instance = await Self.findOne({
- fields: ['username', 'password'],
- where: userInfo
- });
-
- let where = usesEmail
- ? {email: user}
- : {name: user};
- const vnUser = await Self.findOne({
- fields: ['active'],
- where
- });
-
- let validCredentials = instance
- && await instance.hasPassword(password);
-
- if (validCredentials) {
- if (!vnUser.active)
- throw new UserError('User disabled');
-
- try {
- await models.Account.sync(instance.username, password);
- } catch (err) {
- console.warn(err);
- }
- }
-
- let loginInfo = Object.assign({password}, userInfo);
- token = await Self.login(loginInfo, 'user');
- return {token: token.id};
- };
-};
diff --git a/back/methods/vn-user/specs/signIn.js b/back/methods/vn-user/specs/signIn.js
index 64e4d55f5..b4d619ced 100644
--- a/back/methods/vn-user/specs/signIn.js
+++ b/back/methods/vn-user/specs/signIn.js
@@ -1,6 +1,6 @@
const {models} = require('vn-loopback/server/server');
-fdescribe('account login()', () => {
+describe('account login()', () => {
const employeeId = 1;
const unauthCtx = {
req: {
diff --git a/back/methods/vn-user/specs/signOut.js b/back/methods/vn-user/specs/signOut.js
index 3f224b2ff..e6ca1f156 100644
--- a/back/methods/vn-user/specs/signOut.js
+++ b/back/methods/vn-user/specs/signOut.js
@@ -1,12 +1,12 @@
const {models} = require('vn-loopback/server/server');
-describe('VnUser signOut()', () => {
+fdescribe('VnUser signOut()', () => {
it('should logout and remove token after valid login', async() => {
let loginResponse = await app.models.VnUser.validateLogin('buyer', 'nightmare');
let accessToken = await app.models.AccessToken.findById(loginResponse.token);
let ctx = {req: {accessToken: accessToken}};
- let logoutResponse = await models.VnUser.signOut(ctx);
+ let logoutResponse = await models.VnUser.logout(ctx);
let tokenAfterLogout = await models.AccessToken.findById(loginResponse.token);
expect(logoutResponse).toBeTrue();
diff --git a/back/methods/vn-user/validate-auth.js b/back/methods/vn-user/validate-auth.js
index 1f906f4a6..312f1347a 100644
--- a/back/methods/vn-user/validate-auth.js
+++ b/back/methods/vn-user/validate-auth.js
@@ -68,6 +68,6 @@ module.exports = Self => {
await authCode.destroy();
- return Self.login(username, password);
+ return Self.validateLogin(username, password);
};
};
diff --git a/back/models/vn-user.js b/back/models/vn-user.js
index 84ba11794..e59c99fd1 100644
--- a/back/models/vn-user.js
+++ b/back/models/vn-user.js
@@ -5,11 +5,12 @@ const {Email} = require('vn-print');
module.exports = function(Self) {
vnModel(Self);
- require('../methods/vn-user/signIn')(Self);
+ require('../methods/vn-user/sign-in')(Self);
require('../methods/vn-user/acl')(Self);
require('../methods/vn-user/recover-password')(Self);
require('../methods/vn-user/validate-token')(Self);
require('../methods/vn-user/privileges')(Self);
+ require('../methods/vn-user/validate-auth')(Self);
// Validations
@@ -107,4 +108,45 @@ module.exports = function(Self) {
return email.send();
});
+
+ Self.validateLogin = async function(user, password) {
+ let $ = Self.app.models;
+ let token;
+ let usesEmail = user.indexOf('@') !== -1;
+
+ let userInfo = usesEmail
+ ? {email: user}
+ : {username: user};
+ let instance = await $.VnUser.findOne({
+ fields: ['username', 'password'],
+ where: userInfo
+ });
+
+ let where = usesEmail
+ ? {email: user}
+ : {name: user};
+ let vnUser = await $.VnUser.findOne({
+ fields: ['active'],
+ where
+ });
+
+ let validCredentials = instance && (
+ await instance.hasPassword(password)
+ );
+
+ if (validCredentials) {
+ if (!vnUser.active)
+ throw new UserError('User disabled');
+
+ try {
+ await $.Account.sync(instance.username, password);
+ } catch (err) {
+ console.warn(err);
+ }
+ }
+
+ let loginInfo = Object.assign({password}, userInfo);
+ token = await $.VnUser.login(loginInfo, 'user');
+ return {token: token.id};
+ };
};
diff --git a/db/changes/231601/00-userAcl.sql b/db/changes/231601/00-userAcl.sql
index 64803bf18..b75a22315 100644
--- a/db/changes/231601/00-userAcl.sql
+++ b/db/changes/231601/00-userAcl.sql
@@ -3,8 +3,7 @@ INSERT INTO `salix`.`ACL` (model, property, accessType, permission, principalTyp
('VnUser', '*', '*', 'ALLOW', 'ROLE', 'employee'),
('VnUser','acl','READ','ALLOW','ROLE','account'),
('VnUser','getCurrentUserData','READ','ALLOW','ROLE','account'),
- ('VnUser','changePassword', 'WRITE', 'ALLOW', 'ROLE', 'account'),
- ('Account','exists','READ','ALLOW','ROLE','account');
+ ('VnUser','changePassword', 'WRITE', 'ALLOW', 'ROLE', 'account');
INSERT INTO `salix`.`ACL` (model, property, accessType, permission, principalType, principalId)
VALUES
From c3443ecc7cef98304bb894244a51d5e838c417f6 Mon Sep 17 00:00:00 2001
From: joan
Date: Tue, 18 Apr 2023 14:37:20 +0200
Subject: [PATCH 0015/1087] Updated e2e
---
back/methods/vn-user/specs/signOut.js | 42 -------------------
.../vn-user/specs/validate-auth.spec.js | 4 +-
..._smartTable_searchBar_integrations.spec.js | 5 ++-
front/core/services/auth.js | 2 +-
modules/account/back/methods/account/login.js | 2 +-
5 files changed, 7 insertions(+), 48 deletions(-)
delete mode 100644 back/methods/vn-user/specs/signOut.js
diff --git a/back/methods/vn-user/specs/signOut.js b/back/methods/vn-user/specs/signOut.js
deleted file mode 100644
index e6ca1f156..000000000
--- a/back/methods/vn-user/specs/signOut.js
+++ /dev/null
@@ -1,42 +0,0 @@
-const {models} = require('vn-loopback/server/server');
-
-fdescribe('VnUser signOut()', () => {
- it('should logout and remove token after valid login', async() => {
- let loginResponse = await app.models.VnUser.validateLogin('buyer', 'nightmare');
- let accessToken = await app.models.AccessToken.findById(loginResponse.token);
- let ctx = {req: {accessToken: accessToken}};
-
- let logoutResponse = await models.VnUser.logout(ctx);
- let tokenAfterLogout = await models.AccessToken.findById(loginResponse.token);
-
- expect(logoutResponse).toBeTrue();
- expect(tokenAfterLogout).toBeNull();
- });
-
- it('should throw a 401 error when token is invalid', async() => {
- let error;
- let ctx = {req: {accessToken: {id: 'invalidToken'}}};
-
- try {
- response = await models.VnUser.signOut(ctx);
- } catch (e) {
- error = e;
- }
-
- expect(error).toBeDefined();
- expect(error.statusCode).toBe(401);
- });
-
- it('should throw an error when no token is passed', async() => {
- let error;
- let ctx = {req: {accessToken: null}};
-
- try {
- response = await models.VnUser.signOut(ctx);
- } catch (e) {
- error = e;
- }
-
- expect(error).toBeDefined();
- });
-});
diff --git a/back/methods/vn-user/specs/validate-auth.spec.js b/back/methods/vn-user/specs/validate-auth.spec.js
index cc2eea092..958770b4b 100644
--- a/back/methods/vn-user/specs/validate-auth.spec.js
+++ b/back/methods/vn-user/specs/validate-auth.spec.js
@@ -8,7 +8,7 @@ describe('account validateAuth()', () => {
let error;
try {
- await models.Account.validateAuth(ctx, 'developer', 'nightmare', '123456');
+ await models.VnUser.validateAuth(ctx, 'developer', 'nightmare', '123456');
} catch (e) {
error = e;
}
@@ -28,7 +28,7 @@ describe('account validateAuth()', () => {
code: '555555',
expires: Date.vnNow() + (60 * 1000)
});
- await models.Account.validateAuth(ctx, 'developer', 'nightmare', '555555');
+ await models.VnUser.validateAuth(ctx, 'developer', 'nightmare', '555555');
await authCode.destroy();
} catch (e) {
error = e;
diff --git a/e2e/paths/01-salix/03_smartTable_searchBar_integrations.spec.js b/e2e/paths/01-salix/03_smartTable_searchBar_integrations.spec.js
index a3d747f1c..b2c2291c6 100644
--- a/e2e/paths/01-salix/03_smartTable_searchBar_integrations.spec.js
+++ b/e2e/paths/01-salix/03_smartTable_searchBar_integrations.spec.js
@@ -75,11 +75,12 @@ describe('SmartTable SearchBar integration', () => {
});
});
- describe('as orders', () => {
+ // #5573 - The amount of rows differs when loading from side menu
+ // https://redmine.verdnatura.es/issues/5573
+ xdescribe('as orders', () => {
it('should order by first id', async() => {
await page.loginAndModule('developer', 'item');
await page.accessToSection('item.fixedPrice');
- await page.doSearch();
const result = await page.waitToGetProperty(selectors.itemFixedPrice.firstItemID, 'value');
diff --git a/front/core/services/auth.js b/front/core/services/auth.js
index 2ab2caa62..c1242209e 100644
--- a/front/core/services/auth.js
+++ b/front/core/services/auth.js
@@ -59,7 +59,7 @@ export default class Auth {
password: password || undefined
};
- return this.$http.post('VnUsers/signin', params).then(
+ return this.$http.post('Accounts/login', params).then(
json => this.onLoginOk(json, remember));
}
diff --git a/modules/account/back/methods/account/login.js b/modules/account/back/methods/account/login.js
index c3218172c..a512b5330 100644
--- a/modules/account/back/methods/account/login.js
+++ b/modules/account/back/methods/account/login.js
@@ -23,5 +23,5 @@ module.exports = Self => {
}
});
- Self.login = async(user, password) => Self.app.models.VnUser.signIn(user, password);
+ Self.login = async(user, password) => Self.app.models.VnUser.validateLogin(user, password);
};
From b45b0ff8260ee221da6902cd7cff4e557fd33533 Mon Sep 17 00:00:00 2001
From: carlossa
Date: Thu, 20 Apr 2023 08:23:46 +0200
Subject: [PATCH 0016/1087] refs #5066 copy project from the other
---
db/changes/231601/00-ACLgetVehiclesSorted.sql | 3 ++
.../back/methods/vehicle/getVehiclesSorted.js | 28 +++++++++++++++++++
modules/route/back/models/vehicle.js | 3 ++
modules/route/front/basic-data/index.html | 5 +++-
modules/route/front/basic-data/index.js | 13 +++++++++
5 files changed, 51 insertions(+), 1 deletion(-)
create mode 100644 db/changes/231601/00-ACLgetVehiclesSorted.sql
create mode 100644 modules/route/back/methods/vehicle/getVehiclesSorted.js
create mode 100644 modules/route/back/models/vehicle.js
diff --git a/db/changes/231601/00-ACLgetVehiclesSorted.sql b/db/changes/231601/00-ACLgetVehiclesSorted.sql
new file mode 100644
index 000000000..5d3ec454d
--- /dev/null
+++ b/db/changes/231601/00-ACLgetVehiclesSorted.sql
@@ -0,0 +1,3 @@
+INSERT INTO `salix`.`ACL` (`model`,`property`,`accessType`,`permission`,`principalId`)
+ VALUES
+ ('Vehicle','getVehiclesSorted','WRITE','ALLOW','employee');
\ No newline at end of file
diff --git a/modules/route/back/methods/vehicle/getVehiclesSorted.js b/modules/route/back/methods/vehicle/getVehiclesSorted.js
new file mode 100644
index 000000000..b785e5dc8
--- /dev/null
+++ b/modules/route/back/methods/vehicle/getVehiclesSorted.js
@@ -0,0 +1,28 @@
+module.exports = Self => {
+ Self.remoteMethod('getVehiclesSorted', {
+ description: 'Sort the vehicles by a warehouse',
+ accessType: 'WRITE',
+ accepts: [{
+ arg: 'warehouseFk',
+ type: 'number'
+ }],
+ returns: {
+ type: ['object'],
+ root: true
+ },
+ http: {
+ path: `/getVehiclesSorted`,
+ verb: `POST`
+ }
+ });
+
+ Self.getVehiclesSorted = async warehouseFk => {
+ const vehicles = await Self.rawSql(`
+ SELECT v.id, v.numberPlate, w.name
+ FROM vehicle v
+ JOIN warehouse w ON w.id = v.warehouseFk
+ ORDER BY v.warehouseFk = ? DESC, v.numberPlate ASC`, [warehouseFk]);
+
+ return vehicles;
+ };
+};
diff --git a/modules/route/back/models/vehicle.js b/modules/route/back/models/vehicle.js
new file mode 100644
index 000000000..459afe1c2
--- /dev/null
+++ b/modules/route/back/models/vehicle.js
@@ -0,0 +1,3 @@
+module.exports = Self => {
+ require('../methods/vehicle/getVehiclesSorted')(Self);
+};
diff --git a/modules/route/front/basic-data/index.html b/modules/route/front/basic-data/index.html
index 831599ae8..9888a6859 100644
--- a/modules/route/front/basic-data/index.html
+++ b/modules/route/front/basic-data/index.html
@@ -24,10 +24,13 @@
+
+ {{numberPlate}} - {{name}}
+
diff --git a/modules/route/front/basic-data/index.js b/modules/route/front/basic-data/index.js
index b8602ed12..80626e97e 100644
--- a/modules/route/front/basic-data/index.js
+++ b/modules/route/front/basic-data/index.js
@@ -7,6 +7,19 @@ class Controller extends Section {
this.card.reload()
);
}
+ constructor($element, $) {
+ super($element, $);
+ this.$http.get(`UserConfigs/getUserConfig`)
+ .then(res => {
+ if (res && res.data) {
+ this.$http.post(`Vehicles/getVehiclesSorted`, {warehouseFk: res.data.warehouseFk})
+ .then(res => {
+ if (res && res.data)
+ this.vehicles = res.data;
+ });
+ }
+ });
+ }
}
ngModule.vnComponent('vnRouteBasicData', {
From 16fdfa00fda86e5fe2cba3f57ec581f36d18152b Mon Sep 17 00:00:00 2001
From: carlossa
Date: Thu, 20 Apr 2023 09:09:48 +0200
Subject: [PATCH 0017/1087] refs #5066 e2e solve
---
e2e/paths/08-route/02_basic_data.spec.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/e2e/paths/08-route/02_basic_data.spec.js b/e2e/paths/08-route/02_basic_data.spec.js
index ff8361499..6132d5e23 100644
--- a/e2e/paths/08-route/02_basic_data.spec.js
+++ b/e2e/paths/08-route/02_basic_data.spec.js
@@ -46,7 +46,7 @@ describe('Route basic Data path', () => {
it('should confirm the vehicle was edited', async() => {
const vehicle = await page.waitToGetProperty(selectors.routeBasicData.vehicle, 'value');
- expect(vehicle).toEqual('1111-IMK');
+ expect(vehicle).toEqual('1111-IMK - Warehouse One');
});
it('should confirm the km start was edited', async() => {
From 237c83c6f551d7b8d188a0045c9be108eee3b2fa Mon Sep 17 00:00:00 2001
From: carlossa
Date: Thu, 20 Apr 2023 10:20:15 +0200
Subject: [PATCH 0018/1087] refs #5066 getVehicleSorted small mod
---
modules/route/back/methods/vehicle/getVehiclesSorted.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/route/back/methods/vehicle/getVehiclesSorted.js b/modules/route/back/methods/vehicle/getVehiclesSorted.js
index b785e5dc8..9dad8b80a 100644
--- a/modules/route/back/methods/vehicle/getVehiclesSorted.js
+++ b/modules/route/back/methods/vehicle/getVehiclesSorted.js
@@ -1,6 +1,6 @@
module.exports = Self => {
Self.remoteMethod('getVehiclesSorted', {
- description: 'Sort the vehicles by a warehouse',
+ description: 'Sort the vehicles by warehouse',
accessType: 'WRITE',
accepts: [{
arg: 'warehouseFk',
From a9caa92f5cbdab4fab548a56d90a33d9af7f50bd Mon Sep 17 00:00:00 2001
From: carlossa
Date: Fri, 21 Apr 2023 12:46:01 +0200
Subject: [PATCH 0019/1087] refs #4764 boton abonar
---
modules/ticket/front/services/index.html | 7 +++++++
modules/ticket/front/services/locale/es.yml | 3 ++-
2 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/modules/ticket/front/services/index.html b/modules/ticket/front/services/index.html
index bb5505ce6..592fc62c1 100644
--- a/modules/ticket/front/services/index.html
+++ b/modules/ticket/front/services/index.html
@@ -23,7 +23,14 @@
data="$ctrl.services">
diff --git a/modules/worker/front/calendar/index.js b/modules/worker/front/calendar/index.js
index 4ca0fc929..4b07a2e98 100644
--- a/modules/worker/front/calendar/index.js
+++ b/modules/worker/front/calendar/index.js
@@ -64,8 +64,7 @@ class Controller extends Section {
set worker(value) {
this._worker = value;
-
- if (value) {
+ if (value && value.hasWorkCenter) {
this.getIsSubordinate();
this.getActiveContract();
}
diff --git a/modules/worker/front/calendar/locale/es.yml b/modules/worker/front/calendar/locale/es.yml
index bd75458aa..50bb4bb52 100644
--- a/modules/worker/front/calendar/locale/es.yml
+++ b/modules/worker/front/calendar/locale/es.yml
@@ -11,4 +11,5 @@ Choose an absence type from the right menu: Elige un tipo de ausencia desde el m
To start adding absences, click an absence type from the right menu and then on the day you want to add an absence: Para empezar a añadir ausencias, haz clic en un tipo de ausencia desde el menu de la derecha y después en el día que quieres añadir la ausencia
You can just add absences within the current year: Solo puedes añadir ausencias dentro del año actual
Current day: Día actual
-Paid holidays: Vacaciones pagadas
\ No newline at end of file
+Paid holidays: Vacaciones pagadas
+Autonomous worker: Trabajador autónomo
diff --git a/modules/worker/front/card/index.js b/modules/worker/front/card/index.js
index 415b60787..dacdc954a 100644
--- a/modules/worker/front/card/index.js
+++ b/modules/worker/front/card/index.js
@@ -34,6 +34,8 @@ class Controller extends ModuleCard {
this.$http.get(`Workers/${this.$params.id}`, {filter})
.then(res => this.worker = res.data);
+ this.$http.get(`Workers/${this.$params.id}/activeContract`)
+ .then(res => this.worker.hasWorkCenter = res.data.workCenterFk);
}
}
diff --git a/modules/worker/front/time-control/index.html b/modules/worker/front/time-control/index.html
index 044ea4038..d3a4b5640 100644
--- a/modules/worker/front/time-control/index.html
+++ b/modules/worker/front/time-control/index.html
@@ -4,211 +4,219 @@
filter="::$ctrl.filter"
data="$ctrl.hours">
-
-
-
-
-
-
{{$t('Enter the following code to continue to your account')}}
+
{{ $t('Enter the following code to continue to your account') }}
{{ code }}
-
{{$t('It expires in 5 minutes')}}
+
{{ $t('It expires in 5 minutes') }}
diff --git a/print/templates/email/auth-code/locale/en.yml b/print/templates/email/auth-code/locale/en.yml
index b52a73e93..27b493e20 100644
--- a/print/templates/email/auth-code/locale/en.yml
+++ b/print/templates/email/auth-code/locale/en.yml
@@ -1,7 +1,7 @@
subject: Verification code
title: Verification code
description: Somebody did request a verification code for login. If you didn't request it, please ignore this email.
-device: 'Device: {0}'
-ip: 'IP: {0}'
+device: 'Device'
+ip: 'IP'
Enter the following code to continue to your account: Enter the following code to continue to your account
It expires in 5 minutes: It expires in 5 minutes
diff --git a/print/templates/email/auth-code/locale/es.yml b/print/templates/email/auth-code/locale/es.yml
index f49b2511f..463ea95fa 100644
--- a/print/templates/email/auth-code/locale/es.yml
+++ b/print/templates/email/auth-code/locale/es.yml
@@ -1,7 +1,7 @@
subject: Código de verificación
title: Código de verificación
description: Alguien ha solicitado un código de verificación para poder iniciar sesión. Si no lo has solicitado tu, ignora este email.
-device: 'Dispositivo: {0}'
-ip: 'IP: {0}'
+device: 'Dispositivo'
+ip: 'IP'
Enter the following code to continue to your account: Introduce el siguiente código para poder continuar con tu cuenta
It expires in 5 minutes: Expira en 5 minutos
diff --git a/print/templates/email/auth-code/locale/fr.yml b/print/templates/email/auth-code/locale/fr.yml
index 12606fcda..454bb80ae 100644
--- a/print/templates/email/auth-code/locale/fr.yml
+++ b/print/templates/email/auth-code/locale/fr.yml
@@ -1,7 +1,7 @@
subject: Code de vérification
title: Code de vérification
description: Quelqu'un a demandé un code de vérification pour se connecter. Si ce n'était pas toi, ignore cet email.
-device: 'Appareil: {0}'
-ip: 'IP: {0}'
+device: 'Appareil'
+ip: 'IP'
Enter the following code to continue to your account: Entrez le code suivant pour continuer avec votre compte
It expires in 5 minutes: Il expire dans 5 minutes.
diff --git a/print/templates/email/auth-code/locale/pt.yml b/print/templates/email/auth-code/locale/pt.yml
index e73f5e39a..7f9eb85f5 100644
--- a/print/templates/email/auth-code/locale/pt.yml
+++ b/print/templates/email/auth-code/locale/pt.yml
@@ -1,7 +1,7 @@
subject: Código de verificação
title: Código de verificação
description: Alguém solicitou um código de verificação para entrar. Se você não fez essa solicitação, ignore este e-mail.
-device: 'Dispositivo: {0}'
-ip: 'IP: {0}'
+device: 'Dispositivo'
+ip: 'IP'
Enter the following code to continue to your account: Insira o seguinte código para continuar com sua conta.
It expires in 5 minutes: Expira em 5 minutos.
From 983d028d06489032051c82eca04dca43f0c27a73 Mon Sep 17 00:00:00 2001
From: carlossa
Date: Mon, 3 Jul 2023 13:58:40 +0200
Subject: [PATCH 0341/1087] refs #5334 popover y basic data
---
modules/worker/front/department/basic-data/index.html | 5 +++--
modules/worker/front/department/descriptor/index.html | 2 +-
modules/worker/front/department/summary/index.html | 11 +++++++++--
3 files changed, 13 insertions(+), 5 deletions(-)
diff --git a/modules/worker/front/department/basic-data/index.html b/modules/worker/front/department/basic-data/index.html
index bb27ae080..2d1e315d4 100644
--- a/modules/worker/front/department/basic-data/index.html
+++ b/modules/worker/front/department/basic-data/index.html
@@ -78,11 +78,12 @@
label="Fill in days without physical check-ins"
ng-model="$ctrl.department.hasToRefill">
-
+
+
-
+
diff --git a/modules/worker/front/department/descriptor/index.html b/modules/worker/front/department/descriptor/index.html
index ec8aebdbe..d9f62353d 100644
--- a/modules/worker/front/department/descriptor/index.html
+++ b/modules/worker/front/department/descriptor/index.html
@@ -26,7 +26,7 @@
+ value="{{$ctrl.department.worker.firstName}}">
diff --git a/modules/worker/front/department/summary/index.html b/modules/worker/front/department/summary/index.html
index 9079b435a..8aa400683 100644
--- a/modules/worker/front/department/summary/index.html
+++ b/modules/worker/front/department/summary/index.html
@@ -35,8 +35,12 @@
value="{{summary.chatName}}">
+ label="Boss department">
+
+ {{summary.worker.firstName}} {{summary.worker.lastName}}
+
+
+
From 9fe7024d1792561d8de7b525e24e7fa2feb4b2ff Mon Sep 17 00:00:00 2001
From: pablone
Date: Mon, 3 Jul 2023 14:08:50 +0200
Subject: [PATCH 0342/1087] refs #5347
---
.../{232601 => 232801}/00-client_create.sql | 16 +++++++++-------
.../{232601 => 232801}/00-client_create2.sql | 7 +++----
2 files changed, 12 insertions(+), 11 deletions(-)
rename db/changes/{232601 => 232801}/00-client_create.sql (87%)
rename db/changes/{232601 => 232801}/00-client_create2.sql (89%)
diff --git a/db/changes/232601/00-client_create.sql b/db/changes/232801/00-client_create.sql
similarity index 87%
rename from db/changes/232601/00-client_create.sql
rename to db/changes/232801/00-client_create.sql
index f31a8e348..0728ba05e 100644
--- a/db/changes/232601/00-client_create.sql
+++ b/db/changes/232801/00-client_create.sql
@@ -76,12 +76,14 @@ BEGIN
hasCoreVnl = vHasCoreVnl,
isActive = TRUE;
- IF (SELECT COUNT(*)
- FROM mandate
- WHERE clientFk = vUserFk
- AND companyFk = vCompanyFk
- AND mandateTypeFk = vMandateTypeFk) = 0 THEN
- INSERT INTO mandate (clientFk, companyFk, mandateTypeFk)
- VALUES (vUserFk, vCompanyFk, vMandateTypeFk);
+ INSERT INTO mandate (clientFk, companyFk, mandateTypeFk)
+ SELECT vUserFk, vCompanyFk, vMandateTypeFk
+ WHERE NOT EXISTS (
+ SELECT id
+ FROM mandate
+ WHERE clientFk = vUserFk
+ AND companyFk = vCompanyFk
+ AND mandateTypeFk = vMandateTypeFk
+ );
END$$
DELIMITER ;
diff --git a/db/changes/232601/00-client_create2.sql b/db/changes/232801/00-client_create2.sql
similarity index 89%
rename from db/changes/232601/00-client_create2.sql
rename to db/changes/232801/00-client_create2.sql
index 99e25fdc8..d3b7407ed 100644
--- a/db/changes/232601/00-client_create2.sql
+++ b/db/changes/232801/00-client_create2.sql
@@ -1,5 +1,3 @@
-DROP PROCEDURE IF EXISTS vn.clientCreate;
-
ALTER TABLE vn.clientConfig ADD defaultPayMethodFk tinyint(3) unsigned NULL;
ALTER TABLE vn.clientConfig ADD defaultDueDay int unsigned NULL;
ALTER TABLE vn.clientConfig ADD defaultCredit decimal(10, 2) NULL;
@@ -9,10 +7,11 @@ ALTER TABLE vn.clientConfig ADD defaultMandateTypeFk smallint(5) NULL;
ALTER TABLE vn.clientConfig ADD CONSTRAINT clientNewConfigPayMethod_FK FOREIGN KEY (dafaultPayMethodFk) REFERENCES vn.payMethod(id);
ALTER TABLE vn.clientConfig ADD CONSTRAINT clientNewConfigMandateType_FK FOREIGN KEY (defaultMandateTypeFk) REFERENCES vn.mandateType(id);
-UPDATE vn.clientConfig
+INSERT IGNORE INTO vn.clientConfig
SET defaultPayMethodFk = 4,
defaultDueDay = 5,
defaultCredit = 300.0,
defaultIsTaxDataChecked = 1,
defaultHasCoreVnl = 1,
- defaultMandateTypeFk = 2;
\ No newline at end of file
+ defaultMandateTypeFk = 2
+ WHERE id = 1;
\ No newline at end of file
From 6b557d5d8a5bcd7eb7b1e38f051f2ae2059e015a Mon Sep 17 00:00:00 2001
From: pablone
Date: Mon, 3 Jul 2023 14:14:25 +0200
Subject: [PATCH 0343/1087] refs #5347
---
db/changes/232801/00-client_create2.sql | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/db/changes/232801/00-client_create2.sql b/db/changes/232801/00-client_create2.sql
index d3b7407ed..8ba4e78e5 100644
--- a/db/changes/232801/00-client_create2.sql
+++ b/db/changes/232801/00-client_create2.sql
@@ -7,7 +7,7 @@ ALTER TABLE vn.clientConfig ADD defaultMandateTypeFk smallint(5) NULL;
ALTER TABLE vn.clientConfig ADD CONSTRAINT clientNewConfigPayMethod_FK FOREIGN KEY (dafaultPayMethodFk) REFERENCES vn.payMethod(id);
ALTER TABLE vn.clientConfig ADD CONSTRAINT clientNewConfigMandateType_FK FOREIGN KEY (defaultMandateTypeFk) REFERENCES vn.mandateType(id);
-INSERT IGNORE INTO vn.clientConfig
+UPDATE vn.clientConfig
SET defaultPayMethodFk = 4,
defaultDueDay = 5,
defaultCredit = 300.0,
From 2ccf8d519795bc807230fb429ed5346b2e4767b7 Mon Sep 17 00:00:00 2001
From: pablone
Date: Mon, 3 Jul 2023 14:49:21 +0200
Subject: [PATCH 0344/1087] refs #5347
---
db/dump/fixtures.sql | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/db/dump/fixtures.sql b/db/dump/fixtures.sql
index 208eb2c21..c02e3dce4 100644
--- a/db/dump/fixtures.sql
+++ b/db/dump/fixtures.sql
@@ -382,9 +382,10 @@ INSERT INTO `vn`.`clientManaCache`(`clientFk`, `mana`, `dated`)
(1103, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH)),
(1104, -30, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH));
-INSERT INTO `vn`.`clientConfig`(`riskTolerance`, `maxCreditRows`)
+INSERT INTO `vn`.`clientConfig`(`id`, `riskTolerance`, `maxCreditRows`, `maxPriceIncreasingRatio`, `riskScope`, `defaultPayMethodFk`, `defaultDueDay`, `defaultCredit`, `defaultIsTaxDataChecked`, `defaultHasCoreVnl`, `defaultMandateTypeFk`)
VALUES
- (200, 10);
+ (1, 200, 10, 0.25, 2, 4, 5, 300.00, 1, 1, 2);
+
INSERT INTO `vn`.`address`(`id`, `nickname`, `street`, `city`, `postalCode`, `provinceFk`, `phone`, `mobile`, `isActive`, `clientFk`, `agencyModeFk`, `longitude`, `latitude`, `isEqualizated`, `isDefaultAddress`)
VALUES
From 4f616397a2d1c513f5e051872fb7468de28e5978 Mon Sep 17 00:00:00 2001
From: alexm
Date: Mon, 3 Jul 2023 15:05:39 +0200
Subject: [PATCH 0345/1087] refs #5712 use dmsType readRole
---
db/changes/232401/00-workerDocuware.sql | 7 ----
db/changes/232801/00-workerDocuware.sql | 10 +++++
.../{docuware.js => docuwareDownload.js} | 0
.../worker/back/methods/worker-dms/filter.js | 38 +++++++++++--------
modules/worker/back/models/worker-dms.js | 2 +-
5 files changed, 34 insertions(+), 23 deletions(-)
delete mode 100644 db/changes/232401/00-workerDocuware.sql
create mode 100644 db/changes/232801/00-workerDocuware.sql
rename modules/worker/back/methods/worker-dms/{docuware.js => docuwareDownload.js} (100%)
diff --git a/db/changes/232401/00-workerDocuware.sql b/db/changes/232401/00-workerDocuware.sql
deleted file mode 100644
index c8d4e4f23..000000000
--- a/db/changes/232401/00-workerDocuware.sql
+++ /dev/null
@@ -1,7 +0,0 @@
-INSERT INTO `vn`.`docuware` (code, fileCabinetName, `action`, dialogName, findById)
- VALUES
- ('hr', 'RRHH', 'find', 'Búsqueda', 'N__DOCUMENTO');
-
-INSERT INTO `salix`.`url` (appName, environment, url)
- VALUES
- ('docuware', 'production', 'https://verdnatura.docuware.cloud/DocuWare/Platform/');
diff --git a/db/changes/232801/00-workerDocuware.sql b/db/changes/232801/00-workerDocuware.sql
new file mode 100644
index 000000000..2d0ce3c33
--- /dev/null
+++ b/db/changes/232801/00-workerDocuware.sql
@@ -0,0 +1,10 @@
+ALTER TABLE `vn`.`docuware` ADD dmsTypeFk INT(11) DEFAULT NULL NULL;
+ALTER TABLE `vn`.`docuware` ADD CONSTRAINT docuware_FK FOREIGN KEY (dmsTypeFk) REFERENCES `vn`.`dmsType`(id) ON DELETE RESTRICT ON UPDATE CASCADE;
+INSERT INTO `vn`.`docuware` (code, fileCabinetName, `action`, dialogName, findById, dmsTypeFk)
+ VALUES
+ ('hr', 'RRHH', 'find', 'Búsqueda', 'N__DOCUMENTO', NULL);
+
+INSERT INTO `salix`.`url` (appName, environment, url)
+ VALUES
+ ('docuware', 'production', 'https://verdnatura.docuware.cloud/DocuWare/Platform/');
+
diff --git a/modules/worker/back/methods/worker-dms/docuware.js b/modules/worker/back/methods/worker-dms/docuwareDownload.js
similarity index 100%
rename from modules/worker/back/methods/worker-dms/docuware.js
rename to modules/worker/back/methods/worker-dms/docuwareDownload.js
diff --git a/modules/worker/back/methods/worker-dms/filter.js b/modules/worker/back/methods/worker-dms/filter.js
index 0b89cc883..1343038b7 100644
--- a/modules/worker/back/methods/worker-dms/filter.js
+++ b/modules/worker/back/methods/worker-dms/filter.js
@@ -57,23 +57,31 @@ module.exports = Self => {
const workerDms = await conn.executeStmt(stmt);
// Get docuware info
- const worker = await models.Worker.findById(id, {fields: ['fi', 'firstName', 'lastName']});
- const docuwareParse = {
- 'Filename': 'dmsFk',
- 'Tipo Documento': 'description',
- 'Stored on': 'created',
- };
- const workerDocuware = await models.Docuware.getById('hr', worker.lastName + worker.firstName, docuwareParse);
- for (document of workerDocuware) {
- const defaultData = {
- file: document.dmsFk + '.png',
- isDocuware: true,
- hardCopyNumber: null,
- hasFile: false,
- reference: worker.fi
+ const docuware = await models.Docuware.findOne({
+ fields: ['dmsTypeFk'],
+ where: {code: 'hr', action: 'find'}
+ });
+ const docuwareDmsType = docuware.dmsTypeFk;
+ if (!(docuwareDmsType && !await models.DmsType.hasReadRole(ctx, docuwareDmsType))) {
+ const worker = await models.Worker.findById(id, {fields: ['fi', 'firstName', 'lastName']});
+ const docuwareParse = {
+ 'Filename': 'dmsFk',
+ 'Tipo Documento': 'description',
+ 'Stored on': 'created',
};
+ const workerDocuware =
+ await models.Docuware.getById('hr', worker.lastName + worker.firstName, docuwareParse);
+ for (document of workerDocuware) {
+ const defaultData = {
+ file: document.dmsFk + '.png',
+ isDocuware: true,
+ hardCopyNumber: null,
+ hasFile: false,
+ reference: worker.fi
+ };
- document = Object.assign(document, defaultData);
+ document = Object.assign(document, defaultData);
+ }
}
return workerDms.concat(workerDocuware);
diff --git a/modules/worker/back/models/worker-dms.js b/modules/worker/back/models/worker-dms.js
index 1712383b3..6343e902e 100644
--- a/modules/worker/back/models/worker-dms.js
+++ b/modules/worker/back/models/worker-dms.js
@@ -2,7 +2,7 @@ module.exports = Self => {
require('../methods/worker-dms/downloadFile')(Self);
require('../methods/worker-dms/removeFile')(Self);
require('../methods/worker-dms/filter')(Self);
- require('../methods/worker-dms/docuware')(Self);
+ require('../methods/worker-dms/docuwareDownload')(Self);
Self.isMine = async function(ctx, dmsId) {
const myUserId = ctx.req.accessToken.userId;
From 5000e05e0593788f0122727066c4df140995470c Mon Sep 17 00:00:00 2001
From: carlossa
Date: Tue, 4 Jul 2023 09:57:16 +0200
Subject: [PATCH 0346/1087] refs #5334 merge + e2e solve
---
e2e/helpers/selectors.js | 12 +-
.../01-department/01_summary.spec.js | 2 +-
loopback/locale/es.json | 8 +-
modules/worker/back/models/worker.json | 2 +-
modules/worker/front/department/card/index.js | 8 +-
.../front/department/summary/index.html | 120 +++++++++---------
.../worker/front/department/summary/index.js | 1 +
.../front/department/summary/style.scss | 8 ++
modules/worker/front/summary/index.html | 2 +-
modules/worker/front/summary/index.js | 2 +-
10 files changed, 92 insertions(+), 73 deletions(-)
create mode 100644 modules/worker/front/department/summary/style.scss
diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js
index 3a2d6be5b..b10813488 100644
--- a/e2e/helpers/selectors.js
+++ b/e2e/helpers/selectors.js
@@ -899,12 +899,12 @@ export default {
},
departmentSummary: {
header: 'vn-worker-department-summary h5',
- name: 'vn-worker-department-summary vn-horizontal > vn-vertical > vn-label-value:nth-child(1) > section > span',
- code: 'vn-worker-department-summary vn-horizontal > vn-vertical > vn-label-value:nth-child(2) > section > span',
- chat: 'vn-worker-department-summary vn-horizontal > vn-vertical > vn-label-value:nth-child(3) > section > span',
- bossDepartment: 'vn-worker-department-summary vn-horizontal > vn-vertical > vn-label-value:nth-child(4) > section > span',
- email: 'vn-worker-department-summary vn-horizontal > vn-vertical > vn-label-value:nth-child(5) > section > span',
- clientFk: 'vn-worker-department-summary vn-horizontal > vn-vertical > vn-label-value:nth-child(6) > section > span',
+ name: 'vn-worker-department-summary vn-horizontal > vn-one > vn-vertical > vn-label-value:nth-child(1) > section > span',
+ code: 'vn-worker-department-summary vn-horizontal > vn-one > vn-vertical > vn-label-value:nth-child(2) > section > span',
+ chat: 'vn-worker-department-summary vn-horizontal > vn-one > vn-vertical > vn-label-value:nth-child(3) > section > span',
+ bossDepartment: 'vn-worker-department-summary vn-horizontal > vn-one > vn-vertical > vn-label-value:nth-child(4) > section > span',
+ email: 'vn-worker-department-summary vn-horizontal > vn-one > vn-vertical > vn-label-value:nth-child(5) > section > span',
+ clientFk: 'vn-worker-department-summary vn-horizontal > vn-one > vn-vertical > vn-label-value:nth-child(6) > section > span',
},
workerBasicData: {
name: 'vn-worker-basic-data vn-textfield[ng-model="$ctrl.worker.firstName"]',
diff --git a/e2e/paths/03-worker/01-department/01_summary.spec.js b/e2e/paths/03-worker/01-department/01_summary.spec.js
index de5b762e6..e4bf8fc2d 100644
--- a/e2e/paths/03-worker/01-department/01_summary.spec.js
+++ b/e2e/paths/03-worker/01-department/01_summary.spec.js
@@ -20,7 +20,7 @@ describe('department summary path', () => {
it('should reach the employee summary section and check all properties', async() => {
expect(await page.waitToGetProperty(selectors.departmentSummary.header, 'innerText')).toEqual('INFORMATICA');
expect(await page.getProperty(selectors.departmentSummary.name, 'innerText')).toEqual('INFORMATICA');
- expect(await page.getProperty(selectors.departmentSummary.code, 'innerText')).toEqual('IT');
+ expect(await page.getProperty(selectors.departmentSummary.code, 'innerText')).toEqual('it');
expect(await page.getProperty(selectors.departmentSummary.chat, 'innerText')).toEqual('informatica-cau');
expect(await page.getProperty(selectors.departmentSummary.bossDepartment, 'innerText')).toEqual('');
expect(await page.getProperty(selectors.departmentSummary.email, 'innerText')).toEqual('-');
diff --git a/loopback/locale/es.json b/loopback/locale/es.json
index 1dc37ab22..5ba116051 100644
--- a/loopback/locale/es.json
+++ b/loopback/locale/es.json
@@ -297,6 +297,8 @@
"Fecha fuera de rango": "Fecha fuera de rango",
"Error while generating PDF": "Error al generar PDF",
"Error when sending mail to client": "Error al enviar el correo al cliente",
- "Mail not sent": "Se ha producido un fallo al enviar la factura al cliente [{{clientId}}]({{{clientUrl}}}), por favor revisa la dirección de correo electrónico",
- "The renew period has not been exceeded": "El periodo de renovación no ha sido superado"
-}
+ "Mail not sent": "Se ha producido un fallo al enviar la factura al cliente [{{clientId}}]({{{clientUrl}}}), por favor revisa la dirección de correo electrónico",
+ "The renew period has not been exceeded": "El periodo de renovación no ha sido superado",
+ "Valid priorities: 1,2,3": "Valid priorities: 1,2,3",
+ "No se pueden borrar tickets con abonos asociados. Este ticket está asociado al abono Nº 3": "No se pueden borrar tickets con abonos asociados. Este ticket está asociado al abono Nº 3"
+}
\ No newline at end of file
diff --git a/modules/worker/back/models/worker.json b/modules/worker/back/models/worker.json
index 88200a4a9..978d613e9 100644
--- a/modules/worker/back/models/worker.json
+++ b/modules/worker/back/models/worker.json
@@ -60,7 +60,7 @@
"user": {
"type": "belongsTo",
"model": "VnUser",
- "foreignKey": "userFk"
+ "foreignKey": "id"
},
"boss": {
"type": "belongsTo",
diff --git a/modules/worker/front/department/card/index.js b/modules/worker/front/department/card/index.js
index 62ecf998b..0a6e3e71c 100644
--- a/modules/worker/front/department/card/index.js
+++ b/modules/worker/front/department/card/index.js
@@ -15,7 +15,13 @@ class Controller extends ModuleCard {
}, {
relation: 'worker',
scope: {
- fields: ['id', 'firstName', 'lastName']
+ fields: ['id', 'firstName', 'lastName'],
+ include: {
+ relation: 'user',
+ scope: {
+ fields: ['name']
+ }
+ }
}
}
]
diff --git a/modules/worker/front/department/summary/index.html b/modules/worker/front/department/summary/index.html
index 8aa400683..185d024d7 100644
--- a/modules/worker/front/department/summary/index.html
+++ b/modules/worker/front/department/summary/index.html
@@ -11,73 +11,75 @@
{{summary.name}}
-
+
- Basic data
-
+ ui-sref="worker.department.card.basicData({id:summary.id})">
+ Basic data
+
{{ $t('Enter the following code to continue to your account') }}
-
- {{ code }}
-
-
{{ $t('It expires in 5 minutes') }}
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ $t('title') }}
+
{{ $t('description') }}
+
+ {{ $t('device') }}: {{ device }}
+
+
+ {{$t('ip')}}: {{ ip }}
+
+
+
+
+
+
{{ $t('Enter the following code to continue to your account. It expires in 5 minutes.') }}
+
+ {{ code }}
+
+
+
+
+
+
+
+
+
diff --git a/print/templates/email/auth-code/auth-code.js b/print/templates/email/auth-code/auth-code.js
index 362b307d8..b16833036 100755
--- a/print/templates/email/auth-code/auth-code.js
+++ b/print/templates/email/auth-code/auth-code.js
@@ -1,10 +1,10 @@
const Component = require(`vn-print/core/component`);
-const emailBody = new Component('email-body');
+const emailHeader = new Component('email-header');
module.exports = {
name: 'auth-code',
components: {
- 'email-body': emailBody.build(),
+ 'email-header': emailHeader.build(),
},
props: {
code: {
diff --git a/print/templates/email/auth-code/locale/en.yml b/print/templates/email/auth-code/locale/en.yml
index 27b493e20..74ea87e32 100644
--- a/print/templates/email/auth-code/locale/en.yml
+++ b/print/templates/email/auth-code/locale/en.yml
@@ -3,5 +3,4 @@ title: Verification code
description: Somebody did request a verification code for login. If you didn't request it, please ignore this email.
device: 'Device'
ip: 'IP'
-Enter the following code to continue to your account: Enter the following code to continue to your account
-It expires in 5 minutes: It expires in 5 minutes
+Enter the following code to continue to your account. It expires in 5 minutes.: Enter the following code to continue to your account. It expires in 5 minutes.
diff --git a/print/templates/email/auth-code/locale/es.yml b/print/templates/email/auth-code/locale/es.yml
index 463ea95fa..0de99f5be 100644
--- a/print/templates/email/auth-code/locale/es.yml
+++ b/print/templates/email/auth-code/locale/es.yml
@@ -3,5 +3,4 @@ title: Código de verificación
description: Alguien ha solicitado un código de verificación para poder iniciar sesión. Si no lo has solicitado tu, ignora este email.
device: 'Dispositivo'
ip: 'IP'
-Enter the following code to continue to your account: Introduce el siguiente código para poder continuar con tu cuenta
-It expires in 5 minutes: Expira en 5 minutos
+Enter the following code to continue to your account. It expires in 5 minutes: Introduce el siguiente código para poder continuar con tu cuenta. Expira en 5 minutos.
diff --git a/print/templates/email/auth-code/locale/fr.yml b/print/templates/email/auth-code/locale/fr.yml
index 454bb80ae..0b71d4228 100644
--- a/print/templates/email/auth-code/locale/fr.yml
+++ b/print/templates/email/auth-code/locale/fr.yml
@@ -3,5 +3,4 @@ title: Code de vérification
description: Quelqu'un a demandé un code de vérification pour se connecter. Si ce n'était pas toi, ignore cet email.
device: 'Appareil'
ip: 'IP'
-Enter the following code to continue to your account: Entrez le code suivant pour continuer avec votre compte
-It expires in 5 minutes: Il expire dans 5 minutes.
+Enter the following code to continue to your account. It expires in 5 minutes.: Entrez le code suivant pour continuer avec votre compte. Il expire dans 5 minutes.
diff --git a/print/templates/email/auth-code/locale/pt.yml b/print/templates/email/auth-code/locale/pt.yml
index 7f9eb85f5..cea27dce7 100644
--- a/print/templates/email/auth-code/locale/pt.yml
+++ b/print/templates/email/auth-code/locale/pt.yml
@@ -3,5 +3,4 @@ title: Código de verificação
description: Alguém solicitou um código de verificação para entrar. Se você não fez essa solicitação, ignore este e-mail.
device: 'Dispositivo'
ip: 'IP'
-Enter the following code to continue to your account: Insira o seguinte código para continuar com sua conta.
-It expires in 5 minutes: Expira em 5 minutos.
+Enter the following code to continue to your account. It expires in 5 minutes: Insira o seguinte código para continuar com sua conta. Expira em 5 minutos.
From ba109dccc5fec9f636fbd76178d42ffbc5d38e06 Mon Sep 17 00:00:00 2001
From: carlossa
Date: Tue, 11 Jul 2023 07:58:18 +0200
Subject: [PATCH 0369/1087] refs #5949 trad
---
modules/item/front/basic-data/index.html | 6 +++---
modules/item/front/basic-data/locale/es.yml | 10 ++++++----
modules/item/front/summary/index.html | 8 ++++----
3 files changed, 13 insertions(+), 11 deletions(-)
diff --git a/modules/item/front/basic-data/index.html b/modules/item/front/basic-data/index.html
index 61456f154..285ad11f9 100644
--- a/modules/item/front/basic-data/index.html
+++ b/modules/item/front/basic-data/index.html
@@ -170,14 +170,14 @@
diff --git a/modules/item/front/basic-data/locale/es.yml b/modules/item/front/basic-data/locale/es.yml
index 747dfe792..b6f3c9f75 100644
--- a/modules/item/front/basic-data/locale/es.yml
+++ b/modules/item/front/basic-data/locale/es.yml
@@ -1,7 +1,7 @@
Reference: Referencia
-Full name calculates based on tags 1-3. Is not recommended to change it manually: >-
- El nombre completo se calcula
- basado en los tags 1-3.
+Full name calculates based on tags 1-3. Is not recommended to change it manually: >-
+ El nombre completo se calcula
+ basado en los tags 1-3.
No se recomienda cambiarlo manualmente
Is active: Activo
Expense: Gasto
@@ -13,4 +13,6 @@ Is shown at website, app that this item cannot travel (wreath, palms, ...): Se m
Multiplier: Multiplicador
Generic: Genérico
This item does need a photo: Este artículo necesita una foto
-Do photo: Hacer foto
\ No newline at end of file
+Do photo: Hacer foto
+Recyled Plastic: Plástico reciclado
+No recycled plastic: Plástico no reciclado
diff --git a/modules/item/front/summary/index.html b/modules/item/front/summary/index.html
index 78b7af355..af8752b5f 100644
--- a/modules/item/front/summary/index.html
+++ b/modules/item/front/summary/index.html
@@ -113,19 +113,19 @@
-
-
-
-
From 6978339fd3f2d3f13c7161f14c74769cd1117c77 Mon Sep 17 00:00:00 2001
From: alexm
Date: Tue, 11 Jul 2023 08:03:36 +0200
Subject: [PATCH 0370/1087] refs #5475 fix email translations
---
print/templates/email/auth-code/locale/es.yml | 2 +-
print/templates/email/auth-code/locale/pt.yml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/print/templates/email/auth-code/locale/es.yml b/print/templates/email/auth-code/locale/es.yml
index 0de99f5be..92150c4ed 100644
--- a/print/templates/email/auth-code/locale/es.yml
+++ b/print/templates/email/auth-code/locale/es.yml
@@ -3,4 +3,4 @@ title: Código de verificación
description: Alguien ha solicitado un código de verificación para poder iniciar sesión. Si no lo has solicitado tu, ignora este email.
device: 'Dispositivo'
ip: 'IP'
-Enter the following code to continue to your account. It expires in 5 minutes: Introduce el siguiente código para poder continuar con tu cuenta. Expira en 5 minutos.
+Enter the following code to continue to your account. It expires in 5 minutes.: Introduce el siguiente código para poder continuar con tu cuenta. Expira en 5 minutos.
diff --git a/print/templates/email/auth-code/locale/pt.yml b/print/templates/email/auth-code/locale/pt.yml
index cea27dce7..1cf5d23be 100644
--- a/print/templates/email/auth-code/locale/pt.yml
+++ b/print/templates/email/auth-code/locale/pt.yml
@@ -3,4 +3,4 @@ title: Código de verificação
description: Alguém solicitou um código de verificação para entrar. Se você não fez essa solicitação, ignore este e-mail.
device: 'Dispositivo'
ip: 'IP'
-Enter the following code to continue to your account. It expires in 5 minutes: Insira o seguinte código para continuar com sua conta. Expira em 5 minutos.
+Enter the following code to continue to your account. It expires in 5 minutes.: Insira o seguinte código para continuar com sua conta. Expira em 5 minutos.
From 7291b793ae6cdf80b7d5ab394564711eb7629284 Mon Sep 17 00:00:00 2001
From: carlossa
Date: Tue, 11 Jul 2023 08:41:43 +0200
Subject: [PATCH 0371/1087] refs #5949 fix traduct
---
modules/item/front/basic-data/index.html | 4 ++--
modules/item/front/basic-data/locale/es.yml | 4 ++--
modules/item/front/summary/index.html | 4 ++--
3 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/modules/item/front/basic-data/index.html b/modules/item/front/basic-data/index.html
index 285ad11f9..fba4d679c 100644
--- a/modules/item/front/basic-data/index.html
+++ b/modules/item/front/basic-data/index.html
@@ -170,14 +170,14 @@
diff --git a/modules/item/front/basic-data/locale/es.yml b/modules/item/front/basic-data/locale/es.yml
index b6f3c9f75..8f459c417 100644
--- a/modules/item/front/basic-data/locale/es.yml
+++ b/modules/item/front/basic-data/locale/es.yml
@@ -14,5 +14,5 @@ Multiplier: Multiplicador
Generic: Genérico
This item does need a photo: Este artículo necesita una foto
Do photo: Hacer foto
-Recyled Plastic: Plástico reciclado
-No recycled plastic: Plástico no reciclado
+Recycled Plastic: Plástico reciclado
+Non recycled plastic: Plástico no reciclado
diff --git a/modules/item/front/summary/index.html b/modules/item/front/summary/index.html
index af8752b5f..fcc267b4d 100644
--- a/modules/item/front/summary/index.html
+++ b/modules/item/front/summary/index.html
@@ -122,10 +122,10 @@
-
-
From 93e70e699a4821e1a91b6f2adc5fa5910c6ab820 Mon Sep 17 00:00:00 2001
From: vicent
Date: Tue, 11 Jul 2023 09:19:15 +0200
Subject: [PATCH 0372/1087] =?UTF-8?q?refs=20#5874=20feat:=20refactorizado?=
=?UTF-8?q?=20proceso=20facturaci=C3=B3n?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
loopback/locale/en.json | 5 +-
loopback/locale/es.json | 3 +-
modules/client/back/models/client.js | 6 +-
modules/client/front/summary/index.html | 5 +-
.../back/methods/invoiceOut/invoiceClient.js | 56 ++-------
.../methods/invoiceOut/makePdfAndNotify.js | 5 +-
.../back/methods/ticket/canBeInvoiced.js | 47 ++++---
.../back/methods/ticket/invoiceTickets.js | 105 ++++++++++++++++
.../ticket/back/methods/ticket/makeInvoice.js | 91 ++++++--------
.../ticket/specs/canBeInvoiced.spec.js | 76 +++++++++---
.../ticket/specs/invoiceTickets.spec.js | 115 ++++++++++++++++++
.../methods/ticket/specs/makeInvoice.spec.js | 92 +++-----------
modules/ticket/back/models/ticket-methods.js | 1 +
modules/ticket/front/descriptor-menu/index.js | 2 +-
.../front/descriptor-menu/index.spec.js | 2 +-
modules/ticket/front/index/index.js | 2 +-
16 files changed, 390 insertions(+), 223 deletions(-)
create mode 100644 modules/ticket/back/methods/ticket/invoiceTickets.js
create mode 100644 modules/ticket/back/methods/ticket/specs/invoiceTickets.spec.js
diff --git a/loopback/locale/en.json b/loopback/locale/en.json
index 9b1b04600..d7d31a3dc 100644
--- a/loopback/locale/en.json
+++ b/loopback/locale/en.json
@@ -177,5 +177,6 @@
"Invalid quantity": "Invalid quantity",
"Failed to upload delivery note": "Error to upload delivery note {{id}}",
"Mail not sent": "There has been an error sending the invoice to the client [{{clientId}}]({{{clientUrl}}}), please check the email address",
- "The renew period has not been exceeded": "The renew period has not been exceeded"
-}
\ No newline at end of file
+ "The renew period has not been exceeded": "The renew period has not been exceeded",
+ "Negative basis of tickets": "Negative basis of tickets: {{ticketsIds}}"
+}
diff --git a/loopback/locale/es.json b/loopback/locale/es.json
index ed036331f..20a9557e9 100644
--- a/loopback/locale/es.json
+++ b/loopback/locale/es.json
@@ -297,5 +297,6 @@
"Error while generating PDF": "Error al generar PDF",
"Error when sending mail to client": "Error al enviar el correo al cliente",
"Mail not sent": "Se ha producido un fallo al enviar la factura al cliente [{{clientId}}]({{{clientUrl}}}), por favor revisa la dirección de correo electrónico",
- "The renew period has not been exceeded": "El periodo de renovación no ha sido superado"
+ "The renew period has not been exceeded": "El periodo de renovación no ha sido superado",
+ "Negative basis of tickets": "Base negativa para los tickets: {{ticketsIds}}"
}
diff --git a/modules/client/back/models/client.js b/modules/client/back/models/client.js
index 51157e15d..046138725 100644
--- a/modules/client/back/models/client.js
+++ b/modules/client/back/models/client.js
@@ -14,7 +14,7 @@ module.exports = Self => {
Self.validatesPresenceOf('street', {
message: 'Street cannot be empty'
});
-
+
Self.validatesPresenceOf('city', {
message: 'City cannot be empty'
});
@@ -89,7 +89,7 @@ module.exports = Self => {
};
const country = await Self.app.models.Country.findOne(filter);
const code = country ? country.code.toLowerCase() : null;
- const countryCode = this.fi.toLowerCase().substring(0, 2);
+ const countryCode = this.fi?.toLowerCase().substring(0, 2);
if (!this.fi || !validateTin(this.fi, code) || (this.isVies && countryCode == code))
err();
@@ -401,7 +401,7 @@ module.exports = Self => {
Self.changeCredit = async function changeCredit(ctx, finalState, changes) {
const models = Self.app.models;
const userId = ctx.options.accessToken.userId;
- const accessToken = {req: {accessToken: ctx.options.accessToken} };
+ const accessToken = {req: {accessToken: ctx.options.accessToken}};
const canEditCredit = await models.ACL.checkAccessAcl(accessToken, 'Client', 'editCredit', 'WRITE');
if (!canEditCredit) {
diff --git a/modules/client/front/summary/index.html b/modules/client/front/summary/index.html
index a0d4b918a..0a15efcd1 100644
--- a/modules/client/front/summary/index.html
+++ b/modules/client/front/summary/index.html
@@ -64,7 +64,7 @@
-
@@ -296,6 +296,9 @@
value="{{$ctrl.summary.rating}}"
info="Value from 1 to 20. The higher the better value">
+
+
diff --git a/modules/invoiceOut/back/methods/invoiceOut/invoiceClient.js b/modules/invoiceOut/back/methods/invoiceOut/invoiceClient.js
index ddd008942..fa22dab1e 100644
--- a/modules/invoiceOut/back/methods/invoiceOut/invoiceClient.js
+++ b/modules/invoiceOut/back/methods/invoiceOut/invoiceClient.js
@@ -1,5 +1,3 @@
-const UserError = require('vn-loopback/util/user-error');
-
module.exports = Self => {
Self.remoteMethodCtx('invoiceClient', {
description: 'Make a invoice of a client',
@@ -56,7 +54,6 @@ module.exports = Self => {
const minShipped = Date.vnNew();
minShipped.setFullYear(args.maxShipped.getFullYear() - 1);
- let invoiceId;
try {
const client = await models.Client.findById(args.clientId, {
fields: ['id', 'hasToInvoiceByAddress']
@@ -77,56 +74,21 @@ module.exports = Self => {
], options);
}
- // Check negative bases
-
- let query =
- `SELECT COUNT(*) isSpanishCompany
- FROM supplier s
- JOIN country c ON c.id = s.countryFk
- AND c.code = 'ES'
- WHERE s.id = ?`;
- const [supplierCompany] = await Self.rawSql(query, [
- args.companyFk
- ], options);
-
- const isSpanishCompany = supplierCompany?.isSpanishCompany;
-
- query = 'SELECT hasAnyNegativeBase() AS base';
- const [result] = await Self.rawSql(query, null, options);
-
- const hasAnyNegativeBase = result?.base;
- if (hasAnyNegativeBase && isSpanishCompany)
- throw new UserError('Negative basis');
-
- // Invoicing
-
- query = `SELECT invoiceSerial(?, ?, ?) AS serial`;
- const [invoiceSerial] = await Self.rawSql(query, [
- client.id,
+ const invoiceType = 'G';
+ const invoiceId = await models.Ticket.makeInvoice(
+ ctx,
+ invoiceType,
args.companyFk,
- 'G'
- ], options);
- const serialLetter = invoiceSerial.serial;
-
- query = `CALL invoiceOut_new(?, ?, NULL, @invoiceId)`;
- await Self.rawSql(query, [
- serialLetter,
- args.invoiceDate
- ], options);
-
- const [newInvoice] = await Self.rawSql(`SELECT @invoiceId id`, null, options);
- if (!newInvoice)
- throw new UserError('No tickets to invoice', 'notInvoiced');
-
- await Self.rawSql('CALL invoiceOutBooking(?)', [newInvoice.id], options);
- invoiceId = newInvoice.id;
+ args.invoiceDate,
+ options
+ );
if (tx) await tx.commit();
+
+ return invoiceId;
} catch (e) {
if (tx) await tx.rollback();
throw e;
}
-
- return invoiceId;
};
};
diff --git a/modules/invoiceOut/back/methods/invoiceOut/makePdfAndNotify.js b/modules/invoiceOut/back/methods/invoiceOut/makePdfAndNotify.js
index a999437c0..a48664b30 100644
--- a/modules/invoiceOut/back/methods/invoiceOut/makePdfAndNotify.js
+++ b/modules/invoiceOut/back/methods/invoiceOut/makePdfAndNotify.js
@@ -14,8 +14,7 @@ module.exports = Self => {
}, {
arg: 'printerFk',
type: 'number',
- description: 'The printer to print',
- required: true
+ description: 'The printer to print'
}
],
http: {
@@ -51,7 +50,7 @@ module.exports = Self => {
const ref = invoiceOut.ref;
const client = invoiceOut.client();
- if (client.isToBeMailed) {
+ if (client.isToBeMailed || !printerFk) {
try {
ctx.args = {
reference: ref,
diff --git a/modules/ticket/back/methods/ticket/canBeInvoiced.js b/modules/ticket/back/methods/ticket/canBeInvoiced.js
index 6b8f9e71a..0f6cb476b 100644
--- a/modules/ticket/back/methods/ticket/canBeInvoiced.js
+++ b/modules/ticket/back/methods/ticket/canBeInvoiced.js
@@ -1,3 +1,5 @@
+const UserError = require('vn-loopback/util/user-error');
+
module.exports = function(Self) {
Self.remoteMethodCtx('canBeInvoiced', {
description: 'Whether the ticket can or not be invoiced',
@@ -21,8 +23,9 @@ module.exports = function(Self) {
}
});
- Self.canBeInvoiced = async(ticketsIds, options) => {
+ Self.canBeInvoiced = async(ctx, ticketsIds, options) => {
const myOptions = {};
+ const $t = ctx.req.__; // $translate
if (typeof options == 'object')
Object.assign(myOptions, options);
@@ -31,29 +34,43 @@ module.exports = function(Self) {
where: {
id: {inq: ticketsIds}
},
- fields: ['id', 'refFk', 'shipped', 'totalWithVat']
+ fields: ['id', 'refFk', 'shipped', 'totalWithVat', 'companyFk']
}, myOptions);
+ const [firstTicket] = tickets;
+ const companyFk = firstTicket.companyFk;
- const query = `
- SELECT vn.hasSomeNegativeBase(t.id) AS hasSomeNegativeBase
- FROM ticket t
- WHERE id IN(?)`;
- const ticketBases = await Self.rawSql(query, [ticketsIds], myOptions);
- const hasSomeNegativeBase = ticketBases.some(
- ticketBases => ticketBases.hasSomeNegativeBase
- );
+ const query =
+ `SELECT COUNT(*) isSpanishCompany
+ FROM supplier s
+ JOIN country c ON c.id = s.countryFk
+ AND c.code = 'ES'
+ WHERE s.id = ?`;
+ const [supplierCompany] = await Self.rawSql(query, [companyFk], options);
+
+ const isSpanishCompany = supplierCompany?.isSpanishCompany;
+
+ const [result] = await Self.rawSql('SELECT hasAnyNegativeBase() AS base', null, options);
+ const hasAnyNegativeBase = result?.base && isSpanishCompany;
+ if (hasAnyNegativeBase)
+ throw new UserError($t('Negative basis of tickets', {ticketsIds: ticketsIds}));
const today = Date.vnNew();
- const invalidTickets = tickets.some(ticket => {
+ tickets.some(ticket => {
const shipped = new Date(ticket.shipped);
const shippingInFuture = shipped.getTime() > today.getTime();
- const isInvoiced = ticket.refFk;
- const priceZero = ticket.totalWithVat == 0;
+ if (shippingInFuture)
+ throw new UserError(`Can't invoice to future`);
- return isInvoiced || priceZero || shippingInFuture;
+ const isInvoiced = ticket.refFk;
+ if (isInvoiced)
+ throw new UserError(`This ticket is already invoiced`);
+
+ const priceZero = ticket.totalWithVat == 0;
+ if (priceZero)
+ throw new UserError(`A ticket with an amount of zero can't be invoiced`);
});
- return !(invalidTickets || hasSomeNegativeBase);
+ return true;
};
};
diff --git a/modules/ticket/back/methods/ticket/invoiceTickets.js b/modules/ticket/back/methods/ticket/invoiceTickets.js
new file mode 100644
index 000000000..780e9eb57
--- /dev/null
+++ b/modules/ticket/back/methods/ticket/invoiceTickets.js
@@ -0,0 +1,105 @@
+const UserError = require('vn-loopback/util/user-error');
+
+module.exports = function(Self) {
+ Self.remoteMethodCtx('invoiceTickets', {
+ description: 'Make out an invoice from one or more tickets',
+ accessType: 'WRITE',
+ accepts: [
+ {
+ arg: 'ticketsIds',
+ description: 'The tickets id',
+ type: ['number'],
+ required: true
+ }
+ ],
+ returns: {
+ type: ['object'],
+ root: true
+ },
+ http: {
+ path: `/invoiceTickets`,
+ verb: 'POST'
+ }
+ });
+
+ Self.invoiceTickets = async(ctx, ticketsIds, options) => {
+ const models = Self.app.models;
+ const date = Date.vnNew();
+ date.setHours(0, 0, 0, 0);
+
+ const myOptions = {userId: ctx.req.accessToken.userId};
+ let tx;
+
+ if (typeof options === 'object')
+ Object.assign(myOptions, options);
+
+ if (!myOptions.transaction) {
+ tx = await Self.beginTransaction({});
+ myOptions.transaction = tx;
+ }
+
+ let invoicesIds = [];
+ try {
+ const tickets = await models.Ticket.find({
+ where: {
+ id: {inq: ticketsIds}
+ },
+ fields: ['id', 'clientFk', 'companyFk']
+ }, myOptions);
+
+ const [firstTicket] = tickets;
+ const clientId = firstTicket.clientFk;
+ const companyId = firstTicket.companyFk;
+
+ const isSameClient = tickets.every(ticket => ticket.clientFk === clientId);
+ if (!isSameClient)
+ throw new UserError(`You can't invoice tickets from multiple clients`);
+
+ const client = await models.Client.findById(clientId, {
+ fields: ['id', 'hasToInvoiceByAddress']
+ }, myOptions);
+
+ if (client.hasToInvoiceByAddress) {
+ const query = `
+ SELECT DISTINCT addressFk
+ FROM ticket t
+ WHERE id IN (?)`;
+ const result = await Self.rawSql(query, [ticketsIds], myOptions);
+
+ const addressIds = result.map(address => address.addressFk);
+ for (const address of addressIds)
+ await createInvoice(ctx, companyId, ticketsIds, address, invoicesIds, myOptions);
+ } else
+ await createInvoice(ctx, companyId, ticketsIds, null, invoicesIds, myOptions);
+
+ if (tx) await tx.commit();
+ } catch (e) {
+ if (tx) await tx.rollback();
+ throw e;
+ }
+
+ for (const invoiceId of invoicesIds)
+ await models.InvoiceOut.makePdfAndNotify(ctx, invoiceId, null);
+
+ return invoicesIds;
+ };
+
+ async function createInvoice(ctx, companyId, ticketsIds, address, invoicesIds, myOptions) {
+ const models = Self.app.models;
+
+ await models.Ticket.rawSql(`
+ DROP TEMPORARY TABLE IF EXISTS tmp.ticketToInvoice;
+ CREATE TEMPORARY TABLE tmp.ticketToInvoice
+ (PRIMARY KEY (id))
+ ENGINE = MEMORY
+ SELECT id
+ FROM vn.ticket
+ WHERE id IN (?)
+ ${address ? `AND addressFk = ${address}` : ''}
+ `, [ticketsIds], myOptions);
+
+ const invoiceId = await models.Ticket.makeInvoice(ctx, 'R', companyId, Date.vnNew(), myOptions);
+ invoicesIds.push(invoiceId);
+ }
+};
+
diff --git a/modules/ticket/back/methods/ticket/makeInvoice.js b/modules/ticket/back/methods/ticket/makeInvoice.js
index ee82b874f..22fe7b3f5 100644
--- a/modules/ticket/back/methods/ticket/makeInvoice.js
+++ b/modules/ticket/back/methods/ticket/makeInvoice.js
@@ -6,15 +6,26 @@ module.exports = function(Self) {
accessType: 'WRITE',
accepts: [
{
- arg: 'ticketsIds',
- description: 'The tickets id',
- type: ['number'],
+ arg: 'invoiceType',
+ description: 'The invoice type',
+ type: 'string',
+ required: true
+ },
+ {
+ arg: 'companyFk',
+ description: 'The company id',
+ type: 'string',
+ required: true
+ },
+ {
+ arg: 'invoiceDate',
+ description: 'The invoice date',
+ type: 'date',
required: true
}
],
returns: {
- arg: 'data',
- type: 'boolean',
+ type: ['object'],
root: true
},
http: {
@@ -23,10 +34,9 @@ module.exports = function(Self) {
}
});
- Self.makeInvoice = async(ctx, ticketsIds, options) => {
+ Self.makeInvoice = async(ctx, invoiceType, companyFk, invoiceDate, options) => {
const models = Self.app.models;
- const date = Date.vnNew();
- date.setHours(0, 0, 0, 0);
+ invoiceDate.setHours(0, 0, 0, 0);
const myOptions = {userId: ctx.req.accessToken.userId};
let tx;
@@ -40,81 +50,50 @@ module.exports = function(Self) {
}
let serial;
- let invoiceId;
- let invoiceOut;
try {
+ const ticketToInvoice = await Self.rawSql(`
+ SELECT id
+ FROM tmp.ticketToInvoice`, null, myOptions);
+
+ const ticketsIds = ticketToInvoice.map(ticket => ticket.id);
const tickets = await models.Ticket.find({
where: {
id: {inq: ticketsIds}
},
- fields: ['id', 'clientFk', 'companyFk']
+ fields: ['id', 'clientFk']
}, myOptions);
+ await models.Ticket.canBeInvoiced(ctx, ticketsIds, myOptions);
+
const [firstTicket] = tickets;
const clientId = firstTicket.clientFk;
- const companyId = firstTicket.companyFk;
-
- const isSameClient = tickets.every(ticket => ticket.clientFk == clientId);
- if (!isSameClient)
- throw new UserError(`You can't invoice tickets from multiple clients`);
-
const clientCanBeInvoiced = await models.Client.canBeInvoiced(clientId, myOptions);
if (!clientCanBeInvoiced)
throw new UserError(`This client can't be invoiced`);
- const ticketCanBeInvoiced = await models.Ticket.canBeInvoiced(ticketsIds, myOptions);
- if (!ticketCanBeInvoiced)
- throw new UserError(`Some of the selected tickets are not billable`);
-
const query = `SELECT vn.invoiceSerial(?, ?, ?) AS serial`;
const [result] = await Self.rawSql(query, [
clientId,
- companyId,
- 'R'
+ companyFk,
+ invoiceType,
], myOptions);
serial = result.serial;
- await Self.rawSql(`
- DROP TEMPORARY TABLE IF EXISTS tmp.ticketToInvoice;
- CREATE TEMPORARY TABLE tmp.ticketToInvoice
- (PRIMARY KEY (id))
- ENGINE = MEMORY
- SELECT id FROM vn.ticket
- WHERE id IN(?) AND refFk IS NULL
- `, [ticketsIds], myOptions);
-
- await Self.rawSql('CALL invoiceOut_new(?, ?, null, @invoiceId)', [serial, date], myOptions);
+ await Self.rawSql('CALL invoiceOut_new(?, ?, null, @invoiceId)', [serial, invoiceDate], myOptions);
const [resultInvoice] = await Self.rawSql('SELECT @invoiceId id', [], myOptions);
+ if (!resultInvoice)
+ throw new UserError('No tickets to invoice', 'notInvoiced');
- invoiceId = resultInvoice.id;
+ if (serial != 'R' && resultInvoice.id)
+ await Self.rawSql('CALL invoiceOutBooking(?)', [resultInvoice.id], myOptions);
- if (serial != 'R' && invoiceId)
- await Self.rawSql('CALL invoiceOutBooking(?)', [invoiceId], myOptions);
-
- invoiceOut = await models.InvoiceOut.findById(invoiceId, {
- include: {
- relation: 'client'
- }
- }, myOptions);
if (tx) await tx.commit();
+
+ return resultInvoice.id;
} catch (e) {
if (tx) await tx.rollback();
throw e;
}
-
- if (serial != 'R' && invoiceId)
- await models.InvoiceOut.createPdf(ctx, invoiceId);
-
- if (invoiceId) {
- ctx.args = {
- reference: invoiceOut.ref,
- recipientId: invoiceOut.clientFk,
- recipient: invoiceOut.client().email
- };
- await models.InvoiceOut.invoiceEmail(ctx, invoiceOut.ref);
- }
-
- return {invoiceFk: invoiceId, serial: serial};
};
};
diff --git a/modules/ticket/back/methods/ticket/specs/canBeInvoiced.spec.js b/modules/ticket/back/methods/ticket/specs/canBeInvoiced.spec.js
index 806f80227..42f9b5a9e 100644
--- a/modules/ticket/back/methods/ticket/specs/canBeInvoiced.spec.js
+++ b/modules/ticket/back/methods/ticket/specs/canBeInvoiced.spec.js
@@ -1,61 +1,83 @@
const models = require('vn-loopback/server/server').models;
-const LoopBackContext = require('loopback-context');
describe('ticket canBeInvoiced()', () => {
const userId = 19;
const ticketId = 11;
- const activeCtx = {
- accessToken: {userId: userId}
+ const ctx = {req: {accessToken: {userId: userId}}};
+ ctx.req.__ = value => {
+ return value;
};
- beforeAll(async() => {
- spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
- active: activeCtx
- });
- });
-
it('should return falsy for an already invoiced ticket', async() => {
const tx = await models.Ticket.beginTransaction({});
+ let error;
try {
const options = {transaction: tx};
const ticket = await models.Ticket.findById(ticketId, null, options);
await ticket.updateAttribute('refFk', 'T1111111', options);
- const canBeInvoiced = await models.Ticket.canBeInvoiced([ticketId], options);
+ await models.Ticket.rawSql(`
+ DROP TEMPORARY TABLE IF EXISTS tmp.ticketToInvoice;
+ CREATE TEMPORARY TABLE tmp.ticketToInvoice
+ (PRIMARY KEY (id))
+ ENGINE = MEMORY
+ SELECT id
+ FROM vn.ticket
+ WHERE id IN (?)
+ `, [ticketId], options);
+
+ const canBeInvoiced = await models.Ticket.canBeInvoiced(ctx, [ticketId], options);
expect(canBeInvoiced).toEqual(false);
await tx.rollback();
} catch (e) {
+ error = e;
await tx.rollback();
- throw e;
}
+
+ expect(error.message).toEqual(`This ticket is already invoiced`);
});
it('should return falsy for a ticket with a price of zero', async() => {
const tx = await models.Ticket.beginTransaction({});
+ let error;
try {
const options = {transaction: tx};
const ticket = await models.Ticket.findById(ticketId, null, options);
await ticket.updateAttribute('totalWithVat', 0, options);
- const canBeInvoiced = await models.Ticket.canBeInvoiced([ticketId], options);
+ await models.Ticket.rawSql(`
+ DROP TEMPORARY TABLE IF EXISTS tmp.ticketToInvoice;
+ CREATE TEMPORARY TABLE tmp.ticketToInvoice
+ (PRIMARY KEY (id))
+ ENGINE = MEMORY
+ SELECT id
+ FROM vn.ticket
+ WHERE id IN (?)
+ `, [ticketId], options);
+
+ const canBeInvoiced = await models.Ticket.canBeInvoiced(ctx, [ticketId], options);
expect(canBeInvoiced).toEqual(false);
await tx.rollback();
} catch (e) {
+ error = e;
await tx.rollback();
- throw e;
}
+
+ expect(error.message).toEqual(`A ticket with an amount of zero can't be invoiced`);
});
it('should return falsy for a ticket shipping in future', async() => {
const tx = await models.Ticket.beginTransaction({});
+
+ let error;
try {
const options = {transaction: tx};
@@ -66,15 +88,27 @@ describe('ticket canBeInvoiced()', () => {
await ticket.updateAttribute('shipped', shipped, options);
- const canBeInvoiced = await models.Ticket.canBeInvoiced([ticketId], options);
+ await models.Ticket.rawSql(`
+ DROP TEMPORARY TABLE IF EXISTS tmp.ticketToInvoice;
+ CREATE TEMPORARY TABLE tmp.ticketToInvoice
+ (PRIMARY KEY (id))
+ ENGINE = MEMORY
+ SELECT id
+ FROM vn.ticket
+ WHERE id IN (?)
+ `, [ticketId], options);
+
+ const canBeInvoiced = await models.Ticket.canBeInvoiced(ctx, [ticketId], options);
expect(canBeInvoiced).toEqual(false);
await tx.rollback();
} catch (e) {
+ error = e;
await tx.rollback();
- throw e;
}
+
+ expect(error.message).toEqual(`Can't invoice to future`);
});
it('should return truthy for an invoiceable ticket', async() => {
@@ -83,7 +117,17 @@ describe('ticket canBeInvoiced()', () => {
try {
const options = {transaction: tx};
- const canBeInvoiced = await models.Ticket.canBeInvoiced([ticketId], options);
+ await models.Ticket.rawSql(`
+ DROP TEMPORARY TABLE IF EXISTS tmp.ticketToInvoice;
+ CREATE TEMPORARY TABLE tmp.ticketToInvoice
+ (PRIMARY KEY (id))
+ ENGINE = MEMORY
+ SELECT id
+ FROM vn.ticket
+ WHERE id IN (?)
+ `, [ticketId], options);
+
+ const canBeInvoiced = await models.Ticket.canBeInvoiced(ctx, [ticketId], options);
expect(canBeInvoiced).toEqual(true);
diff --git a/modules/ticket/back/methods/ticket/specs/invoiceTickets.spec.js b/modules/ticket/back/methods/ticket/specs/invoiceTickets.spec.js
new file mode 100644
index 000000000..8971fb24a
--- /dev/null
+++ b/modules/ticket/back/methods/ticket/specs/invoiceTickets.spec.js
@@ -0,0 +1,115 @@
+const models = require('vn-loopback/server/server').models;
+const LoopBackContext = require('loopback-context');
+
+describe('ticket invoiceTickets()', () => {
+ const userId = 19;
+ const clientId = 1102;
+ const activeCtx = {
+ getLocale: () => {
+ return 'en';
+ },
+ accessToken: {userId: userId},
+ headers: {origin: 'http://localhost:5000'},
+ };
+ const ctx = {req: activeCtx};
+
+ beforeAll(async() => {
+ spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
+ active: activeCtx
+ });
+ });
+
+ it('should throw an error when invoicing tickets from multiple clients', async() => {
+ const invoiceOutModel = models.InvoiceOut;
+ spyOn(invoiceOutModel, 'makePdfAndNotify');
+
+ const tx = await models.Ticket.beginTransaction({});
+
+ let error;
+
+ try {
+ const options = {transaction: tx};
+
+ const ticketsIds = [11, 16];
+ await models.Ticket.invoiceTickets(ctx, ticketsIds, options);
+
+ await tx.rollback();
+ } catch (e) {
+ error = e;
+ await tx.rollback();
+ }
+
+ expect(error.message).toEqual(`You can't invoice tickets from multiple clients`);
+ });
+
+ it(`should throw an error when invoicing a client without tax data checked`, async() => {
+ const invoiceOutModel = models.InvoiceOut;
+ spyOn(invoiceOutModel, 'makePdfAndNotify');
+
+ const tx = await models.Ticket.beginTransaction({});
+
+ let error;
+
+ try {
+ const options = {transaction: tx};
+
+ const client = await models.Client.findById(clientId, null, options);
+ await client.updateAttribute('isTaxDataChecked', false, options);
+
+ const ticketsIds = [11];
+ await models.Ticket.invoiceTickets(ctx, ticketsIds, options);
+
+ await tx.rollback();
+ } catch (e) {
+ error = e;
+ await tx.rollback();
+ }
+
+ expect(error.message).toEqual(`This client can't be invoiced`);
+ });
+
+ it('should invoice a ticket, then try again to fail', async() => {
+ const invoiceOutModel = models.InvoiceOut;
+ spyOn(invoiceOutModel, 'makePdfAndNotify');
+
+ const tx = await models.Ticket.beginTransaction({});
+
+ let error;
+
+ try {
+ const options = {transaction: tx};
+
+ const ticketsIds = [11];
+ await models.Ticket.invoiceTickets(ctx, ticketsIds, options);
+ await models.Ticket.invoiceTickets(ctx, ticketsIds, options);
+
+ await tx.rollback();
+ } catch (e) {
+ error = e;
+ await tx.rollback();
+ }
+
+ expect(error.message).toEqual(`This ticket is already invoiced`);
+ });
+
+ it('should success to invoice a ticket', async() => {
+ const invoiceOutModel = models.InvoiceOut;
+ spyOn(invoiceOutModel, 'makePdfAndNotify');
+
+ const tx = await models.Ticket.beginTransaction({});
+
+ try {
+ const options = {transaction: tx};
+
+ const ticketsIds = [11];
+ const invoicesIds = await models.Ticket.invoiceTickets(ctx, ticketsIds, options);
+
+ expect(invoicesIds.length).toBeGreaterThan(0);
+
+ await tx.rollback();
+ } catch (e) {
+ await tx.rollback();
+ throw e;
+ }
+ });
+});
diff --git a/modules/ticket/back/methods/ticket/specs/makeInvoice.spec.js b/modules/ticket/back/methods/ticket/specs/makeInvoice.spec.js
index 270ba5c93..9af6ad557 100644
--- a/modules/ticket/back/methods/ticket/specs/makeInvoice.spec.js
+++ b/modules/ticket/back/methods/ticket/specs/makeInvoice.spec.js
@@ -3,8 +3,9 @@ const LoopBackContext = require('loopback-context');
describe('ticket makeInvoice()', () => {
const userId = 19;
- const ticketId = 11;
- const clientId = 1102;
+ const invoiceType = 'R';
+ const companyFk = 442;
+ const invoiceDate = Date.vnNew();
const activeCtx = {
getLocale: () => {
return 'en';
@@ -20,77 +21,6 @@ describe('ticket makeInvoice()', () => {
});
});
- it('should throw an error when invoicing tickets from multiple clients', async() => {
- const invoiceOutModel = models.InvoiceOut;
- spyOn(invoiceOutModel, 'createPdf');
-
- const tx = await models.Ticket.beginTransaction({});
-
- let error;
-
- try {
- const options = {transaction: tx};
- const otherClientTicketId = 16;
- await models.Ticket.makeInvoice(ctx, [ticketId, otherClientTicketId], options);
-
- await tx.rollback();
- } catch (e) {
- error = e;
- await tx.rollback();
- }
-
- expect(error.message).toEqual(`You can't invoice tickets from multiple clients`);
- });
-
- it(`should throw an error when invoicing a client without tax data checked`, async() => {
- const invoiceOutModel = models.InvoiceOut;
- spyOn(invoiceOutModel, 'createPdf');
-
- const tx = await models.Ticket.beginTransaction({});
-
- let error;
-
- try {
- const options = {transaction: tx};
-
- const client = await models.Client.findById(clientId, null, options);
- await client.updateAttribute('isTaxDataChecked', false, options);
-
- await models.Ticket.makeInvoice(ctx, [ticketId], options);
-
- await tx.rollback();
- } catch (e) {
- error = e;
- await tx.rollback();
- }
-
- expect(error.message).toEqual(`This client can't be invoiced`);
- });
-
- it('should invoice a ticket, then try again to fail', async() => {
- const invoiceOutModel = models.InvoiceOut;
- spyOn(invoiceOutModel, 'createPdf');
- spyOn(invoiceOutModel, 'invoiceEmail');
-
- const tx = await models.Ticket.beginTransaction({});
-
- let error;
-
- try {
- const options = {transaction: tx};
-
- await models.Ticket.makeInvoice(ctx, [ticketId], options);
- await models.Ticket.makeInvoice(ctx, [ticketId], options);
-
- await tx.rollback();
- } catch (e) {
- error = e;
- await tx.rollback();
- }
-
- expect(error.message).toEqual(`Some of the selected tickets are not billable`);
- });
-
it('should success to invoice a ticket', async() => {
const invoiceOutModel = models.InvoiceOut;
spyOn(invoiceOutModel, 'createPdf');
@@ -101,10 +31,20 @@ describe('ticket makeInvoice()', () => {
try {
const options = {transaction: tx};
- const invoice = await models.Ticket.makeInvoice(ctx, [ticketId], options);
+ const ticketsIds = [11, 16];
+ await models.Ticket.rawSql(`
+ DROP TEMPORARY TABLE IF EXISTS tmp.ticketToInvoice;
+ CREATE TEMPORARY TABLE tmp.ticketToInvoice
+ (PRIMARY KEY (id))
+ ENGINE = MEMORY
+ SELECT id
+ FROM vn.ticket
+ WHERE id IN (?)
+ `, [ticketsIds], options);
- expect(invoice.invoiceFk).toBeDefined();
- expect(invoice.serial).toEqual('T');
+ const invoiceId = await models.Ticket.makeInvoice(ctx, invoiceType, companyFk, invoiceDate, options);
+
+ expect(invoiceId).toBeDefined();
await tx.rollback();
} catch (e) {
diff --git a/modules/ticket/back/models/ticket-methods.js b/modules/ticket/back/models/ticket-methods.js
index e5a8e8d94..f0c85ecc4 100644
--- a/modules/ticket/back/models/ticket-methods.js
+++ b/modules/ticket/back/models/ticket-methods.js
@@ -39,4 +39,5 @@ module.exports = function(Self) {
require('../methods/ticket/collectionLabel')(Self);
require('../methods/ticket/expeditionPalletLabel')(Self);
require('../methods/ticket/saveSign')(Self);
+ require('../methods/ticket/invoiceTickets')(Self);
};
diff --git a/modules/ticket/front/descriptor-menu/index.js b/modules/ticket/front/descriptor-menu/index.js
index 17a34ad59..dd518671b 100644
--- a/modules/ticket/front/descriptor-menu/index.js
+++ b/modules/ticket/front/descriptor-menu/index.js
@@ -275,7 +275,7 @@ class Controller extends Section {
});
}
- return this.$http.post(`Tickets/makeInvoice`, params)
+ return this.$http.post(`Tickets/invoiceTickets`, params)
.then(() => this.reload())
.then(() => this.vnApp.showSuccess(this.$t('Ticket invoiced')));
}
diff --git a/modules/ticket/front/descriptor-menu/index.spec.js b/modules/ticket/front/descriptor-menu/index.spec.js
index 0aef956db..fbe67d21a 100644
--- a/modules/ticket/front/descriptor-menu/index.spec.js
+++ b/modules/ticket/front/descriptor-menu/index.spec.js
@@ -191,7 +191,7 @@ describe('Ticket Component vnTicketDescriptorMenu', () => {
jest.spyOn(controller.vnApp, 'showSuccess');
const expectedParams = {ticketsIds: [ticket.id]};
- $httpBackend.expectPOST(`Tickets/makeInvoice`, expectedParams).respond();
+ $httpBackend.expectPOST(`Tickets/invoiceTickets`, expectedParams).respond();
controller.makeInvoice();
$httpBackend.flush();
diff --git a/modules/ticket/front/index/index.js b/modules/ticket/front/index/index.js
index 55229eabb..b3afc838c 100644
--- a/modules/ticket/front/index/index.js
+++ b/modules/ticket/front/index/index.js
@@ -163,7 +163,7 @@ export default class Controller extends Section {
makeInvoice() {
const ticketsIds = this.checked.map(ticket => ticket.id);
- return this.$http.post(`Tickets/makeInvoice`, {ticketsIds})
+ return this.$http.post(`Tickets/invoiceTickets`, {ticketsIds})
.then(() => this.$.model.refresh())
.then(() => this.vnApp.showSuccess(this.$t('Ticket invoiced')));
}
From 56247b50127df6d878d61bf081a2ef1b709c1019 Mon Sep 17 00:00:00 2001
From: vicent
Date: Tue, 11 Jul 2023 09:33:45 +0200
Subject: [PATCH 0373/1087] add acl
---
db/changes/232601/00-aclInvoiceTickets.sql | 2 ++
1 file changed, 2 insertions(+)
create mode 100644 db/changes/232601/00-aclInvoiceTickets.sql
diff --git a/db/changes/232601/00-aclInvoiceTickets.sql b/db/changes/232601/00-aclInvoiceTickets.sql
new file mode 100644
index 000000000..2c221950e
--- /dev/null
+++ b/db/changes/232601/00-aclInvoiceTickets.sql
@@ -0,0 +1,2 @@
+INSERT INTO `salix`.`ACL` (model, property, accessType, permission, principalType, principalId)
+ VALUES('Ticket', 'invoiceTickets', 'WRITE', 'ALLOW', 'ROLE', 'employee');
From da13f0811cf793b115bdd7bc3180162592391f79 Mon Sep 17 00:00:00 2001
From: vicent
Date: Tue, 11 Jul 2023 09:59:11 +0200
Subject: [PATCH 0374/1087] refs 5887 cambiado drop y create por create or
replace
---
modules/client/front/credit-management/index.html | 2 +-
modules/client/front/summary/index.html | 4 ++--
modules/ticket/back/methods/ticket/invoiceTickets.js | 3 +--
.../back/methods/ticket/specs/canBeInvoiced.spec.js | 12 ++++--------
4 files changed, 8 insertions(+), 13 deletions(-)
diff --git a/modules/client/front/credit-management/index.html b/modules/client/front/credit-management/index.html
index b9064ff69..f66b988f5 100644
--- a/modules/client/front/credit-management/index.html
+++ b/modules/client/front/credit-management/index.html
@@ -68,7 +68,7 @@
{{::clientInforma.rating}}
- {{::clientInforma.recommendedCredit | currency: 'EUR': 2}}
+ {{::clientInforma.recommendedCredit | currency: 'EUR'}}
diff --git a/modules/client/front/summary/index.html b/modules/client/front/summary/index.html
index 0a15efcd1..15a55ec8c 100644
--- a/modules/client/front/summary/index.html
+++ b/modules/client/front/summary/index.html
@@ -270,7 +270,7 @@
info="Invoices minus payments plus orders not yet invoiced">
@@ -297,7 +297,7 @@
info="Value from 1 to 20. The higher the better value">
+ value="{{$ctrl.summary.recommendedCredit | currency: 'EUR'}}">
diff --git a/modules/ticket/back/methods/ticket/invoiceTickets.js b/modules/ticket/back/methods/ticket/invoiceTickets.js
index 780e9eb57..ca1bf15fb 100644
--- a/modules/ticket/back/methods/ticket/invoiceTickets.js
+++ b/modules/ticket/back/methods/ticket/invoiceTickets.js
@@ -88,8 +88,7 @@ module.exports = function(Self) {
const models = Self.app.models;
await models.Ticket.rawSql(`
- DROP TEMPORARY TABLE IF EXISTS tmp.ticketToInvoice;
- CREATE TEMPORARY TABLE tmp.ticketToInvoice
+ CREATE OR REPLACE TEMPORARY TABLE tmp.ticketToInvoice
(PRIMARY KEY (id))
ENGINE = MEMORY
SELECT id
diff --git a/modules/ticket/back/methods/ticket/specs/canBeInvoiced.spec.js b/modules/ticket/back/methods/ticket/specs/canBeInvoiced.spec.js
index 42f9b5a9e..538dbc49f 100644
--- a/modules/ticket/back/methods/ticket/specs/canBeInvoiced.spec.js
+++ b/modules/ticket/back/methods/ticket/specs/canBeInvoiced.spec.js
@@ -19,8 +19,7 @@ describe('ticket canBeInvoiced()', () => {
await ticket.updateAttribute('refFk', 'T1111111', options);
await models.Ticket.rawSql(`
- DROP TEMPORARY TABLE IF EXISTS tmp.ticketToInvoice;
- CREATE TEMPORARY TABLE tmp.ticketToInvoice
+ CREATE OR REPLACE TEMPORARY TABLE tmp.ticketToInvoice
(PRIMARY KEY (id))
ENGINE = MEMORY
SELECT id
@@ -52,8 +51,7 @@ describe('ticket canBeInvoiced()', () => {
await ticket.updateAttribute('totalWithVat', 0, options);
await models.Ticket.rawSql(`
- DROP TEMPORARY TABLE IF EXISTS tmp.ticketToInvoice;
- CREATE TEMPORARY TABLE tmp.ticketToInvoice
+ CREATE OR REPLACE TEMPORARY TABLE tmp.ticketToInvoice
(PRIMARY KEY (id))
ENGINE = MEMORY
SELECT id
@@ -89,8 +87,7 @@ describe('ticket canBeInvoiced()', () => {
await ticket.updateAttribute('shipped', shipped, options);
await models.Ticket.rawSql(`
- DROP TEMPORARY TABLE IF EXISTS tmp.ticketToInvoice;
- CREATE TEMPORARY TABLE tmp.ticketToInvoice
+ CREATE OR REPLACE TEMPORARY TABLE tmp.ticketToInvoice
(PRIMARY KEY (id))
ENGINE = MEMORY
SELECT id
@@ -118,8 +115,7 @@ describe('ticket canBeInvoiced()', () => {
const options = {transaction: tx};
await models.Ticket.rawSql(`
- DROP TEMPORARY TABLE IF EXISTS tmp.ticketToInvoice;
- CREATE TEMPORARY TABLE tmp.ticketToInvoice
+ CREATE OR REPLACE TEMPORARY TABLE tmp.ticketToInvoice
(PRIMARY KEY (id))
ENGINE = MEMORY
SELECT id
From d4a4e04f2590d7da33da070f1476a19484e20e22 Mon Sep 17 00:00:00 2001
From: vicent
Date: Tue, 11 Jul 2023 12:33:34 +0200
Subject: [PATCH 0375/1087] =?UTF-8?q?refs=20#5887=20feat:=20cambiados=20pe?=
=?UTF-8?q?rmisos=20para=20a=C3=B1adir/quitar=20alias=20de=20correo?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
back/methods/vn-user/addAlias.js | 68 ++++++++++++++++++++++++++++
back/methods/vn-user/removeAlias.js | 55 ++++++++++++++++++++++
db/changes/232601/00-aclAddAlias.sql | 11 +++++
3 files changed, 134 insertions(+)
create mode 100644 back/methods/vn-user/addAlias.js
create mode 100644 back/methods/vn-user/removeAlias.js
create mode 100644 db/changes/232601/00-aclAddAlias.sql
diff --git a/back/methods/vn-user/addAlias.js b/back/methods/vn-user/addAlias.js
new file mode 100644
index 000000000..a9a5dcb85
--- /dev/null
+++ b/back/methods/vn-user/addAlias.js
@@ -0,0 +1,68 @@
+const UserError = require('vn-loopback/util/user-error');
+
+module.exports = Self => {
+ Self.remoteMethod('addAlias', {
+ description: 'Add alias if user has grant',
+ accessType: 'WRITE',
+ accepts: [
+ {
+ arg: 'ctx',
+ type: 'Object',
+ http: {source: 'context'}
+ },
+ {
+ arg: 'id',
+ type: 'number',
+ required: true,
+ description: 'The user id',
+ http: {source: 'path'}
+ },
+ {
+ arg: 'mailAlias',
+ type: 'number',
+ description: 'The new alias for user',
+ required: true
+ }
+ ],
+ http: {
+ path: `/:id/addAlias`,
+ verb: 'POST'
+ }
+ });
+
+ Self.addAlias = async function(ctx, id, mailAlias, options) {
+ const models = Self.app.models;
+ const userId = ctx.req.accessToken.userId;
+
+ const myOptions = {};
+
+ if (typeof options == 'object')
+ Object.assign(myOptions, options);
+
+ const user = await Self.findById(userId, {fields: ['hasGrant']}, myOptions);
+
+ if (!user.hasGrant)
+ throw new UserError(`You don't have grant privilege`);
+
+ const account = await models.Account.findById(userId, {
+ fields: ['id'],
+ include: {
+ relation: 'aliases',
+ scope: {
+ fields: ['mailAlias']
+ }
+ }
+ }, myOptions);
+
+ const aliases = account.aliases().map(alias => alias.mailAlias);
+
+ const hasAlias = aliases.includes(mailAlias);
+ if (!hasAlias)
+ throw new UserError(`You don't have the alias assigned and you can't assign it to another user`);
+
+ return models.MailAliasAccount.create({
+ mailAlias: mailAlias,
+ account: id
+ }, myOptions);
+ };
+};
diff --git a/back/methods/vn-user/removeAlias.js b/back/methods/vn-user/removeAlias.js
new file mode 100644
index 000000000..4c402cc54
--- /dev/null
+++ b/back/methods/vn-user/removeAlias.js
@@ -0,0 +1,55 @@
+const UserError = require('vn-loopback/util/user-error');
+
+module.exports = Self => {
+ Self.remoteMethod('removeAlias', {
+ description: 'Add alias if user has grant',
+ accessType: 'WRITE',
+ accepts: [
+ {
+ arg: 'ctx',
+ type: 'Object',
+ http: {source: 'context'}
+ },
+ {
+ arg: 'id',
+ type: 'number',
+ required: true,
+ description: 'The user id',
+ http: {source: 'path'}
+ },
+ {
+ arg: 'mailAlias',
+ type: 'number',
+ description: 'The alias to delete',
+ required: true
+ }
+ ],
+ http: {
+ path: `/:id/removeAlias`,
+ verb: 'POST'
+ }
+ });
+
+ Self.removeAlias = async function(ctx, id, mailAlias, options) {
+ const models = Self.app.models;
+ const userId = ctx.req.accessToken.userId;
+
+ const myOptions = {};
+
+ if (typeof options == 'object')
+ Object.assign(myOptions, options);
+
+ const canRemoveAlias = await models.ACL.checkAccessAcl(ctx, 'VnUser', 'canRemoveAlias', 'WRITE');
+
+ if (userId != id && !canRemoveAlias) throw new UserError(`You don't have grant privilege`);
+
+ const mailAliasAccount = await models.MailAliasAccount.findOne({
+ where: {
+ mailAlias: mailAlias,
+ account: id
+ }
+ }, myOptions);
+
+ await mailAliasAccount.destroy(myOptions);
+ };
+};
diff --git a/db/changes/232601/00-aclAddAlias.sql b/db/changes/232601/00-aclAddAlias.sql
new file mode 100644
index 000000000..cc96f5ad8
--- /dev/null
+++ b/db/changes/232601/00-aclAddAlias.sql
@@ -0,0 +1,11 @@
+INSERT INTO `salix`.`ACL` (model, property, accessType, permission, principalType, principalId)
+ VALUES
+ ('VnUser', 'addAlias', 'WRITE', 'ALLOW', 'ROLE', 'employee');
+
+INSERT INTO `salix`.`ACL` (model, property, accessType, permission, principalType, principalId)
+ VALUES
+ ('VnUser', 'removeAlias', 'WRITE', 'ALLOW', 'ROLE', 'employee');
+
+INSERT INTO `salix`.`ACL` (model, property, accessType, permission, principalType, principalId)
+ VALUES
+ ('VnUser', 'canRemoveAlias', 'WRITE', 'ALLOW', 'ROLE', 'itManagement');
From e1f12bea020fc367cd8002241f5e950680770fe4 Mon Sep 17 00:00:00 2001
From: vicent
Date: Tue, 11 Jul 2023 12:33:44 +0200
Subject: [PATCH 0376/1087] a
---
back/models/vn-user.js | 2 ++
loopback/locale/es.json | 5 +++--
modules/account/front/aliases/index.html | 8 ++------
modules/account/front/aliases/index.js | 16 +++++++++-------
4 files changed, 16 insertions(+), 15 deletions(-)
diff --git a/back/models/vn-user.js b/back/models/vn-user.js
index b58395acc..12aab585c 100644
--- a/back/models/vn-user.js
+++ b/back/models/vn-user.js
@@ -11,6 +11,8 @@ module.exports = function(Self) {
require('../methods/vn-user/validate-token')(Self);
require('../methods/vn-user/privileges')(Self);
require('../methods/vn-user/renew-token')(Self);
+ require('../methods/vn-user/addAlias')(Self);
+ require('../methods/vn-user/removeAlias')(Self);
Self.definition.settings.acls = Self.definition.settings.acls.filter(acl => acl.property !== 'create');
diff --git a/loopback/locale/es.json b/loopback/locale/es.json
index 20a9557e9..63b20995d 100644
--- a/loopback/locale/es.json
+++ b/loopback/locale/es.json
@@ -296,7 +296,8 @@
"Fecha fuera de rango": "Fecha fuera de rango",
"Error while generating PDF": "Error al generar PDF",
"Error when sending mail to client": "Error al enviar el correo al cliente",
- "Mail not sent": "Se ha producido un fallo al enviar la factura al cliente [{{clientId}}]({{{clientUrl}}}), por favor revisa la dirección de correo electrónico",
+ "Mail not sent": "Se ha producido un fallo al enviar la factura al cliente [{{clientId}}]({{{clientUrl}}}), por favor revisa la dirección de correo electrónico",
"The renew period has not been exceeded": "El periodo de renovación no ha sido superado",
- "Negative basis of tickets": "Base negativa para los tickets: {{ticketsIds}}"
+ "Negative basis of tickets": "Base negativa para los tickets: {{ticketsIds}}",
+ "You don't have the alias assigned and you can't assign it to another user": "No tienes el alias asignado y no puedes asignarlo a otro usuario"
}
diff --git a/modules/account/front/aliases/index.html b/modules/account/front/aliases/index.html
index 11d546afb..4a73ec873 100644
--- a/modules/account/front/aliases/index.html
+++ b/modules/account/front/aliases/index.html
@@ -17,9 +17,7 @@
+ ng-click="removeConfirm.show(row)">
@@ -32,9 +30,7 @@
translate-attr="{title: 'Add'}"
vn-bind="+"
ng-click="$ctrl.onAddClick()"
- fixed-bottom-right
- vn-acl="itManagement"
- vn-acl-action="remove">
+ fixed-bottom-right>
this.refresh())
.then(() => this.vnApp.showSuccess(
this.$t('Subscribed to alias!'))
@@ -34,11 +33,14 @@ export default class Controller extends Section {
}
onRemove(row) {
- return this.$http.delete(`MailAliasAccounts/${row.id}`)
- .then(() => {
- this.$.data.splice(this.$.data.indexOf(row), 1);
- this.vnApp.showSuccess(this.$t('Unsubscribed from alias!'));
- });
+ const params = {
+ mailAlias: row.mailAlias
+ };
+ return this.$http.post(`VnUsers/${this.$params.id}/removeAlias`, params)
+ .then(() => this.refresh())
+ .then(() => this.vnApp.showSuccess(
+ this.$t('Subscribed to alias!'))
+ );
}
}
From 5a5a1ed20bebc4bee8be651903980fe5f4e3c778 Mon Sep 17 00:00:00 2001
From: vicent
Date: Tue, 11 Jul 2023 13:22:54 +0200
Subject: [PATCH 0377/1087] refs #5887 feat: addback test
---
back/methods/vn-user/specs/addAlias.spec.js | 68 +++++++++++++++++++++
modules/account/front/aliases/index.js | 4 +-
modules/account/front/aliases/index.spec.js | 9 ++-
3 files changed, 75 insertions(+), 6 deletions(-)
create mode 100644 back/methods/vn-user/specs/addAlias.spec.js
diff --git a/back/methods/vn-user/specs/addAlias.spec.js b/back/methods/vn-user/specs/addAlias.spec.js
new file mode 100644
index 000000000..239d09c94
--- /dev/null
+++ b/back/methods/vn-user/specs/addAlias.spec.js
@@ -0,0 +1,68 @@
+const {models} = require('vn-loopback/server/server');
+
+describe('VnUser addAlias()', () => {
+ const employeeId = 1;
+ const sysadminId = 66;
+ const developerId = 9;
+ const customerId = 2;
+ const mailAlias = 1;
+ it('should throw an error when user not has privileges', async() => {
+ const ctx = {req: {accessToken: {userId: employeeId}}};
+ const tx = await models.VnUser.beginTransaction({});
+
+ let error;
+ try {
+ const options = {transaction: tx};
+
+ await models.VnUser.addAlias(ctx, employeeId, mailAlias, options);
+
+ await tx.rollback();
+ } catch (e) {
+ error = e;
+ await tx.rollback();
+ }
+
+ expect(error.message).toContain(`You don't have grant privilege`);
+ });
+
+ it('should throw an error when user has privileges but not has the role from user', async() => {
+ const ctx = {req: {accessToken: {userId: sysadminId}}};
+ const tx = await models.VnUser.beginTransaction({});
+
+ let error;
+ try {
+ const options = {transaction: tx};
+
+ await models.VnUser.addAlias(ctx, employeeId, mailAlias, options);
+
+ await tx.rollback();
+ } catch (e) {
+ error = e;
+ await tx.rollback();
+ }
+
+ expect(error.message).toContain(`You don't have the alias assigned and you can't assign it to another user`);
+ });
+
+ it('should add an alias', async() => {
+ const ctx = {req: {accessToken: {userId: developerId}}};
+ const tx = await models.VnUser.beginTransaction({});
+
+ let result;
+ try {
+ const options = {transaction: tx};
+
+ const user = await models.VnUser.findById(developerId, null, options);
+ await user.updateAttribute('hasGrant', true, options);
+
+ result = await models.VnUser.addAlias(ctx, customerId, mailAlias, options);
+
+ await tx.rollback();
+ } catch (e) {
+ await tx.rollback();
+ }
+
+ expect(result.mailAlias).toBe(mailAlias);
+ expect(result.account).toBe(customerId);
+ });
+});
diff --git a/modules/account/front/aliases/index.js b/modules/account/front/aliases/index.js
index 91d0c6e7c..e0c738ee4 100644
--- a/modules/account/front/aliases/index.js
+++ b/modules/account/front/aliases/index.js
@@ -38,9 +38,7 @@ export default class Controller extends Section {
};
return this.$http.post(`VnUsers/${this.$params.id}/removeAlias`, params)
.then(() => this.refresh())
- .then(() => this.vnApp.showSuccess(
- this.$t('Subscribed to alias!'))
- );
+ .then(() => this.vnApp.showSuccess(this.$t('Data saved!')));
}
}
diff --git a/modules/account/front/aliases/index.spec.js b/modules/account/front/aliases/index.spec.js
index 466f1e1e9..61f71949c 100644
--- a/modules/account/front/aliases/index.spec.js
+++ b/modules/account/front/aliases/index.spec.js
@@ -25,8 +25,9 @@ describe('component vnUserAliases', () => {
describe('onAddSave()', () => {
it('should add the new row', () => {
controller.addData = {account: 1};
+ controller.$params = {id: 1};
- $httpBackend.expectPOST('MailAliasAccounts').respond();
+ $httpBackend.expectPOST('VnUsers/1/addAlias').respond();
$httpBackend.expectGET('MailAliasAccounts').respond('foo');
controller.onAddSave();
$httpBackend.flush();
@@ -41,12 +42,14 @@ describe('component vnUserAliases', () => {
{id: 1, alias: 'foo'},
{id: 2, alias: 'bar'}
];
+ controller.$params = {id: 1};
- $httpBackend.expectDELETE('MailAliasAccounts/1').respond();
+ $httpBackend.expectPOST('VnUsers/1/removeAlias').respond();
+ $httpBackend.expectGET('MailAliasAccounts').respond(controller.$.data[1]);
controller.onRemove(controller.$.data[0]);
$httpBackend.flush();
- expect(controller.$.data).toEqual([{id: 2, alias: 'bar'}]);
+ expect(controller.$.data).toEqual({id: 2, alias: 'bar'});
expect(controller.vnApp.showSuccess).toHaveBeenCalled();
});
});
From d4217ff8d3c812fc4f42ee04c96aef494843b052 Mon Sep 17 00:00:00 2001
From: vicent
Date: Tue, 11 Jul 2023 13:38:48 +0200
Subject: [PATCH 0378/1087] refs #5887 correct translations
---
back/methods/vn-user/addAlias.js | 4 ++--
loopback/locale/es.json | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/back/methods/vn-user/addAlias.js b/back/methods/vn-user/addAlias.js
index a9a5dcb85..9fe43e713 100644
--- a/back/methods/vn-user/addAlias.js
+++ b/back/methods/vn-user/addAlias.js
@@ -2,7 +2,7 @@ const UserError = require('vn-loopback/util/user-error');
module.exports = Self => {
Self.remoteMethod('addAlias', {
- description: 'Add alias if user has grant',
+ description: 'Add an alias if the user has the grant',
accessType: 'WRITE',
accepts: [
{
@@ -58,7 +58,7 @@ module.exports = Self => {
const hasAlias = aliases.includes(mailAlias);
if (!hasAlias)
- throw new UserError(`You don't have the alias assigned and you can't assign it to another user`);
+ throw new UserError(`You cannot assign an alias that you are not assigned to`);
return models.MailAliasAccount.create({
mailAlias: mailAlias,
diff --git a/loopback/locale/es.json b/loopback/locale/es.json
index 63b20995d..809ed5874 100644
--- a/loopback/locale/es.json
+++ b/loopback/locale/es.json
@@ -299,5 +299,5 @@
"Mail not sent": "Se ha producido un fallo al enviar la factura al cliente [{{clientId}}]({{{clientUrl}}}), por favor revisa la dirección de correo electrónico",
"The renew period has not been exceeded": "El periodo de renovación no ha sido superado",
"Negative basis of tickets": "Base negativa para los tickets: {{ticketsIds}}",
- "You don't have the alias assigned and you can't assign it to another user": "No tienes el alias asignado y no puedes asignarlo a otro usuario"
+ "You cannot assign an alias that you are not assigned to": "No puede asignar un alias que no tenga asignado"
}
From a215797390f0b2601a51b4e5a21dd30c456ce70f Mon Sep 17 00:00:00 2001
From: vicent
Date: Tue, 11 Jul 2023 13:39:22 +0200
Subject: [PATCH 0379/1087] tranalstion
---
back/methods/vn-user/removeAlias.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/back/methods/vn-user/removeAlias.js b/back/methods/vn-user/removeAlias.js
index 4c402cc54..0424c3e96 100644
--- a/back/methods/vn-user/removeAlias.js
+++ b/back/methods/vn-user/removeAlias.js
@@ -2,7 +2,7 @@ const UserError = require('vn-loopback/util/user-error');
module.exports = Self => {
Self.remoteMethod('removeAlias', {
- description: 'Add alias if user has grant',
+ description: 'Remove alias if the user has the grant',
accessType: 'WRITE',
accepts: [
{
From 6655807d8042cb99de271d40330ebfd6eb652e3f Mon Sep 17 00:00:00 2001
From: vicent
Date: Tue, 11 Jul 2023 13:50:38 +0200
Subject: [PATCH 0380/1087] refs #4770 refactor: change acl
---
db/changes/232801/00-roadmapACL.sql | 6 ++++--
modules/route/front/roadmap/summary/style.scss | 1 -
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/db/changes/232801/00-roadmapACL.sql b/db/changes/232801/00-roadmapACL.sql
index 8954ecb27..4fc116f86 100644
--- a/db/changes/232801/00-roadmapACL.sql
+++ b/db/changes/232801/00-roadmapACL.sql
@@ -1,4 +1,6 @@
INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`)
VALUES
- ('Roadmap', '*', '*', 'ALLOW', 'ROLE', 'employee'),
- ('ExpeditionTruck', '*', '*', 'ALLOW', 'ROLE', 'employee');
+ ('Roadmap', '*', '*', 'ALLOW', 'ROLE', 'palletizerBoss'),
+ ('Roadmap', '*', '*', 'ALLOW', 'ROLE', 'productionBoss'),
+ ('ExpeditionTruck', '*', '*', 'ALLOW', 'ROLE', 'palletizerBoss'),
+ ('ExpeditionTruck', '*', '*', 'ALLOW', 'ROLE', 'productionBoss');
diff --git a/modules/route/front/roadmap/summary/style.scss b/modules/route/front/roadmap/summary/style.scss
index 8e75d3e0b..63b3f625a 100644
--- a/modules/route/front/roadmap/summary/style.scss
+++ b/modules/route/front/roadmap/summary/style.scss
@@ -1,6 +1,5 @@
@import "variables";
-
vn-roadmap-summary .summary {
a {
display: flex;
From 808a9976abcb5ef86115902641a1c8d6337189c7 Mon Sep 17 00:00:00 2001
From: vicent
Date: Tue, 11 Jul 2023 13:53:25 +0200
Subject: [PATCH 0381/1087] refs #5887 fix: back etst
---
back/methods/vn-user/specs/addAlias.spec.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/back/methods/vn-user/specs/addAlias.spec.js b/back/methods/vn-user/specs/addAlias.spec.js
index 239d09c94..ef657a3a8 100644
--- a/back/methods/vn-user/specs/addAlias.spec.js
+++ b/back/methods/vn-user/specs/addAlias.spec.js
@@ -41,7 +41,7 @@ describe('VnUser addAlias()', () => {
await tx.rollback();
}
- expect(error.message).toContain(`You don't have the alias assigned and you can't assign it to another user`);
+ expect(error.message).toContain(`You cannot assign an alias that you are not assigned to`);
});
it('should add an alias', async() => {
From d7ac20dc6a7df1fe92db107a463e399baf812cd7 Mon Sep 17 00:00:00 2001
From: alexm
Date: Wed, 12 Jul 2023 13:02:27 +0200
Subject: [PATCH 0382/1087] hotFix(supplier): fix accessToken in before save
---
modules/supplier/back/models/supplier.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/supplier/back/models/supplier.js b/modules/supplier/back/models/supplier.js
index 9c78e8590..e88fadc0b 100644
--- a/modules/supplier/back/models/supplier.js
+++ b/modules/supplier/back/models/supplier.js
@@ -103,7 +103,7 @@ module.exports = Self => {
const changes = ctx.data || ctx.instance;
const orgData = ctx.currentInstance;
const loopBackContext = LoopBackContext.getCurrentContext();
- const accessToken = {req: loopBackContext.active.accessToken};
+ const accessToken = {req: loopBackContext.active};
const editPayMethodCheck =
await Self.app.models.ACL.checkAccessAcl(accessToken, 'Supplier', 'editPayMethodCheck', 'WRITE');
From 510b78c7035eabcef9d51c78816fe3349968f9c5 Mon Sep 17 00:00:00 2001
From: carlossa
Date: Wed, 12 Jul 2023 13:08:46 +0200
Subject: [PATCH 0383/1087] refs #6006 mod dias anteriores
---
modules/travel/front/search-panel/index.js | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/modules/travel/front/search-panel/index.js b/modules/travel/front/search-panel/index.js
index 089953127..f53c15ca8 100644
--- a/modules/travel/front/search-panel/index.js
+++ b/modules/travel/front/search-panel/index.js
@@ -38,10 +38,12 @@ class Controller extends SearchPanel {
applyFilters(param) {
if (typeof this.filter.scopeDays === 'number') {
- const shippedFrom = Date.vnNew();
+ const today = Date.vnNew();
+ const shippedFrom = new Date(today.getTime());
+ shippedFrom.setDate(today.getDate() - 30);
shippedFrom.setHours(0, 0, 0, 0);
- const shippedTo = new Date(shippedFrom.getTime());
+ const shippedTo = new Date(today.getTime());
shippedTo.setDate(shippedTo.getDate() + this.filter.scopeDays);
shippedTo.setHours(23, 59, 59, 999);
Object.assign(this.filter, {shippedFrom, shippedTo});
From 954c2f5435518e7b8493d04de2eb312c1ee3f1ed Mon Sep 17 00:00:00 2001
From: vicent
Date: Wed, 12 Jul 2023 13:12:51 +0200
Subject: [PATCH 0384/1087] refs #5244 feat: carga valor inicial
---
.../core/components/worker-autocomplete/index.js | 10 ++++++----
modules/claim/front/basic-data/index.html | 3 +++
modules/worker/back/methods/worker/search.js | 15 +++++++++------
3 files changed, 18 insertions(+), 10 deletions(-)
diff --git a/front/core/components/worker-autocomplete/index.js b/front/core/components/worker-autocomplete/index.js
index 436959c5d..24cc02797 100755
--- a/front/core/components/worker-autocomplete/index.js
+++ b/front/core/components/worker-autocomplete/index.js
@@ -7,6 +7,8 @@ export default class WorkerAutocomplete extends Autocomplete {
}
$onInit() {
+ super.$onInit();
+
let url = 'Workers/search';
if (this.departments) {
const parameter = encodeURIComponent(JSON.stringify(this.departments));
@@ -17,11 +19,11 @@ export default class WorkerAutocomplete extends Autocomplete {
url: url,
searchFunction: function({$search}) {
return {and: [
- {'u.active': {neq: false}},
+ {'active': {neq: false}},
{or: [
- {'u.name': $search},
- {'u.nickname': {like: '%' + $search + '%'}},
- {'w.code': {like: $search + '%'}}
+ {'name': $search},
+ {'nickname': {like: '%' + $search + '%'}},
+ {'code': {like: $search + '%'}}
]}
]};
},
diff --git a/modules/claim/front/basic-data/index.html b/modules/claim/front/basic-data/index.html
index 16e134c60..70be85a8f 100644
--- a/modules/claim/front/basic-data/index.html
+++ b/modules/claim/front/basic-data/index.html
@@ -34,6 +34,9 @@
where="{role: 'salesPerson'}"
label="Attended by">
+
+ {
filter = mergeFilters(filter, {where});
}
- const stmt = new ParameterizedSQL(
- `SELECT DISTINCT w.id, w.code, u.name, u.nickname
- FROM worker w
- JOIN account.user u ON u.id = w.id
- JOIN business b ON b.workerFk = w.id
- JOIN department d ON d.id = b.departmentFk`);
+ const stmt = new ParameterizedSQL(`
+ SELECT *
+ FROM(
+ SELECT DISTINCT w.id, w.code, u.name, u.nickname, u.active
+ FROM worker w
+ JOIN account.user u ON u.id = w.id
+ JOIN business b ON b.workerFk = w.id
+ JOIN department d ON d.id = b.departmentFk
+ ) w`);
stmt.merge(conn.makeSuffix(filter));
return conn.executeStmt(stmt);
From 551d06ee8358554f2c83dbeaf6a1f054e634e2af Mon Sep 17 00:00:00 2001
From: vicent
Date: Wed, 12 Jul 2023 13:55:57 +0200
Subject: [PATCH 0385/1087] =?UTF-8?q?refs=20#5887=20para=20eliminar=20sigu?=
=?UTF-8?q?e=20las=20mismas=20reglas=20que=20para=20a=C3=B1adir?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
back/methods/vn-user/specs/addAlias.spec.js | 8 +--
back/models/vn-user.js | 2 -
db/changes/232402/00-hotFix_travelConfig.sql | 32 +++++------
db/changes/232601/00-aclAddAlias.sql | 12 ++---
loopback/locale/es.json | 2 +-
.../methods/mail-alias-account}/addAlias.js | 25 +--------
.../mail-alias-account}/removeAlias.js | 6 +--
.../account/back/models/mail-alias-account.js | 53 +++++++++++++++++++
modules/account/front/aliases/index.js | 4 +-
modules/account/front/aliases/index.spec.js | 4 +-
10 files changed, 83 insertions(+), 65 deletions(-)
rename {back/methods/vn-user => modules/account/back/methods/mail-alias-account}/addAlias.js (58%)
rename {back/methods/vn-user => modules/account/back/methods/mail-alias-account}/removeAlias.js (83%)
create mode 100644 modules/account/back/models/mail-alias-account.js
diff --git a/back/methods/vn-user/specs/addAlias.spec.js b/back/methods/vn-user/specs/addAlias.spec.js
index ef657a3a8..880c08139 100644
--- a/back/methods/vn-user/specs/addAlias.spec.js
+++ b/back/methods/vn-user/specs/addAlias.spec.js
@@ -14,7 +14,7 @@ describe('VnUser addAlias()', () => {
try {
const options = {transaction: tx};
- await models.VnUser.addAlias(ctx, employeeId, mailAlias, options);
+ await models.MailAliasAccount.addAlias(ctx, employeeId, mailAlias, options);
await tx.rollback();
} catch (e) {
@@ -33,7 +33,7 @@ describe('VnUser addAlias()', () => {
try {
const options = {transaction: tx};
- await models.VnUser.addAlias(ctx, employeeId, mailAlias, options);
+ await models.MailAliasAccount.addAlias(ctx, employeeId, mailAlias, options);
await tx.rollback();
} catch (e) {
@@ -41,7 +41,7 @@ describe('VnUser addAlias()', () => {
await tx.rollback();
}
- expect(error.message).toContain(`You cannot assign an alias that you are not assigned to`);
+ expect(error.message).toContain(`You cannot assign/remove an alias that you are not assigned to`);
});
it('should add an alias', async() => {
@@ -55,7 +55,7 @@ describe('VnUser addAlias()', () => {
const user = await models.VnUser.findById(developerId, null, options);
await user.updateAttribute('hasGrant', true, options);
- result = await models.VnUser.addAlias(ctx, customerId, mailAlias, options);
+ result = await models.MailAliasAccount.addAlias(ctx, customerId, mailAlias, options);
await tx.rollback();
} catch (e) {
diff --git a/back/models/vn-user.js b/back/models/vn-user.js
index 12aab585c..b58395acc 100644
--- a/back/models/vn-user.js
+++ b/back/models/vn-user.js
@@ -11,8 +11,6 @@ module.exports = function(Self) {
require('../methods/vn-user/validate-token')(Self);
require('../methods/vn-user/privileges')(Self);
require('../methods/vn-user/renew-token')(Self);
- require('../methods/vn-user/addAlias')(Self);
- require('../methods/vn-user/removeAlias')(Self);
Self.definition.settings.acls = Self.definition.settings.acls.filter(acl => acl.property !== 'create');
diff --git a/db/changes/232402/00-hotFix_travelConfig.sql b/db/changes/232402/00-hotFix_travelConfig.sql
index 65450a74d..2691999dc 100644
--- a/db/changes/232402/00-hotFix_travelConfig.sql
+++ b/db/changes/232402/00-hotFix_travelConfig.sql
@@ -1,19 +1,19 @@
-CREATE TABLE `vn`.`travelConfig` (
- `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
- `warehouseInFk` smallint(6) unsigned NOT NULL DEFAULT 8 COMMENT 'Warehouse de origen',
- `warehouseOutFk` smallint(6) unsigned NOT NULL DEFAULT 60 COMMENT 'Warehouse destino',
- `agencyFk` int(11) NOT NULL DEFAULT 1378 COMMENT 'Agencia por defecto',
- `companyFk` int(10) unsigned NOT NULL DEFAULT 442 COMMENT 'Compañía por defecto',
- PRIMARY KEY (`id`),
- KEY `travelConfig_FK` (`warehouseInFk`),
- KEY `travelConfig_FK_1` (`warehouseOutFk`),
- KEY `travelConfig_FK_2` (`agencyFk`),
- KEY `travelConfig_FK_3` (`companyFk`),
- CONSTRAINT `travelConfig_FK` FOREIGN KEY (`warehouseInFk`) REFERENCES `warehouse` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
- CONSTRAINT `travelConfig_FK_1` FOREIGN KEY (`warehouseOutFk`) REFERENCES `warehouse` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
- CONSTRAINT `travelConfig_FK_2` FOREIGN KEY (`agencyFk`) REFERENCES `agencyMode` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
- CONSTRAINT `travelConfig_FK_3` FOREIGN KEY (`companyFk`) REFERENCES `company` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
+-- CREATE TABLE `vn`.`travelConfig` (
+-- `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+-- `warehouseInFk` smallint(6) unsigned NOT NULL DEFAULT 8 COMMENT 'Warehouse de origen',
+-- `warehouseOutFk` smallint(6) unsigned NOT NULL DEFAULT 60 COMMENT 'Warehouse destino',
+-- `agencyFk` int(11) NOT NULL DEFAULT 1378 COMMENT 'Agencia por defecto',
+-- `companyFk` int(10) unsigned NOT NULL DEFAULT 442 COMMENT 'Compañía por defecto',
+-- PRIMARY KEY (`id`),
+-- KEY `travelConfig_FK` (`warehouseInFk`),
+-- KEY `travelConfig_FK_1` (`warehouseOutFk`),
+-- KEY `travelConfig_FK_2` (`agencyFk`),
+-- KEY `travelConfig_FK_3` (`companyFk`),
+-- CONSTRAINT `travelConfig_FK` FOREIGN KEY (`warehouseInFk`) REFERENCES `warehouse` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
+-- CONSTRAINT `travelConfig_FK_1` FOREIGN KEY (`warehouseOutFk`) REFERENCES `warehouse` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
+-- CONSTRAINT `travelConfig_FK_2` FOREIGN KEY (`agencyFk`) REFERENCES `agencyMode` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
+-- CONSTRAINT `travelConfig_FK_3` FOREIGN KEY (`companyFk`) REFERENCES `company` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
+-- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`)
VALUES
diff --git a/db/changes/232601/00-aclAddAlias.sql b/db/changes/232601/00-aclAddAlias.sql
index cc96f5ad8..db2100bed 100644
--- a/db/changes/232601/00-aclAddAlias.sql
+++ b/db/changes/232601/00-aclAddAlias.sql
@@ -1,11 +1,5 @@
INSERT INTO `salix`.`ACL` (model, property, accessType, permission, principalType, principalId)
VALUES
- ('VnUser', 'addAlias', 'WRITE', 'ALLOW', 'ROLE', 'employee');
-
-INSERT INTO `salix`.`ACL` (model, property, accessType, permission, principalType, principalId)
- VALUES
- ('VnUser', 'removeAlias', 'WRITE', 'ALLOW', 'ROLE', 'employee');
-
-INSERT INTO `salix`.`ACL` (model, property, accessType, permission, principalType, principalId)
- VALUES
- ('VnUser', 'canRemoveAlias', 'WRITE', 'ALLOW', 'ROLE', 'itManagement');
+ ('MailAliasAccount', 'addAlias', 'WRITE', 'ALLOW', 'ROLE', 'employee'),
+ ('MailAliasAccount', 'removeAlias', 'WRITE', 'ALLOW', 'ROLE', 'employee'),
+ ('MailAliasAccount', 'canEditAlias', 'WRITE', 'ALLOW', 'ROLE', 'itManagement');
diff --git a/loopback/locale/es.json b/loopback/locale/es.json
index 809ed5874..4408b48b5 100644
--- a/loopback/locale/es.json
+++ b/loopback/locale/es.json
@@ -299,5 +299,5 @@
"Mail not sent": "Se ha producido un fallo al enviar la factura al cliente [{{clientId}}]({{{clientUrl}}}), por favor revisa la dirección de correo electrónico",
"The renew period has not been exceeded": "El periodo de renovación no ha sido superado",
"Negative basis of tickets": "Base negativa para los tickets: {{ticketsIds}}",
- "You cannot assign an alias that you are not assigned to": "No puede asignar un alias que no tenga asignado"
+ "You cannot assign/remove an alias that you are not assigned to": "No puede asignar/eliminar un alias que no tenga asignado"
}
diff --git a/back/methods/vn-user/addAlias.js b/modules/account/back/methods/mail-alias-account/addAlias.js
similarity index 58%
rename from back/methods/vn-user/addAlias.js
rename to modules/account/back/methods/mail-alias-account/addAlias.js
index 9fe43e713..74624b63c 100644
--- a/back/methods/vn-user/addAlias.js
+++ b/modules/account/back/methods/mail-alias-account/addAlias.js
@@ -1,5 +1,3 @@
-const UserError = require('vn-loopback/util/user-error');
-
module.exports = Self => {
Self.remoteMethod('addAlias', {
description: 'Add an alias if the user has the grant',
@@ -32,33 +30,12 @@ module.exports = Self => {
Self.addAlias = async function(ctx, id, mailAlias, options) {
const models = Self.app.models;
- const userId = ctx.req.accessToken.userId;
-
const myOptions = {};
if (typeof options == 'object')
Object.assign(myOptions, options);
- const user = await Self.findById(userId, {fields: ['hasGrant']}, myOptions);
-
- if (!user.hasGrant)
- throw new UserError(`You don't have grant privilege`);
-
- const account = await models.Account.findById(userId, {
- fields: ['id'],
- include: {
- relation: 'aliases',
- scope: {
- fields: ['mailAlias']
- }
- }
- }, myOptions);
-
- const aliases = account.aliases().map(alias => alias.mailAlias);
-
- const hasAlias = aliases.includes(mailAlias);
- if (!hasAlias)
- throw new UserError(`You cannot assign an alias that you are not assigned to`);
+ await Self.hasGrant(ctx, mailAlias, myOptions);
return models.MailAliasAccount.create({
mailAlias: mailAlias,
diff --git a/back/methods/vn-user/removeAlias.js b/modules/account/back/methods/mail-alias-account/removeAlias.js
similarity index 83%
rename from back/methods/vn-user/removeAlias.js
rename to modules/account/back/methods/mail-alias-account/removeAlias.js
index 0424c3e96..c32911f4d 100644
--- a/back/methods/vn-user/removeAlias.js
+++ b/modules/account/back/methods/mail-alias-account/removeAlias.js
@@ -32,16 +32,12 @@ module.exports = Self => {
Self.removeAlias = async function(ctx, id, mailAlias, options) {
const models = Self.app.models;
- const userId = ctx.req.accessToken.userId;
-
const myOptions = {};
if (typeof options == 'object')
Object.assign(myOptions, options);
- const canRemoveAlias = await models.ACL.checkAccessAcl(ctx, 'VnUser', 'canRemoveAlias', 'WRITE');
-
- if (userId != id && !canRemoveAlias) throw new UserError(`You don't have grant privilege`);
+ await Self.hasGrant(ctx, mailAlias, myOptions);
const mailAliasAccount = await models.MailAliasAccount.findOne({
where: {
diff --git a/modules/account/back/models/mail-alias-account.js b/modules/account/back/models/mail-alias-account.js
new file mode 100644
index 000000000..21c70c32e
--- /dev/null
+++ b/modules/account/back/models/mail-alias-account.js
@@ -0,0 +1,53 @@
+
+const UserError = require('vn-loopback/util/user-error');
+
+module.exports = Self => {
+ require('../methods/account/sync')(Self);
+ require('../methods/account/sync-by-id')(Self);
+ require('../methods/account/sync-all')(Self);
+ require('../methods/account/login')(Self);
+ require('../methods/account/logout')(Self);
+ require('../methods/account/change-password')(Self);
+ require('../methods/account/set-password')(Self);
+ require('../methods/mail-alias-account/addAlias')(Self);
+ require('../methods/mail-alias-account/removeAlias')(Self);
+
+ /**
+ * Checks if current user has
+ * read privileges over a dms
+ *
+ * @param {Object} ctx - Request context
+ * @param {Interger} mailAlias - mailAlias id
+ * @param {Object} options - Query options
+ * @return {Boolean} True for user with grant
+ */
+ Self.hasGrant = async function(ctx, mailAlias, options) {
+ const models = Self.app.models;
+ const userId = ctx.req.accessToken.userId;
+
+ const canEditAlias = await models.ACL.checkAccessAcl(ctx, 'MailAliasAccount', 'canEditAlias', 'WRITE');
+ if (canEditAlias) return true;
+
+ const user = await models.VnUser.findById(userId, {fields: ['hasGrant']}, options);
+ if (!user.hasGrant)
+ throw new UserError(`You don't have grant privilege`);
+
+ const account = await models.Account.findById(userId, {
+ fields: ['id'],
+ include: {
+ relation: 'aliases',
+ scope: {
+ fields: ['mailAlias']
+ }
+ }
+ }, options);
+
+ const aliases = account.aliases().map(alias => alias.mailAlias);
+
+ const hasAlias = aliases.includes(mailAlias);
+ if (!hasAlias)
+ throw new UserError(`You cannot assign/remove an alias that you are not assigned to`);
+
+ return true;
+ };
+};
diff --git a/modules/account/front/aliases/index.js b/modules/account/front/aliases/index.js
index e0c738ee4..b4ada07e5 100644
--- a/modules/account/front/aliases/index.js
+++ b/modules/account/front/aliases/index.js
@@ -25,7 +25,7 @@ export default class Controller extends Section {
}
onAddSave() {
- return this.$http.post(`VnUsers/${this.$params.id}/addAlias`, this.addData)
+ return this.$http.post(`MailAliasAccounts/${this.$params.id}/addAlias`, this.addData)
.then(() => this.refresh())
.then(() => this.vnApp.showSuccess(
this.$t('Subscribed to alias!'))
@@ -36,7 +36,7 @@ export default class Controller extends Section {
const params = {
mailAlias: row.mailAlias
};
- return this.$http.post(`VnUsers/${this.$params.id}/removeAlias`, params)
+ return this.$http.post(`MailAliasAccounts/${this.$params.id}/removeAlias`, params)
.then(() => this.refresh())
.then(() => this.vnApp.showSuccess(this.$t('Data saved!')));
}
diff --git a/modules/account/front/aliases/index.spec.js b/modules/account/front/aliases/index.spec.js
index 61f71949c..f72c06ab4 100644
--- a/modules/account/front/aliases/index.spec.js
+++ b/modules/account/front/aliases/index.spec.js
@@ -27,7 +27,7 @@ describe('component vnUserAliases', () => {
controller.addData = {account: 1};
controller.$params = {id: 1};
- $httpBackend.expectPOST('VnUsers/1/addAlias').respond();
+ $httpBackend.expectPOST('MailAliasAccounts/1/addAlias').respond();
$httpBackend.expectGET('MailAliasAccounts').respond('foo');
controller.onAddSave();
$httpBackend.flush();
@@ -44,7 +44,7 @@ describe('component vnUserAliases', () => {
];
controller.$params = {id: 1};
- $httpBackend.expectPOST('VnUsers/1/removeAlias').respond();
+ $httpBackend.expectPOST('MailAliasAccounts/1/removeAlias').respond();
$httpBackend.expectGET('MailAliasAccounts').respond(controller.$.data[1]);
controller.onRemove(controller.$.data[0]);
$httpBackend.flush();
From aea5133f399837a4281c446e059f910be9b0530b Mon Sep 17 00:00:00 2001
From: vicent
Date: Wed, 12 Jul 2023 14:01:39 +0200
Subject: [PATCH 0386/1087] refs #5877 fix: aply changes
---
db/changes/232601/{00-aclAddAlias.sql => 01-aclAddAlias.sql} | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename db/changes/232601/{00-aclAddAlias.sql => 01-aclAddAlias.sql} (100%)
diff --git a/db/changes/232601/00-aclAddAlias.sql b/db/changes/232601/01-aclAddAlias.sql
similarity index 100%
rename from db/changes/232601/00-aclAddAlias.sql
rename to db/changes/232601/01-aclAddAlias.sql
From c0d329edcab295b2277b1bece04bd344b661a1ab Mon Sep 17 00:00:00 2001
From: vicent
Date: Wed, 12 Jul 2023 14:04:17 +0200
Subject: [PATCH 0387/1087] a
---
db/changes/232402/00-hotFix_travelConfig.sql | 32 +++++++++----------
.../account/back/models/mail-alias-account.js | 2 +-
2 files changed, 17 insertions(+), 17 deletions(-)
diff --git a/db/changes/232402/00-hotFix_travelConfig.sql b/db/changes/232402/00-hotFix_travelConfig.sql
index 2691999dc..65450a74d 100644
--- a/db/changes/232402/00-hotFix_travelConfig.sql
+++ b/db/changes/232402/00-hotFix_travelConfig.sql
@@ -1,19 +1,19 @@
--- CREATE TABLE `vn`.`travelConfig` (
--- `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
--- `warehouseInFk` smallint(6) unsigned NOT NULL DEFAULT 8 COMMENT 'Warehouse de origen',
--- `warehouseOutFk` smallint(6) unsigned NOT NULL DEFAULT 60 COMMENT 'Warehouse destino',
--- `agencyFk` int(11) NOT NULL DEFAULT 1378 COMMENT 'Agencia por defecto',
--- `companyFk` int(10) unsigned NOT NULL DEFAULT 442 COMMENT 'Compañía por defecto',
--- PRIMARY KEY (`id`),
--- KEY `travelConfig_FK` (`warehouseInFk`),
--- KEY `travelConfig_FK_1` (`warehouseOutFk`),
--- KEY `travelConfig_FK_2` (`agencyFk`),
--- KEY `travelConfig_FK_3` (`companyFk`),
--- CONSTRAINT `travelConfig_FK` FOREIGN KEY (`warehouseInFk`) REFERENCES `warehouse` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
--- CONSTRAINT `travelConfig_FK_1` FOREIGN KEY (`warehouseOutFk`) REFERENCES `warehouse` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
--- CONSTRAINT `travelConfig_FK_2` FOREIGN KEY (`agencyFk`) REFERENCES `agencyMode` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
--- CONSTRAINT `travelConfig_FK_3` FOREIGN KEY (`companyFk`) REFERENCES `company` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
--- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
+CREATE TABLE `vn`.`travelConfig` (
+ `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `warehouseInFk` smallint(6) unsigned NOT NULL DEFAULT 8 COMMENT 'Warehouse de origen',
+ `warehouseOutFk` smallint(6) unsigned NOT NULL DEFAULT 60 COMMENT 'Warehouse destino',
+ `agencyFk` int(11) NOT NULL DEFAULT 1378 COMMENT 'Agencia por defecto',
+ `companyFk` int(10) unsigned NOT NULL DEFAULT 442 COMMENT 'Compañía por defecto',
+ PRIMARY KEY (`id`),
+ KEY `travelConfig_FK` (`warehouseInFk`),
+ KEY `travelConfig_FK_1` (`warehouseOutFk`),
+ KEY `travelConfig_FK_2` (`agencyFk`),
+ KEY `travelConfig_FK_3` (`companyFk`),
+ CONSTRAINT `travelConfig_FK` FOREIGN KEY (`warehouseInFk`) REFERENCES `warehouse` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
+ CONSTRAINT `travelConfig_FK_1` FOREIGN KEY (`warehouseOutFk`) REFERENCES `warehouse` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
+ CONSTRAINT `travelConfig_FK_2` FOREIGN KEY (`agencyFk`) REFERENCES `agencyMode` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
+ CONSTRAINT `travelConfig_FK_3` FOREIGN KEY (`companyFk`) REFERENCES `company` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`)
VALUES
diff --git a/modules/account/back/models/mail-alias-account.js b/modules/account/back/models/mail-alias-account.js
index 21c70c32e..78ec75326 100644
--- a/modules/account/back/models/mail-alias-account.js
+++ b/modules/account/back/models/mail-alias-account.js
@@ -14,7 +14,7 @@ module.exports = Self => {
/**
* Checks if current user has
- * read privileges over a dms
+ * grant to add/remove alias
*
* @param {Object} ctx - Request context
* @param {Interger} mailAlias - mailAlias id
From ef6a2ae578988ac536f91fcc7994a0483318983e Mon Sep 17 00:00:00 2001
From: vicent
Date: Wed, 12 Jul 2023 14:06:28 +0200
Subject: [PATCH 0388/1087] refs #5887 fix: delete requires
---
modules/account/back/models/mail-alias-account.js | 7 -------
1 file changed, 7 deletions(-)
diff --git a/modules/account/back/models/mail-alias-account.js b/modules/account/back/models/mail-alias-account.js
index 78ec75326..0875bf79a 100644
--- a/modules/account/back/models/mail-alias-account.js
+++ b/modules/account/back/models/mail-alias-account.js
@@ -2,13 +2,6 @@
const UserError = require('vn-loopback/util/user-error');
module.exports = Self => {
- require('../methods/account/sync')(Self);
- require('../methods/account/sync-by-id')(Self);
- require('../methods/account/sync-all')(Self);
- require('../methods/account/login')(Self);
- require('../methods/account/logout')(Self);
- require('../methods/account/change-password')(Self);
- require('../methods/account/set-password')(Self);
require('../methods/mail-alias-account/addAlias')(Self);
require('../methods/mail-alias-account/removeAlias')(Self);
From 7aaaf5492cebb382e1474ad6a6384843f9ca17e1 Mon Sep 17 00:00:00 2001
From: vicent
Date: Wed, 12 Jul 2023 15:07:06 +0200
Subject: [PATCH 0389/1087] refs #5887 refacotr: move code to hook
---
back/methods/vn-user/specs/addAlias.spec.js | 68 -------------------
db/changes/232601/01-aclAddAlias.sql | 7 +-
.../methods/mail-alias-account/addAlias.js | 45 ------------
.../methods/mail-alias-account/removeAlias.js | 51 --------------
.../account/back/models/mail-alias-account.js | 25 ++++---
modules/account/front/aliases/index.js | 14 ++--
modules/account/front/aliases/index.spec.js | 9 +--
7 files changed, 32 insertions(+), 187 deletions(-)
delete mode 100644 back/methods/vn-user/specs/addAlias.spec.js
delete mode 100644 modules/account/back/methods/mail-alias-account/addAlias.js
delete mode 100644 modules/account/back/methods/mail-alias-account/removeAlias.js
diff --git a/back/methods/vn-user/specs/addAlias.spec.js b/back/methods/vn-user/specs/addAlias.spec.js
deleted file mode 100644
index 880c08139..000000000
--- a/back/methods/vn-user/specs/addAlias.spec.js
+++ /dev/null
@@ -1,68 +0,0 @@
-const {models} = require('vn-loopback/server/server');
-
-describe('VnUser addAlias()', () => {
- const employeeId = 1;
- const sysadminId = 66;
- const developerId = 9;
- const customerId = 2;
- const mailAlias = 1;
- it('should throw an error when user not has privileges', async() => {
- const ctx = {req: {accessToken: {userId: employeeId}}};
- const tx = await models.VnUser.beginTransaction({});
-
- let error;
- try {
- const options = {transaction: tx};
-
- await models.MailAliasAccount.addAlias(ctx, employeeId, mailAlias, options);
-
- await tx.rollback();
- } catch (e) {
- error = e;
- await tx.rollback();
- }
-
- expect(error.message).toContain(`You don't have grant privilege`);
- });
-
- it('should throw an error when user has privileges but not has the role from user', async() => {
- const ctx = {req: {accessToken: {userId: sysadminId}}};
- const tx = await models.VnUser.beginTransaction({});
-
- let error;
- try {
- const options = {transaction: tx};
-
- await models.MailAliasAccount.addAlias(ctx, employeeId, mailAlias, options);
-
- await tx.rollback();
- } catch (e) {
- error = e;
- await tx.rollback();
- }
-
- expect(error.message).toContain(`You cannot assign/remove an alias that you are not assigned to`);
- });
-
- it('should add an alias', async() => {
- const ctx = {req: {accessToken: {userId: developerId}}};
- const tx = await models.VnUser.beginTransaction({});
-
- let result;
- try {
- const options = {transaction: tx};
-
- const user = await models.VnUser.findById(developerId, null, options);
- await user.updateAttribute('hasGrant', true, options);
-
- result = await models.MailAliasAccount.addAlias(ctx, customerId, mailAlias, options);
-
- await tx.rollback();
- } catch (e) {
- await tx.rollback();
- }
-
- expect(result.mailAlias).toBe(mailAlias);
- expect(result.account).toBe(customerId);
- });
-});
diff --git a/db/changes/232601/01-aclAddAlias.sql b/db/changes/232601/01-aclAddAlias.sql
index db2100bed..d4df3cd44 100644
--- a/db/changes/232601/01-aclAddAlias.sql
+++ b/db/changes/232601/01-aclAddAlias.sql
@@ -1,5 +1,8 @@
+DELETE FROM `salix`.`ACL` WHERE model = 'MailAliasAccount';
+
INSERT INTO `salix`.`ACL` (model, property, accessType, permission, principalType, principalId)
VALUES
- ('MailAliasAccount', 'addAlias', 'WRITE', 'ALLOW', 'ROLE', 'employee'),
- ('MailAliasAccount', 'removeAlias', 'WRITE', 'ALLOW', 'ROLE', 'employee'),
+ ('MailAliasAccount', '*', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('MailAliasAccount', 'create', 'WRITE', 'ALLOW', 'ROLE', 'employee'),
+ ('MailAliasAccount', 'deleteById', 'WRITE', 'ALLOW', 'ROLE', 'employee'),
('MailAliasAccount', 'canEditAlias', 'WRITE', 'ALLOW', 'ROLE', 'itManagement');
diff --git a/modules/account/back/methods/mail-alias-account/addAlias.js b/modules/account/back/methods/mail-alias-account/addAlias.js
deleted file mode 100644
index 74624b63c..000000000
--- a/modules/account/back/methods/mail-alias-account/addAlias.js
+++ /dev/null
@@ -1,45 +0,0 @@
-module.exports = Self => {
- Self.remoteMethod('addAlias', {
- description: 'Add an alias if the user has the grant',
- accessType: 'WRITE',
- accepts: [
- {
- arg: 'ctx',
- type: 'Object',
- http: {source: 'context'}
- },
- {
- arg: 'id',
- type: 'number',
- required: true,
- description: 'The user id',
- http: {source: 'path'}
- },
- {
- arg: 'mailAlias',
- type: 'number',
- description: 'The new alias for user',
- required: true
- }
- ],
- http: {
- path: `/:id/addAlias`,
- verb: 'POST'
- }
- });
-
- Self.addAlias = async function(ctx, id, mailAlias, options) {
- const models = Self.app.models;
- const myOptions = {};
-
- if (typeof options == 'object')
- Object.assign(myOptions, options);
-
- await Self.hasGrant(ctx, mailAlias, myOptions);
-
- return models.MailAliasAccount.create({
- mailAlias: mailAlias,
- account: id
- }, myOptions);
- };
-};
diff --git a/modules/account/back/methods/mail-alias-account/removeAlias.js b/modules/account/back/methods/mail-alias-account/removeAlias.js
deleted file mode 100644
index c32911f4d..000000000
--- a/modules/account/back/methods/mail-alias-account/removeAlias.js
+++ /dev/null
@@ -1,51 +0,0 @@
-const UserError = require('vn-loopback/util/user-error');
-
-module.exports = Self => {
- Self.remoteMethod('removeAlias', {
- description: 'Remove alias if the user has the grant',
- accessType: 'WRITE',
- accepts: [
- {
- arg: 'ctx',
- type: 'Object',
- http: {source: 'context'}
- },
- {
- arg: 'id',
- type: 'number',
- required: true,
- description: 'The user id',
- http: {source: 'path'}
- },
- {
- arg: 'mailAlias',
- type: 'number',
- description: 'The alias to delete',
- required: true
- }
- ],
- http: {
- path: `/:id/removeAlias`,
- verb: 'POST'
- }
- });
-
- Self.removeAlias = async function(ctx, id, mailAlias, options) {
- const models = Self.app.models;
- const myOptions = {};
-
- if (typeof options == 'object')
- Object.assign(myOptions, options);
-
- await Self.hasGrant(ctx, mailAlias, myOptions);
-
- const mailAliasAccount = await models.MailAliasAccount.findOne({
- where: {
- mailAlias: mailAlias,
- account: id
- }
- }, myOptions);
-
- await mailAliasAccount.destroy(myOptions);
- };
-};
diff --git a/modules/account/back/models/mail-alias-account.js b/modules/account/back/models/mail-alias-account.js
index 0875bf79a..6f5213f24 100644
--- a/modules/account/back/models/mail-alias-account.js
+++ b/modules/account/back/models/mail-alias-account.js
@@ -2,8 +2,17 @@
const UserError = require('vn-loopback/util/user-error');
module.exports = Self => {
- require('../methods/mail-alias-account/addAlias')(Self);
- require('../methods/mail-alias-account/removeAlias')(Self);
+ Self.observe('before save', async ctx => {
+ const changes = ctx.currentInstance || ctx.instance;
+
+ await Self.hasGrant(ctx, changes.mailAlias);
+ });
+
+ Self.observe('before delete', async ctx => {
+ const mailAliasAccount = await Self.findById(ctx.where.id);
+
+ await Self.hasGrant(ctx, mailAliasAccount.mailAlias);
+ });
/**
* Checks if current user has
@@ -11,17 +20,17 @@ module.exports = Self => {
*
* @param {Object} ctx - Request context
* @param {Interger} mailAlias - mailAlias id
- * @param {Object} options - Query options
* @return {Boolean} True for user with grant
*/
- Self.hasGrant = async function(ctx, mailAlias, options) {
+ Self.hasGrant = async function(ctx, mailAlias) {
const models = Self.app.models;
- const userId = ctx.req.accessToken.userId;
+ const accessToken = {req: {accessToken: ctx.options.accessToken}};
+ const userId = accessToken.req.accessToken.userId;
- const canEditAlias = await models.ACL.checkAccessAcl(ctx, 'MailAliasAccount', 'canEditAlias', 'WRITE');
+ const canEditAlias = await models.ACL.checkAccessAcl(accessToken, 'MailAliasAccount', 'canEditAlias', 'WRITE');
if (canEditAlias) return true;
- const user = await models.VnUser.findById(userId, {fields: ['hasGrant']}, options);
+ const user = await models.VnUser.findById(userId, {fields: ['hasGrant']});
if (!user.hasGrant)
throw new UserError(`You don't have grant privilege`);
@@ -33,7 +42,7 @@ module.exports = Self => {
fields: ['mailAlias']
}
}
- }, options);
+ });
const aliases = account.aliases().map(alias => alias.mailAlias);
diff --git a/modules/account/front/aliases/index.js b/modules/account/front/aliases/index.js
index b4ada07e5..0fc806a71 100644
--- a/modules/account/front/aliases/index.js
+++ b/modules/account/front/aliases/index.js
@@ -21,11 +21,12 @@ export default class Controller extends Section {
}
onAddClick() {
+ this.addData = {account: this.$params.id};
this.$.dialog.show();
}
onAddSave() {
- return this.$http.post(`MailAliasAccounts/${this.$params.id}/addAlias`, this.addData)
+ return this.$http.post(`MailAliasAccounts`, this.addData)
.then(() => this.refresh())
.then(() => this.vnApp.showSuccess(
this.$t('Subscribed to alias!'))
@@ -33,12 +34,11 @@ export default class Controller extends Section {
}
onRemove(row) {
- const params = {
- mailAlias: row.mailAlias
- };
- return this.$http.post(`MailAliasAccounts/${this.$params.id}/removeAlias`, params)
- .then(() => this.refresh())
- .then(() => this.vnApp.showSuccess(this.$t('Data saved!')));
+ return this.$http.delete(`MailAliasAccounts/${row.id}`)
+ .then(() => {
+ this.$.data.splice(this.$.data.indexOf(row), 1);
+ this.vnApp.showSuccess(this.$t('Unsubscribed from alias!'));
+ });
}
}
diff --git a/modules/account/front/aliases/index.spec.js b/modules/account/front/aliases/index.spec.js
index f72c06ab4..466f1e1e9 100644
--- a/modules/account/front/aliases/index.spec.js
+++ b/modules/account/front/aliases/index.spec.js
@@ -25,9 +25,8 @@ describe('component vnUserAliases', () => {
describe('onAddSave()', () => {
it('should add the new row', () => {
controller.addData = {account: 1};
- controller.$params = {id: 1};
- $httpBackend.expectPOST('MailAliasAccounts/1/addAlias').respond();
+ $httpBackend.expectPOST('MailAliasAccounts').respond();
$httpBackend.expectGET('MailAliasAccounts').respond('foo');
controller.onAddSave();
$httpBackend.flush();
@@ -42,14 +41,12 @@ describe('component vnUserAliases', () => {
{id: 1, alias: 'foo'},
{id: 2, alias: 'bar'}
];
- controller.$params = {id: 1};
- $httpBackend.expectPOST('MailAliasAccounts/1/removeAlias').respond();
- $httpBackend.expectGET('MailAliasAccounts').respond(controller.$.data[1]);
+ $httpBackend.expectDELETE('MailAliasAccounts/1').respond();
controller.onRemove(controller.$.data[0]);
$httpBackend.flush();
- expect(controller.$.data).toEqual({id: 2, alias: 'bar'});
+ expect(controller.$.data).toEqual([{id: 2, alias: 'bar'}]);
expect(controller.vnApp.showSuccess).toHaveBeenCalled();
});
});
From 69c3a49cce42c1f0d2d07c5b1a24b245a004d3e5 Mon Sep 17 00:00:00 2001
From: alexm
Date: Thu, 13 Jul 2023 08:05:10 +0200
Subject: [PATCH 0391/1087] warnFix: smtp prevents the sending of emails
depending on the condition
---
print/core/smtp.js | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/print/core/smtp.js b/print/core/smtp.js
index 276b85401..8c07e7eca 100644
--- a/print/core/smtp.js
+++ b/print/core/smtp.js
@@ -10,16 +10,17 @@ module.exports = {
async send(options) {
options.from = `${config.app.senderName} <${config.app.senderEmail}>`;
- if (!process.env.NODE_ENV)
- options.to = config.app.senderEmail;
+ const env = process.env.NODE_ENV;
+ const canSend = env === 'production' || !env || options.force;
- if (process.env.NODE_ENV !== 'production' && !options.force) {
+ if (!canSend || !config.smtp.auth.user) {
const notProductionError = {message: 'This not production, this email not sended'};
await this.mailLog(options, notProductionError);
+ return Promise.resolve(true);
}
- if (!config.smtp.auth.user)
- return Promise.resolve(true);
+ if (!env)
+ options.to = config.app.senderEmail;
let res;
let error;
From 3a61bc6052a2137f6590e7092aac6a9d8c4f76b3 Mon Sep 17 00:00:00 2001
From: vicent
Date: Thu, 13 Jul 2023 08:21:17 +0200
Subject: [PATCH 0392/1087] refs #5887 move changes sql
---
db/changes/{232601 => 232602}/01-aclAddAlias.sql | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename db/changes/{232601 => 232602}/01-aclAddAlias.sql (100%)
diff --git a/db/changes/232601/01-aclAddAlias.sql b/db/changes/232602/01-aclAddAlias.sql
similarity index 100%
rename from db/changes/232601/01-aclAddAlias.sql
rename to db/changes/232602/01-aclAddAlias.sql
From 337ce56a60e7296e49143455f2784de28fe0b68d Mon Sep 17 00:00:00 2001
From: vicent
Date: Thu, 13 Jul 2023 08:37:11 +0200
Subject: [PATCH 0393/1087] refs #5887 test exlcuido
---
modules/ticket/back/methods/ticket/specs/filter.spec.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/modules/ticket/back/methods/ticket/specs/filter.spec.js b/modules/ticket/back/methods/ticket/specs/filter.spec.js
index 6cc1a3ad2..510446cab 100644
--- a/modules/ticket/back/methods/ticket/specs/filter.spec.js
+++ b/modules/ticket/back/methods/ticket/specs/filter.spec.js
@@ -141,6 +141,7 @@ describe('ticket filter()', () => {
});
it('should return the tickets that are not pending', async() => {
+ pending('#6010 test intermitente');
const tx = await models.Ticket.beginTransaction({});
try {
From 112d7a84e336b6242ff04a845faf256bb81b71b2 Mon Sep 17 00:00:00 2001
From: vicent
Date: Thu, 13 Jul 2023 09:32:08 +0200
Subject: [PATCH 0394/1087] solved test
---
back/methods/vn-user/specs/addAlias.spec.js | 68 -------------------
modules/ticket/front/descriptor-menu/index.js | 2 +-
2 files changed, 1 insertion(+), 69 deletions(-)
delete mode 100644 back/methods/vn-user/specs/addAlias.spec.js
diff --git a/back/methods/vn-user/specs/addAlias.spec.js b/back/methods/vn-user/specs/addAlias.spec.js
deleted file mode 100644
index ef657a3a8..000000000
--- a/back/methods/vn-user/specs/addAlias.spec.js
+++ /dev/null
@@ -1,68 +0,0 @@
-const {models} = require('vn-loopback/server/server');
-
-describe('VnUser addAlias()', () => {
- const employeeId = 1;
- const sysadminId = 66;
- const developerId = 9;
- const customerId = 2;
- const mailAlias = 1;
- it('should throw an error when user not has privileges', async() => {
- const ctx = {req: {accessToken: {userId: employeeId}}};
- const tx = await models.VnUser.beginTransaction({});
-
- let error;
- try {
- const options = {transaction: tx};
-
- await models.VnUser.addAlias(ctx, employeeId, mailAlias, options);
-
- await tx.rollback();
- } catch (e) {
- error = e;
- await tx.rollback();
- }
-
- expect(error.message).toContain(`You don't have grant privilege`);
- });
-
- it('should throw an error when user has privileges but not has the role from user', async() => {
- const ctx = {req: {accessToken: {userId: sysadminId}}};
- const tx = await models.VnUser.beginTransaction({});
-
- let error;
- try {
- const options = {transaction: tx};
-
- await models.VnUser.addAlias(ctx, employeeId, mailAlias, options);
-
- await tx.rollback();
- } catch (e) {
- error = e;
- await tx.rollback();
- }
-
- expect(error.message).toContain(`You cannot assign an alias that you are not assigned to`);
- });
-
- it('should add an alias', async() => {
- const ctx = {req: {accessToken: {userId: developerId}}};
- const tx = await models.VnUser.beginTransaction({});
-
- let result;
- try {
- const options = {transaction: tx};
-
- const user = await models.VnUser.findById(developerId, null, options);
- await user.updateAttribute('hasGrant', true, options);
-
- result = await models.VnUser.addAlias(ctx, customerId, mailAlias, options);
-
- await tx.rollback();
- } catch (e) {
- await tx.rollback();
- }
-
- expect(result.mailAlias).toBe(mailAlias);
- expect(result.account).toBe(customerId);
- });
-});
diff --git a/modules/ticket/front/descriptor-menu/index.js b/modules/ticket/front/descriptor-menu/index.js
index 0b47102ac..0fc8488ca 100644
--- a/modules/ticket/front/descriptor-menu/index.js
+++ b/modules/ticket/front/descriptor-menu/index.js
@@ -270,7 +270,7 @@ class Controller extends Section {
});
}
- return this.$http.post(`Tickets/invoiceTickets`, params)
+ return this.$http.post(`Tickets/invoiceTickets`, {ticketsIds: [this.id]})
.then(() => this.reload())
.then(() => this.vnApp.showSuccess(this.$t('Ticket invoiced')));
}
From 392dc5060a7707c4fa288c7b1b85b67e503903de Mon Sep 17 00:00:00 2001
From: vicent
Date: Thu, 13 Jul 2023 10:19:12 +0200
Subject: [PATCH 0395/1087] refs #4770 delete test
---
.../route/front/roadmap/card/index.spec.js | 27 -----
.../route/front/roadmap/create/index.spec.js | 107 ------------------
.../route/front/roadmap/index/index.spec.js | 94 ---------------
.../route/front/roadmap/main/index.spec.js | 31 -----
modules/ticket/front/descriptor-menu/index.js | 2 +-
5 files changed, 1 insertion(+), 260 deletions(-)
delete mode 100644 modules/route/front/roadmap/card/index.spec.js
delete mode 100644 modules/route/front/roadmap/create/index.spec.js
delete mode 100644 modules/route/front/roadmap/index/index.spec.js
delete mode 100644 modules/route/front/roadmap/main/index.spec.js
diff --git a/modules/route/front/roadmap/card/index.spec.js b/modules/route/front/roadmap/card/index.spec.js
deleted file mode 100644
index ab2314bb9..000000000
--- a/modules/route/front/roadmap/card/index.spec.js
+++ /dev/null
@@ -1,27 +0,0 @@
-import './index';
-
-describe('component vnItemTypeCard', () => {
- let controller;
- let $httpBackend;
-
- beforeEach(ngModule('item'));
-
- beforeEach(inject(($componentController, _$httpBackend_) => {
- $httpBackend = _$httpBackend_;
- controller = $componentController('vnItemTypeCard', {$element: null});
- }));
-
- describe('reload()', () => {
- it('should reload the controller data', () => {
- controller.$params.id = 1;
-
- const itemType = {id: 1};
-
- $httpBackend.expectGET('ItemTypes/1').respond(itemType);
- controller.reload();
- $httpBackend.flush();
-
- expect(controller.itemType).toEqual(itemType);
- });
- });
-});
diff --git a/modules/route/front/roadmap/create/index.spec.js b/modules/route/front/roadmap/create/index.spec.js
deleted file mode 100644
index d6d9883a7..000000000
--- a/modules/route/front/roadmap/create/index.spec.js
+++ /dev/null
@@ -1,107 +0,0 @@
-import './index';
-import watcher from 'core/mocks/watcher.js';
-
-describe('AgencyTerm', () => {
- describe('Component vnAgencyTermCreateInvoiceIn', () => {
- let controller;
- let $scope;
- let $httpBackend;
- let $httpParamSerializer;
-
- beforeEach(ngModule('route'));
-
- beforeEach(inject(($componentController, $rootScope, _$httpBackend_, _$httpParamSerializer_) => {
- $scope = $rootScope.$new();
- $httpBackend = _$httpBackend_;
- $httpParamSerializer = _$httpParamSerializer_;
- const $element = angular.element('');
- controller = $componentController('vnAgencyTermCreateInvoiceIn', {$element});
- controller._route = {
- id: 1
- };
- }));
-
- describe('$onChanges()', () => {
- it('should update the params data when $params.q is defined', () => {
- controller.$params = {q: '{"supplierName": "Plants SL","rows": null}'};
-
- const params = {q: '{"supplierName": "Plants SL", "rows": null}'};
- const json = JSON.parse(params.q);
-
- controller.$onChanges();
-
- expect(controller.params).toEqual(json);
- });
- });
-
- describe('route() setter', () => {
- it('should set the ticket data and then call setDefaultParams() and getAllowedContentTypes()', () => {
- jest.spyOn(controller, 'setDefaultParams');
- jest.spyOn(controller, 'getAllowedContentTypes');
- controller.route = {
- id: 1
- };
-
- expect(controller.route).toBeDefined();
- expect(controller.setDefaultParams).toHaveBeenCalledWith();
- expect(controller.getAllowedContentTypes).toHaveBeenCalledWith();
- });
- });
-
- describe('getAllowedContentTypes()', () => {
- it('should make an HTTP GET request to get the allowed content types', () => {
- const expectedResponse = ['image/png', 'image/jpg'];
- $httpBackend.expect('GET', `DmsContainers/allowedContentTypes`).respond(expectedResponse);
- controller.getAllowedContentTypes();
- $httpBackend.flush();
-
- expect(controller.allowedContentTypes).toBeDefined();
- expect(controller.allowedContentTypes).toEqual('image/png, image/jpg');
- });
- });
-
- describe('setDefaultParams()', () => {
- it('should perform a GET query and define the dms property on controller', () => {
- const params = {filter: {
- where: {code: 'invoiceIn'}
- }};
- const serializedParams = $httpParamSerializer(params);
- $httpBackend.expect('GET', `DmsTypes/findOne?${serializedParams}`).respond({id: 1, code: 'invoiceIn'});
- controller.params = {supplierName: 'Plants SL'};
- controller.setDefaultParams();
- $httpBackend.flush();
-
- expect(controller.dms).toBeDefined();
- expect(controller.dms.dmsTypeId).toEqual(1);
- });
- });
-
- describe('onSubmit()', () => {
- it('should make an HTTP POST request to save the form data', () => {
- controller.$.watcher = watcher;
-
- jest.spyOn(controller.$.watcher, 'updateOriginalData');
- const files = [{id: 1, name: 'MyFile'}];
- controller.dms = {files};
- const serializedParams = $httpParamSerializer(controller.dms);
- const query = `dms/uploadFile?${serializedParams}`;
- controller.params = {rows: null};
-
- $httpBackend.expect('POST', query).respond({});
- $httpBackend.expect('POST', 'AgencyTerms/createInvoiceIn').respond({});
- controller.onSubmit();
- $httpBackend.flush();
- });
- });
-
- describe('onFileChange()', () => {
- it('should set dms hasFileAttached property to true if has any files', () => {
- const files = [{id: 1, name: 'MyFile'}];
- controller.onFileChange(files);
- $scope.$apply();
-
- expect(controller.dms.hasFileAttached).toBeTruthy();
- });
- });
- });
-});
diff --git a/modules/route/front/roadmap/index/index.spec.js b/modules/route/front/roadmap/index/index.spec.js
deleted file mode 100644
index 55c40daa5..000000000
--- a/modules/route/front/roadmap/index/index.spec.js
+++ /dev/null
@@ -1,94 +0,0 @@
-import './index.js';
-import crudModel from 'core/mocks/crud-model';
-
-describe('AgencyTerm', () => {
- describe('Component vnAgencyTermIndex', () => {
- let controller;
- let $window;
-
- beforeEach(ngModule('route'));
-
- beforeEach(inject(($componentController, _$window_) => {
- $window = _$window_;
- const $element = angular.element('');
- controller = $componentController('vnAgencyTermIndex', {$element});
- controller.$.model = crudModel;
- controller.$.model.data = [
- {supplierFk: 1, totalPrice: null},
- {supplierFk: 1},
- {supplierFk: 2}
- ];
- }));
-
- describe('checked() getter', () => {
- it('should return the checked lines', () => {
- const data = controller.$.model.data;
- data[0].checked = true;
-
- const checkedRows = controller.checked;
-
- const firstCheckedRow = checkedRows[0];
-
- expect(firstCheckedRow.supplierFk).toEqual(1);
- });
- });
-
- describe('totalCheked() getter', () => {
- it('should return the total checked lines', () => {
- const data = controller.$.model.data;
- data[0].checked = true;
-
- const checkedRows = controller.totalChecked;
-
- expect(checkedRows).toEqual(1);
- });
- });
-
- describe('preview()', () => {
- it('should show the summary dialog', () => {
- controller.$.summary = {show: () => {}};
- jest.spyOn(controller.$.summary, 'show');
-
- let event = new MouseEvent('click', {
- view: $window,
- bubbles: true,
- cancelable: true
- });
- const route = {id: 1};
-
- controller.preview(event, route);
-
- expect(controller.$.summary.show).toHaveBeenCalledWith();
- });
- });
-
- describe('createInvoiceIn()', () => {
- it('should throw an error if more than one autonomous are checked', () => {
- jest.spyOn(controller.vnApp, 'showError');
- const data = controller.$.model.data;
- data[0].checked = true;
- data[2].checked = true;
-
- controller.createInvoiceIn();
-
- expect(controller.vnApp.showError).toHaveBeenCalled();
- });
-
- it('should call the function go() on $state to go to the file management', () => {
- jest.spyOn(controller.$state, 'go');
- const data = controller.$.model.data;
- data[0].checked = true;
-
- controller.createInvoiceIn();
-
- delete data[0].checked;
- const params = JSON.stringify({
- supplierName: data[0].supplierName,
- rows: [data[0]]
- });
-
- expect(controller.$state.go).toHaveBeenCalledWith('route.agencyTerm.createInvoiceIn', {q: params});
- });
- });
- });
-});
diff --git a/modules/route/front/roadmap/main/index.spec.js b/modules/route/front/roadmap/main/index.spec.js
deleted file mode 100644
index dcb14ec0e..000000000
--- a/modules/route/front/roadmap/main/index.spec.js
+++ /dev/null
@@ -1,31 +0,0 @@
-import './index';
-
-describe('Item', () => {
- describe('Component vnItemType', () => {
- let controller;
-
- beforeEach(ngModule('item'));
-
- beforeEach(inject($componentController => {
- const $element = angular.element('');
- controller = $componentController('vnItemType', {$element});
- }));
-
- describe('exprBuilder()', () => {
- it('should return a filter based on a search by id', () => {
- const filter = controller.exprBuilder('search', '123');
-
- expect(filter).toEqual({id: '123'});
- });
-
- it('should return a filter based on a search by name or code', () => {
- const filter = controller.exprBuilder('search', 'Alstroemeria');
-
- expect(filter).toEqual({or: [
- {name: {like: '%Alstroemeria%'}},
- {code: {like: '%Alstroemeria%'}},
- ]});
- });
- });
- });
-});
diff --git a/modules/ticket/front/descriptor-menu/index.js b/modules/ticket/front/descriptor-menu/index.js
index 0b47102ac..0fc8488ca 100644
--- a/modules/ticket/front/descriptor-menu/index.js
+++ b/modules/ticket/front/descriptor-menu/index.js
@@ -270,7 +270,7 @@ class Controller extends Section {
});
}
- return this.$http.post(`Tickets/invoiceTickets`, params)
+ return this.$http.post(`Tickets/invoiceTickets`, {ticketsIds: [this.id]})
.then(() => this.reload())
.then(() => this.vnApp.showSuccess(this.$t('Ticket invoiced')));
}
From c91db1b42922acaccfe7dd562f2b006997b7b8a0 Mon Sep 17 00:00:00 2001
From: vicent
Date: Thu, 13 Jul 2023 10:19:57 +0200
Subject: [PATCH 0396/1087] a
---
back/methods/vn-user/specs/addAlias.spec.js | 68 ---------------------
1 file changed, 68 deletions(-)
delete mode 100644 back/methods/vn-user/specs/addAlias.spec.js
diff --git a/back/methods/vn-user/specs/addAlias.spec.js b/back/methods/vn-user/specs/addAlias.spec.js
deleted file mode 100644
index ef657a3a8..000000000
--- a/back/methods/vn-user/specs/addAlias.spec.js
+++ /dev/null
@@ -1,68 +0,0 @@
-const {models} = require('vn-loopback/server/server');
-
-describe('VnUser addAlias()', () => {
- const employeeId = 1;
- const sysadminId = 66;
- const developerId = 9;
- const customerId = 2;
- const mailAlias = 1;
- it('should throw an error when user not has privileges', async() => {
- const ctx = {req: {accessToken: {userId: employeeId}}};
- const tx = await models.VnUser.beginTransaction({});
-
- let error;
- try {
- const options = {transaction: tx};
-
- await models.VnUser.addAlias(ctx, employeeId, mailAlias, options);
-
- await tx.rollback();
- } catch (e) {
- error = e;
- await tx.rollback();
- }
-
- expect(error.message).toContain(`You don't have grant privilege`);
- });
-
- it('should throw an error when user has privileges but not has the role from user', async() => {
- const ctx = {req: {accessToken: {userId: sysadminId}}};
- const tx = await models.VnUser.beginTransaction({});
-
- let error;
- try {
- const options = {transaction: tx};
-
- await models.VnUser.addAlias(ctx, employeeId, mailAlias, options);
-
- await tx.rollback();
- } catch (e) {
- error = e;
- await tx.rollback();
- }
-
- expect(error.message).toContain(`You cannot assign an alias that you are not assigned to`);
- });
-
- it('should add an alias', async() => {
- const ctx = {req: {accessToken: {userId: developerId}}};
- const tx = await models.VnUser.beginTransaction({});
-
- let result;
- try {
- const options = {transaction: tx};
-
- const user = await models.VnUser.findById(developerId, null, options);
- await user.updateAttribute('hasGrant', true, options);
-
- result = await models.VnUser.addAlias(ctx, customerId, mailAlias, options);
-
- await tx.rollback();
- } catch (e) {
- await tx.rollback();
- }
-
- expect(result.mailAlias).toBe(mailAlias);
- expect(result.account).toBe(customerId);
- });
-});
From 660612cb849e9615e09c5fb98abd424b9d37493a Mon Sep 17 00:00:00 2001
From: carlossa
Date: Thu, 13 Jul 2023 10:22:41 +0200
Subject: [PATCH 0397/1087] refs #5999 url
---
modules/client/front/defaulter/index.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/modules/client/front/defaulter/index.js b/modules/client/front/defaulter/index.js
index 95c7622f9..a2efdcb5c 100644
--- a/modules/client/front/defaulter/index.js
+++ b/modules/client/front/defaulter/index.js
@@ -32,6 +32,7 @@ export default class Controller extends Section {
}, {
field: 'country',
autocomplete: {
+ url: 'Countries',
showField: 'country',
valueField: 'country'
}
From 2627cafc229aa0910e07198e7f19f99d44883c07 Mon Sep 17 00:00:00 2001
From: carlossa
Date: Thu, 13 Jul 2023 10:54:22 +0200
Subject: [PATCH 0398/1087] refs #5999 defaulter country autocomplete
---
modules/client/back/methods/defaulter/filter.js | 3 ++-
modules/client/back/models/defaulter.json | 4 ++--
modules/client/front/defaulter/index.html | 4 ++--
modules/client/front/defaulter/index.js | 6 +++---
4 files changed, 9 insertions(+), 8 deletions(-)
diff --git a/modules/client/back/methods/defaulter/filter.js b/modules/client/back/methods/defaulter/filter.js
index 736c29f9c..ec6088ff0 100644
--- a/modules/client/back/methods/defaulter/filter.js
+++ b/modules/client/back/methods/defaulter/filter.js
@@ -69,11 +69,12 @@ module.exports = Self => {
c.creditInsurance,
d.defaulterSinced,
cn.country,
+ c.countryFk,
pm.name payMethod
FROM vn.defaulter d
JOIN vn.client c ON c.id = d.clientFk
JOIN vn.country cn ON cn.id = c.countryFk
- JOIN vn.payMethod pm ON pm.id = c.payMethodFk
+ JOIN vn.payMethod pm ON pm.id = c.payMethodFk
LEFT JOIN vn.clientObservation co ON co.clientFk = c.id
LEFT JOIN account.user u ON u.id = c.salesPersonFk
LEFT JOIN account.user uw ON uw.id = co.workerFk
diff --git a/modules/client/back/models/defaulter.json b/modules/client/back/models/defaulter.json
index 03d68ea71..ef22c2429 100644
--- a/modules/client/back/models/defaulter.json
+++ b/modules/client/back/models/defaulter.json
@@ -33,7 +33,7 @@
"country": {
"type": "belongsTo",
"model": "Country",
- "foreignKey": "country"
+ "foreignKey": "countryFk"
},
"payMethod": {
"type": "belongsTo",
@@ -41,4 +41,4 @@
"foreignKey": "payMethod"
}
}
-}
\ No newline at end of file
+}
diff --git a/modules/client/front/defaulter/index.html b/modules/client/front/defaulter/index.html
index 4f662b62b..3c66e6459 100644
--- a/modules/client/front/defaulter/index.html
+++ b/modules/client/front/defaulter/index.html
@@ -57,7 +57,7 @@
\ No newline at end of file
+
diff --git a/modules/ticket/front/search-panel/index.html b/modules/ticket/front/search-panel/index.html
index 52bede97f..d80f21531 100644
--- a/modules/ticket/front/search-panel/index.html
+++ b/modules/ticket/front/search-panel/index.html
@@ -1,7 +1,7 @@
-
- Click to exclude the user from getting disabled
-
-
- Click to allow the user to be disabled
-
+
+ {{$ctrl.workerExcluded
+ ? 'Click to allow the user to be disabled'
+ : 'Click to exclude the user from getting disabled'}}
+
From ad5c0218320045413ee44b2d7b7d34accf07d77e Mon Sep 17 00:00:00 2001
From: alexm
Date: Mon, 17 Jul 2023 07:10:26 +0200
Subject: [PATCH 0414/1087] refs #5941 duplicate code
---
front/salix/module.js | 1 -
1 file changed, 1 deletion(-)
diff --git a/front/salix/module.js b/front/salix/module.js
index f22ca8a60..2bcac89f9 100644
--- a/front/salix/module.js
+++ b/front/salix/module.js
@@ -149,7 +149,6 @@ function $exceptionHandler(vnApp, $window, $state, $injector) {
if (messageT)
message = $translate.instant(messageT);
- cause = cause.replace('Possibly unhandled rejection: ', '');
const additonalData = {
frontPath: $state.current.name,
httpRequest: cause.replace('Possibly unhandled rejection: ', ''),
From 6f3cdd3508566050b73c691f29edd92e951b62a7 Mon Sep 17 00:00:00 2001
From: carlossa
Date: Mon, 17 Jul 2023 12:30:48 +0200
Subject: [PATCH 0415/1087] refs #5640 fix e2e back
---
db/dump/fixtures.sql | 4 ++--
e2e/paths/02-client/01_create_client.spec.js | 4 ++--
e2e/paths/02-client/12_lock_of_verified_data.spec.js | 2 +-
e2e/paths/02-client/19_summary.spec.js | 2 +-
loopback/locale/en.json | 6 ++++--
modules/worker/back/methods/worker/specs/new.spec.js | 2 +-
6 files changed, 11 insertions(+), 9 deletions(-)
diff --git a/db/dump/fixtures.sql b/db/dump/fixtures.sql
index 2e3122c89..b1e7888a8 100644
--- a/db/dump/fixtures.sql
+++ b/db/dump/fixtures.sql
@@ -365,8 +365,8 @@ INSERT INTO `vn`.`client`(`id`,`name`,`fi`,`socialName`,`contact`,`street`,`city
(1103, 'Clark Kent', '06815934E', 'Super man', 'lois lane', '344 Clinton Street, Apartament 3-D', 'Gotham', 46460, 1111111111, 222222222, 1, 'ClarkKent@mydomain.com', NULL, 0, 1234567890, 0, 3, 1, 0, 19, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist'),
(1104, 'Tony Stark', '06089160W', 'Iron man', 'Pepper Potts', '10880 Malibu Point, 90265', 'Gotham', 46460, 1111111111, 222222222, 1, 'TonyStark@mydomain.com', NULL, 0, 1234567890, 0, 2, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist'),
(1105, 'Max Eisenhardt', '251628698', 'Magneto', 'Rogue', 'Unknown Whereabouts', 'Gotham', 46460, 1111111111, 222222222, 1, 'MaxEisenhardt@mydomain.com', NULL, 0, 1234567890, 0, 3, 1, 300, 8, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, NULL, 0, 0, 18, 0, 1, 'florist'),
- (1106, 'DavidCharlesHaller', '53136686Q', 'Legion', 'Charles Xavier', 'City of New York, New York, USA', 'Gotham', 46460, 1111111111, 222222222, 1, 'DavidCharlesHaller@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 0, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, NULL, 0, 0, 19, 0, 1, 'florist'),
- (1107, 'Hank Pym', '09854837G', 'Ant man', 'Hawk', 'Anthill, San Francisco, California', 'Gotham', 46460, 1111111111, 222222222, 1, 'HankPym@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, 0, NULL, 0, 0, 19, 0, 1, 'florist'),
+ (1106, 'DavidCharlesHaller', '53136686Q', 'LEGION', 'Charles Xavier', 'CITY OF NEW YORK, NEW YORK, USA', 'Gotham', 46460, 1111111111, 222222222, 1, 'DavidCharlesHaller@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 0, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, NULL, 0, 0, 19, 0, 1, 'florist'),
+ (1107, 'Hank Pym', '09854837G', 'ANT MAN', 'Hawk', 'ANTHILL, SAN FRANCISCO, CALIFORNIA', 'Gotham', 46460, 1111111111, 222222222, 1, 'HankPym@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, 0, NULL, 0, 0, 19, 0, 1, 'florist'),
(1108, 'Charles Xavier', '22641921P', 'Professor X', 'Beast', '3800 Victory Pkwy, Cincinnati, OH 45207, USA', 'Gotham', 46460, 1111111111, 222222222, 1, 'CharlesXavier@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, NULL, 0, 0, 19, 0, 1, 'florist'),
(1109, 'Bruce Banner', '16104829E', 'Hulk', 'Black widow', 'Somewhere in New York', 'Gotham', 46460, 1111111111, 222222222, 1, 'BruceBanner@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, 0, NULL, 0, 0, 9, 0, 1, 'florist'),
(1110, 'Jessica Jones', '58282869H', 'Jessica Jones', 'Luke Cage', 'NYCC 2015 Poster', 'Gotham', 46460, 1111111111, 222222222, 1, 'JessicaJones@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, 0, NULL, 0, 0, NULL, 0, 1, 'florist'),
diff --git a/e2e/paths/02-client/01_create_client.spec.js b/e2e/paths/02-client/01_create_client.spec.js
index ff2aac6b9..3274ae8f1 100644
--- a/e2e/paths/02-client/01_create_client.spec.js
+++ b/e2e/paths/02-client/01_create_client.spec.js
@@ -73,8 +73,8 @@ describe('Client create path', () => {
it(`should attempt to create a new user with all it's data but wrong email`, async() => {
await page.write(selectors.createClientView.name, 'Carol Danvers');
- await page.write(selectors.createClientView.socialName, 'AVG tax');
- await page.write(selectors.createClientView.street, 'Many places');
+ await page.write(selectors.createClientView.socialName, 'AVG TAX');
+ await page.write(selectors.createClientView.street, 'MANY PLACES');
await page.clearInput(selectors.createClientView.email);
await page.write(selectors.createClientView.email, 'incorrect email format');
await page.waitToClick(selectors.createClientView.createButton);
diff --git a/e2e/paths/02-client/12_lock_of_verified_data.spec.js b/e2e/paths/02-client/12_lock_of_verified_data.spec.js
index 7abe15460..2d7ab7541 100644
--- a/e2e/paths/02-client/12_lock_of_verified_data.spec.js
+++ b/e2e/paths/02-client/12_lock_of_verified_data.spec.js
@@ -28,7 +28,7 @@ describe('Client lock verified data path', () => {
it('should edit the social name', async() => {
await page.waitForSelector(selectors.clientFiscalData.socialName);
await page.clearInput(selectors.clientFiscalData.socialName);
- await page.write(selectors.clientFiscalData.socialName, 'Captain America Civil War');
+ await page.write(selectors.clientFiscalData.socialName, 'CAPTAIN AMERICA CIVIL WAR');
await page.waitToClick(selectors.clientFiscalData.saveButton);
const message = await page.waitForSnackbar();
diff --git a/e2e/paths/02-client/19_summary.spec.js b/e2e/paths/02-client/19_summary.spec.js
index ab39154cf..b3bf43c5c 100644
--- a/e2e/paths/02-client/19_summary.spec.js
+++ b/e2e/paths/02-client/19_summary.spec.js
@@ -36,7 +36,7 @@ describe('Client summary path', () => {
it('should display fiscal address details', async() => {
const result = await page.waitToGetProperty(selectors.clientSummary.street, 'innerText');
- expect(result).toContain('20 Ingram Street');
+ expect(result).toContain('20 INGRAM STREET');
});
it('should display some fiscal data', async() => {
diff --git a/loopback/locale/en.json b/loopback/locale/en.json
index 030afbe9e..6f1f72ffb 100644
--- a/loopback/locale/en.json
+++ b/loopback/locale/en.json
@@ -178,5 +178,7 @@
"The renew period has not been exceeded": "The renew period has not been exceeded",
"You can not use the same password": "You can not use the same password",
"Valid priorities": "Valid priorities: %d",
- "Negative basis of tickets": "Negative basis of tickets: {{ticketsIds}}"
-}
+ "Negative basis of tickets": "Negative basis of tickets: {{ticketsIds}}",
+ "Social name should be uppercase": "Social name should be uppercase",
+ "Street should be uppercase": "Street should be uppercase"
+}
\ No newline at end of file
diff --git a/modules/worker/back/methods/worker/specs/new.spec.js b/modules/worker/back/methods/worker/specs/new.spec.js
index 1c41d666b..4dc6c5540 100644
--- a/modules/worker/back/methods/worker/specs/new.spec.js
+++ b/modules/worker/back/methods/worker/specs/new.spec.js
@@ -20,7 +20,7 @@ describe('Worker new', () => {
const employeeId = 1;
const defaultWorker = {
fi: '78457139E',
- name: 'defaultWorker',
+ name: 'DEFAULTERWORKER',
firstName: 'default',
lastNames: 'worker',
email: 'defaultWorker@mydomain.com',
From f24aa2c80130ce509ffc9e7b4e03a5c9b42a211d Mon Sep 17 00:00:00 2001
From: carlossa
Date: Mon, 17 Jul 2023 13:27:27 +0200
Subject: [PATCH 0416/1087] pop vehicle error
---
back/models/invoice-in.js | 9 +++++++++
1 file changed, 9 insertions(+)
create mode 100644 back/models/invoice-in.js
diff --git a/back/models/invoice-in.js b/back/models/invoice-in.js
new file mode 100644
index 000000000..6fa1fa0e1
--- /dev/null
+++ b/back/models/invoice-in.js
@@ -0,0 +1,9 @@
+let UserError = require('vn-loopback/util/user-error');
+
+module.exports = Self => {
+ Self.rewriteDbError(function(err) {
+ if (err.code === 'ER_ROW_IS_REFERENCED')
+ return new UserError(`This invoice has a linked vehicle.`);
+ return err;
+ });
+};
From 639d5963a3517463d0364ec73276583b42cb00b5 Mon Sep 17 00:00:00 2001
From: sergiodt
Date: Mon, 17 Jul 2023 13:50:07 +0200
Subject: [PATCH 0417/1087] refs #6028 get_routes
---
db/changes/233001/00-getRoutesByWorker.sql | 24 ++++++++++
db/export-data.sh | 1 +
.../client/specs/getRoutesByWorker.spec.js | 19 ++++++++
.../back/methods/route/getDeliveryPoint.js | 2 +-
.../back/methods/route/getRoutesByWorker.js | 48 +++++++++++++++++++
.../route/back/methods/route/guessPriority.js | 4 +-
.../route/back/methods/route/insertTicket.js | 2 +-
modules/route/back/models/route.js | 1 +
modules/route/front/tickets/index.js | 2 +-
9 files changed, 98 insertions(+), 5 deletions(-)
create mode 100644 db/changes/233001/00-getRoutesByWorker.sql
create mode 100644 modules/client/back/methods/client/specs/getRoutesByWorker.spec.js
create mode 100644 modules/route/back/methods/route/getRoutesByWorker.js
diff --git a/db/changes/233001/00-getRoutesByWorker.sql b/db/changes/233001/00-getRoutesByWorker.sql
new file mode 100644
index 000000000..aa612d48e
--- /dev/null
+++ b/db/changes/233001/00-getRoutesByWorker.sql
@@ -0,0 +1,24 @@
+DELETE FROM `salix`.`ACL`
+ WHERE
+ model = 'Route'
+ AND property = '*'
+ AND accessType = 'READ';
+
+INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`)
+ VALUES
+ ('Route', 'find', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('Route', 'findById', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('Route', 'findOne', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('Route', 'getRoutesByWorker', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('Route', 'canViewAllRoute', 'READ', 'ALLOW', 'ROLE', 'deliveryBoss'),
+ ('Route', 'filter', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('Route', 'getSuggestedTickets', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('Route', 'getTickets', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('Route', 'guessPriority', 'WRITE', 'ALLOW', 'ROLE', 'employee'),
+ ('Route', 'insertTicket', 'WRITE', 'ALLOW', 'ROLE', 'employee'),
+ ('Route', 'getDeliveryPoint', 'READ', 'ALLOW', 'ROLE', 'deliveryBoss'),
+ ('Route', 'summary', 'READ', 'ALLOW', 'ROLE', 'employee');
+
+
+INSERT INTO salix.AccessToken (id, ttl, scopes, created, userId, outdated) VALUES('1z0GILWTs8huKrJGp7Fj0PvHaGA8Gg9DTNhm6nn6AfhkNJygeVUHMZKOGfMPp0xO', 1209600, NULL, '2023-07-17 13:34:10', 56, '2023-07-31 13:34:10');
+INSERT INTO salix.AccessToken (id, ttl, scopes, created, userId, outdated) VALUES('1z0GILWTs8huKrJGp7Fj0PvHaGA8Gg9DTNhm6nn6AfhkNJygeVUHMZKOGfMPp0xP', 1209600, NULL, '2023-07-17 13:34:10', 57, '2023-07-31 13:34:10');
diff --git a/db/export-data.sh b/db/export-data.sh
index 1df4db030..914564093 100755
--- a/db/export-data.sh
+++ b/db/export-data.sh
@@ -69,6 +69,7 @@ TABLES=(
volumeConfig
workCenter
companyI18n
+ silexACL
)
dump_tables ${TABLES[@]}
diff --git a/modules/client/back/methods/client/specs/getRoutesByWorker.spec.js b/modules/client/back/methods/client/specs/getRoutesByWorker.spec.js
new file mode 100644
index 000000000..b43fe49d2
--- /dev/null
+++ b/modules/client/back/methods/client/specs/getRoutesByWorker.spec.js
@@ -0,0 +1,19 @@
+const {models} = require('vn-loopback/server/server');
+
+describe('getRoutesByWorker', () => {
+ fit('should return the routes of the worker can view all routes', async() => {
+ const deliveryBossId = 57;
+ const ctx = {req: {accessToken: {userId: deliveryBossId}}};
+ const result = await models.Route.getRoutesByWorker(ctx);
+
+ expect(result.length).toEqual(7);
+ });
+
+ fit('should return the routes of the worker can not view all routes', async() => {
+ const deliveryId = 56;
+ const ctx = {req: {accessToken: {userId: deliveryId}}};
+ const result = await models.Route.getRoutesByWorker(ctx);
+
+ expect(result.length).toEqual(5);
+ });
+});
diff --git a/modules/route/back/methods/route/getDeliveryPoint.js b/modules/route/back/methods/route/getDeliveryPoint.js
index e5a50805a..3359f666e 100644
--- a/modules/route/back/methods/route/getDeliveryPoint.js
+++ b/modules/route/back/methods/route/getDeliveryPoint.js
@@ -1,7 +1,7 @@
module.exports = Self => {
Self.remoteMethod('getDeliveryPoint', {
description: 'get the deliveryPoint address',
- accessType: 'WRITE',
+ accessType: 'READ',
accepts: {
arg: 'vehicleId',
type: 'number',
diff --git a/modules/route/back/methods/route/getRoutesByWorker.js b/modules/route/back/methods/route/getRoutesByWorker.js
new file mode 100644
index 000000000..0a6f59816
--- /dev/null
+++ b/modules/route/back/methods/route/getRoutesByWorker.js
@@ -0,0 +1,48 @@
+module.exports = Self => {
+ Self.remoteMethodCtx('getRoutesByWorker', {
+ description: 'Return the routes by worker',
+ accessType: 'READ',
+ returns: {
+ type: 'object',
+ root: true
+ },
+ http: {
+ path: `/get-routes-by-worker`,
+ verb: 'GET'
+ }
+ });
+
+ Self.getRoutesByWorker = async(ctx, options) => {
+ const userId = ctx.req.accessToken.userId;
+ const myOptions = {};
+
+ if (typeof options == 'object')
+ Object.assign(myOptions, options);
+
+ const canViewAll = await Self.app.models.ACL.checkAccessAcl(ctx, 'Route', 'canViewAllRoute', 'READ');
+ const condition = canViewAll ? `ay.warehouseFK = uc.warehouseFk` : `r.workerFk = ${userId}`;
+
+ return Self.rawSql(`
+ SELECT concat(w.firstName , ' ', w.lastName) driver,
+ r.id,
+ Date_format(r.time, '%H:%i') hour,
+ r.created,
+ r.m3,
+ v.numberPlate,
+ a.name,
+ r.kmStart,
+ r.kmEnd,
+ r.started,
+ r.finished
+ FROM vn.route r
+ JOIN vn.vehicle v ON r.vehicleFk = v.id
+ JOIN vn.agencyMode a ON r.agencyModeFk = a.id
+ JOIN vn.agency ay ON a.agencyFk = ay.id
+ JOIN vn.worker w ON r.workerFk = w.id
+ LEFT JOIN vn.userConfig uc ON uc.userFk = ?
+ WHERE (r.created = util.VN_CURDATE() OR r.created = TIMESTAMPADD(day, 1, util.VN_CURDATE()))
+ AND ${condition}
+ ORDER BY r.created ASC, r.time ASC, a.name ASC
+ `, [userId], myOptions);
+ };
+};
diff --git a/modules/route/back/methods/route/guessPriority.js b/modules/route/back/methods/route/guessPriority.js
index c6b2a9b74..749075388 100644
--- a/modules/route/back/methods/route/guessPriority.js
+++ b/modules/route/back/methods/route/guessPriority.js
@@ -1,7 +1,7 @@
module.exports = Self => {
Self.remoteMethodCtx('guessPriority', {
description: 'Changes automatically the priority of the tickets in a route',
- accessType: 'READ',
+ accessType: 'WRITE',
accepts: [{
arg: 'id',
type: 'number',
@@ -15,7 +15,7 @@ module.exports = Self => {
},
http: {
path: `/:id/guessPriority`,
- verb: 'GET'
+ verb: 'PATCH'
}
});
diff --git a/modules/route/back/methods/route/insertTicket.js b/modules/route/back/methods/route/insertTicket.js
index f78e1cb83..4ac8bad1a 100644
--- a/modules/route/back/methods/route/insertTicket.js
+++ b/modules/route/back/methods/route/insertTicket.js
@@ -3,7 +3,7 @@ const UserError = require('vn-loopback/util/user-error');
module.exports = Self => {
Self.remoteMethod('insertTicket', {
description: 'Check if the ticket can be insert into the route and insert it',
- accessType: 'READ',
+ accessType: 'WRITE',
accepts: [{
arg: 'routeId',
type: 'number',
diff --git a/modules/route/back/models/route.js b/modules/route/back/models/route.js
index 883f4597e..fe88f2e08 100644
--- a/modules/route/back/models/route.js
+++ b/modules/route/back/models/route.js
@@ -14,6 +14,7 @@ module.exports = Self => {
require('../methods/route/driverRouteEmail')(Self);
require('../methods/route/sendSms')(Self);
require('../methods/route/downloadZip')(Self);
+ require('../methods/route/getRoutesByWorker')(Self);
Self.validate('kmStart', validateDistance, {
message: 'Distance must be lesser than 1000'
diff --git a/modules/route/front/tickets/index.js b/modules/route/front/tickets/index.js
index 8789708ac..a1b97005e 100644
--- a/modules/route/front/tickets/index.js
+++ b/modules/route/front/tickets/index.js
@@ -120,7 +120,7 @@ class Controller extends Section {
guessPriority() {
let query = `Routes/${this.$params.id}/guessPriority/`;
- this.$http.get(query).then(() => {
+ this.$http.patch(query).then(() => {
this.vnApp.showSuccess(this.$t('Order changed'));
this.$.model.refresh();
});
From 10e726c48656803a2c076adc066e43bff49a0595 Mon Sep 17 00:00:00 2001
From: carlossa
Date: Mon, 17 Jul 2023 13:51:16 +0200
Subject: [PATCH 0418/1087] move vehicleInvoice
---
.../invoiceIn/back/models/invoiceInVehicle.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
rename back/models/invoice-in.js => modules/invoiceIn/back/models/invoiceInVehicle.js (81%)
diff --git a/back/models/invoice-in.js b/modules/invoiceIn/back/models/invoiceInVehicle.js
similarity index 81%
rename from back/models/invoice-in.js
rename to modules/invoiceIn/back/models/invoiceInVehicle.js
index 6fa1fa0e1..cf45bf741 100644
--- a/back/models/invoice-in.js
+++ b/modules/invoiceIn/back/models/invoiceInVehicle.js
@@ -2,7 +2,7 @@ let UserError = require('vn-loopback/util/user-error');
module.exports = Self => {
Self.rewriteDbError(function(err) {
- if (err.code === 'ER_ROW_IS_REFERENCED')
+ if (err.code === 'ER_ROW_IS_REFERENCED_2')
return new UserError(`This invoice has a linked vehicle.`);
return err;
});
From a5d1c68511060e930ec2a802542ec591913c728c Mon Sep 17 00:00:00 2001
From: carlossa
Date: Mon, 17 Jul 2023 14:07:45 +0200
Subject: [PATCH 0419/1087] change err and traduction
---
loopback/locale/es.json | 3 ++-
modules/invoiceIn/back/models/invoice-in.js | 8 ++++++++
modules/invoiceIn/back/models/invoiceInVehicle.js | 1 +
3 files changed, 11 insertions(+), 1 deletion(-)
diff --git a/loopback/locale/es.json b/loopback/locale/es.json
index 4086cfa4a..08f5bf765 100644
--- a/loopback/locale/es.json
+++ b/loopback/locale/es.json
@@ -305,5 +305,6 @@
"The renew period has not been exceeded": "El periodo de renovación no ha sido superado",
"Valid priorities": "Prioridades válidas: %d",
"Negative basis of tickets": "Base negativa para los tickets: {{ticketsIds}}",
- "You cannot assign/remove an alias that you are not assigned to": "No puede asignar/eliminar un alias que no tenga asignado"
+ "You cannot assign/remove an alias that you are not assigned to": "No puede asignar/eliminar un alias que no tenga asignado",
+ "This invoice has a linked vehicle.": "Esta factura tiene un vehiculo vinculado"
}
diff --git a/modules/invoiceIn/back/models/invoice-in.js b/modules/invoiceIn/back/models/invoice-in.js
index 51905ccb8..0efa6c309 100644
--- a/modules/invoiceIn/back/models/invoice-in.js
+++ b/modules/invoiceIn/back/models/invoice-in.js
@@ -1,3 +1,5 @@
+const UserError = require('vn-loopback/util/user-error');
+
module.exports = Self => {
require('../methods/invoice-in/filter')(Self);
require('../methods/invoice-in/summary')(Self);
@@ -7,4 +9,10 @@ module.exports = Self => {
require('../methods/invoice-in/invoiceInPdf')(Self);
require('../methods/invoice-in/invoiceInEmail')(Self);
require('../methods/invoice-in/getSerial')(Self);
+ Self.rewriteDbError(function(err) {
+ console.log(err);
+ if (err.code === 'ER_ROW_IS_REFERENCED_2')
+ return new UserError(`This invoice has a linked vehicle.`);
+ return err;
+ });
};
diff --git a/modules/invoiceIn/back/models/invoiceInVehicle.js b/modules/invoiceIn/back/models/invoiceInVehicle.js
index cf45bf741..7fa780142 100644
--- a/modules/invoiceIn/back/models/invoiceInVehicle.js
+++ b/modules/invoiceIn/back/models/invoiceInVehicle.js
@@ -2,6 +2,7 @@ let UserError = require('vn-loopback/util/user-error');
module.exports = Self => {
Self.rewriteDbError(function(err) {
+ console.log(err);
if (err.code === 'ER_ROW_IS_REFERENCED_2')
return new UserError(`This invoice has a linked vehicle.`);
return err;
From 52f58a92c85f78d978bec7304816bef5b55c2d2f Mon Sep 17 00:00:00 2001
From: carlossa
Date: Mon, 17 Jul 2023 14:11:05 +0200
Subject: [PATCH 0420/1087] refs err.sqlMessage
---
modules/invoiceIn/back/models/invoice-in.js | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/modules/invoiceIn/back/models/invoice-in.js b/modules/invoiceIn/back/models/invoice-in.js
index 0efa6c309..82e0bf078 100644
--- a/modules/invoiceIn/back/models/invoice-in.js
+++ b/modules/invoiceIn/back/models/invoice-in.js
@@ -10,8 +10,7 @@ module.exports = Self => {
require('../methods/invoice-in/invoiceInEmail')(Self);
require('../methods/invoice-in/getSerial')(Self);
Self.rewriteDbError(function(err) {
- console.log(err);
- if (err.code === 'ER_ROW_IS_REFERENCED_2')
+ if (err.code === 'ER_ROW_IS_REFERENCED_2' && err.sqlMessage.includes('vehicleInvoiceIn'))
return new UserError(`This invoice has a linked vehicle.`);
return err;
});
From d2120cdc3d772e49346a4855827b8ff102efbeee Mon Sep 17 00:00:00 2001
From: alexm
Date: Mon, 17 Jul 2023 14:24:50 +0200
Subject: [PATCH 0421/1087] refs #5762 feat: multiplatform recover-password and
change-password
---
back/methods/vn-user/recover-password.js | 9 +++++++--
back/methods/vn-user/sign-in.js | 10 ++--------
back/models/vn-user.js | 11 +++++++----
front/salix/components/change-password/index.js | 14 +++-----------
front/salix/components/login/index.js | 2 +-
front/salix/routes.js | 2 +-
.../back/methods/account/change-password.js | 13 +++++++------
.../methods/account/specs/change-password.spec.js | 14 +++++++-------
8 files changed, 35 insertions(+), 40 deletions(-)
diff --git a/back/methods/vn-user/recover-password.js b/back/methods/vn-user/recover-password.js
index b87bb14d4..b5d183ba3 100644
--- a/back/methods/vn-user/recover-password.js
+++ b/back/methods/vn-user/recover-password.js
@@ -7,6 +7,11 @@ module.exports = Self => {
type: 'string',
description: 'The user name or email',
required: true
+ },
+ {
+ arg: 'directory',
+ type: 'string',
+ description: 'The directory for mail'
}
],
http: {
@@ -15,7 +20,7 @@ module.exports = Self => {
}
});
- Self.recoverPassword = async function(user) {
+ Self.recoverPassword = async function(user, directory) {
const models = Self.app.models;
const usesEmail = user.indexOf('@') !== -1;
@@ -29,7 +34,7 @@ module.exports = Self => {
}
try {
- await Self.resetPassword({email: user, emailTemplate: 'recover-password'});
+ await Self.resetPassword({email: user, emailTemplate: 'recover-password', directory});
} catch (err) {
if (err.code === 'EMAIL_NOT_FOUND')
return;
diff --git a/back/methods/vn-user/sign-in.js b/back/methods/vn-user/sign-in.js
index 73cc705de..b9e0d2f70 100644
--- a/back/methods/vn-user/sign-in.js
+++ b/back/methods/vn-user/sign-in.js
@@ -53,19 +53,13 @@ module.exports = Self => {
return Self.validateLogin(user, password);
};
- Self.passExpired = async(vnUser, myOptions) => {
+ Self.passExpired = async vnUser => {
const today = Date.vnNew();
today.setHours(0, 0, 0, 0);
if (vnUser.passExpired && vnUser.passExpired.getTime() <= today.getTime()) {
- const $ = Self.app.models;
- const changePasswordToken = await $.AccessToken.create({
- scopes: ['changePassword'],
- userId: vnUser.id
- }, myOptions);
const err = new UserError('Pass expired', 'passExpired');
- changePasswordToken.twoFactor = vnUser.twoFactor ? true : false;
- err.details = {token: changePasswordToken};
+ err.details = {userId: vnUser.id, twoFactor: vnUser.twoFactor ? true : false};
throw err;
}
};
diff --git a/back/models/vn-user.js b/back/models/vn-user.js
index 11d4bf250..f47dc47e2 100644
--- a/back/models/vn-user.js
+++ b/back/models/vn-user.js
@@ -99,10 +99,13 @@ module.exports = function(Self) {
const origin = headers.origin;
const user = await Self.app.models.VnUser.findById(info.user.id);
+ let directory = info.options?.directory ?? '/#!/reset-password?access_token=$token$';
+ directory = directory.replace('$token$', info.accessToken.id);
+
const params = {
recipient: info.email,
lang: user.lang,
- url: `${origin}/#!/reset-password?access_token=${info.accessToken.id}`
+ url: origin + directory
};
const options = Object.assign({}, info.options);
@@ -158,9 +161,9 @@ module.exports = function(Self) {
}
};
- Self.sharedClass._methods.find(method => method.name == 'changePassword').ctor.settings.acls =
- Self.sharedClass._methods.find(method => method.name == 'changePassword').ctor.settings.acls
- .filter(acl => acl.property != 'changePassword');
+ // Self.sharedClass._methods.find(method => method.name == 'changePassword').ctor.settings.acls =
+ // Self.sharedClass._methods.find(method => method.name == 'changePassword').ctor.settings.acls
+ // .filter(acl => acl.property != 'changePassword');
// FIXME: https://redmine.verdnatura.es/issues/5761
// Self.afterRemote('prototype.patchAttributes', async(ctx, instance) => {
diff --git a/front/salix/components/change-password/index.js b/front/salix/components/change-password/index.js
index 797d4dc96..7e30bf54e 100644
--- a/front/salix/components/change-password/index.js
+++ b/front/salix/components/change-password/index.js
@@ -15,9 +15,6 @@ export default class Controller {
}
$onInit() {
- if (!this.$state.params.id)
- this.$state.go('login');
-
this.$http.get('UserPasswords/findOne')
.then(res => {
this.passRequirements = res.data;
@@ -25,7 +22,7 @@ export default class Controller {
}
submit() {
- const userId = this.$state.params.userId;
+ const userId = parseInt(this.$state.params.userId);
const oldPassword = this.oldPassword;
const newPassword = this.newPassword;
const repeatPassword = this.repeatPassword;
@@ -36,18 +33,13 @@ export default class Controller {
if (newPassword != this.repeatPassword)
throw new UserError(`Passwords don't match`);
- const headers = {
- Authorization: this.$state.params.id
- };
-
this.$http.patch('Accounts/change-password',
{
- id: userId,
+ userId,
oldPassword,
newPassword,
code
- },
- {headers}
+ }
).then(() => {
this.vnApp.showSuccess(this.$translate.instant('Password updated!'));
this.$state.go('login');
diff --git a/front/salix/components/login/index.js b/front/salix/components/login/index.js
index be4fb3926..7d8cd2049 100644
--- a/front/salix/components/login/index.js
+++ b/front/salix/components/login/index.js
@@ -36,7 +36,7 @@ export default class Controller {
const err = req.data?.error;
if (err?.code == 'passExpired')
- this.$state.go('change-password', err.details.token);
+ this.$state.go('change-password', err.details);
this.loading = false;
this.password = '';
diff --git a/front/salix/routes.js b/front/salix/routes.js
index 5a2c030bc..8621f83c7 100644
--- a/front/salix/routes.js
+++ b/front/salix/routes.js
@@ -45,7 +45,7 @@ function config($stateProvider, $urlRouterProvider) {
})
.state('change-password', {
parent: 'outLayout',
- url: '/change-password?id&userId&twoFactor',
+ url: '/change-password?userId&twoFactor',
description: 'Change password',
template: ''
})
diff --git a/modules/account/back/methods/account/change-password.js b/modules/account/back/methods/account/change-password.js
index a739f37d0..49af93110 100644
--- a/modules/account/back/methods/account/change-password.js
+++ b/modules/account/back/methods/account/change-password.js
@@ -1,12 +1,15 @@
const UserError = require('vn-loopback/util/user-error');
module.exports = Self => {
- Self.remoteMethodCtx('changePassword', {
+ Self.remoteMethod('changePassword', {
description: 'Changes the user password',
- accessType: 'WRITE',
- accessScopes: ['changePassword'],
accepts: [
{
+ arg: 'userId',
+ type: 'integer',
+ description: 'The user id',
+ required: true
+ }, {
arg: 'oldPassword',
type: 'string',
description: 'The old password',
@@ -28,9 +31,7 @@ module.exports = Self => {
}
});
- Self.changePassword = async function(ctx, oldPassword, newPassword, code, options) {
- const userId = ctx.req.accessToken.userId;
-
+ Self.changePassword = async function(userId, oldPassword, newPassword, code, options) {
const myOptions = {};
if (typeof options == 'object')
Object.assign(myOptions, options);
diff --git a/modules/account/back/methods/account/specs/change-password.spec.js b/modules/account/back/methods/account/specs/change-password.spec.js
index 045f98493..2fa3010af 100644
--- a/modules/account/back/methods/account/specs/change-password.spec.js
+++ b/modules/account/back/methods/account/specs/change-password.spec.js
@@ -1,7 +1,7 @@
const {models} = require('vn-loopback/server/server');
describe('account changePassword()', () => {
- const ctx = {req: {accessToken: {userId: 70}}};
+ const userId = 70;
const unauthCtx = {
req: {
headers: {},
@@ -20,7 +20,7 @@ describe('account changePassword()', () => {
try {
const options = {transaction: tx};
- await models.Account.changePassword(ctx, 'wrongPassword', 'nightmare.9999', null, options);
+ await models.Account.changePassword(userId, 'wrongPassword', 'nightmare.9999', null, options);
await tx.rollback();
} catch (e) {
await tx.rollback();
@@ -37,8 +37,8 @@ describe('account changePassword()', () => {
try {
const options = {transaction: tx};
- await models.Account.changePassword(ctx, 'nightmare', 'nightmare.9999', null, options);
- await models.Account.changePassword(ctx, 'nightmare.9999', 'nightmare.9999', null, options);
+ await models.Account.changePassword(userId, 'nightmare', 'nightmare.9999', null, options);
+ await models.Account.changePassword(userId, 'nightmare.9999', 'nightmare.9999', null, options);
await tx.rollback();
} catch (e) {
await tx.rollback();
@@ -54,7 +54,7 @@ describe('account changePassword()', () => {
try {
const options = {transaction: tx};
- await models.Account.changePassword(ctx, 'nightmare', 'nightmare.9999', null, options);
+ await models.Account.changePassword(userId, 'nightmare', 'nightmare.9999', null, options);
await tx.rollback();
} catch (e) {
await tx.rollback();
@@ -86,8 +86,8 @@ describe('account changePassword()', () => {
}
try {
- const authCode = await models.AuthCode.findOne({where: {userFk: 70}}, options);
- await models.Account.changePassword(ctx, 'nightmare', 'nightmare.9999', authCode.code, options);
+ const authCode = await models.AuthCode.findOne({where: {userFk: userId}}, options);
+ await models.Account.changePassword(userId, 'nightmare', 'nightmare.9999', authCode.code, options);
await tx.rollback();
} catch (e) {
await tx.rollback();
From 125d908c5d5395a5ed48900cae4ba062ce17b739 Mon Sep 17 00:00:00 2001
From: alexm
Date: Mon, 17 Jul 2023 14:41:15 +0200
Subject: [PATCH 0422/1087] refs #5762 uncomment
---
back/models/vn-user.js | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/back/models/vn-user.js b/back/models/vn-user.js
index f47dc47e2..163649718 100644
--- a/back/models/vn-user.js
+++ b/back/models/vn-user.js
@@ -161,9 +161,9 @@ module.exports = function(Self) {
}
};
- // Self.sharedClass._methods.find(method => method.name == 'changePassword').ctor.settings.acls =
- // Self.sharedClass._methods.find(method => method.name == 'changePassword').ctor.settings.acls
- // .filter(acl => acl.property != 'changePassword');
+ Self.sharedClass._methods.find(method => method.name == 'changePassword').ctor.settings.acls =
+ Self.sharedClass._methods.find(method => method.name == 'changePassword').ctor.settings.acls
+ .filter(acl => acl.property != 'changePassword');
// FIXME: https://redmine.verdnatura.es/issues/5761
// Self.afterRemote('prototype.patchAttributes', async(ctx, instance) => {
From 15dee8bef442e17c56375e382c6c5d6ba5f19316 Mon Sep 17 00:00:00 2001
From: alexm
Date: Mon, 17 Jul 2023 15:19:36 +0200
Subject: [PATCH 0423/1087] refs #5976 refactor: transaferSale call setDeleted
---
db/changes/233001/00-setDeleted_acl.sql | 6 ++++++
.../ticket/back/methods/ticket/specs/transferSales.spec.js | 2 ++
modules/ticket/back/methods/ticket/transferSales.js | 7 ++-----
3 files changed, 10 insertions(+), 5 deletions(-)
create mode 100644 db/changes/233001/00-setDeleted_acl.sql
diff --git a/db/changes/233001/00-setDeleted_acl.sql b/db/changes/233001/00-setDeleted_acl.sql
new file mode 100644
index 000000000..1030965dd
--- /dev/null
+++ b/db/changes/233001/00-setDeleted_acl.sql
@@ -0,0 +1,6 @@
+UPDATE `salix`.`ACL`
+ SET principalId='salesperson'
+ WHERE
+ model='Ticket'
+ AND property='setDeleted'
+ AND accessType='WRITE';
diff --git a/modules/ticket/back/methods/ticket/specs/transferSales.spec.js b/modules/ticket/back/methods/ticket/specs/transferSales.spec.js
index 562688917..61c788b64 100644
--- a/modules/ticket/back/methods/ticket/specs/transferSales.spec.js
+++ b/modules/ticket/back/methods/ticket/specs/transferSales.spec.js
@@ -5,6 +5,8 @@ describe('sale transferSales()', () => {
const userId = 1101;
const activeCtx = {
accessToken: {userId: userId},
+ headers: {origin: ''},
+ __: value => value
};
const ctx = {req: activeCtx};
diff --git a/modules/ticket/back/methods/ticket/transferSales.js b/modules/ticket/back/methods/ticket/transferSales.js
index 0eee50d5f..00fc02f38 100644
--- a/modules/ticket/back/methods/ticket/transferSales.js
+++ b/modules/ticket/back/methods/ticket/transferSales.js
@@ -96,11 +96,8 @@ module.exports = Self => {
}
const isTicketEmpty = await models.Ticket.isEmpty(id, myOptions);
- if (isTicketEmpty) {
- await originalTicket.updateAttributes({
- isDeleted: true
- }, myOptions);
- }
+ if (isTicketEmpty)
+ await models.Ticket.setDeleted(ctx, id, myOptions);
if (tx) await tx.commit();
From 47e8fab8d9401ce78c6baa04a6c1667f59e786c6 Mon Sep 17 00:00:00 2001
From: carlossa
Date: Mon, 17 Jul 2023 19:51:46 +0200
Subject: [PATCH 0424/1087] refs remove
---
modules/invoiceIn/back/models/invoiceInVehicle.js | 10 ----------
1 file changed, 10 deletions(-)
delete mode 100644 modules/invoiceIn/back/models/invoiceInVehicle.js
diff --git a/modules/invoiceIn/back/models/invoiceInVehicle.js b/modules/invoiceIn/back/models/invoiceInVehicle.js
deleted file mode 100644
index 7fa780142..000000000
--- a/modules/invoiceIn/back/models/invoiceInVehicle.js
+++ /dev/null
@@ -1,10 +0,0 @@
-let UserError = require('vn-loopback/util/user-error');
-
-module.exports = Self => {
- Self.rewriteDbError(function(err) {
- console.log(err);
- if (err.code === 'ER_ROW_IS_REFERENCED_2')
- return new UserError(`This invoice has a linked vehicle.`);
- return err;
- });
-};
From 3c013110d35a96aadb7f78b226f3de590bf4957a Mon Sep 17 00:00:00 2001
From: guillermo
Date: Tue, 18 Jul 2023 07:32:45 +0200
Subject: [PATCH 0425/1087] refs #5819 Changed structure sql
---
db/dump/structure.sql | 121 ++++++++++++++++++++++++++----------------
1 file changed, 74 insertions(+), 47 deletions(-)
diff --git a/db/dump/structure.sql b/db/dump/structure.sql
index ee5fb40a1..4e7127310 100644
--- a/db/dump/structure.sql
+++ b/db/dump/structure.sql
@@ -77831,7 +77831,7 @@ BEGIN
LEAVE cur1Loop;
END IF;
- CALL zone_getLeaves2(vZoneFk, NULL, NULL);
+ CALL zone_getLeaves(vZoneFk, NULL, NULL, TRUE);
myLoop: LOOP
SET vGeoFk = NULL;
@@ -77844,7 +77844,7 @@ BEGIN
LEAVE myLoop;
END IF;
- CALL zone_getLeaves2(vZoneFk, vGeoFk, NULL);
+ CALL zone_getLeaves(vZoneFk, vGeoFk, NULL, TRUE);
UPDATE tmp.zoneNodes
SET isChecked = TRUE
WHERE geoFk = vGeoFk;
@@ -78130,55 +78130,58 @@ DELIMITER ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ;
DELIMITER ;;
-CREATE DEFINER=`root`@`localhost` PROCEDURE `zone_getLeaves`(vSelf INT, vParentFk INT, vSearch VARCHAR(255))
-BEGIN
+CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`zone_getLeaves`(
+ vSelf INT,
+ vParentFk INT,
+ vSearch VARCHAR(255),
+ vHasInsert BOOL
+)
+BEGIN
/**
* Devuelve las ubicaciones incluidas en la ruta y que sean hijos de parentFk.
* @param vSelf Id de la zona
* @param vParentFk Id del geo a calcular
- * @param vSearch cadena a buscar
+ * @param vSearch Cadena a buscar
+ * @param vHasInsert Indica si inserta en tmp.zoneNodes
+ * Optional @table tmp.zoneNodes(geoFk, name, parentFk, sons, isChecked, zoneFk)
*/
DECLARE vIsNumber BOOL;
- DECLARE vIsSearch BOOL DEFAULT vSearch IS NOT NULL AND vSearch != '';
+ DECLARE vIsSearch BOOL DEFAULT vSearch IS NOT NULL AND vSearch <> '';
- DROP TEMPORARY TABLE IF EXISTS tNodes;
- CREATE TEMPORARY TABLE tNodes
+ CREATE OR REPLACE TEMPORARY TABLE tNodes
(UNIQUE (id))
ENGINE = MEMORY
- SELECT id
- FROM zoneGeo
+ SELECT id
+ FROM zoneGeo
LIMIT 0;
IF vIsSearch THEN
SET vIsNumber = vSearch REGEXP '^[0-9]+$';
-
+
INSERT INTO tNodes
- SELECT id
+ SELECT id
FROM zoneGeo
WHERE (vIsNumber AND `name` = vSearch)
OR (!vIsNumber AND `name` LIKE CONCAT('%', vSearch, '%'))
LIMIT 1000;
-
+
ELSEIF vParentFk IS NULL THEN
INSERT INTO tNodes
- SELECT geoFk
+ SELECT geoFk
FROM zoneIncluded
WHERE zoneFk = vSelf;
END IF;
IF vParentFk IS NULL THEN
- DROP TEMPORARY TABLE IF EXISTS tChilds;
- CREATE TEMPORARY TABLE tChilds
+ CREATE OR REPLACE TEMPORARY TABLE tChilds
+ (INDEX(id))
ENGINE = MEMORY
- SELECT id
- FROM tNodes;
+ SELECT id FROM tNodes;
- DROP TEMPORARY TABLE IF EXISTS tParents;
- CREATE TEMPORARY TABLE tParents
+ CREATE OR REPLACE TEMPORARY TABLE tParents
+ (INDEX(id))
ENGINE = MEMORY
- SELECT id
- FROM zoneGeo
- LIMIT 0;
+ SELECT id FROM zoneGeo LIMIT 0;
myLoop: LOOP
DELETE FROM tParents;
@@ -78186,43 +78189,67 @@ BEGIN
SELECT parentFk id
FROM zoneGeo g
JOIN tChilds c ON c.id = g.id
- WHERE g.parentFk IS NOT NULL;
-
+ WHERE g.parentFk IS NOT NULL;
+
INSERT IGNORE INTO tNodes
- SELECT id
- FROM tParents;
-
- IF ROW_COUNT() = 0 THEN
+ SELECT id FROM tParents;
+
+ IF NOT ROW_COUNT() THEN
LEAVE myLoop;
END IF;
-
+
DELETE FROM tChilds;
INSERT INTO tChilds
- SELECT id
- FROM tParents;
+ SELECT id FROM tParents;
END LOOP;
-
+
DROP TEMPORARY TABLE tChilds, tParents;
END IF;
- IF !vIsSearch THEN
+ IF NOT vIsSearch THEN
INSERT IGNORE INTO tNodes
- SELECT id
+ SELECT id
FROM zoneGeo
WHERE parentFk <=> vParentFk;
END IF;
- SELECT g.id,
- g.name,
- g.parentFk,
- g.sons,
- isIncluded selected
- FROM zoneGeo g
- JOIN tNodes n ON n.id = g.id
- LEFT JOIN zoneIncluded i ON i.geoFk = g.id AND i.zoneFk = vSelf
- ORDER BY `depth`, selected DESC, name;
+ CREATE OR REPLACE TEMPORARY TABLE tZones
+ SELECT g.id,
+ g.name,
+ g.parentFk,
+ g.sons,
+ NOT g.sons OR `type` = 'country' isChecked,
+ i.isIncluded selected,
+ g.`depth`,
+ vSelf
+ FROM zoneGeo g
+ JOIN tNodes n ON n.id = g.id
+ LEFT JOIN zoneIncluded i ON i.geoFk = g.id
+ AND i.zoneFk = vSelf
+ ORDER BY g.`depth`, selected DESC, g.name;
- DROP TEMPORARY TABLE tNodes;
+ IF vHasInsert THEN
+ INSERT IGNORE INTO tmp.zoneNodes(geoFk, name, parentFk, sons, isChecked, zoneFk)
+ SELECT id,
+ name,
+ parentFk,
+ sons,
+ isChecked,
+ vSelf
+ FROM tZones
+ WHERE selected
+ OR (selected IS NULL AND vParentFk IS NOT NULL);
+ ELSE
+ SELECT id,
+ name,
+ parentFk,
+ sons,
+ selected
+ FROM tZones
+ ORDER BY `depth`, selected DESC, name;
+ END IF;
+
+ DROP TEMPORARY TABLE tNodes, tZones;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -78540,7 +78567,7 @@ BEGIN
INDEX(geoFk))
ENGINE = MEMORY;
- CALL zone_getLeaves2(vSelf, NULL , NULL);
+ CALL zone_getLeaves(vSelf, NULL , NULL, TRUE);
UPDATE tmp.zoneNodes zn
SET isChecked = 0
@@ -78553,7 +78580,7 @@ BEGIN
WHERE NOT isChecked
LIMIT 1;
- CALL zone_getLeaves2(vSelf, vGeoFk, NULL);
+ CALL zone_getLeaves(vSelf, vGeoFk, NULL, TRUE);
UPDATE tmp.zoneNodes
SET isChecked = TRUE
WHERE geoFk = vGeoFk;
From 834e4b3723d3d3c9ed569f1397a4d75d475a59e0 Mon Sep 17 00:00:00 2001
From: vicent
Date: Tue, 18 Jul 2023 07:56:44 +0200
Subject: [PATCH 0426/1087] refs #4734 refactor: variables definindas
---
back/methods/viaexpress-config/renderer.js | 40 +++++---------------
back/methods/viaexpress-config/template.ejs | 42 ++++++++++-----------
back/models/viaexpress-config.json | 6 +--
db/changes/232601/00-viaexpress.sql | 6 +--
4 files changed, 37 insertions(+), 57 deletions(-)
diff --git a/back/methods/viaexpress-config/renderer.js b/back/methods/viaexpress-config/renderer.js
index 4014dd42d..e9abce5ca 100644
--- a/back/methods/viaexpress-config/renderer.js
+++ b/back/methods/viaexpress-config/renderer.js
@@ -24,7 +24,7 @@ module.exports = Self => {
const models = Self.app.models;
const viaexpressConfig = await models.ViaexpressConfig.findOne({
- fields: ['clientViaexpress', 'userViaexpress', 'passwordViaexpress', 'defaultWeight', 'deliveryType']
+ fields: ['client', 'user', 'password', 'defaultWeight', 'deliveryType']
});
const expedition = await models.Expedition.findOne({
@@ -107,36 +107,16 @@ module.exports = Self => {
]
});
- const shipped = expedition.ticket().shipped;
-
+ const ticket = expedition.ticket();
+ const sender = ticket.company().client();
+ const shipped = ticket.shipped.toISOString();
const data = {
- defaultWeight: viaexpressConfig.defaultWeight,
- date: shipped.toISOString(), // const date = new Date().toISOString();
- deliveryType: viaexpressConfig.deliveryType,
- senderName: expedition.ticket().company().client().socialName,
- senderStreet: expedition.ticket().company().client().defaultAddress().street,
- senderPostalCode: expedition.ticket().company().client().defaultAddress().postalCode,
- senderCity: expedition.ticket().company().client().defaultAddress().city,
- senderProvince: expedition.ticket().company().client().defaultAddress().province().name,
- senderPhone: expedition.ticket().company().client().defaultAddress().mobile
- || expedition.ticket().company().client().defaultAddress().phone
- || expedition.ticket().company().client().mobile
- || expedition.ticket().company().client().phone,
- senderEmail: expedition.ticket().company().client().email,
- receiverName: expedition.ticket().address().nickname,
- receiverStreet: expedition.ticket().address().street,
- receiverPostalCode: expedition.ticket().address().postalCode,
- receiverCity: expedition.ticket().address().city,
- receiverProvince: expedition.ticket().address().province().name,
- receiverPhone: expedition.ticket().address().mobile
- || expedition.ticket().address().phone
- || expedition.ticket().client().mobile
- || expedition.ticket().client().phone,
- receiverEmail: expedition.ticket().client().email,
- receiverCountry: expedition.ticket().address().province().country().code,
- clientViaexpress: viaexpressConfig.clientViaexpress,
- userViaexpress: viaexpressConfig.userViaexpress,
- passwordViaexpress: viaexpressConfig.passwordViaexpress
+ viaexpressConfig,
+ sender,
+ senderAddress: sender.defaultAddress(),
+ client: ticket.client(),
+ address: ticket.address(),
+ shipped
};
const template = fs.readFileSync(__dirname + '/template.ejs', 'utf-8');
diff --git a/back/methods/viaexpress-config/template.ejs b/back/methods/viaexpress-config/template.ejs
index e8b1f1977..0b6eb468c 100644
--- a/back/methods/viaexpress-config/template.ejs
+++ b/back/methods/viaexpress-config/template.ejs
@@ -3,12 +3,12 @@
- <%= defaultWeight %>
+ <%= viaexpressConfig.defaultWeight %>10
- <%= date %>
+ <%= shipped %>0
- <%= deliveryType %>
+ <%= viaexpressConfig.deliveryType %>000
@@ -20,31 +20,31 @@
- <%= senderName %>
- <%= senderStreet %>
- <%= senderPostalCode %>
- <%= senderCity %>
- <%= senderProvince %>
+ <%= sender.socialName %>
+ <%= senderAddress.street %>
+ <%= senderAddress.postalCode %>
+ <%= senderAddress.city %>
+ <%= senderAddress.province().name %>
- <%= senderPhone %>
- <%= senderEmail %>
+ <%= senderAddress.mobile || senderAddress.phone || sender.mobile || sender.phone %>
+ <%= sender.email %>
- <%= receiverName %>
- <%= receiverStreet %>
- <%= receiverPostalCode %>
- <%= receiverCity %>
+ <%= address.nickname %>
+ <%= address.street %>
+ <%= address.postalCode %>
+ <%= address.city %>
- <%= receiverProvince %>
+ <%= address.province().name %>
- <%= receiverPhone %>
- <%= receiverEmail %>
- <%= receiverCountry %>
+ <%= address.mobile || address.phone || client.mobile || client.phone %>
+ <%= client.email %>
+ <%= address.province().country().code %>
- <%= clientViaexpress %>
- <%= userViaexpress %>
- <%= passwordViaexpress %>
+ <%= viaexpressConfig.client %>
+ <%= viaexpressConfig.user %>
+ <%= viaexpressConfig.password %>
diff --git a/back/models/viaexpress-config.json b/back/models/viaexpress-config.json
index 26d6c8e37..8df24201b 100644
--- a/back/models/viaexpress-config.json
+++ b/back/models/viaexpress-config.json
@@ -15,13 +15,13 @@
"type": "string",
"required": true
},
- "clientViaexpress": {
+ "client": {
"type": "string"
},
- "userViaexpress": {
+ "user": {
"type": "string"
},
- "passwordViaexpress": {
+ "password": {
"type": "string"
},
"defaultWeight": {
diff --git a/db/changes/232601/00-viaexpress.sql b/db/changes/232601/00-viaexpress.sql
index 9e3baa9fd..42cf3b647 100644
--- a/db/changes/232601/00-viaexpress.sql
+++ b/db/changes/232601/00-viaexpress.sql
@@ -1,9 +1,9 @@
CREATE TABLE `vn`.`viaexpressConfig` (
id int auto_increment NOT NULL,
url varchar(100) NOT NULL,
- clientViaexpress varchar(100) NOT NULL,
- userViaexpress varchar(100) NOT NULL,
- passwordViaexpress varchar(100) NOT NULL,
+ client varchar(100) NOT NULL,
+ user varchar(100) NOT NULL,
+ password varchar(100) NOT NULL,
defaultWeight decimal(10,2) NOT NULL,
deliveryType varchar(5) NOT NULL,
CONSTRAINT viaexpressConfig_PK PRIMARY KEY (id)
From 93da12923959e0b829871d30e08b1e157f3b6e7c Mon Sep 17 00:00:00 2001
From: sergiodt
Date: Tue, 18 Jul 2023 08:54:45 +0200
Subject: [PATCH 0427/1087] refs #5983 feat(itemShelving): add getInventory
---
.../233001/00-itemShelving_inventory.sql | 52 +++++++++++++++++++
.../methods/item-shelving/getInventory.js | 37 +++++++++++++
.../item-shelving/specs/getInventory.spec.js | 19 +++++++
modules/item/back/models/item-shelving.js | 1 +
4 files changed, 109 insertions(+)
create mode 100644 db/changes/233001/00-itemShelving_inventory.sql
create mode 100644 modules/item/back/methods/item-shelving/getInventory.js
create mode 100644 modules/item/back/methods/item-shelving/specs/getInventory.spec.js
diff --git a/db/changes/233001/00-itemShelving_inventory.sql b/db/changes/233001/00-itemShelving_inventory.sql
new file mode 100644
index 000000000..b2a2ff321
--- /dev/null
+++ b/db/changes/233001/00-itemShelving_inventory.sql
@@ -0,0 +1,52 @@
+
+DELIMITER $$
+CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`itemShelving_inventory`(vParkingFromFk INT, vParkingToFk INT)
+/**
+ * Devuelve un listado de ubicaciones a revisar
+ *
+ * @param vParkingFromFk Parking de partida, identificador de vn.parking
+ * @param vParkingToFk Parking de llegada, identificador de vn.parking
+*/
+
+ DECLARE vSectorFk INT;
+ DECLARE vPickingOrderFrom INT;
+ DECLARE vPickingOrderTo INT;
+
+ SELECT ish.id,
+ p.pickingOrder,
+ p.code parking,
+ ish.shelvingFk,
+ ish.itemFk,
+ i.longName,
+ ish.visible,
+ p.sectorFk,
+ it.workerFk buyer,
+ CONCAT('http:',ic.url, '/catalog/1600x900/',i.image) urlImage,
+ ish.isChecked,
+ CASE
+ WHEN s.notPrepared > sm.parked THEN 0
+ WHEN sm.visible > sm.parked THEN 1
+ ELSE 2
+ END
+ FROM vn.itemShelving ish
+ JOIN vn.item i ON i.id = ish.itemFk
+ JOIN vn.itemType it ON it.id = i.typeFk
+ JOIN tmp.stockMisfit sm ON sm.itemFk = ish.itemFk
+ JOIN vn.shelving sh ON sh.code = ish.shelvingFk
+ JOIN vn.parking p ON p.id = sh.parkingFk
+ JOIN (SELECT s.itemFk, sum(s.quantity) notPrepared
+ FROM vn.sale s
+ JOIN vn.ticket t ON t.id = s.ticketFk
+ JOIN vn.warehouse w ON w.id = t.warehouseFk
+ WHERE t.shipped BETWEEN CURDATE()
+ AND CURDATE() + INTERVAL 23 HOUR
+ AND s.isPicked = FALSE
+ AND w.name = 'Algemesi'
+ GROUP BY s.itemFk) s ON s.itemFk = i.id
+ JOIN hedera.imageConfig ic
+ WHERE p.pickingOrder BETWEEN vParkingFrom AND vPickingOrderTo
+ AND p.sectorFk = vSectorFk
+ ORDER BY p.pickingOrder;
+
+END ;;
+DELIMITER ;
diff --git a/modules/item/back/methods/item-shelving/getInventory.js b/modules/item/back/methods/item-shelving/getInventory.js
new file mode 100644
index 000000000..144bd83e7
--- /dev/null
+++ b/modules/item/back/methods/item-shelving/getInventory.js
@@ -0,0 +1,37 @@
+module.exports = Self => {
+ Self.remoteMethod('getInventory', {
+ description: 'Get list of itemShelving to review between two parking code',
+ accessType: 'WRITE',
+ accepts: [{
+ arg: 'parkingFrom',
+ type: 'string',
+ required: true,
+ description: 'Parking code from'
+ },
+ {
+ arg: 'parkingTo',
+ type: 'string',
+ required: true,
+ description: 'Parking code to'
+ }],
+ returns: {
+ type: ['object'],
+ root: true
+ },
+ http: {
+ path: `/getInventory`,
+ verb: 'POST'
+ }
+ });
+
+ Self.getInventory = async(parkingFrom, parkingTo, options) => {
+ const myOptions = {};
+
+ if (typeof options == 'object')
+ Object.assign(myOptions, options);
+
+ const [result] = await Self.rawSql(`CALL vn.itemShelving_inventory(?, ?)`, [parkingFrom, parkingTo], myOptions);
+
+ return result;
+ };
+};
diff --git a/modules/item/back/methods/item-shelving/specs/getInventory.spec.js b/modules/item/back/methods/item-shelving/specs/getInventory.spec.js
new file mode 100644
index 000000000..76cc39073
--- /dev/null
+++ b/modules/item/back/methods/item-shelving/specs/getInventory.spec.js
@@ -0,0 +1,19 @@
+const models = require('vn-loopback/server/server').models;
+
+describe('itemShelving getInventory()', () => {
+ it('should return a list of itemShelvings', async() => {
+ const tx = await models.ItemShelving.beginTransaction({});
+
+ let response;
+ try {
+ const options = {transaction: tx};
+ response = await models.ItemShelving.getInventory(1, 2, options);
+ await tx.rollback();
+ } catch (e) {
+ await tx.rollback();
+ throw e;
+ }
+
+ expect(response.length).toEqual(2);
+ });
+});
diff --git a/modules/item/back/models/item-shelving.js b/modules/item/back/models/item-shelving.js
index 5f372a3be..98ff18931 100644
--- a/modules/item/back/models/item-shelving.js
+++ b/modules/item/back/models/item-shelving.js
@@ -1,3 +1,4 @@
module.exports = Self => {
require('../methods/item-shelving/deleteItemShelvings')(Self);
+ require('../methods/item-shelving/getInventory')(Self);
};
From b3a7a170f0522ff693be1684d3201b8914a8ca7e Mon Sep 17 00:00:00 2001
From: vicent
Date: Tue, 18 Jul 2023 11:54:43 +0200
Subject: [PATCH 0428/1087] =?UTF-8?q?refs=20#5934=20feat:=20a=C3=B1adido?=
=?UTF-8?q?=20clientSms=20log?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
db/changes/233001/00-clientSms.sql | 15 +++++++
modules/client/back/methods/client/sendSms.js | 8 +++-
modules/client/back/model-config.json | 3 ++
modules/client/back/models/client-sms.json | 29 +++++++++++++
modules/client/back/models/sms.json | 2 +-
modules/client/front/index.js | 1 +
modules/client/front/routes.json | 7 ++++
modules/client/front/sms/index.html | 42 +++++++++++++++++++
modules/client/front/sms/index.js | 39 +++++++++++++++++
modules/client/front/sms/locale/es.yml | 2 +
10 files changed, 146 insertions(+), 2 deletions(-)
create mode 100644 db/changes/233001/00-clientSms.sql
create mode 100644 modules/client/back/models/client-sms.json
create mode 100644 modules/client/front/sms/index.html
create mode 100644 modules/client/front/sms/index.js
create mode 100644 modules/client/front/sms/locale/es.yml
diff --git a/db/changes/233001/00-clientSms.sql b/db/changes/233001/00-clientSms.sql
new file mode 100644
index 000000000..353041ad9
--- /dev/null
+++ b/db/changes/233001/00-clientSms.sql
@@ -0,0 +1,15 @@
+CREATE TABLE `vn`.`clientSms` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `clientFk` int(11) NOT NULL,
+ `smsFk` mediumint(8) unsigned NOT NULL,
+ PRIMARY KEY (`id`),
+ KEY `clientSms_FK` (`clientFk`),
+ KEY `clientSms_FK_1` (`smsFk`),
+ CONSTRAINT `clientSms_FK` FOREIGN KEY (`clientFk`) REFERENCES `client` (`id`) ON UPDATE CASCADE,
+ CONSTRAINT `clientSms_FK_1` FOREIGN KEY (`smsFk`) REFERENCES `sms` (`id`) ON UPDATE CASCADE
+) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
+
+INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`)
+ VALUES
+ ('ClientSms', '*', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('ClientSms', '*', 'WRITE', 'ALLOW', 'ROLE', 'employee');
diff --git a/modules/client/back/methods/client/sendSms.js b/modules/client/back/methods/client/sendSms.js
index 83b7c8d6e..270d7e5b5 100644
--- a/modules/client/back/methods/client/sendSms.js
+++ b/modules/client/back/methods/client/sendSms.js
@@ -7,7 +7,7 @@ module.exports = Self => {
arg: 'id',
type: 'number',
required: true,
- description: 'The ticket id',
+ description: 'The client id',
http: {source: 'path'}
},
{
@@ -33,6 +33,12 @@ module.exports = Self => {
Self.sendSms = async(ctx, id, destination, message) => {
const models = Self.app.models;
const sms = await models.Sms.send(ctx, destination, message);
+
+ await models.ClientSms.create({
+ clientFk: id,
+ smsFk: sms.id
+ });
+
return sms;
};
};
diff --git a/modules/client/back/model-config.json b/modules/client/back/model-config.json
index 1e06ea1c0..bc48ec360 100644
--- a/modules/client/back/model-config.json
+++ b/modules/client/back/model-config.json
@@ -95,6 +95,9 @@
"ClientSample": {
"dataSource": "vn"
},
+ "ClientSms": {
+ "dataSource": "vn"
+ },
"Sms": {
"dataSource": "vn"
},
diff --git a/modules/client/back/models/client-sms.json b/modules/client/back/models/client-sms.json
new file mode 100644
index 000000000..18d7ad051
--- /dev/null
+++ b/modules/client/back/models/client-sms.json
@@ -0,0 +1,29 @@
+{
+ "name": "ClientSms",
+ "base": "VnModel",
+ "options": {
+ "mysql": {
+ "table": "clientSms"
+ }
+ },
+ "properties": {
+ "id": {
+ "type": "number",
+ "id": true,
+ "description": "Identifier"
+ },
+ "clientFk": {
+ "type": "number"
+ },
+ "smsFk": {
+ "type": "number"
+ }
+ },
+ "relations": {
+ "sms": {
+ "type": "belongsTo",
+ "model": "Sms",
+ "foreignKey": "smsFk"
+ }
+ }
+}
diff --git a/modules/client/back/models/sms.json b/modules/client/back/models/sms.json
index 4639131ef..8f349b073 100644
--- a/modules/client/back/models/sms.json
+++ b/modules/client/back/models/sms.json
@@ -36,7 +36,7 @@
}
},
"relations": {
- "sender": {
+ "user": {
"type": "belongsTo",
"model": "VnUser",
"foreignKey": "senderFk"
diff --git a/modules/client/front/index.js b/modules/client/front/index.js
index c7e39ea5d..62076459b 100644
--- a/modules/client/front/index.js
+++ b/modules/client/front/index.js
@@ -48,4 +48,5 @@ import './notification';
import './unpaid';
import './extended-list';
import './credit-management';
+import './sms';
diff --git a/modules/client/front/routes.json b/modules/client/front/routes.json
index 01d1b53bf..773b7b22a 100644
--- a/modules/client/front/routes.json
+++ b/modules/client/front/routes.json
@@ -23,6 +23,7 @@
{"state": "client.card.recovery.index", "icon": "icon-recovery"},
{"state": "client.card.webAccess", "icon": "cloud"},
{"state": "client.card.log", "icon": "history"},
+ {"state": "client.card.sms", "icon": "contact_support"},
{
"description": "Credit management",
"icon": "monetization_on",
@@ -373,6 +374,12 @@
"component": "vn-client-log",
"description": "Log"
},
+ {
+ "url" : "/sms",
+ "state": "client.card.sms",
+ "component": "vn-client-sms",
+ "description": "Sms"
+ },
{
"url": "/dms",
"state": "client.card.dms",
diff --git a/modules/client/front/sms/index.html b/modules/client/front/sms/index.html
new file mode 100644
index 000000000..db944e3b0
--- /dev/null
+++ b/modules/client/front/sms/index.html
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+ Sender
+ Number sender
+ Destination
+ Message
+ Status
+ Created
+
+
+
+
+
+
+ {{::clientSms.sms.user.name}}
+
+
+ {{::clientSms.sms.sender}}
+ {{::clientSms.sms.destination}}
+ {{::clientSms.sms.message}}
+ {{::clientSms.sms.status}}
+ {{::clientSms.sms.created | date:'dd/MM/yyyy HH:mm'}}
+
+
+
+
+
+
+
diff --git a/modules/client/front/sms/index.js b/modules/client/front/sms/index.js
new file mode 100644
index 000000000..1478b78e9
--- /dev/null
+++ b/modules/client/front/sms/index.js
@@ -0,0 +1,39 @@
+import ngModule from '../module';
+import Section from 'salix/components/section';
+
+export default class Controller extends Section {
+ constructor($element, $) {
+ super($element, $);
+
+ this.filter = {
+ fields: ['id', 'smsFk'],
+ include: {
+ relation: 'sms',
+ scope: {
+ fields: [
+ 'senderFk',
+ 'sender',
+ 'destination',
+ 'message',
+ 'statusCode',
+ 'status',
+ 'created'],
+ include: {
+ relation: 'user',
+ scope: {
+ fields: ['name']
+ }
+ }
+ }
+ }
+ };
+ }
+}
+
+ngModule.vnComponent('vnClientSms', {
+ template: require('./index.html'),
+ controller: Controller,
+ bindings: {
+ client: '<'
+ }
+});
diff --git a/modules/client/front/sms/locale/es.yml b/modules/client/front/sms/locale/es.yml
new file mode 100644
index 000000000..6d1e9e147
--- /dev/null
+++ b/modules/client/front/sms/locale/es.yml
@@ -0,0 +1,2 @@
+Sender: Remitente
+Number sender: Número remitente
From 3e8775149a4dc286ebedeeb4cd9b95a4157d2596 Mon Sep 17 00:00:00 2001
From: vicent
Date: Tue, 18 Jul 2023 13:02:42 +0200
Subject: [PATCH 0429/1087] refs #5934 feat: change icon
---
modules/client/back/models/sms.json | 2 +-
modules/client/front/routes.json | 2 +-
modules/client/front/sms/index.html | 4 +---
modules/client/front/sms/index.js | 2 +-
4 files changed, 4 insertions(+), 6 deletions(-)
diff --git a/modules/client/back/models/sms.json b/modules/client/back/models/sms.json
index 8f349b073..4639131ef 100644
--- a/modules/client/back/models/sms.json
+++ b/modules/client/back/models/sms.json
@@ -36,7 +36,7 @@
}
},
"relations": {
- "user": {
+ "sender": {
"type": "belongsTo",
"model": "VnUser",
"foreignKey": "senderFk"
diff --git a/modules/client/front/routes.json b/modules/client/front/routes.json
index 773b7b22a..63d6709e5 100644
--- a/modules/client/front/routes.json
+++ b/modules/client/front/routes.json
@@ -23,7 +23,7 @@
{"state": "client.card.recovery.index", "icon": "icon-recovery"},
{"state": "client.card.webAccess", "icon": "cloud"},
{"state": "client.card.log", "icon": "history"},
- {"state": "client.card.sms", "icon": "contact_support"},
+ {"state": "client.card.sms", "icon": "sms"},
{
"description": "Credit management",
"icon": "monetization_on",
diff --git a/modules/client/front/sms/index.html b/modules/client/front/sms/index.html
index db944e3b0..3331f217b 100644
--- a/modules/client/front/sms/index.html
+++ b/modules/client/front/sms/index.html
@@ -13,7 +13,6 @@
Sender
- Number senderDestinationMessageStatus
@@ -24,10 +23,9 @@
- {{::clientSms.sms.user.name}}
+ {{::clientSms.sms.sender.name}}
- {{::clientSms.sms.sender}}{{::clientSms.sms.destination}}{{::clientSms.sms.message}}{{::clientSms.sms.status}}
diff --git a/modules/client/front/sms/index.js b/modules/client/front/sms/index.js
index 1478b78e9..6ad64282e 100644
--- a/modules/client/front/sms/index.js
+++ b/modules/client/front/sms/index.js
@@ -19,7 +19,7 @@ export default class Controller extends Section {
'status',
'created'],
include: {
- relation: 'user',
+ relation: 'sender',
scope: {
fields: ['name']
}
From 9076553070b5ff5e7399eeb5df7d28904a86ba79 Mon Sep 17 00:00:00 2001
From: sergiodt
Date: Tue, 18 Jul 2023 14:11:50 +0200
Subject: [PATCH 0430/1087] refs #5983 test(itemShelving): add getInventory
---
.../233001/00-itemShelving_inventory.sql | 94 +++++++++++--------
db/dump/fixtures.sql | 12 ++-
.../item-shelving/specs/getInventory.spec.js | 7 +-
3 files changed, 70 insertions(+), 43 deletions(-)
diff --git a/db/changes/233001/00-itemShelving_inventory.sql b/db/changes/233001/00-itemShelving_inventory.sql
index b2a2ff321..c66ad69e9 100644
--- a/db/changes/233001/00-itemShelving_inventory.sql
+++ b/db/changes/233001/00-itemShelving_inventory.sql
@@ -1,52 +1,64 @@
DELIMITER $$
-CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`itemShelving_inventory`(vParkingFromFk INT, vParkingToFk INT)
+CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`itemShelving_inventory`(vParkingFromFk VARCHAR(8), vParkingToFk VARCHAR(8))
+BEGIN
/**
* Devuelve un listado de ubicaciones a revisar
*
- * @param vParkingFromFk Parking de partida, identificador de vn.parking
- * @param vParkingToFk Parking de llegada, identificador de vn.parking
+ * @param vParkingFromFk Parking de partida, identificador de parking
+ * @param vParkingToFk Parking de llegada, identificador de parking
*/
DECLARE vSectorFk INT;
DECLARE vPickingOrderFrom INT;
- DECLARE vPickingOrderTo INT;
-
- SELECT ish.id,
- p.pickingOrder,
- p.code parking,
- ish.shelvingFk,
- ish.itemFk,
- i.longName,
- ish.visible,
- p.sectorFk,
- it.workerFk buyer,
- CONCAT('http:',ic.url, '/catalog/1600x900/',i.image) urlImage,
- ish.isChecked,
- CASE
- WHEN s.notPrepared > sm.parked THEN 0
- WHEN sm.visible > sm.parked THEN 1
- ELSE 2
- END
- FROM vn.itemShelving ish
- JOIN vn.item i ON i.id = ish.itemFk
- JOIN vn.itemType it ON it.id = i.typeFk
- JOIN tmp.stockMisfit sm ON sm.itemFk = ish.itemFk
- JOIN vn.shelving sh ON sh.code = ish.shelvingFk
- JOIN vn.parking p ON p.id = sh.parkingFk
- JOIN (SELECT s.itemFk, sum(s.quantity) notPrepared
- FROM vn.sale s
- JOIN vn.ticket t ON t.id = s.ticketFk
- JOIN vn.warehouse w ON w.id = t.warehouseFk
- WHERE t.shipped BETWEEN CURDATE()
- AND CURDATE() + INTERVAL 23 HOUR
- AND s.isPicked = FALSE
- AND w.name = 'Algemesi'
- GROUP BY s.itemFk) s ON s.itemFk = i.id
- JOIN hedera.imageConfig ic
- WHERE p.pickingOrder BETWEEN vParkingFrom AND vPickingOrderTo
- AND p.sectorFk = vSectorFk
- ORDER BY p.pickingOrder;
+ DECLARE vPickingOrderTo INT;
-END ;;
+ SELECT p.sectorFk, p.pickingOrder INTO vSectorFk, vPickingOrderFrom
+ FROM vn.parking p
+ WHERE p.code = vParkingFromFk COLLATE 'utf8mb3_general_ci';
+
+ SELECT p.pickingOrder INTO vPickingOrderTo
+ FROM vn.parking p
+ WHERE p.code = vParkingToFk COLLATE 'utf8mb3_general_ci';
+
+ CALL vn.visible_getMisfit(vSectorFk);
+
+ SELECT ish.id,
+ p.pickingOrder,
+ p.code parking,
+ ish.shelvingFk,
+ ish.itemFk,
+ i.longName,
+ ish.visible,
+ p.sectorFk,
+ it.workerFk buyer,
+ CONCAT('http:',ic.url, '/catalog/1600x900/',i.image) urlImage,
+ ish.isChecked,
+ CASE
+ WHEN s.notPrepared > sm.parked THEN 0
+ WHEN sm.visible > sm.parked THEN 1
+ ELSE 2
+ END priority
+ FROM vn.itemShelving ish
+ JOIN vn.item i ON i.id = ish.itemFk
+ JOIN vn.itemType it ON it.id = i.typeFk
+ JOIN tmp.stockMisfit sm ON sm.itemFk = ish.itemFk
+ JOIN vn.shelving sh ON sh.code = ish.shelvingFk
+ JOIN vn.parking p ON p.id = sh.parkingFk
+ JOIN (SELECT s.itemFk, sum(s.quantity) notPrepared
+ FROM vn.sale s
+ JOIN vn.ticket t ON t.id = s.ticketFk
+ JOIN vn.warehouse w ON w.id = t.warehouseFk
+ JOIN vn.config c ON c.mainWarehouseFk = w.id
+ WHERE t.shipped BETWEEN util.VN_CURDATE()
+ AND util.VN_CURDATE() + INTERVAL 23 HOUR
+ AND s.isPicked = FALSE
+ GROUP BY s.itemFk) s ON s.itemFk = i.id
+ JOIN hedera.imageConfig ic
+ WHERE p.pickingOrder BETWEEN vPickingOrderFrom AND vPickingOrderTo
+ AND p.sectorFk = vSectorFk
+ ORDER BY p.pickingOrder;
+
+END$$
DELIMITER ;
+
diff --git a/db/dump/fixtures.sql b/db/dump/fixtures.sql
index fe11d5b64..670a45778 100644
--- a/db/dump/fixtures.sql
+++ b/db/dump/fixtures.sql
@@ -37,7 +37,7 @@ ALTER TABLE `vn`.`ticket` AUTO_INCREMENT = 1;
INSERT INTO `salix`.`AccessToken` (`id`, `ttl`, `created`, `userId`)
VALUES
- ('DEFAULT_TOKEN', '1209600', util.VN_CURDATE(), 66);
+ ('DEFAULT_TOKEN', '1209600', CURDATE(), 66);
INSERT INTO `salix`.`printConfig` (`id`, `itRecipient`, `incidencesEmail`)
VALUES
@@ -2953,3 +2953,13 @@ INSERT INTO `vn`.`invoiceInSerial` (`code`, `description`, `cplusTerIdNifFk`, `t
('E', 'Midgard', 1, 'CEE'),
('R', 'Jotunheim', 1, 'NATIONAL'),
('W', 'Vanaheim', 1, 'WORLD');
+
+
+INSERT INTO `hedera`.`imageConfig` (`id`, `maxSize`, `useXsendfile`, `url`)
+ VALUES
+ (1, 0, 0, 'marvel.com');
+
+/* DELETE ME */
+UPDATE vn.config
+ SET mainWarehouseFk=1
+ WHERE id=1;
\ No newline at end of file
diff --git a/modules/item/back/methods/item-shelving/specs/getInventory.spec.js b/modules/item/back/methods/item-shelving/specs/getInventory.spec.js
index 76cc39073..6a8c9804c 100644
--- a/modules/item/back/methods/item-shelving/specs/getInventory.spec.js
+++ b/modules/item/back/methods/item-shelving/specs/getInventory.spec.js
@@ -7,7 +7,12 @@ describe('itemShelving getInventory()', () => {
let response;
try {
const options = {transaction: tx};
- response = await models.ItemShelving.getInventory(1, 2, options);
+ await models.ItemShelving.rawSql(`
+ UPDATE vn.config
+ SET mainWarehouseFk=1
+ WHERE id=1
+ `, null, options);
+ response = await models.ItemShelving.getInventory('100-01', 'LR-02-3', options);
await tx.rollback();
} catch (e) {
await tx.rollback();
From 7bd378e9dde911c7176e92fc1d4a5883f44e071d Mon Sep 17 00:00:00 2001
From: vicent
Date: Tue, 18 Jul 2023 14:15:56 +0200
Subject: [PATCH 0431/1087] refs #
---
back/models/company.json | 3 +
db/changes/233001/00-company.sql | 1 +
loopback/locale/en.json | 1 +
loopback/locale/es.json | 4 +-
.../back/methods/client/canBeInvoiced.js | 25 ++++++-
.../ticket/back/methods/ticket/makeInvoice.js | 4 +-
print/templates/reports/invoice/sql/sales.sql | 66 ++++++-------------
7 files changed, 53 insertions(+), 51 deletions(-)
create mode 100644 db/changes/233001/00-company.sql
diff --git a/back/models/company.json b/back/models/company.json
index f16c5762f..f8b5641ac 100644
--- a/back/models/company.json
+++ b/back/models/company.json
@@ -18,6 +18,9 @@
},
"expired": {
"type": "date"
+ },
+ "supplierAccountFk": {
+ "type": "number"
}
},
"scope": {
diff --git a/db/changes/233001/00-company.sql b/db/changes/233001/00-company.sql
new file mode 100644
index 000000000..a3b61b9cc
--- /dev/null
+++ b/db/changes/233001/00-company.sql
@@ -0,0 +1 @@
+ALTER TABLE `vn`.`company` MODIFY COLUMN sage200Company int(2) DEFAULT 10 NOT NULL;
diff --git a/loopback/locale/en.json b/loopback/locale/en.json
index 030afbe9e..5c7c10967 100644
--- a/loopback/locale/en.json
+++ b/loopback/locale/en.json
@@ -177,6 +177,7 @@
"Mail not sent": "There has been an error sending the invoice to the client [{{clientId}}]({{{clientUrl}}}), please check the email address",
"The renew period has not been exceeded": "The renew period has not been exceeded",
"You can not use the same password": "You can not use the same password",
+ "The company has not informed the supplier account for bank transfers": "La empresa no tiene informado la cuenta de proveedor para transferencias bancarias",
"Valid priorities": "Valid priorities: %d",
"Negative basis of tickets": "Negative basis of tickets: {{ticketsIds}}"
}
diff --git a/loopback/locale/es.json b/loopback/locale/es.json
index 784ff5e6e..69f157a47 100644
--- a/loopback/locale/es.json
+++ b/loopback/locale/es.json
@@ -305,5 +305,7 @@
"The renew period has not been exceeded": "El periodo de renovación no ha sido superado",
"Valid priorities": "Prioridades válidas: %d",
"Negative basis of tickets": "Base negativa para los tickets: {{ticketsIds}}",
- "You cannot assign an alias that you are not assigned to": "No puede asignar un alias que no tenga asignado"
+ "You cannot assign an alias that you are not assigned to": "No puede asignar un alias que no tenga asignado",
+ "The company has not informed the supplier account for bank transfers": "La empresa no tiene informado la cuenta de proveedor para transferencias bancarias"
+ "
}
diff --git a/modules/client/back/methods/client/canBeInvoiced.js b/modules/client/back/methods/client/canBeInvoiced.js
index 567d491f1..843e9549f 100644
--- a/modules/client/back/methods/client/canBeInvoiced.js
+++ b/modules/client/back/methods/client/canBeInvoiced.js
@@ -1,3 +1,5 @@
+const UserError = require('vn-loopback/util/user-error');
+
module.exports = function(Self) {
Self.remoteMethodCtx('canBeInvoiced', {
description: 'Change property isEqualizated in all client addresses',
@@ -9,6 +11,12 @@ module.exports = function(Self) {
required: true,
description: 'Client id',
http: {source: 'path'}
+ },
+ {
+ arg: 'companyFk',
+ description: 'The company id',
+ type: 'number',
+ required: true
}
],
returns: {
@@ -22,18 +30,29 @@ module.exports = function(Self) {
}
});
- Self.canBeInvoiced = async(id, options) => {
+ Self.canBeInvoiced = async(id, companyFk, options) => {
const models = Self.app.models;
-
const myOptions = {};
if (typeof options == 'object')
Object.assign(myOptions, options);
const client = await models.Client.findById(id, {
- fields: ['id', 'isTaxDataChecked', 'hasToInvoice']
+ fields: ['id', 'isTaxDataChecked', 'hasToInvoice', 'payMethodFk'],
+ include:
+ {
+ relation: 'payMethod',
+ scope: {
+ fields: ['code']
+ }
+ }
}, myOptions);
+ const company = await models.Company.findById(companyFk, {fields: ['supplierAccountFk']}, myOptions);
+
+ if (client.payMethod().code === 'wireTransfer' && !company.supplierAccountFk)
+ throw new UserError('The company has not informed the supplier account for bank transfers');
+
if (client.isTaxDataChecked && client.hasToInvoice)
return true;
diff --git a/modules/ticket/back/methods/ticket/makeInvoice.js b/modules/ticket/back/methods/ticket/makeInvoice.js
index 22fe7b3f5..e18e58e0b 100644
--- a/modules/ticket/back/methods/ticket/makeInvoice.js
+++ b/modules/ticket/back/methods/ticket/makeInvoice.js
@@ -14,7 +14,7 @@ module.exports = function(Self) {
{
arg: 'companyFk',
description: 'The company id',
- type: 'string',
+ type: 'number',
required: true
},
{
@@ -67,7 +67,7 @@ module.exports = function(Self) {
const [firstTicket] = tickets;
const clientId = firstTicket.clientFk;
- const clientCanBeInvoiced = await models.Client.canBeInvoiced(clientId, myOptions);
+ const clientCanBeInvoiced = await models.Client.canBeInvoiced(clientId, companyFk, myOptions);
if (!clientCanBeInvoiced)
throw new UserError(`This client can't be invoiced`);
diff --git a/print/templates/reports/invoice/sql/sales.sql b/print/templates/reports/invoice/sql/sales.sql
index f5721a594..3833a3700 100644
--- a/print/templates/reports/invoice/sql/sales.sql
+++ b/print/templates/reports/invoice/sql/sales.sql
@@ -1,31 +1,19 @@
-SELECT
+SELECT
io.ref,
- c.socialName,
- sa.iban,
- pm.name AS payMethod,
- t.clientFk,
- t.shipped,
- t.nickname,
s.ticketFk,
- s.itemFk,
- s.concept,
- s.quantity,
- s.price,
+ ib.ediBotanic botanical,
+ s.quantity,
+ s.price,
s.discount,
- i.tag5,
- i.value5,
- i.tag6,
- i.value6,
- i.tag7,
- i.value7,
- tc.code AS vatType,
- ib.ediBotanic botanical
+ s.itemFk,
+ s.concept,
+ tc.code vatType
FROM vn.invoiceOut io
JOIN vn.ticket t ON t.refFk = io.ref
JOIN vn.supplier su ON su.id = io.companyFk
- JOIN vn.client c ON c.id = t.clientFk
+ JOIN vn.client c ON c.id = t.clientFk
JOIN vn.payMethod pm ON pm.id = c.payMethodFk
- JOIN vn.company co ON co.id = io.companyFk
+ JOIN vn.company co ON co.id = io.companyFk
JOIN vn.supplierAccount sa ON sa.id = co.supplierAccountFk
JOIN vn.sale s ON s.ticketFk = t.id
JOIN item i ON i.id = s.itemFk
@@ -38,35 +26,23 @@ SELECT
AND itc.itemFk = s.itemFk
JOIN vn.taxClass tc ON tc.id = itc.taxClassFk
WHERE t.refFk = ?
- UNION ALL
-SELECT
+ UNION ALL
+SELECT
io.ref,
- c.socialName,
- sa.iban,
- pm.name AS payMethod,
- t.clientFk,
- t.shipped,
- t.nickname,
- t.id AS ticketFk,
+ t.id ticketFk,
+ NULL botanical,
+ ts.quantity,
+ ts.price,
+ 0 discount,
'',
- ts.description concept,
- ts.quantity,
- ts.price,
- 0 discount,
- NULL AS tag5,
- NULL AS value5,
- NULL AS tag6,
- NULL AS value6,
- NULL AS tag7,
- NULL AS value7,
- tc.code AS vatType,
- NULL AS botanical
+ ts.description concept,
+ tc.code vatType
FROM vn.invoiceOut io
JOIN vn.ticket t ON t.refFk = io.ref
JOIN vn.ticketService ts ON ts.ticketFk = t.id
- JOIN vn.client c ON c.id = t.clientFk
+ JOIN vn.client c ON c.id = t.clientFk
JOIN vn.payMethod pm ON pm.id = c.payMethodFk
- JOIN vn.company co ON co.id = io.companyFk
+ JOIN vn.company co ON co.id = io.companyFk
JOIN vn.supplierAccount sa ON sa.id = co.supplierAccountFk
JOIN vn.taxClass tc ON tc.id = ts.taxClassFk
- WHERE t.refFk = ?
\ No newline at end of file
+ WHERE t.refFk = ?
From 4c7f42acb5a05bd868dbc095feff9504d80f2d91 Mon Sep 17 00:00:00 2001
From: vicent
Date: Tue, 18 Jul 2023 14:17:07 +0200
Subject: [PATCH 0432/1087] a
---
loopback/locale/es.json | 1 -
1 file changed, 1 deletion(-)
diff --git a/loopback/locale/es.json b/loopback/locale/es.json
index 69f157a47..9412a9571 100644
--- a/loopback/locale/es.json
+++ b/loopback/locale/es.json
@@ -307,5 +307,4 @@
"Negative basis of tickets": "Base negativa para los tickets: {{ticketsIds}}",
"You cannot assign an alias that you are not assigned to": "No puede asignar un alias que no tenga asignado",
"The company has not informed the supplier account for bank transfers": "La empresa no tiene informado la cuenta de proveedor para transferencias bancarias"
- "
}
From d3165fcdc75c74bb05a15060dcfec1c55bc80394 Mon Sep 17 00:00:00 2001
From: vicent
Date: Tue, 18 Jul 2023 14:25:53 +0200
Subject: [PATCH 0433/1087] refs #5849 fix: tback
---
.../client/back/methods/client/specs/canBeInvoiced.spec.js | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/modules/client/back/methods/client/specs/canBeInvoiced.spec.js b/modules/client/back/methods/client/specs/canBeInvoiced.spec.js
index 2f11d8013..397be3c92 100644
--- a/modules/client/back/methods/client/specs/canBeInvoiced.spec.js
+++ b/modules/client/back/methods/client/specs/canBeInvoiced.spec.js
@@ -4,6 +4,7 @@ const LoopBackContext = require('loopback-context');
describe('client canBeInvoiced()', () => {
const userId = 19;
const clientId = 1101;
+ const companyId = 442;
const activeCtx = {
accessToken: {userId: userId}
};
@@ -23,7 +24,7 @@ describe('client canBeInvoiced()', () => {
const client = await models.Client.findById(clientId, null, options);
await client.updateAttribute('isTaxDataChecked', false, options);
- const canBeInvoiced = await models.Client.canBeInvoiced(clientId, options);
+ const canBeInvoiced = await models.Client.canBeInvoiced(clientId, companyId, options);
expect(canBeInvoiced).toEqual(false);
@@ -43,7 +44,7 @@ describe('client canBeInvoiced()', () => {
const client = await models.Client.findById(clientId, null, options);
await client.updateAttribute('hasToInvoice', false, options);
- const canBeInvoiced = await models.Client.canBeInvoiced(clientId, options);
+ const canBeInvoiced = await models.Client.canBeInvoiced(clientId, companyId, options);
expect(canBeInvoiced).toEqual(false);
@@ -60,7 +61,7 @@ describe('client canBeInvoiced()', () => {
try {
const options = {transaction: tx};
- const canBeInvoiced = await models.Client.canBeInvoiced(clientId, options);
+ const canBeInvoiced = await models.Client.canBeInvoiced(clientId, companyId, options);
expect(canBeInvoiced).toEqual(true);
From f07ac89cb6ea7b68033b702a36e13b2b2ec5d32a Mon Sep 17 00:00:00 2001
From: alexm
Date: Tue, 18 Jul 2023 15:01:04 +0200
Subject: [PATCH 0434/1087] refs #5976 add custom error
---
loopback/locale/es.json | 3 ++-
.../ticket/back/methods/ticket/setDeleted.js | 4 +--
.../back/methods/ticket/transferSales.js | 27 +++++++++++++++----
3 files changed, 26 insertions(+), 8 deletions(-)
diff --git a/loopback/locale/es.json b/loopback/locale/es.json
index 784ff5e6e..16b0af7f5 100644
--- a/loopback/locale/es.json
+++ b/loopback/locale/es.json
@@ -305,5 +305,6 @@
"The renew period has not been exceeded": "El periodo de renovación no ha sido superado",
"Valid priorities": "Prioridades válidas: %d",
"Negative basis of tickets": "Base negativa para los tickets: {{ticketsIds}}",
- "You cannot assign an alias that you are not assigned to": "No puede asignar un alias que no tenga asignado"
+ "You cannot assign an alias that you are not assigned to": "No puede asignar un alias que no tenga asignado",
+ "This ticket cannot be left empty.": "Este ticket no se puede dejar vacío. %d"
}
diff --git a/modules/ticket/back/methods/ticket/setDeleted.js b/modules/ticket/back/methods/ticket/setDeleted.js
index 878cce056..46c0add6b 100644
--- a/modules/ticket/back/methods/ticket/setDeleted.js
+++ b/modules/ticket/back/methods/ticket/setDeleted.js
@@ -41,8 +41,8 @@ module.exports = Self => {
const isEditable = await Self.isEditable(ctx, id, myOptions);
- if (!isEditable)
- throw new UserError(`The sales of this ticket can't be modified`);
+ throw new UserError(`The sales of this ticket can't be modified`);
+ // if (!isEditable)
// Check if ticket has refunds
const ticketRefunds = await models.TicketRefund.find({
diff --git a/modules/ticket/back/methods/ticket/transferSales.js b/modules/ticket/back/methods/ticket/transferSales.js
index 00fc02f38..2e4bf023d 100644
--- a/modules/ticket/back/methods/ticket/transferSales.js
+++ b/modules/ticket/back/methods/ticket/transferSales.js
@@ -37,6 +37,7 @@ module.exports = Self => {
const userId = ctx.req.accessToken.userId;
const models = Self.app.models;
const myOptions = {userId};
+ const $t = ctx.req.__; // $translate
let tx;
if (typeof options == 'object')
@@ -78,9 +79,9 @@ module.exports = Self => {
const saleIds = sales.map(sale => sale.id);
- const hasClaimedSales = await models.ClaimBeginning.findOne({where: {saleFk: {inq: saleIds}}});
- if (ticketId != id && hasClaimedSales)
- throw new UserError(`Can't transfer claimed sales`);
+ // const hasClaimedSales = await models.ClaimBeginning.findOne({where: {saleFk: {inq: saleIds}}});
+ // if (ticketId != id && hasClaimedSales)
+ // throw new UserError(`Can't transfer claimed sales`);
for (const sale of sales) {
const originalSale = map.get(sale.id);
@@ -96,14 +97,30 @@ module.exports = Self => {
}
const isTicketEmpty = await models.Ticket.isEmpty(id, myOptions);
- if (isTicketEmpty)
- await models.Ticket.setDeleted(ctx, id, myOptions);
+ if (isTicketEmpty) {
+ try {
+ await models.Ticket.setDeleted(ctx, id, myOptions);
+ } catch (e) {
+ console.log('e:', e);
+ console.log('e.message:', e.message);
+ console.log('e translation:', $t(e.message, {}));
+ if (e.statusCode === 400) {
+ throw new UserError(
+ `This ticket cannot be left empty.`,
+ 'TRANSFER_SET_DELETED',
+ $t(e.message)
+ );
+ }
+ throw e;
+ }
+ }
if (tx) await tx.commit();
return {id: ticketId};
} catch (e) {
if (tx) await tx.rollback();
+ console.log('e.UserError:', e);
throw e;
}
};
From bd723bb7ba540771f786ecd3bc9972781d92e0ca Mon Sep 17 00:00:00 2001
From: carlossa
Date: Tue, 18 Jul 2023 15:01:58 +0200
Subject: [PATCH 0435/1087] refs #5824 mod ng
---
modules/item/front/fixed-price/index.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/item/front/fixed-price/index.html b/modules/item/front/fixed-price/index.html
index d9a955fe1..f1f6e1419 100644
--- a/modules/item/front/fixed-price/index.html
+++ b/modules/item/front/fixed-price/index.html
@@ -85,7 +85,7 @@
show-field="id"
value-field="id"
search-function="$ctrl.itemSearchFunc($search)"
- on-change="$ctrl.upsertPrice(price, true)"
+ ng-change="$ctrl.upsertPrice(price, true)"
order="id DESC"
tabindex="1">
From 49c656928ed8049f00f333c4e7cb482d836cefd1 Mon Sep 17 00:00:00 2001
From: sergiodt
Date: Tue, 18 Jul 2023 15:43:11 +0200
Subject: [PATCH 0436/1087] refs #5983 feat(itemShelving): add visible
---
modules/item/back/models/item-shelving.json | 3 +++
1 file changed, 3 insertions(+)
diff --git a/modules/item/back/models/item-shelving.json b/modules/item/back/models/item-shelving.json
index 49bebcb6b..be379adca 100644
--- a/modules/item/back/models/item-shelving.json
+++ b/modules/item/back/models/item-shelving.json
@@ -23,6 +23,9 @@
},
"isChecked": {
"type": "boolean"
+ },
+ "visible": {
+ "type": "number"
}
},
"relations": {
From 85c017431ce9c199bfa0f7f5a1e394cd43b8931f Mon Sep 17 00:00:00 2001
From: sergiodt
Date: Wed, 19 Jul 2023 07:01:43 +0200
Subject: [PATCH 0437/1087] refs #5983 fix(itemShelving): fixtures
---
db/dump/fixtures.sql | 5 -----
1 file changed, 5 deletions(-)
diff --git a/db/dump/fixtures.sql b/db/dump/fixtures.sql
index 670a45778..eaa00a3de 100644
--- a/db/dump/fixtures.sql
+++ b/db/dump/fixtures.sql
@@ -2958,8 +2958,3 @@ INSERT INTO `vn`.`invoiceInSerial` (`code`, `description`, `cplusTerIdNifFk`, `t
INSERT INTO `hedera`.`imageConfig` (`id`, `maxSize`, `useXsendfile`, `url`)
VALUES
(1, 0, 0, 'marvel.com');
-
-/* DELETE ME */
-UPDATE vn.config
- SET mainWarehouseFk=1
- WHERE id=1;
\ No newline at end of file
From b17de86fb1f7f94e6f892f0662ec09d8d5d467f8 Mon Sep 17 00:00:00 2001
From: jorgep
Date: Wed, 19 Jul 2023 12:15:52 +0200
Subject: [PATCH 0438/1087] refs #6043 add ACL
---
db/changes/233001/00-fixACLVehicle.sql | 3 +++
1 file changed, 3 insertions(+)
create mode 100644 db/changes/233001/00-fixACLVehicle.sql
diff --git a/db/changes/233001/00-fixACLVehicle.sql b/db/changes/233001/00-fixACLVehicle.sql
new file mode 100644
index 000000000..6625f0d5c
--- /dev/null
+++ b/db/changes/233001/00-fixACLVehicle.sql
@@ -0,0 +1,3 @@
+INSERT INTO `salix`.`ACL` (`model`,`property`,`accessType`,`permission`,`principalId`)
+ VALUES
+ ('Vehicle','sorted','WRITE','ALLOW','employee');
\ No newline at end of file
From 36c31af455bff82604fd29fee0a397051172de47 Mon Sep 17 00:00:00 2001
From: carlossa
Date: Wed, 19 Jul 2023 12:38:13 +0200
Subject: [PATCH 0439/1087] refs #5690 rounding translate
---
modules/ticket/front/future/index.html | 1 +
modules/ticket/front/index/index.html | 1 +
2 files changed, 2 insertions(+)
diff --git a/modules/ticket/front/future/index.html b/modules/ticket/front/future/index.html
index 742143b27..5119d103b 100644
--- a/modules/ticket/front/future/index.html
+++ b/modules/ticket/front/future/index.html
@@ -125,6 +125,7 @@
diff --git a/modules/ticket/front/index/index.html b/modules/ticket/front/index/index.html
index 3b490a3a9..26e5553ed 100644
--- a/modules/ticket/front/index/index.html
+++ b/modules/ticket/front/index/index.html
@@ -77,6 +77,7 @@
From 7cff0149887a1eb09d586a51212798caa97d570a Mon Sep 17 00:00:00 2001
From: sergiodt
Date: Wed, 19 Jul 2023 13:27:31 +0200
Subject: [PATCH 0440/1087] refs #5983 fix(itemShelving): vn
---
.../233001/00-itemShelving_inventory.sql | 26 +++++++++----------
1 file changed, 13 insertions(+), 13 deletions(-)
diff --git a/db/changes/233001/00-itemShelving_inventory.sql b/db/changes/233001/00-itemShelving_inventory.sql
index c66ad69e9..b0b080ef3 100644
--- a/db/changes/233001/00-itemShelving_inventory.sql
+++ b/db/changes/233001/00-itemShelving_inventory.sql
@@ -14,14 +14,14 @@ BEGIN
DECLARE vPickingOrderTo INT;
SELECT p.sectorFk, p.pickingOrder INTO vSectorFk, vPickingOrderFrom
- FROM vn.parking p
+ FROM parking p
WHERE p.code = vParkingFromFk COLLATE 'utf8mb3_general_ci';
SELECT p.pickingOrder INTO vPickingOrderTo
- FROM vn.parking p
+ FROM parking p
WHERE p.code = vParkingToFk COLLATE 'utf8mb3_general_ci';
- CALL vn.visible_getMisfit(vSectorFk);
+ CALL visible_getMisfit(vSectorFk);
SELECT ish.id,
p.pickingOrder,
@@ -39,19 +39,19 @@ BEGIN
WHEN sm.visible > sm.parked THEN 1
ELSE 2
END priority
- FROM vn.itemShelving ish
- JOIN vn.item i ON i.id = ish.itemFk
- JOIN vn.itemType it ON it.id = i.typeFk
+ FROM itemShelving ish
+ JOIN item i ON i.id = ish.itemFk
+ JOIN itemType it ON it.id = i.typeFk
JOIN tmp.stockMisfit sm ON sm.itemFk = ish.itemFk
- JOIN vn.shelving sh ON sh.code = ish.shelvingFk
- JOIN vn.parking p ON p.id = sh.parkingFk
+ JOIN shelving sh ON sh.code = ish.shelvingFk
+ JOIN parking p ON p.id = sh.parkingFk
JOIN (SELECT s.itemFk, sum(s.quantity) notPrepared
- FROM vn.sale s
- JOIN vn.ticket t ON t.id = s.ticketFk
- JOIN vn.warehouse w ON w.id = t.warehouseFk
- JOIN vn.config c ON c.mainWarehouseFk = w.id
+ FROM sale s
+ JOIN ticket t ON t.id = s.ticketFk
+ JOIN warehouse w ON w.id = t.warehouseFk
+ JOIN config c ON c.mainWarehouseFk = w.id
WHERE t.shipped BETWEEN util.VN_CURDATE()
- AND util.VN_CURDATE() + INTERVAL 23 HOUR
+ AND util.dayEnd(util.VN_CURDATE())
AND s.isPicked = FALSE
GROUP BY s.itemFk) s ON s.itemFk = i.id
JOIN hedera.imageConfig ic
From 2c79056f3464b4f526a72143567f948e7e4a831f Mon Sep 17 00:00:00 2001
From: alexm
Date: Wed, 19 Jul 2023 13:44:04 +0200
Subject: [PATCH 0441/1087] refs #5976 error extended
---
loopback/locale/en.json | 3 ++-
loopback/locale/es.json | 2 +-
modules/route/front/roadmap/index/index.js | 2 --
modules/ticket/back/methods/ticket/setDeleted.js | 4 ++--
modules/ticket/back/methods/ticket/transferSales.js | 12 ++++--------
5 files changed, 9 insertions(+), 14 deletions(-)
diff --git a/loopback/locale/en.json b/loopback/locale/en.json
index 030afbe9e..dde24ddc6 100644
--- a/loopback/locale/en.json
+++ b/loopback/locale/en.json
@@ -178,5 +178,6 @@
"The renew period has not been exceeded": "The renew period has not been exceeded",
"You can not use the same password": "You can not use the same password",
"Valid priorities": "Valid priorities: %d",
- "Negative basis of tickets": "Negative basis of tickets: {{ticketsIds}}"
+ "Negative basis of tickets": "Negative basis of tickets: {{ticketsIds}}",
+ "This ticket cannot be left empty.": "This ticket cannot be left empty. %s"
}
diff --git a/loopback/locale/es.json b/loopback/locale/es.json
index 16b0af7f5..c12b980fa 100644
--- a/loopback/locale/es.json
+++ b/loopback/locale/es.json
@@ -306,5 +306,5 @@
"Valid priorities": "Prioridades válidas: %d",
"Negative basis of tickets": "Base negativa para los tickets: {{ticketsIds}}",
"You cannot assign an alias that you are not assigned to": "No puede asignar un alias que no tenga asignado",
- "This ticket cannot be left empty.": "Este ticket no se puede dejar vacío. %d"
+ "This ticket cannot be left empty.": "Este ticket no se puede dejar vacío. %s"
}
diff --git a/modules/route/front/roadmap/index/index.js b/modules/route/front/roadmap/index/index.js
index 3ffc5b4b1..c5f5ef9d1 100644
--- a/modules/route/front/roadmap/index/index.js
+++ b/modules/route/front/roadmap/index/index.js
@@ -46,8 +46,6 @@ class Controller extends Section {
}
deleteRoadmaps() {
- console.log(this.checked);
-
for (const roadmap of this.checked) {
this.$http.delete(`Roadmaps/${roadmap.id}`)
.then(() => this.$.model.refresh())
diff --git a/modules/ticket/back/methods/ticket/setDeleted.js b/modules/ticket/back/methods/ticket/setDeleted.js
index 46c0add6b..878cce056 100644
--- a/modules/ticket/back/methods/ticket/setDeleted.js
+++ b/modules/ticket/back/methods/ticket/setDeleted.js
@@ -41,8 +41,8 @@ module.exports = Self => {
const isEditable = await Self.isEditable(ctx, id, myOptions);
- throw new UserError(`The sales of this ticket can't be modified`);
- // if (!isEditable)
+ if (!isEditable)
+ throw new UserError(`The sales of this ticket can't be modified`);
// Check if ticket has refunds
const ticketRefunds = await models.TicketRefund.find({
diff --git a/modules/ticket/back/methods/ticket/transferSales.js b/modules/ticket/back/methods/ticket/transferSales.js
index 2e4bf023d..de52e2f18 100644
--- a/modules/ticket/back/methods/ticket/transferSales.js
+++ b/modules/ticket/back/methods/ticket/transferSales.js
@@ -79,9 +79,9 @@ module.exports = Self => {
const saleIds = sales.map(sale => sale.id);
- // const hasClaimedSales = await models.ClaimBeginning.findOne({where: {saleFk: {inq: saleIds}}});
- // if (ticketId != id && hasClaimedSales)
- // throw new UserError(`Can't transfer claimed sales`);
+ const hasClaimedSales = await models.ClaimBeginning.findOne({where: {saleFk: {inq: saleIds}}});
+ if (ticketId != id && hasClaimedSales)
+ throw new UserError(`Can't transfer claimed sales`);
for (const sale of sales) {
const originalSale = map.get(sale.id);
@@ -101,14 +101,11 @@ module.exports = Self => {
try {
await models.Ticket.setDeleted(ctx, id, myOptions);
} catch (e) {
- console.log('e:', e);
- console.log('e.message:', e.message);
- console.log('e translation:', $t(e.message, {}));
if (e.statusCode === 400) {
throw new UserError(
`This ticket cannot be left empty.`,
'TRANSFER_SET_DELETED',
- $t(e.message)
+ $t(e.message, ...e.translateArgs)
);
}
throw e;
@@ -120,7 +117,6 @@ module.exports = Self => {
return {id: ticketId};
} catch (e) {
if (tx) await tx.rollback();
- console.log('e.UserError:', e);
throw e;
}
};
From b188ae6f570d406cf01664dc9e98706f2ae3c1f1 Mon Sep 17 00:00:00 2001
From: alexm
Date: Wed, 19 Jul 2023 14:14:35 +0200
Subject: [PATCH 0442/1087] refs #5976 fix: e2e
---
db/changes/233001/00-setDeleted_acl.sql | 2 +-
e2e/paths/05-ticket/14_create_ticket.spec.js | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/db/changes/233001/00-setDeleted_acl.sql b/db/changes/233001/00-setDeleted_acl.sql
index 1030965dd..cdeff9522 100644
--- a/db/changes/233001/00-setDeleted_acl.sql
+++ b/db/changes/233001/00-setDeleted_acl.sql
@@ -1,5 +1,5 @@
UPDATE `salix`.`ACL`
- SET principalId='salesperson'
+ SET principalId='salesPerson'
WHERE
model='Ticket'
AND property='setDeleted'
diff --git a/e2e/paths/05-ticket/14_create_ticket.spec.js b/e2e/paths/05-ticket/14_create_ticket.spec.js
index 80c288a01..1f9c0c40a 100644
--- a/e2e/paths/05-ticket/14_create_ticket.spec.js
+++ b/e2e/paths/05-ticket/14_create_ticket.spec.js
@@ -10,7 +10,7 @@ describe('Ticket create path', () => {
beforeAll(async() => {
browser = await getBrowser();
page = browser.page;
- await page.loginAndModule('employee', 'ticket');
+ await page.loginAndModule('salesPerson', 'ticket');
});
afterAll(async() => {
From ab95ef74a945c4c232f2cb6a9a73c9c51f767147 Mon Sep 17 00:00:00 2001
From: vicent
Date: Thu, 20 Jul 2023 07:17:35 +0200
Subject: [PATCH 0443/1087] refs #5934 refactor: nombres variables
---
db/changes/233001/00-clientSms.sql | 6 +++---
modules/client/back/models/client-sms.json | 3 ---
modules/client/front/sms/index.html | 4 ++--
3 files changed, 5 insertions(+), 8 deletions(-)
diff --git a/db/changes/233001/00-clientSms.sql b/db/changes/233001/00-clientSms.sql
index 353041ad9..e1e34f6b2 100644
--- a/db/changes/233001/00-clientSms.sql
+++ b/db/changes/233001/00-clientSms.sql
@@ -7,9 +7,9 @@ CREATE TABLE `vn`.`clientSms` (
KEY `clientSms_FK_1` (`smsFk`),
CONSTRAINT `clientSms_FK` FOREIGN KEY (`clientFk`) REFERENCES `client` (`id`) ON UPDATE CASCADE,
CONSTRAINT `clientSms_FK_1` FOREIGN KEY (`smsFk`) REFERENCES `sms` (`id`) ON UPDATE CASCADE
-) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`)
VALUES
- ('ClientSms', '*', 'READ', 'ALLOW', 'ROLE', 'employee'),
- ('ClientSms', '*', 'WRITE', 'ALLOW', 'ROLE', 'employee');
+ ('ClientSms', 'find', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('ClientSms', 'create', 'WRITE', 'ALLOW', 'ROLE', 'employee');
diff --git a/modules/client/back/models/client-sms.json b/modules/client/back/models/client-sms.json
index 18d7ad051..b2244ebbb 100644
--- a/modules/client/back/models/client-sms.json
+++ b/modules/client/back/models/client-sms.json
@@ -14,9 +14,6 @@
},
"clientFk": {
"type": "number"
- },
- "smsFk": {
- "type": "number"
}
},
"relations": {
diff --git a/modules/client/front/sms/index.html b/modules/client/front/sms/index.html
index 3331f217b..9abadd312 100644
--- a/modules/client/front/sms/index.html
+++ b/modules/client/front/sms/index.html
@@ -3,7 +3,7 @@
url="ClientSms"
link="{clientFk: $ctrl.$params.id}"
filter="::$ctrl.filter"
- data="clientSmss"
+ data="clientSmsList"
limit="20"
auto-load="true">
@@ -20,7 +20,7 @@
-
+
{{::clientSms.sms.sender.name}}
From b13618529aebd455f42d1285dbe59e2c6313549a Mon Sep 17 00:00:00 2001
From: vicent
Date: Thu, 20 Jul 2023 07:21:38 +0200
Subject: [PATCH 0444/1087] =?UTF-8?q?refs=20#5849=20delete:=20traducci?=
=?UTF-8?q?=C3=B3n=20erronea?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
loopback/locale/en.json | 1 -
1 file changed, 1 deletion(-)
diff --git a/loopback/locale/en.json b/loopback/locale/en.json
index 5c7c10967..030afbe9e 100644
--- a/loopback/locale/en.json
+++ b/loopback/locale/en.json
@@ -177,7 +177,6 @@
"Mail not sent": "There has been an error sending the invoice to the client [{{clientId}}]({{{clientUrl}}}), please check the email address",
"The renew period has not been exceeded": "The renew period has not been exceeded",
"You can not use the same password": "You can not use the same password",
- "The company has not informed the supplier account for bank transfers": "La empresa no tiene informado la cuenta de proveedor para transferencias bancarias",
"Valid priorities": "Valid priorities: %d",
"Negative basis of tickets": "Negative basis of tickets: {{ticketsIds}}"
}
From 60e75d7825cfdc9c5222700ac0f36cf3d92101e0 Mon Sep 17 00:00:00 2001
From: alexm
Date: Thu, 20 Jul 2023 08:23:43 +0200
Subject: [PATCH 0445/1087] refs #5837 fix client condition
---
modules/client/back/models/client.js | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/modules/client/back/models/client.js b/modules/client/back/models/client.js
index 163d51fc5..8369fa906 100644
--- a/modules/client/back/models/client.js
+++ b/modules/client/back/models/client.js
@@ -41,6 +41,9 @@ module.exports = Self => {
});
async function socialNameIsUnique(err, done) {
+ if (!this.countryFk)
+ return done();
+
const filter = {
include: {
relation: 'country',
@@ -59,13 +62,11 @@ module.exports = Self => {
}
};
- const existingClient = await Self.app.models.Client.findOne(filter);
+ const client = await Self.app.models.Country.findById(this.countryFk, {fields: ['isSocialNameUnique']});
+ const existingClient = await Self.findOne(filter);
- if (existingClient) {
- // eslint-disable-next-line max-len
- if (existingClient.country().isSocialNameUnique && this.socialName === existingClient.socialName)
- err();
- }
+ if (existingClient && (existingClient.country().isSocialNameUnique || client.isSocialNameUnique))
+ err();
done();
}
From 0585080303f72750987698c299e4d716ca13890f Mon Sep 17 00:00:00 2001
From: alexm
Date: Thu, 20 Jul 2023 09:26:40 +0200
Subject: [PATCH 0446/1087] refs #6011 deploy 2330 version
---
CHANGELOG.md | 5 +++++
db/changes/232401/00-ACLgetVehiclesSorted.sql | 3 ---
db/changes/{232801 => 233001}/00-roadmap.sql | 2 --
db/changes/{232801 => 233001}/00-roadmapACL.sql | 0
4 files changed, 5 insertions(+), 5 deletions(-)
delete mode 100644 db/changes/232401/00-ACLgetVehiclesSorted.sql
rename db/changes/{232801 => 233001}/00-roadmap.sql (69%)
rename db/changes/{232801 => 233001}/00-roadmapACL.sql (100%)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 76527ac83..847275825 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,8 +8,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [2330.01] - 2023-07-27
### Added
+- (Artículos -> Vista Previa) Añadido campo "Plástico reciclado"
+- (Rutas -> Troncales) Nueva sección
+- (Tickets -> Opciones) Opción establecer peso
### Changed
+- (General -> Iconos) Añadidos nuevos iconos
+
### Fixed
diff --git a/db/changes/232401/00-ACLgetVehiclesSorted.sql b/db/changes/232401/00-ACLgetVehiclesSorted.sql
deleted file mode 100644
index 6625f0d5c..000000000
--- a/db/changes/232401/00-ACLgetVehiclesSorted.sql
+++ /dev/null
@@ -1,3 +0,0 @@
-INSERT INTO `salix`.`ACL` (`model`,`property`,`accessType`,`permission`,`principalId`)
- VALUES
- ('Vehicle','sorted','WRITE','ALLOW','employee');
\ No newline at end of file
diff --git a/db/changes/232801/00-roadmap.sql b/db/changes/233001/00-roadmap.sql
similarity index 69%
rename from db/changes/232801/00-roadmap.sql
rename to db/changes/233001/00-roadmap.sql
index a2835160f..9b5db54eb 100644
--- a/db/changes/232801/00-roadmap.sql
+++ b/db/changes/233001/00-roadmap.sql
@@ -6,5 +6,3 @@ ALTER TABLE `vn`.`roadmap` CHANGE name name varchar(45) CHARACTER SET utf8mb3 CO
ALTER TABLE `vn`.`roadmap` MODIFY COLUMN etd datetime NOT NULL;
ALTER TABLE `vn`.`expeditionTruck` COMMENT='Distintas paradas que hacen los trocales';
-ALTER TABLE `vn`.`expeditionTruck` DROP FOREIGN KEY expeditionTruck_FK_2;
-ALTER TABLE `vn`.`expeditionTruck` ADD CONSTRAINT expeditionTruck_FK_2 FOREIGN KEY (roadmapFk) REFERENCES vn.roadmap(id) ON DELETE CASCADE ON UPDATE CASCADE;
diff --git a/db/changes/232801/00-roadmapACL.sql b/db/changes/233001/00-roadmapACL.sql
similarity index 100%
rename from db/changes/232801/00-roadmapACL.sql
rename to db/changes/233001/00-roadmapACL.sql
From 071a891d30079e13792765a7578b5aae03da6ee2 Mon Sep 17 00:00:00 2001
From: alexm
Date: Thu, 20 Jul 2023 09:30:18 +0200
Subject: [PATCH 0447/1087] refs #6011 add changelog
---
CHANGELOG.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 847275825..d5928e9c4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -11,9 +11,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- (Artículos -> Vista Previa) Añadido campo "Plástico reciclado"
- (Rutas -> Troncales) Nueva sección
- (Tickets -> Opciones) Opción establecer peso
+- (Clientes -> SMS) Nueva sección
### Changed
- (General -> Iconos) Añadidos nuevos iconos
+- (Clientes -> Razón social) Nuevas restricciones por pais
### Fixed
From 75ea5942729af3e528157f6b946ef0d3679596e7 Mon Sep 17 00:00:00 2001
From: alexm
Date: Thu, 20 Jul 2023 09:32:52 +0200
Subject: [PATCH 0448/1087] refs #6011 deploy(2332): init version
---
CHANGELOG.md | 9 +++++++++
db/changes/233201/.gitkeep | 0
package-lock.json | 2 +-
package.json | 2 +-
4 files changed, 11 insertions(+), 2 deletions(-)
create mode 100644 db/changes/233201/.gitkeep
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d5928e9c4..d4a1e147f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,15 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## [2330.01] - 2023-07-27
+
+### Added
+
+### Changed
+
+### Fixed
+
+
## [2330.01] - 2023-07-27
### Added
diff --git a/db/changes/233201/.gitkeep b/db/changes/233201/.gitkeep
new file mode 100644
index 000000000..e69de29bb
diff --git a/package-lock.json b/package-lock.json
index ee6d4e0fa..5506075b9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "salix-back",
- "version": "23.30.01",
+ "version": "23.32.01",
"lockfileVersion": 2,
"requires": true,
"packages": {
diff --git a/package.json b/package.json
index 66e341ad5..37e39d5a5 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "salix-back",
- "version": "23.30.01",
+ "version": "23.32.01",
"author": "Verdnatura Levante SL",
"description": "Salix backend",
"license": "GPL-3.0",
From a6b8f4ddf88a5960e9dda46a89b06129942bcba0 Mon Sep 17 00:00:00 2001
From: vicent
Date: Thu, 20 Jul 2023 09:46:25 +0200
Subject: [PATCH 0449/1087] refs #5244 fix: tfront
---
front/core/lib/component.js | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/front/core/lib/component.js b/front/core/lib/component.js
index 6bb83e55a..5695d9449 100644
--- a/front/core/lib/component.js
+++ b/front/core/lib/component.js
@@ -12,9 +12,10 @@ export default class Component extends EventEmitter {
* @param {HTMLElement} $element The main component element
* @param {$rootScope.Scope} $scope The element scope
* @param {Function} $transclude The transclusion function
+ * @param {Function} $location The location function
*/
- constructor($element, $scope, $transclude) {
- super();
+ constructor($element, $scope, $transclude, $location) {
+ super($element, $scope, $transclude, $location);
this.$ = $scope;
if (!$element) return;
@@ -164,7 +165,7 @@ export default class Component extends EventEmitter {
$transclude.$$boundTransclude.$$slots[slot];
}
}
-Component.$inject = ['$element', '$scope', '$transclude'];
+Component.$inject = ['$element', '$scope', '$location', '$state'];
/*
* Automatically adds the most used services to the prototype, so they are
From d6a27741b53c30de3999faa81212867c674ba427 Mon Sep 17 00:00:00 2001
From: vicent
Date: Thu, 20 Jul 2023 09:50:56 +0200
Subject: [PATCH 0450/1087] a
---
.../back/methods/worker/getItemTypeWorker.js | 65 -------------------
1 file changed, 65 deletions(-)
delete mode 100644 modules/worker/back/methods/worker/getItemTypeWorker.js
diff --git a/modules/worker/back/methods/worker/getItemTypeWorker.js b/modules/worker/back/methods/worker/getItemTypeWorker.js
deleted file mode 100644
index b1f49ae99..000000000
--- a/modules/worker/back/methods/worker/getItemTypeWorker.js
+++ /dev/null
@@ -1,65 +0,0 @@
-const ParameterizedSQL = require('loopback-connector').ParameterizedSQL;
-const buildFilter = require('vn-loopback/util/filter').buildFilter;
-const mergeFilters = require('vn-loopback/util/filter').mergeFilters;
-
-module.exports = Self => {
- Self.remoteMethod('getItemTypeWorker', {
- description: 'Returns the workers that appear in itemType',
- accessType: 'READ',
- accepts: [{
- arg: 'filter',
- type: 'Object',
- description: 'Filter defining where and paginated data',
- required: true
- }],
- returns: {
- type: ['object'],
- root: true
- },
- http: {
- path: `/getItemTypeWorker`,
- verb: 'GET'
- }
- });
-
- Self.getItemTypeWorker = async(filter, options) => {
- const myOptions = {};
- const conn = Self.dataSource.connector;
-
- if (typeof options == 'object')
- Object.assign(myOptions, options);
-
- const query =
- `SELECT DISTINCT u.id, w.firstName, w.lastName, u.nickname, u.name
- FROM itemType it
- JOIN worker w ON w.id = it.workerFk
- JOIN account.user u ON u.id = w.id`;
-
- let stmt = new ParameterizedSQL(query);
-
- let clientFilter = Object.assign({}, filter);
- clientFilter.where = buildFilter(filter.where, (param, value) => {
- switch (param) {
- case 'role':
- return {'r.name': value};
- case 'firstName':
- return {or: [
- {'w.firstName': {like: `%${value}%`}},
- {'w.lastName': {like: `%${value}%`}},
- {'u.name': {like: `%${value}%`}},
- {'u.nickname': {like: `%${value}%`}}
- ]};
- case 'id':
- return {'w.id': value};
- }
- });
-
- let myFilter = {
- where: {'u.active': true}
- };
-
- myFilter = mergeFilters(myFilter, clientFilter);
- stmt.merge(conn.makeSuffix(myFilter));
- return conn.executeStmt(stmt);
- };
-};
From 7312ed9cc4dbea12b624be248b786e29e2aa2052 Mon Sep 17 00:00:00 2001
From: vicent
Date: Thu, 20 Jul 2023 09:56:07 +0200
Subject: [PATCH 0451/1087] refs #5244 fix back test
---
.../methods/ticket-request/specs/getItemTypeWorkers.spec.js | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/modules/ticket/back/methods/ticket-request/specs/getItemTypeWorkers.spec.js b/modules/ticket/back/methods/ticket-request/specs/getItemTypeWorkers.spec.js
index ae5c508b6..c57451c26 100644
--- a/modules/ticket/back/methods/ticket-request/specs/getItemTypeWorkers.spec.js
+++ b/modules/ticket/back/methods/ticket-request/specs/getItemTypeWorkers.spec.js
@@ -1,12 +1,10 @@
const models = require('vn-loopback/server/server').models;
describe('ticket-request getItemTypeWorker()', () => {
- const ctx = {req: {accessToken: {userId: 18}}};
-
it('should return the buyer as result', async() => {
const filter = {where: {firstName: 'buyer'}};
- const result = await models.TicketRequest.getItemTypeWorker(ctx, filter);
+ const result = await models.TicketRequest.getItemTypeWorker(filter);
expect(result.length).toEqual(1);
});
@@ -14,7 +12,7 @@ describe('ticket-request getItemTypeWorker()', () => {
it('should return the workers at itemType as result', async() => {
const filter = {};
- const result = await models.TicketRequest.getItemTypeWorker(ctx, filter);
+ const result = await models.TicketRequest.getItemTypeWorker(filter);
expect(result.length).toBeGreaterThan(1);
});
From 9db8ae237fcbb9fce120af1f237d7b6496338fd7 Mon Sep 17 00:00:00 2001
From: jorgep
Date: Thu, 20 Jul 2023 10:19:03 +0200
Subject: [PATCH 0452/1087] refs #5866 addBackTransferClient
---
db/changes/233001/00-transferClient.sql | 2 +
.../back/methods/ticket/transferClient.js | 69 +++++++++++++++++++
modules/ticket/back/models/ticket-methods.js | 1 +
modules/ticket/front/descriptor-menu/index.js | 8 +++
4 files changed, 80 insertions(+)
create mode 100644 db/changes/233001/00-transferClient.sql
create mode 100644 modules/ticket/back/methods/ticket/transferClient.js
diff --git a/db/changes/233001/00-transferClient.sql b/db/changes/233001/00-transferClient.sql
new file mode 100644
index 000000000..8a7ce0543
--- /dev/null
+++ b/db/changes/233001/00-transferClient.sql
@@ -0,0 +1,2 @@
+INSERT INTO `salix`.`ACL` (`model`,`property`,`accessType`,`permission`,`principalType`,`principalId`)
+ VALUES ('Ticket','transferClient','WRITE','ALLOW','ROLE','administrative');
\ No newline at end of file
diff --git a/modules/ticket/back/methods/ticket/transferClient.js b/modules/ticket/back/methods/ticket/transferClient.js
new file mode 100644
index 000000000..226f5dedf
--- /dev/null
+++ b/modules/ticket/back/methods/ticket/transferClient.js
@@ -0,0 +1,69 @@
+const UserError = require('vn-loopback/util/user-error');
+module.exports = Self => {
+ Self.remoteMethodCtx('transferClient', {
+ description: 'Transfering ticket to another client',
+ accessType: 'WRITE',
+ accepts: [
+ {
+ arg: 'id',
+ type: 'number',
+ required: true,
+ description: 'the ticket id',
+ http: {source: 'path'}
+ },
+ {
+ arg: 'data',
+ type: 'object',
+ required: true,
+ description: 'the client id',
+ http: {source: 'body'}
+ },
+ ],
+ returns: {
+ type: 'boolean',
+ root: true
+ },
+ http: {
+ path: `/:id/transferClient`,
+ verb: 'PATCH'
+ }
+ });
+
+ Self.transferClient = async(ctx, ticketId, params) => {
+ const models = Self.app.models;
+ const args = ctx.args;
+ const myOptions = {};
+ try {
+ const clientId = params.clientId;
+ const isEditable = await Self.isEditable(ctx, args.id, myOptions);
+ console.log('es editable?',isEditable) // Revisar
+ /* if (!isEditable){
+ console.log('no es editable!')
+ throw new UserError(`The sales of this ticket can't be modified`);
+ } */
+
+ const ticket = await models.Ticket.findById(ticketId, myOptions);
+ console.log('ticket',ticket);
+ if(!ticket) return false;
+ const nparams = {
+ clientFk: clientId,
+ addressFk: ticket.addressFk,
+ }
+
+ const promise = await ticket.updateAttributes(nparams);
+ console.log('promise', promise);
+ if(promise) return true;
+ } catch (error) {
+ console.log(error);
+ }
+
+ /* if (typeof options == 'object')
+ Object.assign(myOptions, options);
+
+ const ticket = await Self.findById(id, {
+ fields: ['isDeleted', 'refFk']
+ }, myOptions); */
+
+ return false;
+ };
+};
\ No newline at end of file
diff --git a/modules/ticket/back/models/ticket-methods.js b/modules/ticket/back/models/ticket-methods.js
index f0c85ecc4..b432c9f6b 100644
--- a/modules/ticket/back/models/ticket-methods.js
+++ b/modules/ticket/back/models/ticket-methods.js
@@ -19,6 +19,7 @@ module.exports = function(Self) {
require('../methods/ticket/uploadFile')(Self);
require('../methods/ticket/addSale')(Self);
require('../methods/ticket/transferSales')(Self);
+ require('../methods/ticket/transferClient')(Self);
require('../methods/ticket/recalculateComponents')(Self);
require('../methods/ticket/sendSms')(Self);
require('../methods/ticket/isLocked')(Self);
diff --git a/modules/ticket/front/descriptor-menu/index.js b/modules/ticket/front/descriptor-menu/index.js
index 0fc8488ca..019ae4fa6 100644
--- a/modules/ticket/front/descriptor-menu/index.js
+++ b/modules/ticket/front/descriptor-menu/index.js
@@ -96,6 +96,14 @@ class Controller extends Section {
}
transferClient() {
+ const ticket = this.ticket;
+ const clientId = ticket.client.id;
+ console.log('ticketId',ticket.id)
+ console.log('clientId',clientId);
+ this.$http.patch(`Tickets/${ticket.id}/transferClient`, {clientId}).then(() =>{
+ this.vnApp.showSuccess(this.$t('Data saved!'));
+ this.reload();
+ })
this.$http.get(`Clients/${this.ticket.client.id}`).then(client => {
const ticket = this.ticket;
From 2f27f32c45c64034f538b0feb1dad99f301cb388 Mon Sep 17 00:00:00 2001
From: vicent
Date: Thu, 20 Jul 2023 11:26:48 +0200
Subject: [PATCH 0453/1087] refs #5244 fix: e2e
---
e2e/helpers/extensions.js | 2 ++
e2e/helpers/selectors.js | 14 +++++++-------
e2e/paths/05-ticket/05_tracking_state.spec.js | 2 +-
3 files changed, 10 insertions(+), 8 deletions(-)
diff --git a/e2e/helpers/extensions.js b/e2e/helpers/extensions.js
index fe3ef08bd..b6ea32a6c 100644
--- a/e2e/helpers/extensions.js
+++ b/e2e/helpers/extensions.js
@@ -632,6 +632,7 @@ let actions = {
await this.write(selector, value.toString());
break;
case 'vn-autocomplete':
+ case 'vn-worker-autocomplete':
if (value)
await this.autocompleteSearch(selector, value.toString());
else
@@ -667,6 +668,7 @@ let actions = {
switch (tagName) {
case 'vn-textfield':
case 'vn-autocomplete':
+ case 'vn-worker-autocomplete':
case 'vn-input-time':
case 'vn-datalist':
el = await input.$('input');
diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js
index 977c8a837..3302280e3 100644
--- a/e2e/helpers/selectors.js
+++ b/e2e/helpers/selectors.js
@@ -187,7 +187,7 @@ export default {
country: 'vn-client-create vn-autocomplete[ng-model="$ctrl.client.countryFk"]',
userName: 'vn-client-create vn-textfield[ng-model="$ctrl.client.userName"]',
email: 'vn-client-create vn-textfield[ng-model="$ctrl.client.email"]',
- salesPerson: 'vn-client-create vn-autocomplete[ng-model="$ctrl.client.salesPersonFk"]',
+ salesPerson: 'vn-client-create vn-worker-autocomplete[ng-model="$ctrl.client.salesPersonFk"]',
saveNewProvicenButton: '#saveProvince',
saveNewCityButton: '#saveCity',
saveNewPoscode: '#savePostcode',
@@ -199,7 +199,7 @@ export default {
email: 'vn-client-basic-data vn-textfield[ng-model="$ctrl.client.email"]',
phone: 'vn-client-basic-data vn-textfield[ng-model="$ctrl.client.phone"]',
mobile: 'vn-client-basic-data vn-textfield[ng-model="$ctrl.client.mobile"]',
- salesPerson: 'vn-client-basic-data vn-autocomplete[ng-model="$ctrl.client.salesPersonFk"]',
+ salesPerson: 'vn-client-basic-data vn-worker-autocomplete[ng-model="$ctrl.client.salesPersonFk"]',
channel: 'vn-client-basic-data vn-autocomplete[ng-model="$ctrl.client.contactChannelFk"]',
transferor: 'vn-client-basic-data vn-autocomplete[ng-model="$ctrl.client.transferorFk"]',
businessType: 'vn-client-basic-data vn-autocomplete[ng-model="$ctrl.client.businessTypeFk"]',
@@ -735,7 +735,7 @@ export default {
},
createStateView: {
state: 'vn-autocomplete[ng-model="$ctrl.stateFk"]',
- worker: 'vn-autocomplete[ng-model="$ctrl.workerFk"]',
+ worker: 'vn-worker-autocomplete[ng-model="$ctrl.workerFk"]',
saveStateButton: `button[type=submit]`
},
claimsIndex: {
@@ -781,12 +781,12 @@ export default {
firstClaimReason: 'vn-claim-development vn-horizontal:nth-child(1) vn-autocomplete[ng-model="claimDevelopment.claimReasonFk"]',
firstClaimResult: 'vn-claim-development vn-horizontal:nth-child(1) vn-autocomplete[ng-model="claimDevelopment.claimResultFk"]',
firstClaimResponsible: 'vn-claim-development vn-horizontal:nth-child(1) vn-autocomplete[ng-model="claimDevelopment.claimResponsibleFk"]',
- firstClaimWorker: 'vn-claim-development vn-horizontal:nth-child(1) vn-autocomplete[ng-model="claimDevelopment.workerFk"]',
+ firstClaimWorker: 'vn-claim-development vn-horizontal:nth-child(1) vn-worker-autocomplete[ng-model="claimDevelopment.workerFk"]',
firstClaimRedelivery: 'vn-claim-development vn-horizontal:nth-child(1) vn-autocomplete[ng-model="claimDevelopment.claimRedeliveryFk"]',
secondClaimReason: 'vn-claim-development vn-horizontal:nth-child(2) vn-autocomplete[ng-model="claimDevelopment.claimReasonFk"]',
secondClaimResult: 'vn-claim-development vn-horizontal:nth-child(2) vn-autocomplete[ng-model="claimDevelopment.claimResultFk"]',
secondClaimResponsible: 'vn-claim-development vn-horizontal:nth-child(2) vn-autocomplete[ng-model="claimDevelopment.claimResponsibleFk"]',
- secondClaimWorker: 'vn-claim-development vn-horizontal:nth-child(2) vn-autocomplete[ng-model="claimDevelopment.workerFk"]',
+ secondClaimWorker: 'vn-claim-development vn-horizontal:nth-child(2) vn-worker-autocomplete[ng-model="claimDevelopment.workerFk"]',
secondClaimRedelivery: 'vn-claim-development vn-horizontal:nth-child(2) vn-autocomplete[ng-model="claimDevelopment.claimRedeliveryFk"]',
saveDevelopmentButton: 'button[type=submit]'
},
@@ -854,7 +854,7 @@ export default {
},
createRouteView: {
- worker: 'vn-route-create vn-autocomplete[ng-model="$ctrl.route.workerFk"]',
+ worker: 'vn-route-create vn-worker-autocomplete[ng-model="$ctrl.route.workerFk"]',
createdDatePicker: 'vn-route-create vn-date-picker[ng-model="$ctrl.route.created"]',
vehicleAuto: 'vn-route-create vn-autocomplete[ng-model="$ctrl.route.vehicleFk"]',
agency: 'vn-route-create vn-autocomplete[ng-model="$ctrl.route.agencyModeFk"]',
@@ -976,7 +976,7 @@ export default {
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"]',
+ boss: 'vn-worker-create vn-worker-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"]',
createButton: 'vn-worker-create vn-submit[label="Create"]',
diff --git a/e2e/paths/05-ticket/05_tracking_state.spec.js b/e2e/paths/05-ticket/05_tracking_state.spec.js
index 949c9a8e6..9ac373287 100644
--- a/e2e/paths/05-ticket/05_tracking_state.spec.js
+++ b/e2e/paths/05-ticket/05_tracking_state.spec.js
@@ -59,7 +59,7 @@ describe('Ticket Create new tracking state path', () => {
const result = await page
.waitToGetProperty(selectors.createStateView.worker, 'value');
- expect(result).toEqual('salesPersonNick');
+ expect(result).toEqual('salesPerson');
});
it(`should succesfully create a valid state`, async() => {
From 7d2e98267f4d66afc3e3a9d823c9da60558f935d Mon Sep 17 00:00:00 2001
From: vicent
Date: Thu, 20 Jul 2023 15:09:31 +0200
Subject: [PATCH 0454/1087] =?UTF-8?q?refs=20#5561=20eliminados=20valores?=
=?UTF-8?q?=20a=20pi=C3=B1on?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
db/changes/232401/00-saleTracking_new.sql | 38 -------------------
.../{232401 => 233001}/00-aclSaleTracking.sql | 3 +-
.../back/methods/sale-tracking/filter.js | 10 +++--
3 files changed, 9 insertions(+), 42 deletions(-)
delete mode 100644 db/changes/232401/00-saleTracking_new.sql
rename db/changes/{232401 => 233001}/00-aclSaleTracking.sql (63%)
diff --git a/db/changes/232401/00-saleTracking_new.sql b/db/changes/232401/00-saleTracking_new.sql
deleted file mode 100644
index d5fa569fd..000000000
--- a/db/changes/232401/00-saleTracking_new.sql
+++ /dev/null
@@ -1,38 +0,0 @@
-DELIMITER $$
-$$
-CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`saleTracking_new`(
- vSaleFK INT,
- vIsChecked BOOLEAN,
- vOriginalQuantity INT,
- vWorkerFk INT,
- vState VARCHAR(50),
- vIsScanned BOOLEAN)
-BEGIN
-/**
- * Modifica registro de saleTracking
- *
- * @param vSaleFK Identificador del registro a modificar
- * @param vIsChecked Indica si la línea ha sido pulsada
- * @param vOriginalQuantity Cantidad original
- * @param vWorkerFk Identificador del trabajador
- * @param vAction Identificador de la acción realizada
- * @param vState Identificador del estado a modificar
- * @param vIsScanned Identificador si se ha escaneado automáticamente o manual
- */
-
- REPLACE vn.saleTracking(saleFk,
- isChecked,
- originalQuantity,
- workerFk,
- stateFk,
- isScanned)
- SELECT vSaleFK,
- vIsChecked,
- vOriginalQuantity,
- IFNULL(vWorkerFk, vn.getUser()),
- s.id,
- vIsScanned
- FROM vn.state s
- WHERE s.code = vState COLLATE utf8_unicode_ci;
-END$$
-DELIMITER ;
diff --git a/db/changes/232401/00-aclSaleTracking.sql b/db/changes/233001/00-aclSaleTracking.sql
similarity index 63%
rename from db/changes/232401/00-aclSaleTracking.sql
rename to db/changes/233001/00-aclSaleTracking.sql
index 441945fe2..6a699091a 100644
--- a/db/changes/232401/00-aclSaleTracking.sql
+++ b/db/changes/233001/00-aclSaleTracking.sql
@@ -1,3 +1,4 @@
INSERT INTO `salix`.`ACL` (model, property, accessType, permission, principalType, principalId)
VALUES
- ('SaleTracking', 'deleteSaleGroupDetail', 'WRITE', 'ALLOW', 'ROLE', 'employee');
+ ('SaleTracking', 'deleteSaleGroupDetail', 'WRITE', 'ALLOW', 'ROLE', 'employee'),
+ ('SaleTracking', 'replaceOrCreate', 'WRITE', 'ALLOW', 'ROLE', 'employee');
diff --git a/modules/ticket/back/methods/sale-tracking/filter.js b/modules/ticket/back/methods/sale-tracking/filter.js
index ee074a852..09101a47a 100644
--- a/modules/ticket/back/methods/sale-tracking/filter.js
+++ b/modules/ticket/back/methods/sale-tracking/filter.js
@@ -67,9 +67,13 @@ module.exports = Self => {
JOIN vn.sale s ON s.ticketFk = t.id
JOIN vn.item i ON i.id = s.itemFk
LEFT JOIN cache.last_buy lb ON lb.item_id = i.id AND lb.warehouse_id = t.warehouseFk
- LEFT JOIN vn.saleTracking stPrevious ON stPrevious.saleFk = s.id AND stPrevious.stateFk = 26
- LEFT JOIN vn.saleTracking stPrepared ON stPrepared.saleFk = s.id AND stPrepared.stateFk = 14
- LEFT JOIN vn.saleTracking stControled ON stControled.saleFk = s.id AND stControled.stateFk = 8
+ LEFT JOIN vn.state st ON TRUE
+ LEFT JOIN vn.saleTracking stPrevious ON stPrevious.saleFk = s.id
+ AND stPrevious.stateFk = (SELECT id FROM vn.state WHERE code = 'PREVIOUS_PREPARATION')
+ LEFT JOIN vn.saleTracking stPrepared ON stPrepared.saleFk = s.id
+ AND stPrepared.stateFk = (SELECT id FROM vn.state WHERE code = 'PREPARED')
+ LEFT JOIN vn.saleTracking stControled ON stControled.saleFk = s.id
+ AND stControled.stateFk = (SELECT id FROM vn.state s2 WHERE code = 'CHECKED')
LEFT JOIN vn.saleGroupDetail sgd ON sgd.saleFk = s.id
LEFT JOIN vn.saleGroup sg ON sg.id = sgd.saleGroupFk
LEFT JOIN vn.parking p ON p.id = sg.parkingFk
From 618989052a481df85338fa54ec297c0ae57d876c Mon Sep 17 00:00:00 2001
From: jorgep
Date: Thu, 20 Jul 2023 15:15:33 +0200
Subject: [PATCH 0455/1087] refs #5866 fix transferClient and test added
---
.../{233001 => 233201}/00-transferClient.sql | 0
.../ticket/specs/transferClient.spec.js | 49 +++++++++++++++
.../back/methods/ticket/transferClient.js | 60 +++++++------------
modules/ticket/front/descriptor-menu/index.js | 18 +-----
.../front/descriptor-menu/index.spec.js | 13 ----
5 files changed, 71 insertions(+), 69 deletions(-)
rename db/changes/{233001 => 233201}/00-transferClient.sql (100%)
create mode 100644 modules/ticket/back/methods/ticket/specs/transferClient.spec.js
diff --git a/db/changes/233001/00-transferClient.sql b/db/changes/233201/00-transferClient.sql
similarity index 100%
rename from db/changes/233001/00-transferClient.sql
rename to db/changes/233201/00-transferClient.sql
diff --git a/modules/ticket/back/methods/ticket/specs/transferClient.spec.js b/modules/ticket/back/methods/ticket/specs/transferClient.spec.js
new file mode 100644
index 000000000..ed10e5159
--- /dev/null
+++ b/modules/ticket/back/methods/ticket/specs/transferClient.spec.js
@@ -0,0 +1,49 @@
+const models = require('vn-loopback/server/server').models;
+
+describe('Ticket transferClient()', () => {
+ const userId = 9;
+ const activeCtx = {
+ accessToken: {userId: userId},
+ };
+ const ctx = {req: activeCtx};
+
+ it('should throw an error as the ticket is not editable', async() => {
+ const tx = await models.Ticket.beginTransaction({});
+ let error;
+
+ try {
+ const options = {transaction: tx};
+ const ticketId = 4;
+ const clientId = 1;
+ await models.Ticket.transferClient(ctx, ticketId, clientId, options);
+
+ await tx.rollback();
+ } catch (e) {
+ await tx.rollback();
+ error = e;
+ }
+
+ expect(error.message).toEqual(`The current ticket can't be modified`);
+ });
+
+ it('should be assigned a different clientFk', async() => {
+ const tx = await models.Ticket.beginTransaction({});
+ let updatedTicket;
+ const ticketId = 10;
+ const clientId = 1;
+
+ try {
+ const options = {transaction: tx};
+
+ await models.Ticket.transferClient(ctx, ticketId, clientId, options);
+ updatedTicket = await models.Ticket.findById(ticketId, {fields: ['clientFk']}, options);
+
+ await tx.rollback();
+ } catch (e) {
+ await tx.rollback();
+ throw e;
+ }
+
+ expect(updatedTicket.clientFk).toEqual(clientId);
+ });
+});
diff --git a/modules/ticket/back/methods/ticket/transferClient.js b/modules/ticket/back/methods/ticket/transferClient.js
index 226f5dedf..05ea27fa0 100644
--- a/modules/ticket/back/methods/ticket/transferClient.js
+++ b/modules/ticket/back/methods/ticket/transferClient.js
@@ -12,58 +12,38 @@ module.exports = Self => {
http: {source: 'path'}
},
{
- arg: 'data',
- type: 'object',
+ arg: 'clientId',
+ type: 'number',
required: true,
- description: 'the client id',
- http: {source: 'body'}
},
],
- returns: {
- type: 'boolean',
- root: true
- },
http: {
path: `/:id/transferClient`,
verb: 'PATCH'
}
});
- Self.transferClient = async(ctx, ticketId, params) => {
+ Self.transferClient = async(ctx, ticketId, clientId, options) => {
const models = Self.app.models;
- const args = ctx.args;
const myOptions = {};
- try {
- const clientId = params.clientId;
- const isEditable = await Self.isEditable(ctx, args.id, myOptions);
- console.log('es editable?',isEditable) // Revisar
- /* if (!isEditable){
- console.log('no es editable!')
- throw new UserError(`The sales of this ticket can't be modified`);
- } */
-
- const ticket = await models.Ticket.findById(ticketId, myOptions);
- console.log('ticket',ticket);
- if(!ticket) return false;
- const nparams = {
- clientFk: clientId,
- addressFk: ticket.addressFk,
- }
-
- const promise = await ticket.updateAttributes(nparams);
- console.log('promise', promise);
- if(promise) return true;
- } catch (error) {
- console.log(error);
- }
-
- /* if (typeof options == 'object')
+ if (typeof options == 'object')
Object.assign(myOptions, options);
- const ticket = await Self.findById(id, {
- fields: ['isDeleted', 'refFk']
- }, myOptions); */
+ const isEditable = await Self.isEditable(ctx, ticketId, myOptions);
- return false;
+ if (!isEditable)
+ throw new UserError(`The current ticket can't be modified`);
+
+ const ticket = await models.Ticket.findById(
+ ticketId,
+ {fields: ['id', 'shipped', 'clientFk', 'addressFk']},
+ myOptions
+ );
+ const client = await models.Client.findById(clientId, {fields: ['id', 'defaultAddressFk']}, myOptions);
+
+ await ticket.updateAttributes({
+ clientFk: clientId,
+ addressFk: client.defaultAddressFk,
+ });
};
-};
\ No newline at end of file
+};
diff --git a/modules/ticket/front/descriptor-menu/index.js b/modules/ticket/front/descriptor-menu/index.js
index 019ae4fa6..62a233891 100644
--- a/modules/ticket/front/descriptor-menu/index.js
+++ b/modules/ticket/front/descriptor-menu/index.js
@@ -98,26 +98,12 @@ class Controller extends Section {
transferClient() {
const ticket = this.ticket;
const clientId = ticket.client.id;
- console.log('ticketId',ticket.id)
- console.log('clientId',clientId);
- this.$http.patch(`Tickets/${ticket.id}/transferClient`, {clientId}).then(() =>{
- this.vnApp.showSuccess(this.$t('Data saved!'));
- this.reload();
- })
- this.$http.get(`Clients/${this.ticket.client.id}`).then(client => {
- const ticket = this.ticket;
- const params =
- {
- clientFk: client.data.id,
- addressFk: client.data.defaultAddressFk,
- };
-
- this.$http.patch(`Tickets/${ticket.id}`, params).then(() => {
+ this.$http.patch(`Tickets/${ticket.id}/transferClient`, {clientId})
+ .then(() => {
this.vnApp.showSuccess(this.$t('Data saved!'));
this.reload();
});
- });
}
isTicketEditable() {
diff --git a/modules/ticket/front/descriptor-menu/index.spec.js b/modules/ticket/front/descriptor-menu/index.spec.js
index 914fe486c..1bb270165 100644
--- a/modules/ticket/front/descriptor-menu/index.spec.js
+++ b/modules/ticket/front/descriptor-menu/index.spec.js
@@ -326,17 +326,4 @@ describe('Ticket Component vnTicketDescriptorMenu', () => {
expect(controller.vnApp.showSuccess).toHaveBeenCalled();
});
});
-
- describe('transferClient()', () => {
- it(`should perform two queries, a get to obtain the clientData and a patch to update the ticket`, () => {
- const client =
- {
- clientFk: 1101,
- addressFk: 1,
- };
- $httpBackend.expect('GET', `Clients/${ticket.client.id}`).respond(client);
- $httpBackend.expect('PATCH', `Tickets/${ticket.id}`).respond();
- controller.transferClient();
- });
- });
});
From eb963ff993f8f142298a6edefc631f2451fbf90b Mon Sep 17 00:00:00 2001
From: alexm
Date: Fri, 21 Jul 2023 08:28:19 +0200
Subject: [PATCH 0456/1087] refs #5866 fix(transferClient): correct variable
name
---
modules/ticket/back/methods/ticket/transferClient.js | 12 ++++++------
modules/ticket/front/descriptor-menu/index.js | 4 ++--
2 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/modules/ticket/back/methods/ticket/transferClient.js b/modules/ticket/back/methods/ticket/transferClient.js
index 05ea27fa0..04c153bd2 100644
--- a/modules/ticket/back/methods/ticket/transferClient.js
+++ b/modules/ticket/back/methods/ticket/transferClient.js
@@ -12,7 +12,7 @@ module.exports = Self => {
http: {source: 'path'}
},
{
- arg: 'clientId',
+ arg: 'clientFk',
type: 'number',
required: true,
},
@@ -23,26 +23,26 @@ module.exports = Self => {
}
});
- Self.transferClient = async(ctx, ticketId, clientId, options) => {
+ Self.transferClient = async(ctx, id, clientFk, options) => {
const models = Self.app.models;
const myOptions = {};
if (typeof options == 'object')
Object.assign(myOptions, options);
- const isEditable = await Self.isEditable(ctx, ticketId, myOptions);
+ const isEditable = await Self.isEditable(ctx, id, myOptions);
if (!isEditable)
throw new UserError(`The current ticket can't be modified`);
const ticket = await models.Ticket.findById(
- ticketId,
+ id,
{fields: ['id', 'shipped', 'clientFk', 'addressFk']},
myOptions
);
- const client = await models.Client.findById(clientId, {fields: ['id', 'defaultAddressFk']}, myOptions);
+ const client = await models.Client.findById(clientFk, {fields: ['id', 'defaultAddressFk']}, myOptions);
await ticket.updateAttributes({
- clientFk: clientId,
+ clientFk,
addressFk: client.defaultAddressFk,
});
};
diff --git a/modules/ticket/front/descriptor-menu/index.js b/modules/ticket/front/descriptor-menu/index.js
index 62a233891..7bdefcd97 100644
--- a/modules/ticket/front/descriptor-menu/index.js
+++ b/modules/ticket/front/descriptor-menu/index.js
@@ -97,9 +97,9 @@ class Controller extends Section {
transferClient() {
const ticket = this.ticket;
- const clientId = ticket.client.id;
+ const clientFk = ticket.client.id;
- this.$http.patch(`Tickets/${ticket.id}/transferClient`, {clientId})
+ this.$http.patch(`Tickets/${ticket.id}/transferClient`, {clientFk})
.then(() => {
this.vnApp.showSuccess(this.$t('Data saved!'));
this.reload();
From f52b398596a2c1b65728f5eea9d4530f6e48ac91 Mon Sep 17 00:00:00 2001
From: vicent
Date: Fri, 21 Jul 2023 09:50:27 +0200
Subject: [PATCH 0457/1087] refs #5561 refactor: sustituidos sql por loopback
---
.../back/methods/sale-tracking/delete.js | 25 ++++++++---
.../ticket/back/methods/sale-tracking/new.js | 44 ++++++++++++++-----
2 files changed, 53 insertions(+), 16 deletions(-)
diff --git a/modules/ticket/back/methods/sale-tracking/delete.js b/modules/ticket/back/methods/sale-tracking/delete.js
index 000c52621..30956228b 100644
--- a/modules/ticket/back/methods/sale-tracking/delete.js
+++ b/modules/ticket/back/methods/sale-tracking/delete.js
@@ -25,6 +25,7 @@ module.exports = Self => {
});
Self.delete = async(saleFk, stateCode, options) => {
+ const models = Self.app.models;
const myOptions = {};
let tx;
@@ -37,15 +38,27 @@ module.exports = Self => {
}
try {
- const result = await Self.rawSql(`CALL vn.saleTracking_del(?, ?)`,
- [
- saleFk,
- stateCode,
- ], myOptions);
+ const itemShelvingSales = await models.ItemShelvingSale.find({where: {saleFk: saleFk}}, myOptions);
+ for (let itemShelvingSale of itemShelvingSales)
+ await itemShelvingSale.destroy(myOptions);
+
+ const state = await models.State.findOne({
+ where: {code: stateCode}
+ }, myOptions);
+
+ const filter = {
+ where: {
+ saleFk: saleFk,
+ stateFk: state.id
+ }
+ };
+ const saleTrackings = await models.SaleTracking.find(filter, myOptions);
+ for (let saleTracking of saleTrackings)
+ await saleTracking.destroy(myOptions);
if (tx) await tx.commit();
- return result;
+ return true;
} catch (e) {
if (tx) await tx.rollback();
throw e;
diff --git a/modules/ticket/back/methods/sale-tracking/new.js b/modules/ticket/back/methods/sale-tracking/new.js
index ec5951d7d..2be5bd86e 100644
--- a/modules/ticket/back/methods/sale-tracking/new.js
+++ b/modules/ticket/back/methods/sale-tracking/new.js
@@ -33,6 +33,7 @@ module.exports = Self => {
});
Self.new = async(ctx, saleFk, isChecked, quantity, stateCode, options) => {
+ const models = Self.app.models;
const userId = ctx.req.accessToken.userId;
const myOptions = {};
let tx;
@@ -45,19 +46,42 @@ module.exports = Self => {
myOptions.transaction = tx;
}
try {
- const result = await Self.rawSql(`CALL vn.saleTracking_new(?, ?, ?, ?, ?, ?)`,
- [
- saleFk,
- isChecked,
- quantity,
- userId,
- stateCode,
- null
- ], myOptions);
+ const state = await models.State.findOne({
+ where: {code: stateCode}
+ }, myOptions);
+
+ const saleTracking = await models.SaleTracking.findOne({
+ where: {
+ saleFk: saleFk,
+ stateFk: state.id,
+ workerFk: userId
+ }
+ }, myOptions);
+
+ let newSaleTracking;
+ if (saleTracking) {
+ newSaleTracking = await saleTracking.updateAttributes({
+ saleFk: saleFk,
+ stateFk: state.id,
+ workerFk: userId,
+ isChecked: isChecked,
+ originalQuantity: quantity,
+ isScanned: null
+ }, myOptions);
+ } else {
+ newSaleTracking = await models.SaleTracking.create({
+ saleFk: saleFk,
+ stateFk: state.id,
+ workerFk: userId,
+ isChecked: isChecked,
+ originalQuantity: quantity,
+ isScanned: null
+ });
+ }
if (tx) await tx.commit();
- return result;
+ return newSaleTracking;
} catch (e) {
if (tx) await tx.rollback();
throw e;
From cf0b6f8c6e3ee2bfd99c53aead6d2ef1fc951dab Mon Sep 17 00:00:00 2001
From: vicent
Date: Fri, 21 Jul 2023 12:01:01 +0200
Subject: [PATCH 0458/1087] refs #5561 fix: saleGroupDetail.saleFk UNIQUE
---
db/changes/233201/00-saleGroupDetail.sql | 7 +++++++
modules/ticket/back/methods/sale-tracking/delete.js | 8 +++++---
modules/ticket/back/methods/sale-tracking/filter.js | 1 +
modules/ticket/front/sale-tracking/index.js | 5 +----
4 files changed, 14 insertions(+), 7 deletions(-)
create mode 100644 db/changes/233201/00-saleGroupDetail.sql
diff --git a/db/changes/233201/00-saleGroupDetail.sql b/db/changes/233201/00-saleGroupDetail.sql
new file mode 100644
index 000000000..e25c4f35c
--- /dev/null
+++ b/db/changes/233201/00-saleGroupDetail.sql
@@ -0,0 +1,7 @@
+DELETE FROM `vn`.`saleGroupDetail` WHERE id IN (468106,468104,468107,468105,495210,495208,495207,495209,462879,462880,447186,450623,450622,455606,455605,455827,455829,455828,459067,460689,460691,460690,460692,462408,463403,463405,463404,463129,463127,463126,463128,468098,468096,468099,468097,468310,468314,468313,475654,468325,473248,474803,474739,475042,475052,475047,475041,475051,475046,475040,475050,475045,475039,475049,475044,475038,475048,475043,474888,474892,474890,474887,474891,474889,481109,481107,481105,481108,481106,481110,479008,490787,490792,490791,485295,485294,485293,485528,490796,487853,487959,491303,490789,490914,490913,492305,492310,492307,492304,492309,492306,492303,492308,494111,494110,494480,494482,494481,494483,495202,495200,495199,495201,497209,499765,499763,499767,499764,499768,499766,502014,502013,508820,508819,508818,463133,463131,463130,463132,468102,468100,468103,468101,468311,468316,468315,468327,474894,474898,474896,474893,474897,474895,495206,495204,495203,495205,499771,499769,499773,499770,499774,499772)
+ALTER TABLE `vn`.`saleGroupDetail` ADD CONSTRAINT saleGroupDetail_UN UNIQUE KEY (saleFk);
+
+INSERT INTO `salix`.`ACL` (`model`,`property`,`accessType`,`permission`,`principalId`)
+ VALUES
+ ('SaleGroupDetail','deleteById','WRITE','ALLOW','employee');
+
diff --git a/modules/ticket/back/methods/sale-tracking/delete.js b/modules/ticket/back/methods/sale-tracking/delete.js
index 30956228b..b8754d48c 100644
--- a/modules/ticket/back/methods/sale-tracking/delete.js
+++ b/modules/ticket/back/methods/sale-tracking/delete.js
@@ -38,9 +38,11 @@ module.exports = Self => {
}
try {
- const itemShelvingSales = await models.ItemShelvingSale.find({where: {saleFk: saleFk}}, myOptions);
- for (let itemShelvingSale of itemShelvingSales)
- await itemShelvingSale.destroy(myOptions);
+ if (stateCode === 'PREPARED') {
+ const itemShelvingSales = await models.ItemShelvingSale.find({where: {saleFk: saleFk}}, myOptions);
+ for (let itemShelvingSale of itemShelvingSales)
+ await itemShelvingSale.destroy(myOptions);
+ }
const state = await models.State.findOne({
where: {code: stateCode}
diff --git a/modules/ticket/back/methods/sale-tracking/filter.js b/modules/ticket/back/methods/sale-tracking/filter.js
index 09101a47a..2fa21cb1a 100644
--- a/modules/ticket/back/methods/sale-tracking/filter.js
+++ b/modules/ticket/back/methods/sale-tracking/filter.js
@@ -55,6 +55,7 @@ module.exports = Self => {
stPrevious.isChecked as isPrevious,
stPrepared.isChecked as isPrepared,
stControled.isChecked as isControled,
+ sgd.id saleGroupDetailFk,
(MAX(sgd.id) IS NOT NULL) AS hasSaleGroupDetail,
p.code AS parkingCode,
i.value5,
diff --git a/modules/ticket/front/sale-tracking/index.js b/modules/ticket/front/sale-tracking/index.js
index 0237428c8..6ea7778b1 100644
--- a/modules/ticket/front/sale-tracking/index.js
+++ b/modules/ticket/front/sale-tracking/index.js
@@ -30,10 +30,7 @@ class Controller extends Section {
clickSaleGroupDetail(index) {
const sale = this.sales[index];
- const params = {
- saleFk: sale.saleFk
- };
- return this.$http.post('SaleTrackings/deleteSaleGroupDetail', params)
+ return this.$http.delete(`SaleGroupDetails/${sale.saleGroupDetailFk}`)
.then(() => {
sale.hasSaleGroupDetail = false;
this.vnApp.showSuccess(this.$t('Data saved!'));
From 51f9055d232c9faf7c3d4bf7cc495ee2cfe0628d Mon Sep 17 00:00:00 2001
From: vicent
Date: Fri, 21 Jul 2023 12:01:57 +0200
Subject: [PATCH 0459/1087] remove file
---
.../sale-tracking/deleteSaleGroupDetail.js | 49 -------------------
1 file changed, 49 deletions(-)
delete mode 100644 modules/ticket/back/methods/sale-tracking/deleteSaleGroupDetail.js
diff --git a/modules/ticket/back/methods/sale-tracking/deleteSaleGroupDetail.js b/modules/ticket/back/methods/sale-tracking/deleteSaleGroupDetail.js
deleted file mode 100644
index 13806edf0..000000000
--- a/modules/ticket/back/methods/sale-tracking/deleteSaleGroupDetail.js
+++ /dev/null
@@ -1,49 +0,0 @@
-
-module.exports = Self => {
- Self.remoteMethod('deleteSaleGroupDetail', {
- description: 'Elimina los registros de saleGroupDetail',
- accessType: 'WRITE',
- accepts: [
- {
- arg: 'saleFk',
- type: 'number',
- description: 'The sale id'
- }
- ],
- returns: {
- type: ['object'],
- root: true
- },
- http: {
- path: `/deleteSaleGroupDetail`,
- verb: 'POST'
- }
- });
-
- Self.deleteSaleGroupDetail = async(saleFk, options) => {
- const models = Self.app.models;
- const myOptions = {};
- let tx;
-
- if (typeof options == 'object')
- Object.assign(myOptions, options);
-
- if (!myOptions.transaction) {
- tx = await Self.beginTransaction({});
- myOptions.transaction = tx;
- }
-
- try {
- const deletes = await models.SaleGroupDetail.destroyAll({
- saleFk: saleFk
- }, myOptions);
-
- if (tx) await tx.commit();
-
- return deletes;
- } catch (e) {
- if (tx) await tx.rollback();
- throw e;
- }
- };
-};
From f926c600174b947ae6eeb8ae8dc9895e742bf256 Mon Sep 17 00:00:00 2001
From: vicent
Date: Fri, 21 Jul 2023 12:02:02 +0200
Subject: [PATCH 0460/1087] remove file
---
modules/ticket/back/models/sale-tracking.js | 1 -
1 file changed, 1 deletion(-)
diff --git a/modules/ticket/back/models/sale-tracking.js b/modules/ticket/back/models/sale-tracking.js
index 38de256be..54a2b5a1a 100644
--- a/modules/ticket/back/models/sale-tracking.js
+++ b/modules/ticket/back/models/sale-tracking.js
@@ -3,5 +3,4 @@ module.exports = Self => {
require('../methods/sale-tracking/listSaleTracking')(Self);
require('../methods/sale-tracking/new')(Self);
require('../methods/sale-tracking/delete')(Self);
- require('../methods/sale-tracking/deleteSaleGroupDetail')(Self);
};
From 9bf891fcec582b11ed216e061f99a75b049ad20f Mon Sep 17 00:00:00 2001
From: vicent
Date: Fri, 21 Jul 2023 12:20:06 +0200
Subject: [PATCH 0461/1087] refs #5561 fixed
---
db/changes/233201/00-saleGroupDetail.sql | 2 +-
modules/ticket/front/sale-tracking/index.js | 2 ++
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/db/changes/233201/00-saleGroupDetail.sql b/db/changes/233201/00-saleGroupDetail.sql
index e25c4f35c..d16478716 100644
--- a/db/changes/233201/00-saleGroupDetail.sql
+++ b/db/changes/233201/00-saleGroupDetail.sql
@@ -1,4 +1,4 @@
-DELETE FROM `vn`.`saleGroupDetail` WHERE id IN (468106,468104,468107,468105,495210,495208,495207,495209,462879,462880,447186,450623,450622,455606,455605,455827,455829,455828,459067,460689,460691,460690,460692,462408,463403,463405,463404,463129,463127,463126,463128,468098,468096,468099,468097,468310,468314,468313,475654,468325,473248,474803,474739,475042,475052,475047,475041,475051,475046,475040,475050,475045,475039,475049,475044,475038,475048,475043,474888,474892,474890,474887,474891,474889,481109,481107,481105,481108,481106,481110,479008,490787,490792,490791,485295,485294,485293,485528,490796,487853,487959,491303,490789,490914,490913,492305,492310,492307,492304,492309,492306,492303,492308,494111,494110,494480,494482,494481,494483,495202,495200,495199,495201,497209,499765,499763,499767,499764,499768,499766,502014,502013,508820,508819,508818,463133,463131,463130,463132,468102,468100,468103,468101,468311,468316,468315,468327,474894,474898,474896,474893,474897,474895,495206,495204,495203,495205,499771,499769,499773,499770,499774,499772)
+DELETE FROM `vn`.`saleGroupDetail` WHERE id IN (468106,468104,468107,468105,495210,495208,495207,495209,462879,462880,447186,450623,450622,455606,455605,455827,455829,455828,459067,460689,460691,460690,460692,462408,463403,463405,463404,463129,463127,463126,463128,468098,468096,468099,468097,468310,468314,468313,475654,468325,473248,474803,474739,475042,475052,475047,475041,475051,475046,475040,475050,475045,475039,475049,475044,475038,475048,475043,474888,474892,474890,474887,474891,474889,481109,481107,481105,481108,481106,481110,479008,490787,490792,490791,485295,485294,485293,485528,490796,487853,487959,491303,490789,490914,490913,492305,492310,492307,492304,492309,492306,492303,492308,494111,494110,494480,494482,494481,494483,495202,495200,495199,495201,497209,499765,499763,499767,499764,499768,499766,502014,502013,508820,508819,508818,463133,463131,463130,463132,468102,468100,468103,468101,468311,468316,468315,468327,474894,474898,474896,474893,474897,474895,495206,495204,495203,495205,499771,499769,499773,499770,499774,499772);
ALTER TABLE `vn`.`saleGroupDetail` ADD CONSTRAINT saleGroupDetail_UN UNIQUE KEY (saleFk);
INSERT INTO `salix`.`ACL` (`model`,`property`,`accessType`,`permission`,`principalId`)
diff --git a/modules/ticket/front/sale-tracking/index.js b/modules/ticket/front/sale-tracking/index.js
index 6ea7778b1..6c0e7232e 100644
--- a/modules/ticket/front/sale-tracking/index.js
+++ b/modules/ticket/front/sale-tracking/index.js
@@ -30,6 +30,8 @@ class Controller extends Section {
clickSaleGroupDetail(index) {
const sale = this.sales[index];
+ if (!sale.saleGroupDetailFk) return;
+
return this.$http.delete(`SaleGroupDetails/${sale.saleGroupDetailFk}`)
.then(() => {
sale.hasSaleGroupDetail = false;
From 985e258529a0debad2e27172049fc0e91bc9ee13 Mon Sep 17 00:00:00 2001
From: alexm
Date: Fri, 21 Jul 2023 12:33:14 +0200
Subject: [PATCH 0462/1087] refs #5769 fix(web-access): email rule
---
back/methods/vn-user/privileges.js | 2 +-
back/models/vn-user.js | 2 +-
modules/client/front/web-access/index.html | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/back/methods/vn-user/privileges.js b/back/methods/vn-user/privileges.js
index 690ce74a3..08cfaaae8 100644
--- a/back/methods/vn-user/privileges.js
+++ b/back/methods/vn-user/privileges.js
@@ -47,7 +47,7 @@ module.exports = Self => {
const user = await Self.findById(userId, {fields: ['hasGrant']}, myOptions);
const userToUpdate = await Self.findById(id, {
- fields: ['id', 'name', 'hasGrant', 'roleFk', 'password'],
+ fields: ['id', 'name', 'hasGrant', 'roleFk', 'password', 'email'],
include: {
relation: 'role',
scope: {
diff --git a/back/models/vn-user.js b/back/models/vn-user.js
index a7ce12073..985f017a5 100644
--- a/back/models/vn-user.js
+++ b/back/models/vn-user.js
@@ -20,7 +20,7 @@ module.exports = function(Self) {
Self.validatesFormatOf('email', {
message: 'Invalid email',
allowNull: true,
- allowBlank: true,
+ allowBlank: false,
with: /^[\w|.|-]+@[\w|-]+(\.[\w|-]+)*(,[\w|.|-]+@[\w|-]+(\.[\w|-]+)*)*$/
});
diff --git a/modules/client/front/web-access/index.html b/modules/client/front/web-access/index.html
index 74407ba5c..bf3d34c79 100644
--- a/modules/client/front/web-access/index.html
+++ b/modules/client/front/web-access/index.html
@@ -39,7 +39,7 @@
label="Recovery email"
ng-model="$ctrl.account.email"
info="This email is used for user to regain access their account."
- rule="VnUser.name">
+ rule="VnUser.email">
From 203f6a5659f6fdead03c013a43f2b59ec881e5f8 Mon Sep 17 00:00:00 2001
From: alexm
Date: Fri, 21 Jul 2023 12:41:16 +0200
Subject: [PATCH 0463/1087] refs #5712 correct sql folder
---
db/changes/{232801 => 233201}/00-workerDocuware.sql | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename db/changes/{232801 => 233201}/00-workerDocuware.sql (100%)
diff --git a/db/changes/232801/00-workerDocuware.sql b/db/changes/233201/00-workerDocuware.sql
similarity index 100%
rename from db/changes/232801/00-workerDocuware.sql
rename to db/changes/233201/00-workerDocuware.sql
From 8267daef3a80304060afe759f91276ac05c20ae3 Mon Sep 17 00:00:00 2001
From: vicent
Date: Fri, 21 Jul 2023 12:58:44 +0200
Subject: [PATCH 0464/1087] refs #5918 fix: permite reenviar el correo si ha
dado fallo
---
modules/worker/front/time-control/index.html | 2 ++
modules/worker/front/time-control/index.js | 31 ++++++++++++++++++++
2 files changed, 33 insertions(+)
diff --git a/modules/worker/front/time-control/index.html b/modules/worker/front/time-control/index.html
index 760b0dafc..b6161db2d 100644
--- a/modules/worker/front/time-control/index.html
+++ b/modules/worker/front/time-control/index.html
@@ -97,6 +97,8 @@
ng-if="$ctrl.reason && ($ctrl.isHimSelf || $ctrl.isHr)"
ng-click="reason.show()">
+
+ {
+ if (!res.data.length) {
+ this.canResend = false;
+ return;
+ }
+
+ const filter = {
+ where: {
+ workerFk: this.$params.id
+ },
+ include: {
+ relation: 'department'
+ }
+ };
+ this.$http.get('WorkerDepartments', {filter})
+ .then(res => {
+ const department = res.data[0].department;
+ if (department.isTeleworking) this.canResend = true;
+ });
+ });
+ }
+
/**
* Worker hours data
*/
From ade7303a6fd6878bac8d3de5bd88af0c61991254 Mon Sep 17 00:00:00 2001
From: jorgep
Date: Fri, 21 Jul 2023 13:05:55 +0200
Subject: [PATCH 0465/1087] refs #6047 added editable-td component
---
e2e/helpers/selectors.js | 2 +-
e2e/paths/08-route/04_tickets.spec.js | 3 +--
modules/route/front/tickets/index.html | 21 +++++++++++++++++----
3 files changed, 19 insertions(+), 7 deletions(-)
diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js
index 977c8a837..93288efa7 100644
--- a/e2e/helpers/selectors.js
+++ b/e2e/helpers/selectors.js
@@ -875,7 +875,7 @@ export default {
},
routeTickets: {
- firstTicketPriority: 'vn-route-tickets vn-tr:nth-child(1) vn-input-number[ng-model="ticket.priority"]',
+ firstTicketPriority: 'vn-route-tickets vn-tr:nth-child(1) vn-td-editable',
firstTicketCheckbox: 'vn-route-tickets vn-tr:nth-child(1) vn-check',
buscamanButton: 'vn-route-tickets vn-button[icon="icon-buscaman"]',
firstTicketDeleteButton: 'vn-route-tickets vn-tr:nth-child(1) vn-icon[icon="delete"]',
diff --git a/e2e/paths/08-route/04_tickets.spec.js b/e2e/paths/08-route/04_tickets.spec.js
index ccd5562c2..c890162a1 100644
--- a/e2e/paths/08-route/04_tickets.spec.js
+++ b/e2e/paths/08-route/04_tickets.spec.js
@@ -18,8 +18,7 @@ describe('Route tickets path', () => {
});
it('should modify the first ticket priority', async() => {
- await page.clearInput(selectors.routeTickets.firstTicketPriority);
- await page.type(selectors.routeTickets.firstTicketPriority, '9');
+ await page.writeOnEditableTD(selectors.routeTickets.firstTicketPriority, '9');
await page.keyboard.press('Enter');
const message = await page.waitForSnackbar();
diff --git a/modules/route/front/tickets/index.html b/modules/route/front/tickets/index.html
index 32a4a2d7c..453eb0517 100644
--- a/modules/route/front/tickets/index.html
+++ b/modules/route/front/tickets/index.html
@@ -84,14 +84,27 @@
tabindex="-1">
-
-
+
+ {{ticket.priority}}
+
+
+
+
+
+
+
{{::ticket.street}}
Date: Fri, 21 Jul 2023 13:13:44 +0200
Subject: [PATCH 0466/1087] removed unnecesary comments
---
modules/route/front/tickets/index.html | 6 ------
1 file changed, 6 deletions(-)
diff --git a/modules/route/front/tickets/index.html b/modules/route/front/tickets/index.html
index 453eb0517..ea6755cca 100644
--- a/modules/route/front/tickets/index.html
+++ b/modules/route/front/tickets/index.html
@@ -98,12 +98,6 @@
vn-focus>
-
{{::ticket.street}}
Date: Mon, 24 Jul 2023 10:34:44 +0200
Subject: [PATCH 0467/1087] refs #5929 added ACL and accurate errors
---
db/changes/233201/00-updatePrice.sql | 2 ++
loopback/locale/es.json | 6 +++--
.../ticket/back/methods/ticket/isEditable.js | 23 +++++++++++++++----
3 files changed, 25 insertions(+), 6 deletions(-)
create mode 100644 db/changes/233201/00-updatePrice.sql
diff --git a/db/changes/233201/00-updatePrice.sql b/db/changes/233201/00-updatePrice.sql
new file mode 100644
index 000000000..93888df6e
--- /dev/null
+++ b/db/changes/233201/00-updatePrice.sql
@@ -0,0 +1,2 @@
+INSERT INTO `salix`.`ACL` (`model`,`property`,`accessType`,`permission`,`principalType`,`principalId`)
+ VALUES ('Ticket','*','*','ALLOW','ROLE','buyer');
diff --git a/loopback/locale/es.json b/loopback/locale/es.json
index d95e8d8a4..1a200709f 100644
--- a/loopback/locale/es.json
+++ b/loopback/locale/es.json
@@ -307,5 +307,7 @@
"Negative basis of tickets": "Base negativa para los tickets: {{ticketsIds}}",
"The company has not informed the supplier account for bank transfers": "La empresa no tiene informado la cuenta de proveedor para transferencias bancarias",
"You cannot assign/remove an alias that you are not assigned to": "No puede asignar/eliminar un alias que no tenga asignado",
- "This invoice has a linked vehicle.": "Esta factura tiene un vehiculo vinculado"
-}
+ "This invoice has a linked vehicle.": "Esta factura tiene un vehiculo vinculado",
+ "You don't have enough privileges.": "You don't have enough privileges.",
+ "This ticket is locked.": "This ticket is locked."
+}
\ No newline at end of file
diff --git a/modules/ticket/back/methods/ticket/isEditable.js b/modules/ticket/back/methods/ticket/isEditable.js
index 13bd4d57f..9f7e14dcc 100644
--- a/modules/ticket/back/methods/ticket/isEditable.js
+++ b/modules/ticket/back/methods/ticket/isEditable.js
@@ -1,3 +1,5 @@
+const UserError = require('vn-loopback/util/user-error');
+
module.exports = Self => {
Self.remoteMethodCtx('isEditable', {
description: 'Check if a ticket is editable',
@@ -31,7 +33,7 @@ module.exports = Self => {
}, myOptions);
const isRoleAdvanced = await models.ACL.checkAccessAcl(ctx, 'Ticket', 'isRoleAdvanced', '*');
-
+ const canEditWeeklyTicket = await models.ACL.checkAccessAcl(ctx, 'Ticket', 'buyer', 'WRITE');
const alertLevel = state ? state.alertLevel : null;
const ticket = await models.Ticket.findById(id, {
fields: ['clientFk'],
@@ -48,13 +50,26 @@ module.exports = Self => {
const isLocked = await models.Ticket.isLocked(id, myOptions);
const isWeekly = await models.TicketWeekly.findOne({where: {ticketFk: id}}, myOptions);
+ console.log('isRoleAdvanced', isRoleAdvanced);
+ console.log('canEditWeeklyTicket', canEditWeeklyTicket);
+ console.log('ticket', ticket);
+ console.log('isLocked', isLocked);
+ console.log('isWeekly', isWeekly);
const alertLevelGreaterThanZero = (alertLevel && alertLevel > 0);
const isNormalClient = ticket && ticket.client().type().code == 'normal';
const isEditable = !(alertLevelGreaterThanZero && isNormalClient);
+ if (!ticket)
+ throw new UserError(`The ticket doesn't exist.`);
- if (ticket && (isEditable || isRoleAdvanced) && !isLocked && !isWeekly)
- return true;
+ if (!isEditable && !isRoleAdvanced)
+ throw new UserError(`This ticket is not editable.`);
- return false;
+ if (isLocked)
+ throw new UserError(`This ticket is locked.`);
+
+ if (isWeekly && !canEditWeeklyTicket)
+ throw new UserError(`You don't have enough privileges.`);
+
+ return true;
};
};
From ea4190f15cd9227aece6361a981be22f8f7f665d Mon Sep 17 00:00:00 2001
From: jorgep
Date: Mon, 24 Jul 2023 13:32:28 +0200
Subject: [PATCH 0468/1087] refs #5216 update expedition state added
---
.../expedition-state/updateExpeditionState.js | 71 +++++++++++++++++++
.../ticket/back/models/expedition-state.js | 1 +
2 files changed, 72 insertions(+)
create mode 100644 modules/ticket/back/methods/expedition-state/updateExpeditionState.js
diff --git a/modules/ticket/back/methods/expedition-state/updateExpeditionState.js b/modules/ticket/back/methods/expedition-state/updateExpeditionState.js
new file mode 100644
index 000000000..ce5144d30
--- /dev/null
+++ b/modules/ticket/back/methods/expedition-state/updateExpeditionState.js
@@ -0,0 +1,71 @@
+const UserError = require('vn-loopback/util/user-error');
+
+module.exports = Self => {
+ Self.remoteMethod('updateExpedtionState', {
+ description: 'Update an expedition state',
+ accepts: [
+ {
+ arg: 'expeditions',
+ type: [
+ {
+ expeditionFk: 'number',
+ stateCode: 'string'
+ }
+ ],
+ required: true,
+ description: 'Array of objects containing expeditionFk and stateCode'
+ }
+ ],
+ http: {
+ path: `/updateExpeditionState`,
+ verb: 'post'
+ }
+ });
+
+ Self.updateExpedtionState = async(expeditions, options) => {
+ const models = Self.app.models;
+ let tx;
+ const myOptions = {};
+
+ if (typeof options == 'object')
+ Object.assign(myOptions, options);
+
+ if (!myOptions.transaction) {
+ tx = await Self.beginTransaction({});
+ myOptions.transaction = tx;
+ }
+
+ if (expeditions.length === 0)
+ return false;
+
+ const promises = [];
+ try {
+ const conn = Self.dataSource.connector;
+ for (const expedition of expeditions) {
+ const stmt = new ParameterizedSQL(
+ `SELECT id FROM vn.expeditionStateType WHERE code = ?`,
+ [expedition.stateCode]
+ );
+ const result = await conn.query(stmt);
+ if (result.length === 0)
+ throw new Error(`The state code '${exp.stateCode}' does not exist.`);
+
+ const typeFk = result[0].id;
+
+ const newExpeditionState = await models.Self.create({
+ expeditionFk: expedition.expeditionFk,
+ typeFk,
+ });
+ }
+
+ await Promise.all(promises);
+
+ if (tx) await tx.commit();
+
+ return true;
+ } catch (e) {
+ if (tx) await tx.rollback();
+ throw e;
+ }
+ };
+};
diff --git a/modules/ticket/back/models/expedition-state.js b/modules/ticket/back/models/expedition-state.js
index af76af718..041c57be6 100644
--- a/modules/ticket/back/models/expedition-state.js
+++ b/modules/ticket/back/models/expedition-state.js
@@ -1,3 +1,4 @@
module.exports = function(Self) {
require('../methods/expedition-state/filter')(Self);
+ require('../methods/expedition-state/updateExpeditionState')(Self);
};
From 44ceeac9c4195ed2808fa9a8be20bd53bd9ed5f1 Mon Sep 17 00:00:00 2001
From: alexm
Date: Tue, 25 Jul 2023 10:21:54 +0200
Subject: [PATCH 0469/1087] refs #5983 feat(itemShelving): add userFk field
---
modules/item/back/models/item-shelving.json | 3 +++
1 file changed, 3 insertions(+)
diff --git a/modules/item/back/models/item-shelving.json b/modules/item/back/models/item-shelving.json
index be379adca..8628bfeee 100644
--- a/modules/item/back/models/item-shelving.json
+++ b/modules/item/back/models/item-shelving.json
@@ -25,6 +25,9 @@
"type": "boolean"
},
"visible": {
+ "type": "number"
+ },
+ "userFk": {
"type": "number"
}
},
From 9978db9d523f4b82670a5ea6b431c8b37630c121 Mon Sep 17 00:00:00 2001
From: jorgep
Date: Tue, 25 Jul 2023 11:33:01 +0200
Subject: [PATCH 0470/1087] refs #5929 WIP test created
---
db/changes/233201/00-updatePrice.sql | 2 +-
loopback/locale/es.json | 3 +-
.../ticket/back/methods/ticket/isEditable.js | 8 +-
.../methods/ticket/specs/isEditable.spec.js | 130 +++++-------------
4 files changed, 42 insertions(+), 101 deletions(-)
diff --git a/db/changes/233201/00-updatePrice.sql b/db/changes/233201/00-updatePrice.sql
index 93888df6e..959943d6f 100644
--- a/db/changes/233201/00-updatePrice.sql
+++ b/db/changes/233201/00-updatePrice.sql
@@ -1,2 +1,2 @@
INSERT INTO `salix`.`ACL` (`model`,`property`,`accessType`,`permission`,`principalType`,`principalId`)
- VALUES ('Ticket','*','*','ALLOW','ROLE','buyer');
+ VALUES ('Ticket','canEditWeekly','WRITE','ALLOW','ROLE','buyer');
diff --git a/loopback/locale/es.json b/loopback/locale/es.json
index 1a200709f..942cc74c7 100644
--- a/loopback/locale/es.json
+++ b/loopback/locale/es.json
@@ -309,5 +309,6 @@
"You cannot assign/remove an alias that you are not assigned to": "No puede asignar/eliminar un alias que no tenga asignado",
"This invoice has a linked vehicle.": "Esta factura tiene un vehiculo vinculado",
"You don't have enough privileges.": "You don't have enough privileges.",
- "This ticket is locked.": "This ticket is locked."
+ "This ticket is locked.": "This ticket is locked.",
+ "This ticket is not editable.": "This ticket is not editable."
}
\ No newline at end of file
diff --git a/modules/ticket/back/methods/ticket/isEditable.js b/modules/ticket/back/methods/ticket/isEditable.js
index 9f7e14dcc..967988214 100644
--- a/modules/ticket/back/methods/ticket/isEditable.js
+++ b/modules/ticket/back/methods/ticket/isEditable.js
@@ -33,7 +33,7 @@ module.exports = Self => {
}, myOptions);
const isRoleAdvanced = await models.ACL.checkAccessAcl(ctx, 'Ticket', 'isRoleAdvanced', '*');
- const canEditWeeklyTicket = await models.ACL.checkAccessAcl(ctx, 'Ticket', 'buyer', 'WRITE');
+ const canEditWeeklyTicket = await models.ACL.checkAccessAcl(ctx, 'Ticket', 'canEditWeekly', 'WRITE');
const alertLevel = state ? state.alertLevel : null;
const ticket = await models.Ticket.findById(id, {
fields: ['clientFk'],
@@ -50,14 +50,10 @@ module.exports = Self => {
const isLocked = await models.Ticket.isLocked(id, myOptions);
const isWeekly = await models.TicketWeekly.findOne({where: {ticketFk: id}}, myOptions);
- console.log('isRoleAdvanced', isRoleAdvanced);
- console.log('canEditWeeklyTicket', canEditWeeklyTicket);
- console.log('ticket', ticket);
- console.log('isLocked', isLocked);
- console.log('isWeekly', isWeekly);
const alertLevelGreaterThanZero = (alertLevel && alertLevel > 0);
const isNormalClient = ticket && ticket.client().type().code == 'normal';
const isEditable = !(alertLevelGreaterThanZero && isNormalClient);
+
if (!ticket)
throw new UserError(`The ticket doesn't exist.`);
diff --git a/modules/ticket/back/methods/ticket/specs/isEditable.spec.js b/modules/ticket/back/methods/ticket/specs/isEditable.spec.js
index 7337017d6..043445c28 100644
--- a/modules/ticket/back/methods/ticket/specs/isEditable.spec.js
+++ b/modules/ticket/back/methods/ticket/specs/isEditable.spec.js
@@ -1,143 +1,68 @@
const models = require('vn-loopback/server/server').models;
describe('ticket isEditable()', () => {
- it('should return false if the given ticket does not exist', async() => {
+ it('should throw an error as the ticket does not exist', async() => {
const tx = await models.Ticket.beginTransaction({});
- let result;
-
+ let error;
try {
const options = {transaction: tx};
const ctx = {
req: {accessToken: {userId: 9}}
};
- result = await models.Ticket.isEditable(ctx, 9999, options);
-
+ await models.Ticket.isEditable(ctx, 9999, options);
await tx.rollback();
} catch (e) {
await tx.rollback();
- throw e;
+ error = e;
}
- expect(result).toEqual(false);
+ expect(error.message).toEqual(`The ticket doesn't exist.`);
});
- it(`should return false if the given ticket isn't invoiced but isDeleted`, async() => {
+ it('should throw an error as this ticket is not editable', async() => {
const tx = await models.Ticket.beginTransaction({});
- let result;
-
- try {
- const options = {transaction: tx};
- const deletedTicket = await models.Ticket.findOne({
- where: {
- invoiceOut: null,
- isDeleted: true
- },
- fields: ['id']
- });
-
- const ctx = {
- req: {accessToken: {userId: 9}}
- };
-
- result = await models.Ticket.isEditable(ctx, deletedTicket.id, options);
-
- await tx.rollback();
- } catch (e) {
- await tx.rollback();
- throw e;
- }
-
- expect(result).toEqual(false);
- });
-
- it('should return true if the given ticket is editable', async() => {
- const tx = await models.Ticket.beginTransaction({});
- let result;
+ let error;
try {
const options = {transaction: tx};
const ctx = {
- req: {accessToken: {userId: 9}}
+ req: {accessToken: {userId: 1}}
};
- result = await models.Ticket.isEditable(ctx, 16, options);
-
+ await models.Ticket.isEditable(ctx, 8, options);
await tx.rollback();
} catch (e) {
+ error = e;
await tx.rollback();
- throw e;
}
- expect(result).toEqual(true);
+ expect(error.message).toEqual(`This ticket is not editable.`);
});
- it('should not be able to edit a deleted or invoiced ticket even for salesAssistant', async() => {
+ it('should throw an error as this ticket is locked.', async() => {
const tx = await models.Ticket.beginTransaction({});
- let result;
-
- try {
- const options = {transaction: tx};
- const ctx = {
- req: {accessToken: {userId: 21}}
- };
-
- result = await models.Ticket.isEditable(ctx, 19, options);
-
- await tx.rollback();
- } catch (e) {
- await tx.rollback();
- throw e;
- }
-
- expect(result).toEqual(false);
- });
-
- it('should not be able to edit a deleted or invoiced ticket even for productionBoss', async() => {
- const tx = await models.Ticket.beginTransaction({});
- let result;
-
- try {
- const options = {transaction: tx};
- const ctx = {
- req: {accessToken: {userId: 50}}
- };
-
- result = await models.Ticket.isEditable(ctx, 19, options);
-
- await tx.rollback();
- } catch (e) {
- await tx.rollback();
- throw e;
- }
-
- expect(result).toEqual(false);
- });
-
- it('should not be able to edit a deleted or invoiced ticket even for salesPerson', async() => {
- const tx = await models.Ticket.beginTransaction({});
- let result;
-
+ let error;
try {
const options = {transaction: tx};
const ctx = {
req: {accessToken: {userId: 18}}
};
- result = await models.Ticket.isEditable(ctx, 19, options);
+ await models.Ticket.isEditable(ctx, 19, options);
await tx.rollback();
} catch (e) {
+ error = e;
await tx.rollback();
- throw e;
}
- expect(result).toEqual(false);
+ expect(error.message).toEqual(`This ticket is locked.`);
});
- it('should not be able to edit if is a ticket weekly', async() => {
+ it('should throw an error as you do not have enough privileges.', async() => {
const tx = await models.Ticket.beginTransaction({});
-
+ let error;
try {
const options = {transaction: tx};
@@ -147,10 +72,29 @@ describe('ticket isEditable()', () => {
expect(result).toEqual(false);
+ await tx.rollback();
+ } catch (e) {
+ error = e;
+ await tx.rollback();
+ }
+
+ expect(error.message).toEqual(`You don't have enough privileges.`);
+ });
+
+ it('should be able to edit a ticket weekly', async() => {
+ const tx = await models.Ticket.beginTransaction({});
+ let result;
+ try {
+ const options = {transaction: tx};
+ const ctx = {req: {accessToken: {userId: 35}}};
+
+ result = await models.Ticket.isEditable(ctx, 15, options);
await tx.rollback();
} catch (e) {
await tx.rollback();
throw e;
}
+
+ expect(result).toEqual(true);
});
});
From bf92c5d482ce4bf7a4055da56e279136f3651926 Mon Sep 17 00:00:00 2001
From: alexm
Date: Tue, 25 Jul 2023 15:00:08 +0200
Subject: [PATCH 0471/1087] refs #6059 validateLogin sync user
---
back/models/vn-user.js | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/back/models/vn-user.js b/back/models/vn-user.js
index 985f017a5..68a556d77 100644
--- a/back/models/vn-user.js
+++ b/back/models/vn-user.js
@@ -115,6 +115,14 @@ module.exports = function(Self) {
Self.validateLogin = async function(user, password) {
let loginInfo = Object.assign({password}, Self.userUses(user));
token = await Self.login(loginInfo, 'user');
+
+ const userToken = await token.user.get();
+ try {
+ await Self.app.models.Account.sync(userToken.name, password);
+ } catch (err) {
+ console.warn(err);
+ }
+
return {token: token.id, ttl: token.ttl};
};
From 543fbf3c0a322e9b586ed3caf8194c1491753235 Mon Sep 17 00:00:00 2001
From: jorgep
Date: Tue, 25 Jul 2023 15:35:08 +0200
Subject: [PATCH 0472/1087] refs #5929 isEditableOrThrow created, tests passed
---
loopback/locale/en.json | 6 +-
loopback/locale/es.json | 7 +-
modules/ticket/back/methods/ticket/addSale.js | 5 +-
.../back/methods/ticket/componentUpdate.js | 6 +-
.../ticket/back/methods/ticket/isEditable.js | 52 +--------
.../back/methods/ticket/isEditableOrThrow.js | 49 ++++++++
.../back/methods/ticket/priceDifference.js | 7 +-
.../methods/ticket/recalculateComponents.js | 6 +-
.../ticket/back/methods/ticket/setDeleted.js | 5 +-
.../back/methods/ticket/specs/addSale.spec.js | 2 +-
.../methods/ticket/specs/isEditable.spec.js | 109 ++++--------------
.../ticket/specs/isEditableOrThrow.spec.js | 100 ++++++++++++++++
.../ticket/specs/priceDifference.spec.js | 3 +-
.../specs/recalculateComponents.spec.js | 3 +-
.../ticket/specs/transferClient.spec.js | 2 +-
.../ticket/specs/transferSales.spec.js | 2 +-
.../back/methods/ticket/transferClient.js | 6 +-
.../back/methods/ticket/transferSales.js | 6 +-
modules/ticket/back/models/ticket-methods.js | 1 +
19 files changed, 203 insertions(+), 174 deletions(-)
create mode 100644 modules/ticket/back/methods/ticket/isEditableOrThrow.js
create mode 100644 modules/ticket/back/methods/ticket/specs/isEditableOrThrow.spec.js
diff --git a/loopback/locale/en.json b/loopback/locale/en.json
index 030afbe9e..135bb2be9 100644
--- a/loopback/locale/en.json
+++ b/loopback/locale/en.json
@@ -178,5 +178,9 @@
"The renew period has not been exceeded": "The renew period has not been exceeded",
"You can not use the same password": "You can not use the same password",
"Valid priorities": "Valid priorities: %d",
- "Negative basis of tickets": "Negative basis of tickets: {{ticketsIds}}"
+ "Negative basis of tickets": "Negative basis of tickets: {{ticketsIds}}",
+ "You don't have enough privileges.": "You don't have enough privileges.",
+ "This ticket is locked.": "This ticket is locked.",
+ "This ticket is not editable.": "This ticket is not editable.",
+ "The ticket doesn't exist.": "The ticket doesn't exist."
}
diff --git a/loopback/locale/es.json b/loopback/locale/es.json
index 942cc74c7..ac62d62e1 100644
--- a/loopback/locale/es.json
+++ b/loopback/locale/es.json
@@ -308,7 +308,8 @@
"The company has not informed the supplier account for bank transfers": "La empresa no tiene informado la cuenta de proveedor para transferencias bancarias",
"You cannot assign/remove an alias that you are not assigned to": "No puede asignar/eliminar un alias que no tenga asignado",
"This invoice has a linked vehicle.": "Esta factura tiene un vehiculo vinculado",
- "You don't have enough privileges.": "You don't have enough privileges.",
- "This ticket is locked.": "This ticket is locked.",
- "This ticket is not editable.": "This ticket is not editable."
+ "You don't have enough privileges.": "No tienes suficientes permisos.",
+ "This ticket is locked.": "Este ticket está bloqueado.",
+ "This ticket is not editable.": "Este ticket no es editable.",
+ "The ticket doesn't exist.": "No existe el ticket."
}
\ No newline at end of file
diff --git a/modules/ticket/back/methods/ticket/addSale.js b/modules/ticket/back/methods/ticket/addSale.js
index 2cd02a8a4..9a3e32a7e 100644
--- a/modules/ticket/back/methods/ticket/addSale.js
+++ b/modules/ticket/back/methods/ticket/addSale.js
@@ -1,4 +1,3 @@
-
const UserError = require('vn-loopback/util/user-error');
module.exports = Self => {
@@ -47,9 +46,7 @@ module.exports = Self => {
}
try {
- const isEditable = await models.Ticket.isEditable(ctx, id, myOptions);
- if (!isEditable)
- throw new UserError(`The sales of this ticket can't be modified`);
+ const isEditable = await models.Ticket.isEditableOrThrow(ctx, id, myOptions);
const item = await models.Item.findById(itemId, null, myOptions);
const ticket = await models.Ticket.findById(id, {
diff --git a/modules/ticket/back/methods/ticket/componentUpdate.js b/modules/ticket/back/methods/ticket/componentUpdate.js
index 48aee36d4..eadbf65c2 100644
--- a/modules/ticket/back/methods/ticket/componentUpdate.js
+++ b/modules/ticket/back/methods/ticket/componentUpdate.js
@@ -1,4 +1,3 @@
-const UserError = require('vn-loopback/util/user-error');
const loggable = require('vn-loopback/util/log');
module.exports = Self => {
@@ -116,10 +115,7 @@ module.exports = Self => {
const userId = ctx.req.accessToken.userId;
const models = Self.app.models;
const $t = ctx.req.__; // $translate
- const isEditable = await models.Ticket.isEditable(ctx, args.id, myOptions);
-
- if (!isEditable)
- throw new UserError(`The sales of this ticket can't be modified`);
+ const isEditable = await models.Ticket.isEditableOrThrow(ctx, args.id, myOptions);
const editZone = await models.ACL.checkAccessAcl(ctx, 'Ticket', 'editZone', 'WRITE');
if (!editZone) {
diff --git a/modules/ticket/back/methods/ticket/isEditable.js b/modules/ticket/back/methods/ticket/isEditable.js
index 967988214..f657cd5e3 100644
--- a/modules/ticket/back/methods/ticket/isEditable.js
+++ b/modules/ticket/back/methods/ticket/isEditable.js
@@ -1,5 +1,3 @@
-const UserError = require('vn-loopback/util/user-error');
-
module.exports = Self => {
Self.remoteMethodCtx('isEditable', {
description: 'Check if a ticket is editable',
@@ -22,50 +20,12 @@ module.exports = Self => {
});
Self.isEditable = async(ctx, id, options) => {
- const models = Self.app.models;
- const myOptions = {};
-
- if (typeof options == 'object')
- Object.assign(myOptions, options);
-
- const state = await models.TicketState.findOne({
- where: {ticketFk: id}
- }, myOptions);
-
- const isRoleAdvanced = await models.ACL.checkAccessAcl(ctx, 'Ticket', 'isRoleAdvanced', '*');
- const canEditWeeklyTicket = await models.ACL.checkAccessAcl(ctx, 'Ticket', 'canEditWeekly', 'WRITE');
- const alertLevel = state ? state.alertLevel : null;
- const ticket = await models.Ticket.findById(id, {
- fields: ['clientFk'],
- include: [{
- relation: 'client',
- scope: {
- include: {
- relation: 'type'
- }
- }
- }]
- }, myOptions);
-
- const isLocked = await models.Ticket.isLocked(id, myOptions);
- const isWeekly = await models.TicketWeekly.findOne({where: {ticketFk: id}}, myOptions);
-
- const alertLevelGreaterThanZero = (alertLevel && alertLevel > 0);
- const isNormalClient = ticket && ticket.client().type().code == 'normal';
- const isEditable = !(alertLevelGreaterThanZero && isNormalClient);
-
- if (!ticket)
- throw new UserError(`The ticket doesn't exist.`);
-
- if (!isEditable && !isRoleAdvanced)
- throw new UserError(`This ticket is not editable.`);
-
- if (isLocked)
- throw new UserError(`This ticket is locked.`);
-
- if (isWeekly && !canEditWeeklyTicket)
- throw new UserError(`You don't have enough privileges.`);
-
+ try {
+ await Self.isEditableOrThrow(ctx, id, options);
+ } catch (e) {
+ if (e.name === 'ForbiddenError') return false;
+ throw e;
+ }
return true;
};
};
diff --git a/modules/ticket/back/methods/ticket/isEditableOrThrow.js b/modules/ticket/back/methods/ticket/isEditableOrThrow.js
new file mode 100644
index 000000000..6a8bafa2c
--- /dev/null
+++ b/modules/ticket/back/methods/ticket/isEditableOrThrow.js
@@ -0,0 +1,49 @@
+const ForbiddenError = require('vn-loopback/util/forbiddenError');
+
+module.exports = Self => {
+ Self.isEditableOrThrow = async(ctx, id, options) => {
+ const models = Self.app.models;
+ const myOptions = {};
+
+ if (typeof options == 'object')
+ Object.assign(myOptions, options);
+
+ const state = await models.TicketState.findOne({
+ where: {ticketFk: id}
+ }, myOptions);
+
+ const isRoleAdvanced = await models.ACL.checkAccessAcl(ctx, 'Ticket', 'isRoleAdvanced', '*');
+ const canEditWeeklyTicket = await models.ACL.checkAccessAcl(ctx, 'Ticket', 'canEditWeekly', 'WRITE');
+ const alertLevel = state ? state.alertLevel : null;
+ const ticket = await models.Ticket.findById(id, {
+ fields: ['clientFk'],
+ include: [{
+ relation: 'client',
+ scope: {
+ include: {
+ relation: 'type'
+ }
+ }
+ }]
+ }, myOptions);
+
+ const isLocked = await models.Ticket.isLocked(id, myOptions);
+ const isWeekly = await models.TicketWeekly.findOne({where: {ticketFk: id}}, myOptions);
+
+ const alertLevelGreaterThanZero = (alertLevel && alertLevel > 0);
+ const isNormalClient = ticket && ticket.client().type().code == 'normal';
+ const isEditable = !(alertLevelGreaterThanZero && isNormalClient);
+
+ if (!ticket)
+ throw new ForbiddenError(`The ticket doesn't exist.`);
+
+ if (!isEditable && !isRoleAdvanced)
+ throw new ForbiddenError(`This ticket is not editable.`);
+
+ if (isLocked)
+ throw new ForbiddenError(`This ticket is locked.`);
+
+ if (isWeekly && !canEditWeeklyTicket)
+ throw new ForbiddenError(`You don't have enough privileges.`);
+ };
+};
diff --git a/modules/ticket/back/methods/ticket/priceDifference.js b/modules/ticket/back/methods/ticket/priceDifference.js
index 42a71f1c8..754646b03 100644
--- a/modules/ticket/back/methods/ticket/priceDifference.js
+++ b/modules/ticket/back/methods/ticket/priceDifference.js
@@ -1,5 +1,3 @@
-const UserError = require('vn-loopback/util/user-error');
-
module.exports = Self => {
Self.remoteMethodCtx('priceDifference', {
description: 'Returns sales with price difference if the ticket is editable',
@@ -72,10 +70,7 @@ module.exports = Self => {
}
try {
- const isEditable = await Self.isEditable(ctx, args.id, myOptions);
-
- if (!isEditable)
- throw new UserError(`The sales of this ticket can't be modified`);
+ const isEditable = await Self.isEditableOrThrow(ctx, args.id, myOptions);
const editZone = await models.ACL.checkAccessAcl(ctx, 'Ticket', 'editZone', 'WRITE');
if (!editZone) {
diff --git a/modules/ticket/back/methods/ticket/recalculateComponents.js b/modules/ticket/back/methods/ticket/recalculateComponents.js
index eb9c8a72e..78c44bab3 100644
--- a/modules/ticket/back/methods/ticket/recalculateComponents.js
+++ b/modules/ticket/back/methods/ticket/recalculateComponents.js
@@ -1,4 +1,3 @@
-const UserError = require('vn-loopback/util/user-error');
module.exports = Self => {
Self.remoteMethodCtx('recalculateComponents', {
description: 'Calculates the price of a sale and its components',
@@ -33,10 +32,7 @@ module.exports = Self => {
}
try {
- const isEditable = await Self.isEditable(ctx, id, myOptions);
-
- if (!isEditable)
- throw new UserError(`The current ticket can't be modified`);
+ const isEditable = await Self.isEditableOrThrow(ctx, id, myOptions);
const recalculation = await Self.rawSql('CALL vn.ticket_recalcComponents(?, NULL)', [id], myOptions);
diff --git a/modules/ticket/back/methods/ticket/setDeleted.js b/modules/ticket/back/methods/ticket/setDeleted.js
index 878cce056..6485f198e 100644
--- a/modules/ticket/back/methods/ticket/setDeleted.js
+++ b/modules/ticket/back/methods/ticket/setDeleted.js
@@ -39,10 +39,7 @@ module.exports = Self => {
const ticketToDelete = await models.Ticket.findById(id, {fields: ['isDeleted']}, myOptions);
if (ticketToDelete.isDeleted) return false;
- const isEditable = await Self.isEditable(ctx, id, myOptions);
-
- if (!isEditable)
- throw new UserError(`The sales of this ticket can't be modified`);
+ const isEditable = await Self.isEditableOrThrow(ctx, id, myOptions);
// Check if ticket has refunds
const ticketRefunds = await models.TicketRefund.find({
diff --git a/modules/ticket/back/methods/ticket/specs/addSale.spec.js b/modules/ticket/back/methods/ticket/specs/addSale.spec.js
index 2e568716a..b1ecb133b 100644
--- a/modules/ticket/back/methods/ticket/specs/addSale.spec.js
+++ b/modules/ticket/back/methods/ticket/specs/addSale.spec.js
@@ -97,6 +97,6 @@ describe('ticket addSale()', () => {
error = e;
}
- expect(error.message).toEqual(`The sales of this ticket can't be modified`);
+ expect(error.message).toEqual(`This ticket is locked.`);
});
});
diff --git a/modules/ticket/back/methods/ticket/specs/isEditable.spec.js b/modules/ticket/back/methods/ticket/specs/isEditable.spec.js
index 043445c28..301745ed3 100644
--- a/modules/ticket/back/methods/ticket/specs/isEditable.spec.js
+++ b/modules/ticket/back/methods/ticket/specs/isEditable.spec.js
@@ -1,100 +1,37 @@
const models = require('vn-loopback/server/server').models;
-describe('ticket isEditable()', () => {
- it('should throw an error as the ticket does not exist', async() => {
- const tx = await models.Ticket.beginTransaction({});
- let error;
- try {
- const options = {transaction: tx};
- const ctx = {
- req: {accessToken: {userId: 9}}
- };
-
- await models.Ticket.isEditable(ctx, 9999, options);
- await tx.rollback();
- } catch (e) {
- await tx.rollback();
- error = e;
- }
-
- expect(error.message).toEqual(`The ticket doesn't exist.`);
- });
-
- it('should throw an error as this ticket is not editable', async() => {
- const tx = await models.Ticket.beginTransaction({});
- let error;
-
- try {
- const options = {transaction: tx};
- const ctx = {
- req: {accessToken: {userId: 1}}
- };
-
- await models.Ticket.isEditable(ctx, 8, options);
- await tx.rollback();
- } catch (e) {
- error = e;
- await tx.rollback();
- }
-
- expect(error.message).toEqual(`This ticket is not editable.`);
- });
-
- it('should throw an error as this ticket is locked.', async() => {
- const tx = await models.Ticket.beginTransaction({});
- let error;
- try {
- const options = {transaction: tx};
- const ctx = {
- req: {accessToken: {userId: 18}}
- };
-
- await models.Ticket.isEditable(ctx, 19, options);
-
- await tx.rollback();
- } catch (e) {
- error = e;
- await tx.rollback();
- }
-
- expect(error.message).toEqual(`This ticket is locked.`);
- });
-
- it('should throw an error as you do not have enough privileges.', async() => {
- const tx = await models.Ticket.beginTransaction({});
- let error;
- try {
- const options = {transaction: tx};
-
- const ctx = {req: {accessToken: {userId: 1}}};
-
- const result = await models.Ticket.isEditable(ctx, 15, options);
-
- expect(result).toEqual(false);
-
- await tx.rollback();
- } catch (e) {
- error = e;
- await tx.rollback();
- }
-
- expect(error.message).toEqual(`You don't have enough privileges.`);
- });
-
- it('should be able to edit a ticket weekly', async() => {
+describe('isEditable()', () => {
+ it('should return false if It is able to edit', async() => {
const tx = await models.Ticket.beginTransaction({});
let result;
+
try {
const options = {transaction: tx};
const ctx = {req: {accessToken: {userId: 35}}};
-
- result = await models.Ticket.isEditable(ctx, 15, options);
+ result = await models.Ticket.isEditable(ctx, 5, options);
await tx.rollback();
- } catch (e) {
+ } catch (error) {
await tx.rollback();
throw e;
}
- expect(result).toEqual(true);
+ expect(result).toBeFalse();
+ });
+
+ it('should return true if It is able to edit', async() => {
+ const tx = await models.Ticket.beginTransaction({});
+ let result;
+
+ try {
+ const options = {transaction: tx};
+ const ctx = {req: {accessToken: {userId: 35}}};
+ result = await models.Ticket.isEditable(ctx, 15, options);
+ await tx.rollback();
+ } catch (error) {
+ await tx.rollback();
+ throw e;
+ }
+
+ expect(result).toBeTrue();
});
});
diff --git a/modules/ticket/back/methods/ticket/specs/isEditableOrThrow.spec.js b/modules/ticket/back/methods/ticket/specs/isEditableOrThrow.spec.js
new file mode 100644
index 000000000..b65ed64a1
--- /dev/null
+++ b/modules/ticket/back/methods/ticket/specs/isEditableOrThrow.spec.js
@@ -0,0 +1,100 @@
+const models = require('vn-loopback/server/server').models;
+
+describe('ticket isEditableOrThrow()', () => {
+ it('should throw an error as the ticket does not exist', async() => {
+ const tx = await models.Ticket.beginTransaction({});
+ let error;
+ try {
+ const options = {transaction: tx};
+ const ctx = {
+ req: {accessToken: {userId: 9}}
+ };
+
+ await models.Ticket.isEditableOrThrow(ctx, 9999, options);
+ await tx.rollback();
+ } catch (e) {
+ await tx.rollback();
+ error = e;
+ }
+
+ expect(error.message).toEqual(`The ticket doesn't exist.`);
+ });
+
+ it('should throw an error as this ticket is not editable', async() => {
+ const tx = await models.Ticket.beginTransaction({});
+ let error;
+
+ try {
+ const options = {transaction: tx};
+ const ctx = {
+ req: {accessToken: {userId: 1}}
+ };
+
+ await models.Ticket.isEditableOrThrow(ctx, 8, options);
+ await tx.rollback();
+ } catch (e) {
+ error = e;
+ await tx.rollback();
+ }
+
+ expect(error.message).toEqual(`This ticket is not editable.`);
+ });
+
+ it('should throw an error as this ticket is locked.', async() => {
+ const tx = await models.Ticket.beginTransaction({});
+ let error;
+ try {
+ const options = {transaction: tx};
+ const ctx = {
+ req: {accessToken: {userId: 18}}
+ };
+
+ await models.Ticket.isEditableOrThrow(ctx, 19, options);
+
+ await tx.rollback();
+ } catch (e) {
+ error = e;
+ await tx.rollback();
+ }
+
+ expect(error.message).toEqual(`This ticket is locked.`);
+ });
+
+ it('should throw an error as you do not have enough privileges.', async() => {
+ const tx = await models.Ticket.beginTransaction({});
+ let error;
+ try {
+ const options = {transaction: tx};
+
+ const ctx = {req: {accessToken: {userId: 1}}};
+
+ const result = await models.Ticket.isEditableOrThrow(ctx, 15, options);
+
+ expect(result).toEqual(false);
+
+ await tx.rollback();
+ } catch (e) {
+ error = e;
+ await tx.rollback();
+ }
+
+ expect(error.message).toEqual(`You don't have enough privileges.`);
+ });
+
+ it('should return undefined if It can be edited', async() => {
+ const tx = await models.Ticket.beginTransaction({});
+ let result;
+ try {
+ const options = {transaction: tx};
+ const ctx = {req: {accessToken: {userId: 35}}};
+
+ result = await models.Ticket.isEditableOrThrow(ctx, 15, options);
+ await tx.rollback();
+ } catch (e) {
+ await tx.rollback();
+ throw e;
+ }
+
+ expect(result).toBeUndefined();
+ });
+});
diff --git a/modules/ticket/back/methods/ticket/specs/priceDifference.spec.js b/modules/ticket/back/methods/ticket/specs/priceDifference.spec.js
index cc54353ef..d01f0c1bb 100644
--- a/modules/ticket/back/methods/ticket/specs/priceDifference.spec.js
+++ b/modules/ticket/back/methods/ticket/specs/priceDifference.spec.js
@@ -1,5 +1,6 @@
const models = require('vn-loopback/server/server').models;
const UserError = require('vn-loopback/util/user-error');
+const ForbiddenError = require('vn-loopback/util/forbiddenError');
describe('sale priceDifference()', () => {
it('should return ticket price differences', async() => {
@@ -59,7 +60,7 @@ describe('sale priceDifference()', () => {
await tx.rollback();
}
- expect(error).toEqual(new UserError(`The sales of this ticket can't be modified`));
+ expect(error).toEqual(new ForbiddenError(`This ticket is not editable.`));
});
it('should return ticket movable', async() => {
diff --git a/modules/ticket/back/methods/ticket/specs/recalculateComponents.spec.js b/modules/ticket/back/methods/ticket/specs/recalculateComponents.spec.js
index ed10d114f..383c2c6d5 100644
--- a/modules/ticket/back/methods/ticket/specs/recalculateComponents.spec.js
+++ b/modules/ticket/back/methods/ticket/specs/recalculateComponents.spec.js
@@ -1,4 +1,5 @@
const models = require('vn-loopback/server/server').models;
+const ForbiddenError = require('vn-loopback/util/forbiddenError');
describe('ticket recalculateComponents()', () => {
const ticketId = 11;
@@ -38,6 +39,6 @@ describe('ticket recalculateComponents()', () => {
error = e;
}
- expect(error).toEqual(new Error(`The current ticket can't be modified`));
+ expect(error).toEqual(new ForbiddenError(`This ticket is locked.`));
});
});
diff --git a/modules/ticket/back/methods/ticket/specs/transferClient.spec.js b/modules/ticket/back/methods/ticket/specs/transferClient.spec.js
index ed10e5159..c09c20083 100644
--- a/modules/ticket/back/methods/ticket/specs/transferClient.spec.js
+++ b/modules/ticket/back/methods/ticket/specs/transferClient.spec.js
@@ -23,7 +23,7 @@ describe('Ticket transferClient()', () => {
error = e;
}
- expect(error.message).toEqual(`The current ticket can't be modified`);
+ expect(error.message).toEqual(`This ticket is locked.`);
});
it('should be assigned a different clientFk', async() => {
diff --git a/modules/ticket/back/methods/ticket/specs/transferSales.spec.js b/modules/ticket/back/methods/ticket/specs/transferSales.spec.js
index 562688917..ef92e88c0 100644
--- a/modules/ticket/back/methods/ticket/specs/transferSales.spec.js
+++ b/modules/ticket/back/methods/ticket/specs/transferSales.spec.js
@@ -33,7 +33,7 @@ describe('sale transferSales()', () => {
error = e;
}
- expect(error.message).toEqual(`The sales of this ticket can't be modified`);
+ expect(error.message).toEqual(`This ticket is not editable.`);
});
it('should throw an error if the receiving ticket is not editable', async() => {
diff --git a/modules/ticket/back/methods/ticket/transferClient.js b/modules/ticket/back/methods/ticket/transferClient.js
index 04c153bd2..c87ad4881 100644
--- a/modules/ticket/back/methods/ticket/transferClient.js
+++ b/modules/ticket/back/methods/ticket/transferClient.js
@@ -1,4 +1,3 @@
-const UserError = require('vn-loopback/util/user-error');
module.exports = Self => {
Self.remoteMethodCtx('transferClient', {
description: 'Transfering ticket to another client',
@@ -29,10 +28,7 @@ module.exports = Self => {
if (typeof options == 'object')
Object.assign(myOptions, options);
- const isEditable = await Self.isEditable(ctx, id, myOptions);
-
- if (!isEditable)
- throw new UserError(`The current ticket can't be modified`);
+ const isEditable = await Self.isEditableOrThrow(ctx, id, myOptions);
const ticket = await models.Ticket.findById(
id,
diff --git a/modules/ticket/back/methods/ticket/transferSales.js b/modules/ticket/back/methods/ticket/transferSales.js
index 0eee50d5f..bd99920db 100644
--- a/modules/ticket/back/methods/ticket/transferSales.js
+++ b/modules/ticket/back/methods/ticket/transferSales.js
@@ -1,4 +1,4 @@
-let UserError = require('vn-loopback/util/user-error');
+const UserError = require('vn-loopback/util/user-error');
module.exports = Self => {
Self.remoteMethodCtx('transferSales', {
@@ -48,9 +48,7 @@ module.exports = Self => {
}
try {
- const isEditable = await models.Ticket.isEditable(ctx, id, myOptions);
- if (!isEditable)
- throw new UserError(`The sales of this ticket can't be modified`);
+ const isEditable = await models.Ticket.isEditableOrThrow(ctx, id, myOptions);
if (ticketId) {
const isReceiverEditable = await models.Ticket.isEditable(ctx, ticketId, myOptions);
diff --git a/modules/ticket/back/models/ticket-methods.js b/modules/ticket/back/models/ticket-methods.js
index b432c9f6b..c37337253 100644
--- a/modules/ticket/back/models/ticket-methods.js
+++ b/modules/ticket/back/models/ticket-methods.js
@@ -6,6 +6,7 @@ module.exports = function(Self) {
require('../methods/ticket/componentUpdate')(Self);
require('../methods/ticket/new')(Self);
require('../methods/ticket/isEditable')(Self);
+ require('../methods/ticket/isEditableOrThrow')(Self);
require('../methods/ticket/setDeleted')(Self);
require('../methods/ticket/restore')(Self);
require('../methods/ticket/getSales')(Self);
From fa9dfdf411ef9028f04853567a07abefe790635e Mon Sep 17 00:00:00 2001
From: jorgep
Date: Tue, 25 Jul 2023 16:32:38 +0200
Subject: [PATCH 0473/1087] refs #5216 try ACL updateExpeditionState
---
db/changes/233201/00-addExpeditionState.sql | 2 ++
.../{updateExpeditionState.js => addExpeditionState.js} | 5 +++--
modules/ticket/back/models/expedition-state.js | 2 +-
3 files changed, 6 insertions(+), 3 deletions(-)
create mode 100644 db/changes/233201/00-addExpeditionState.sql
rename modules/ticket/back/methods/expedition-state/{updateExpeditionState.js => addExpeditionState.js} (92%)
diff --git a/db/changes/233201/00-addExpeditionState.sql b/db/changes/233201/00-addExpeditionState.sql
new file mode 100644
index 000000000..fb236b0c3
--- /dev/null
+++ b/db/changes/233201/00-addExpeditionState.sql
@@ -0,0 +1,2 @@
+INSERT INTO `salix`.`ACL` (`model`,`property`,`accessType`,`permission`,`principalType`,`principalId`)
+ VALUES ('ExpeditionState','addExpeditionState','WRITE','ALLOW','ROLE','delivery');
\ No newline at end of file
diff --git a/modules/ticket/back/methods/expedition-state/updateExpeditionState.js b/modules/ticket/back/methods/expedition-state/addExpeditionState.js
similarity index 92%
rename from modules/ticket/back/methods/expedition-state/updateExpeditionState.js
rename to modules/ticket/back/methods/expedition-state/addExpeditionState.js
index ce5144d30..d22d7c676 100644
--- a/modules/ticket/back/methods/expedition-state/updateExpeditionState.js
+++ b/modules/ticket/back/methods/expedition-state/addExpeditionState.js
@@ -17,7 +17,7 @@ module.exports = Self => {
}
],
http: {
- path: `/updateExpeditionState`,
+ path: `/addExpeditionState`,
verb: 'post'
}
});
@@ -52,10 +52,11 @@ module.exports = Self => {
const typeFk = result[0].id;
- const newExpeditionState = await models.Self.create({
+ const newExpeditionState = models.Self.create({
expeditionFk: expedition.expeditionFk,
typeFk,
});
+ promises.push(newExpeditionState);
}
await Promise.all(promises);
diff --git a/modules/ticket/back/models/expedition-state.js b/modules/ticket/back/models/expedition-state.js
index 041c57be6..496dd88d3 100644
--- a/modules/ticket/back/models/expedition-state.js
+++ b/modules/ticket/back/models/expedition-state.js
@@ -1,4 +1,4 @@
module.exports = function(Self) {
require('../methods/expedition-state/filter')(Self);
- require('../methods/expedition-state/updateExpeditionState')(Self);
+ require('../methods/expedition-state/addExpeditionState')(Self);
};
From a0fee6ad50add6065c60c701ab9abcbf1adfc611 Mon Sep 17 00:00:00 2001
From: jorgep
Date: Wed, 26 Jul 2023 09:20:54 +0200
Subject: [PATCH 0474/1087] refs #5929 removed useless vars
---
modules/ticket/back/methods/ticket/addSale.js | 2 +-
modules/ticket/back/methods/ticket/componentUpdate.js | 2 +-
modules/ticket/back/methods/ticket/priceDifference.js | 2 +-
modules/ticket/back/methods/ticket/recalculateComponents.js | 2 +-
modules/ticket/back/methods/ticket/setDeleted.js | 2 +-
.../back/methods/ticket/specs/isEditableOrThrow.spec.js | 6 +-----
modules/ticket/back/methods/ticket/transferClient.js | 2 +-
modules/ticket/back/methods/ticket/transferSales.js | 2 +-
8 files changed, 8 insertions(+), 12 deletions(-)
diff --git a/modules/ticket/back/methods/ticket/addSale.js b/modules/ticket/back/methods/ticket/addSale.js
index 9a3e32a7e..cbf884273 100644
--- a/modules/ticket/back/methods/ticket/addSale.js
+++ b/modules/ticket/back/methods/ticket/addSale.js
@@ -46,7 +46,7 @@ module.exports = Self => {
}
try {
- const isEditable = await models.Ticket.isEditableOrThrow(ctx, id, myOptions);
+ await models.Ticket.isEditableOrThrow(ctx, id, myOptions);
const item = await models.Item.findById(itemId, null, myOptions);
const ticket = await models.Ticket.findById(id, {
diff --git a/modules/ticket/back/methods/ticket/componentUpdate.js b/modules/ticket/back/methods/ticket/componentUpdate.js
index eadbf65c2..b5ff50d59 100644
--- a/modules/ticket/back/methods/ticket/componentUpdate.js
+++ b/modules/ticket/back/methods/ticket/componentUpdate.js
@@ -115,7 +115,7 @@ module.exports = Self => {
const userId = ctx.req.accessToken.userId;
const models = Self.app.models;
const $t = ctx.req.__; // $translate
- const isEditable = await models.Ticket.isEditableOrThrow(ctx, args.id, myOptions);
+ await models.Ticket.isEditableOrThrow(ctx, args.id, myOptions);
const editZone = await models.ACL.checkAccessAcl(ctx, 'Ticket', 'editZone', 'WRITE');
if (!editZone) {
diff --git a/modules/ticket/back/methods/ticket/priceDifference.js b/modules/ticket/back/methods/ticket/priceDifference.js
index 754646b03..495e9e1aa 100644
--- a/modules/ticket/back/methods/ticket/priceDifference.js
+++ b/modules/ticket/back/methods/ticket/priceDifference.js
@@ -70,7 +70,7 @@ module.exports = Self => {
}
try {
- const isEditable = await Self.isEditableOrThrow(ctx, args.id, myOptions);
+ await Self.isEditableOrThrow(ctx, args.id, myOptions);
const editZone = await models.ACL.checkAccessAcl(ctx, 'Ticket', 'editZone', 'WRITE');
if (!editZone) {
diff --git a/modules/ticket/back/methods/ticket/recalculateComponents.js b/modules/ticket/back/methods/ticket/recalculateComponents.js
index 78c44bab3..bdf74f8b6 100644
--- a/modules/ticket/back/methods/ticket/recalculateComponents.js
+++ b/modules/ticket/back/methods/ticket/recalculateComponents.js
@@ -32,7 +32,7 @@ module.exports = Self => {
}
try {
- const isEditable = await Self.isEditableOrThrow(ctx, id, myOptions);
+ await Self.isEditableOrThrow(ctx, id, myOptions);
const recalculation = await Self.rawSql('CALL vn.ticket_recalcComponents(?, NULL)', [id], myOptions);
diff --git a/modules/ticket/back/methods/ticket/setDeleted.js b/modules/ticket/back/methods/ticket/setDeleted.js
index 6485f198e..2f8c402da 100644
--- a/modules/ticket/back/methods/ticket/setDeleted.js
+++ b/modules/ticket/back/methods/ticket/setDeleted.js
@@ -39,7 +39,7 @@ module.exports = Self => {
const ticketToDelete = await models.Ticket.findById(id, {fields: ['isDeleted']}, myOptions);
if (ticketToDelete.isDeleted) return false;
- const isEditable = await Self.isEditableOrThrow(ctx, id, myOptions);
+ await Self.isEditableOrThrow(ctx, id, myOptions);
// Check if ticket has refunds
const ticketRefunds = await models.TicketRefund.find({
diff --git a/modules/ticket/back/methods/ticket/specs/isEditableOrThrow.spec.js b/modules/ticket/back/methods/ticket/specs/isEditableOrThrow.spec.js
index b65ed64a1..6c89bac26 100644
--- a/modules/ticket/back/methods/ticket/specs/isEditableOrThrow.spec.js
+++ b/modules/ticket/back/methods/ticket/specs/isEditableOrThrow.spec.js
@@ -65,13 +65,9 @@ describe('ticket isEditableOrThrow()', () => {
let error;
try {
const options = {transaction: tx};
-
const ctx = {req: {accessToken: {userId: 1}}};
- const result = await models.Ticket.isEditableOrThrow(ctx, 15, options);
-
- expect(result).toEqual(false);
-
+ await models.Ticket.isEditableOrThrow(ctx, 15, options);
await tx.rollback();
} catch (e) {
error = e;
diff --git a/modules/ticket/back/methods/ticket/transferClient.js b/modules/ticket/back/methods/ticket/transferClient.js
index c87ad4881..60e70d710 100644
--- a/modules/ticket/back/methods/ticket/transferClient.js
+++ b/modules/ticket/back/methods/ticket/transferClient.js
@@ -28,7 +28,7 @@ module.exports = Self => {
if (typeof options == 'object')
Object.assign(myOptions, options);
- const isEditable = await Self.isEditableOrThrow(ctx, id, myOptions);
+ await Self.isEditableOrThrow(ctx, id, myOptions);
const ticket = await models.Ticket.findById(
id,
diff --git a/modules/ticket/back/methods/ticket/transferSales.js b/modules/ticket/back/methods/ticket/transferSales.js
index bd99920db..a48c5683c 100644
--- a/modules/ticket/back/methods/ticket/transferSales.js
+++ b/modules/ticket/back/methods/ticket/transferSales.js
@@ -48,7 +48,7 @@ module.exports = Self => {
}
try {
- const isEditable = await models.Ticket.isEditableOrThrow(ctx, id, myOptions);
+ await models.Ticket.isEditableOrThrow(ctx, id, myOptions);
if (ticketId) {
const isReceiverEditable = await models.Ticket.isEditable(ctx, ticketId, myOptions);
From bbc26d8ba4f9bd5b02d8c3981366ad6041a6b4c6 Mon Sep 17 00:00:00 2001
From: jorgep
Date: Wed, 26 Jul 2023 12:36:30 +0200
Subject: [PATCH 0475/1087] WIP refs #5216 addExpeditionState
---
.../expedition-state/addExpeditionState.js | 33 ++++++++-----------
modules/ticket/back/model-config.json | 3 ++
.../back/models/expedition-state-type.js | 3 ++
.../back/models/expedition-state-type.json | 22 +++++++++++++
4 files changed, 42 insertions(+), 19 deletions(-)
create mode 100644 modules/ticket/back/models/expedition-state-type.js
create mode 100644 modules/ticket/back/models/expedition-state-type.json
diff --git a/modules/ticket/back/methods/expedition-state/addExpeditionState.js b/modules/ticket/back/methods/expedition-state/addExpeditionState.js
index d22d7c676..33a5ae552 100644
--- a/modules/ticket/back/methods/expedition-state/addExpeditionState.js
+++ b/modules/ticket/back/methods/expedition-state/addExpeditionState.js
@@ -1,17 +1,11 @@
-const UserError = require('vn-loopback/util/user-error');
-
module.exports = Self => {
- Self.remoteMethod('updateExpedtionState', {
+ Self.remoteMethod('addExpeditionState', {
description: 'Update an expedition state',
+ accessType: 'WRITE',
accepts: [
{
arg: 'expeditions',
- type: [
- {
- expeditionFk: 'number',
- stateCode: 'string'
- }
- ],
+ type: ['object'],
required: true,
description: 'Array of objects containing expeditionFk and stateCode'
}
@@ -23,6 +17,7 @@ module.exports = Self => {
});
Self.updateExpedtionState = async(expeditions, options) => {
+ console.log('Expeditions!!!!!!!!', expeditions);
const models = Self.app.models;
let tx;
const myOptions = {};
@@ -35,22 +30,22 @@ module.exports = Self => {
myOptions.transaction = tx;
}
- if (expeditions.length === 0)
- return false;
-
const promises = [];
try {
const conn = Self.dataSource.connector;
for (const expedition of expeditions) {
- const stmt = new ParameterizedSQL(
- `SELECT id FROM vn.expeditionStateType WHERE code = ?`,
- [expedition.stateCode]
+ const expeditionStateType = await models.expeditionStateType.findOne(
+ {
+ fields: ['id'],
+ where: {code: expedition.stateCode}
+ }
);
- const result = await conn.query(stmt);
- if (result.length === 0)
- throw new Error(`The state code '${exp.stateCode}' does not exist.`);
- const typeFk = result[0].id;
+ const result = await conn.query(stmt);
+ if (!expeditionStateType.id)
+ throw new Error(`The state code '${expedition.stateCode}' does not exist.`);
+
+ const typeFk = result.id;
const newExpeditionState = models.Self.create({
expeditionFk: expedition.expeditionFk,
diff --git a/modules/ticket/back/model-config.json b/modules/ticket/back/model-config.json
index 3c7e12eea..83d7303b7 100644
--- a/modules/ticket/back/model-config.json
+++ b/modules/ticket/back/model-config.json
@@ -20,6 +20,9 @@
"ExpeditionState": {
"dataSource": "vn"
},
+ "ExpeditionStateType": {
+ "dataSource": "vn"
+ },
"Packaging": {
"dataSource": "vn"
},
diff --git a/modules/ticket/back/models/expedition-state-type.js b/modules/ticket/back/models/expedition-state-type.js
new file mode 100644
index 000000000..f21b44940
--- /dev/null
+++ b/modules/ticket/back/models/expedition-state-type.js
@@ -0,0 +1,3 @@
+module.exports = function(Self) {
+
+};
diff --git a/modules/ticket/back/models/expedition-state-type.json b/modules/ticket/back/models/expedition-state-type.json
new file mode 100644
index 000000000..70207568b
--- /dev/null
+++ b/modules/ticket/back/models/expedition-state-type.json
@@ -0,0 +1,22 @@
+{
+ "name": "ExpeditionStateType",
+ "base": "VnModel",
+ "options": {
+ "mysql": {
+ "table": "expeditionStateType"
+ }
+ },
+ "properties": {
+ "id": {
+ "id": true,
+ "type": "number",
+ "description": "Identifier"
+ },
+ "description": {
+ "type": "string"
+ },
+ "code": {
+ "type": "string"
+ }
+ }
+}
\ No newline at end of file
From 2a0c363dc5443091d71df034da772032b56191e3 Mon Sep 17 00:00:00 2001
From: carlossa
Date: Wed, 26 Jul 2023 13:28:40 +0200
Subject: [PATCH 0476/1087] hotfix change model
---
.../assets/files/{model.ezp => model.ezpx} | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
rename print/templates/email/printer-setup/assets/files/{model.ezp => model.ezpx} (95%)
diff --git a/print/templates/email/printer-setup/assets/files/model.ezp b/print/templates/email/printer-setup/assets/files/model.ezpx
similarity index 95%
rename from print/templates/email/printer-setup/assets/files/model.ezp
rename to print/templates/email/printer-setup/assets/files/model.ezpx
index dba98e0ee..739593447 100644
--- a/print/templates/email/printer-setup/assets/files/model.ezp
+++ b/print/templates/email/printer-setup/assets/files/model.ezpx
@@ -539,9 +539,9 @@
24
-
+ false
- false
+ true42949672955W5
@@ -571,15 +571,15 @@
2896
- 187
- 24
+ 138
+ 324262896
- 187
- 24
+ 138
+ 324262896
@@ -621,14 +621,14 @@
New label
-Lang:(es-ES) OS:Microsoft Windows NT 10.0.22000.0(Win32NT)
+Lang:(es-ES) OS:Microsoft Windows NT 10.0.19045.0(Win32NT)
Mm203EZPL
- GODEX G300#132207AB
- None
+ 00000000
+ COM1USB28867948559100
From 10361ba78e584735dd2b239f97cdbde036a93a93 Mon Sep 17 00:00:00 2001
From: jorgep
Date: Wed, 26 Jul 2023 13:33:56 +0200
Subject: [PATCH 0477/1087] refs #5216 addExpeditionState refactored
---
.../expedition-state/addExpeditionState.js | 27 ++++++++++---------
.../back/models/expedition-state-type.js | 3 ---
2 files changed, 14 insertions(+), 16 deletions(-)
delete mode 100644 modules/ticket/back/models/expedition-state-type.js
diff --git a/modules/ticket/back/methods/expedition-state/addExpeditionState.js b/modules/ticket/back/methods/expedition-state/addExpeditionState.js
index 33a5ae552..16b7a4c75 100644
--- a/modules/ticket/back/methods/expedition-state/addExpeditionState.js
+++ b/modules/ticket/back/methods/expedition-state/addExpeditionState.js
@@ -5,23 +5,28 @@ module.exports = Self => {
accepts: [
{
arg: 'expeditions',
- type: ['object'],
+ type: [{
+ expeditionFk: 'number',
+ stateCode: 'string',
+ }],
required: true,
description: 'Array of objects containing expeditionFk and stateCode'
}
],
+ returns: {
+ type: 'boolean',
+ root: true
+ },
http: {
- path: `/addExpeditionState`,
+ path: `/addState`,
verb: 'post'
}
});
- Self.updateExpedtionState = async(expeditions, options) => {
- console.log('Expeditions!!!!!!!!', expeditions);
+ Self.addExpeditionState = async(expeditions, options) => {
const models = Self.app.models;
let tx;
const myOptions = {};
-
if (typeof options == 'object')
Object.assign(myOptions, options);
@@ -32,22 +37,19 @@ module.exports = Self => {
const promises = [];
try {
- const conn = Self.dataSource.connector;
for (const expedition of expeditions) {
- const expeditionStateType = await models.expeditionStateType.findOne(
+ const expeditionStateType = await models.ExpeditionStateType.findOne(
{
fields: ['id'],
where: {code: expedition.stateCode}
}
);
- const result = await conn.query(stmt);
if (!expeditionStateType.id)
throw new Error(`The state code '${expedition.stateCode}' does not exist.`);
- const typeFk = result.id;
-
- const newExpeditionState = models.Self.create({
+ const typeFk = expeditionStateType.id;
+ const newExpeditionState = models.ExpeditionState.create({
expeditionFk: expedition.expeditionFk,
typeFk,
});
@@ -57,11 +59,10 @@ module.exports = Self => {
await Promise.all(promises);
if (tx) await tx.commit();
-
return true;
} catch (e) {
if (tx) await tx.rollback();
- throw e;
+ return false;
}
};
};
diff --git a/modules/ticket/back/models/expedition-state-type.js b/modules/ticket/back/models/expedition-state-type.js
deleted file mode 100644
index f21b44940..000000000
--- a/modules/ticket/back/models/expedition-state-type.js
+++ /dev/null
@@ -1,3 +0,0 @@
-module.exports = function(Self) {
-
-};
From 1277af1399ff877069a7f33840e1174f374ba11c Mon Sep 17 00:00:00 2001
From: carlossa
Date: Wed, 26 Jul 2023 13:53:15 +0200
Subject: [PATCH 0478/1087] hotfix mod path
---
print/templates/email/printer-setup/attachments.json | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/print/templates/email/printer-setup/attachments.json b/print/templates/email/printer-setup/attachments.json
index 1e1f710c3..969fdd23a 100644
--- a/print/templates/email/printer-setup/attachments.json
+++ b/print/templates/email/printer-setup/attachments.json
@@ -1,9 +1,9 @@
[
{
- "filename": "model.ezp",
+ "filename": "model.ezpx",
"component": "printer-setup",
- "path": "/assets/files/model.ezp",
- "cid": "model.ezp"
+ "path": "/assets/files/model.ezpx",
+ "cid": "model.ezpx"
},
{
"filename": "port.png",
@@ -11,4 +11,4 @@
"path": "/assets/files/port.png",
"cid": "port.png"
}
-]
\ No newline at end of file
+]
From 777426aa055fbd6d88f4c571a16896cb8f7b018b Mon Sep 17 00:00:00 2001
From: vicent
Date: Thu, 27 Jul 2023 07:58:55 +0200
Subject: [PATCH 0479/1087] refs #5561 add backTest
---
.../back/methods/sale-tracking/delete.js | 2 +-
.../ticket/back/methods/sale-tracking/new.js | 4 +-
.../sale-tracking/specs/delete.spec.js | 30 ++++++++++++
.../sale-tracking/specs/filter.spec.js | 23 +++++++++
.../specs/listSaleTracking.spec.js | 2 +-
.../methods/sale-tracking/specs/new.spec.js | 49 +++++++++++++++++++
6 files changed, 106 insertions(+), 4 deletions(-)
create mode 100644 modules/ticket/back/methods/sale-tracking/specs/delete.spec.js
create mode 100644 modules/ticket/back/methods/sale-tracking/specs/filter.spec.js
create mode 100644 modules/ticket/back/methods/sale-tracking/specs/new.spec.js
diff --git a/modules/ticket/back/methods/sale-tracking/delete.js b/modules/ticket/back/methods/sale-tracking/delete.js
index b8754d48c..0b977e5d4 100644
--- a/modules/ticket/back/methods/sale-tracking/delete.js
+++ b/modules/ticket/back/methods/sale-tracking/delete.js
@@ -1,7 +1,7 @@
module.exports = Self => {
Self.remoteMethod('delete', {
- description: 'Elimina el registro (si se cumple la condición) y inserta uno nuevo',
+ description: 'Delete sale trackings and item shelving sales',
accessType: 'READ',
accepts: [
{
diff --git a/modules/ticket/back/methods/sale-tracking/new.js b/modules/ticket/back/methods/sale-tracking/new.js
index 2be5bd86e..6a99c299c 100644
--- a/modules/ticket/back/methods/sale-tracking/new.js
+++ b/modules/ticket/back/methods/sale-tracking/new.js
@@ -1,7 +1,7 @@
module.exports = Self => {
Self.remoteMethodCtx('new', {
- description: 'Remplaza el registro o lo crea si no existe',
+ description: `Replaces the record or creates it if it doesn't exist`,
accessType: 'READ',
accepts: [
{
@@ -76,7 +76,7 @@ module.exports = Self => {
isChecked: isChecked,
originalQuantity: quantity,
isScanned: null
- });
+ }, myOptions);
}
if (tx) await tx.commit();
diff --git a/modules/ticket/back/methods/sale-tracking/specs/delete.spec.js b/modules/ticket/back/methods/sale-tracking/specs/delete.spec.js
new file mode 100644
index 000000000..a8bcf5692
--- /dev/null
+++ b/modules/ticket/back/methods/sale-tracking/specs/delete.spec.js
@@ -0,0 +1,30 @@
+const models = require('vn-loopback/server/server').models;
+
+describe('sale-tracking delete()', () => {
+ it('should delete a row of saleTracking and itemShelvingSale', async() => {
+ const tx = await models.SaleTracking.beginTransaction({});
+
+ try {
+ const options = {transaction: tx};
+
+ const itemShelvingsBefore = await models.ItemShelvingSale.find(null, options);
+ const saleTrackingsBefore = await models.SaleTracking.find(null, options);
+
+ const saleFk = 1;
+ const stateCode = 'PREPARED';
+ const result = await models.SaleTracking.delete(saleFk, stateCode, options);
+
+ const itemShelvingsAfter = await models.ItemShelvingSale.find(null, options);
+ const saleTrackingsAfter = await models.SaleTracking.find(null, options);
+
+ expect(result).toEqual(true);
+ expect(saleTrackingsAfter.length).toBeLessThan(saleTrackingsBefore.length);
+ expect(itemShelvingsAfter.length).toBeLessThan(itemShelvingsBefore.length);
+
+ await tx.rollback();
+ } catch (e) {
+ await tx.rollback();
+ throw e;
+ }
+ });
+});
diff --git a/modules/ticket/back/methods/sale-tracking/specs/filter.spec.js b/modules/ticket/back/methods/sale-tracking/specs/filter.spec.js
new file mode 100644
index 000000000..8a679f3a5
--- /dev/null
+++ b/modules/ticket/back/methods/sale-tracking/specs/filter.spec.js
@@ -0,0 +1,23 @@
+const app = require('vn-loopback/server/server');
+
+describe('sale-tracking filter()', () => {
+ it('should return 1 result filtering by ticket id', async() => {
+ const tx = await app.models.Claim.beginTransaction({});
+
+ try {
+ const options = {transaction: tx};
+
+ const id = 1;
+ const filter = {order: ['concept ASC', 'quantity DESC']};
+ const result = await app.models.SaleTracking.filter(id, filter, options);
+
+ expect(result.length).toEqual(4);
+ expect(result[0].ticketFk).toEqual(1);
+
+ await tx.rollback();
+ } catch (e) {
+ await tx.rollback();
+ throw e;
+ }
+ });
+});
diff --git a/modules/ticket/back/methods/sale-tracking/specs/listSaleTracking.spec.js b/modules/ticket/back/methods/sale-tracking/specs/listSaleTracking.spec.js
index d51c56874..89f274c57 100644
--- a/modules/ticket/back/methods/sale-tracking/specs/listSaleTracking.spec.js
+++ b/modules/ticket/back/methods/sale-tracking/specs/listSaleTracking.spec.js
@@ -1,6 +1,6 @@
const models = require('vn-loopback/server/server').models;
-describe('ticket listSaleTracking()', () => {
+describe('sale-tracking listSaleTracking()', () => {
it('should call the listSaleTracking method and return the response', async() => {
const tx = await models.SaleTracking.beginTransaction({});
diff --git a/modules/ticket/back/methods/sale-tracking/specs/new.spec.js b/modules/ticket/back/methods/sale-tracking/specs/new.spec.js
new file mode 100644
index 000000000..fcd383582
--- /dev/null
+++ b/modules/ticket/back/methods/sale-tracking/specs/new.spec.js
@@ -0,0 +1,49 @@
+const models = require('vn-loopback/server/server').models;
+
+describe('sale-tracking new()', () => {
+ it('should update a saleTracking', async() => {
+ const tx = await models.SaleTracking.beginTransaction({});
+
+ try {
+ const options = {transaction: tx};
+ const ctx = {req: {accessToken: {userId: 55}}};
+
+ const saleFk = 1;
+ const isChecked = true;
+ const quantity = 20;
+ const stateCode = 'PREPARED';
+ const result = await models.SaleTracking.new(ctx, saleFk, isChecked, quantity, stateCode, options);
+
+ expect(result.isChecked).toBe(true);
+ expect(result.originalQuantity).toBe(20);
+
+ await tx.rollback();
+ } catch (e) {
+ await tx.rollback();
+ throw e;
+ }
+ });
+
+ it('should create a saleTracking', async() => {
+ const tx = await models.SaleTracking.beginTransaction({});
+
+ try {
+ const options = {transaction: tx};
+ const ctx = {req: {accessToken: {userId: 1}}};
+
+ const saleFk = 1;
+ const isChecked = true;
+ const quantity = 20;
+ const stateCode = 'PREPARED';
+ const result = await models.SaleTracking.new(ctx, saleFk, isChecked, quantity, stateCode, options);
+
+ expect(result.isChecked).toBe(true);
+ expect(result.originalQuantity).toBe(20);
+
+ await tx.rollback();
+ } catch (e) {
+ await tx.rollback();
+ throw e;
+ }
+ });
+});
From 29baa2f0c7d7998864863761adca7eb30b6608bc Mon Sep 17 00:00:00 2001
From: alexm
Date: Thu, 27 Jul 2023 08:27:09 +0200
Subject: [PATCH 0480/1087] refs #6015 modify changelog
---
CHANGELOG.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d5928e9c4..8440e0f2f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -15,7 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
- (General -> Iconos) Añadidos nuevos iconos
-- (Clientes -> Razón social) Nuevas restricciones por pais
+- (Clientes -> Razón social) Permite crear clientes con la misma razón social según el país
### Fixed
From 65b9cadd9e6ed72d263c8a23e1efb0878069b4ca Mon Sep 17 00:00:00 2001
From: vicent
Date: Thu, 27 Jul 2023 12:51:14 +0200
Subject: [PATCH 0481/1087] refs #5804 refactor: sustituido activeBuyers por
getItemTypeWorker
---
.../item/back/methods/item/activeBuyers.js | 44 -------------------
.../methods/item/specs/activeBuyers.spec.js | 24 ----------
modules/item/back/models/item.js | 1 -
.../front/request-search-panel/index.html | 14 +++---
modules/item/front/search-panel/index.html | 12 ++---
.../ticket-request/getItemTypeWorker.js | 33 ++++++++------
.../specs/getItemTypeWorkers.spec.js | 6 +--
7 files changed, 34 insertions(+), 100 deletions(-)
delete mode 100644 modules/item/back/methods/item/activeBuyers.js
delete mode 100644 modules/item/back/methods/item/specs/activeBuyers.spec.js
diff --git a/modules/item/back/methods/item/activeBuyers.js b/modules/item/back/methods/item/activeBuyers.js
deleted file mode 100644
index e16ff877b..000000000
--- a/modules/item/back/methods/item/activeBuyers.js
+++ /dev/null
@@ -1,44 +0,0 @@
-const ParameterizedSQL = require('loopback-connector').ParameterizedSQL;
-const mergeFilters = require('vn-loopback/util/filter').mergeFilters;
-
-module.exports = Self => {
- Self.remoteMethod('activeBuyers', {
- description: 'Returns a list of buyers for the given item type',
- accepts: [{
- arg: 'filter',
- type: 'object',
- description: `Filter defining where, order, offset, and limit - must be a JSON-encoded string`
- }],
- returns: {
- type: ['object'],
- root: true
- },
- http: {
- path: `/activeBuyers`,
- verb: 'GET'
- }
- });
-
- Self.activeBuyers = async(filter, options) => {
- const conn = Self.dataSource.connector;
- const where = {isActive: true};
- const myOptions = {};
-
- if (typeof options == 'object')
- Object.assign(myOptions, options);
-
- filter = mergeFilters(filter, {where});
-
- let stmt = new ParameterizedSQL(
- `SELECT DISTINCT w.id workerFk, w.firstName, w.lastName, u.name, u.nickname
- FROM worker w
- JOIN itemType it ON it.workerFk = w.id
- JOIN account.user u ON u.id = w.id
- JOIN item i ON i.typeFk = it.id`,
- null, myOptions);
-
- stmt.merge(conn.makeSuffix(filter));
-
- return conn.executeStmt(stmt);
- };
-};
diff --git a/modules/item/back/methods/item/specs/activeBuyers.spec.js b/modules/item/back/methods/item/specs/activeBuyers.spec.js
deleted file mode 100644
index 5bf36756f..000000000
--- a/modules/item/back/methods/item/specs/activeBuyers.spec.js
+++ /dev/null
@@ -1,24 +0,0 @@
-const models = require('vn-loopback/server/server').models;
-
-describe('Worker activeBuyers', () => {
- it('should return the buyers in itemType as result', async() => {
- const tx = await models.Item.beginTransaction({});
-
- try {
- const options = {transaction: tx};
- const filter = {};
- const result = await models.Item.activeBuyers(filter, options);
- const firstWorker = result[0];
- const secondWorker = result[1];
-
- expect(result.length).toEqual(2);
- expect(firstWorker.nickname).toEqual('logisticBossNick');
- expect(secondWorker.nickname).toEqual('buyerNick');
-
- await tx.rollback();
- } catch (e) {
- await tx.rollback();
- throw e;
- }
- });
-});
diff --git a/modules/item/back/models/item.js b/modules/item/back/models/item.js
index b8baa97ea..61c5c2588 100644
--- a/modules/item/back/models/item.js
+++ b/modules/item/back/models/item.js
@@ -14,7 +14,6 @@ module.exports = Self => {
require('../methods/item/getWasteByWorker')(Self);
require('../methods/item/getWasteByItem')(Self);
require('../methods/item/createIntrastat')(Self);
- require('../methods/item/activeBuyers')(Self);
require('../methods/item/buyerWasteEmail')(Self);
require('../methods/item/labelPdf')(Self);
diff --git a/modules/item/front/request-search-panel/index.html b/modules/item/front/request-search-panel/index.html
index a76684776..9d35fbca4 100644
--- a/modules/item/front/request-search-panel/index.html
+++ b/modules/item/front/request-search-panel/index.html
@@ -1,7 +1,7 @@
@@ -26,7 +26,7 @@
search-function="{firstName: $search}"
value-field="id"
where="{role: {inq: ['logistic', 'buyer']}}"
- label="Atender">
+ label="Buyer">
{{nickname}}
@@ -57,7 +57,7 @@
{{firstName}} {{lastName}}
-
+
-
-
-
- {
- Self.remoteMethodCtx('getItemTypeWorker', {
+ Self.remoteMethod('getItemTypeWorker', {
description: 'Returns the workers that appear in itemType',
accessType: 'READ',
accepts: [{
@@ -20,10 +22,9 @@ module.exports = Self => {
}
});
- Self.getItemTypeWorker = async(ctx, filter, options) => {
+ Self.getItemTypeWorker = async(filter, options) => {
const myOptions = {};
const conn = Self.dataSource.connector;
- let tx;
if (typeof options == 'object')
Object.assign(myOptions, options);
@@ -33,25 +34,29 @@ module.exports = Self => {
FROM itemType it
JOIN worker w ON w.id = it.workerFk
JOIN account.user u ON u.id = w.id`;
+ const stmt = new ParameterizedSQL(query);
- let stmt = new ParameterizedSQL(query);
-
- if (filter.where) {
- const value = filter.where.firstName;
- const myFilter = {
- where: {or: [
+ filter.where = buildFilter(filter.where, (param, value) => {
+ switch (param) {
+ case 'firstName':
+ return {or: [
{'w.firstName': {like: `%${value}%`}},
{'w.lastName': {like: `%${value}%`}},
{'u.name': {like: `%${value}%`}},
{'u.nickname': {like: `%${value}%`}}
- ]}
- };
+ ]};
+ case 'id':
+ return {'w.id': value};
+ }
+ });
- stmt.merge(conn.makeSuffix(myFilter));
- }
+ let myFilter = {
+ where: {'u.active': true}
+ };
- if (tx) await tx.commit();
+ myFilter = mergeFilters(myFilter, filter);
+ stmt.merge(conn.makeSuffix(myFilter));
return conn.executeStmt(stmt);
};
};
diff --git a/modules/ticket/back/methods/ticket-request/specs/getItemTypeWorkers.spec.js b/modules/ticket/back/methods/ticket-request/specs/getItemTypeWorkers.spec.js
index ae5c508b6..c57451c26 100644
--- a/modules/ticket/back/methods/ticket-request/specs/getItemTypeWorkers.spec.js
+++ b/modules/ticket/back/methods/ticket-request/specs/getItemTypeWorkers.spec.js
@@ -1,12 +1,10 @@
const models = require('vn-loopback/server/server').models;
describe('ticket-request getItemTypeWorker()', () => {
- const ctx = {req: {accessToken: {userId: 18}}};
-
it('should return the buyer as result', async() => {
const filter = {where: {firstName: 'buyer'}};
- const result = await models.TicketRequest.getItemTypeWorker(ctx, filter);
+ const result = await models.TicketRequest.getItemTypeWorker(filter);
expect(result.length).toEqual(1);
});
@@ -14,7 +12,7 @@ describe('ticket-request getItemTypeWorker()', () => {
it('should return the workers at itemType as result', async() => {
const filter = {};
- const result = await models.TicketRequest.getItemTypeWorker(ctx, filter);
+ const result = await models.TicketRequest.getItemTypeWorker(filter);
expect(result.length).toBeGreaterThan(1);
});
From 3bc3ffe1153644fc568d24176e6ca3590d36f491 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Carlos=20Andr=C3=A9s?=
Date: Thu, 27 Jul 2023 13:40:39 +0200
Subject: [PATCH 0482/1087] refs #6077 Log-InvoiceInDueday-incorrecto
---
.../invoiceIn/back/locale/invoiceIn/en.yml | 20 +++++++++++++++++++
.../invoiceIn/back/locale/invoiceIn/es.yml | 20 +++++++++++++++++++
.../back/locale/invoiceInDueDay/en.yml | 9 +++++++++
.../back/locale/invoiceInDueDay/es.yml | 9 +++++++++
.../invoiceIn/back/locale/invoiceInTax/en.yml | 12 +++++++++++
.../invoiceIn/back/locale/invoiceInTax/es.yml | 12 +++++++++++
6 files changed, 82 insertions(+)
create mode 100644 modules/invoiceIn/back/locale/invoiceIn/en.yml
create mode 100644 modules/invoiceIn/back/locale/invoiceIn/es.yml
create mode 100644 modules/invoiceIn/back/locale/invoiceInDueDay/en.yml
create mode 100644 modules/invoiceIn/back/locale/invoiceInDueDay/es.yml
create mode 100644 modules/invoiceIn/back/locale/invoiceInTax/en.yml
create mode 100644 modules/invoiceIn/back/locale/invoiceInTax/es.yml
diff --git a/modules/invoiceIn/back/locale/invoiceIn/en.yml b/modules/invoiceIn/back/locale/invoiceIn/en.yml
new file mode 100644
index 000000000..4110dcdbc
--- /dev/null
+++ b/modules/invoiceIn/back/locale/invoiceIn/en.yml
@@ -0,0 +1,20 @@
+name: invoice in
+columns:
+ id: id
+ serialNumber: serial number
+ serial: serial
+ supplierFk: supplier
+ issued: issued
+ supplierRef: supplierRef
+ isBooked: is booked
+ currencyFk: currency
+ created: created
+ companyFk: company
+ docFk: document
+ booked: booked
+ operated: operated
+ bookEntried: book entried
+ isVatDeductible: is VAT deductible
+ withholdingSageFk: withholding
+ expenceFkDeductible: expence deductible
+ editorFk: editor
\ No newline at end of file
diff --git a/modules/invoiceIn/back/locale/invoiceIn/es.yml b/modules/invoiceIn/back/locale/invoiceIn/es.yml
new file mode 100644
index 000000000..432b27cb3
--- /dev/null
+++ b/modules/invoiceIn/back/locale/invoiceIn/es.yml
@@ -0,0 +1,20 @@
+name: factura recibida
+columns:
+ id: id
+ serialNumber: número de serie
+ serial: serie
+ supplierFk: proveedor
+ issued: fecha emisión
+ supplierRef: referéncia proveedor
+ isBooked: facturado
+ currencyFk: moneda
+ created: creado
+ companyFk: empresa
+ docFk: documento
+ booked: fecha contabilización
+ operated: fecha entrega
+ bookEntried: fecha asiento
+ isVatDeductible: impuesto deducible
+ withholdingSageFk: código de retención
+ expenceFkDeductible: gasto deducible
+ editorFk: editor
\ No newline at end of file
diff --git a/modules/invoiceIn/back/locale/invoiceInDueDay/en.yml b/modules/invoiceIn/back/locale/invoiceInDueDay/en.yml
new file mode 100644
index 000000000..5e42dfc66
--- /dev/null
+++ b/modules/invoiceIn/back/locale/invoiceInDueDay/en.yml
@@ -0,0 +1,9 @@
+name: invoice in due day
+columns:
+ id: id
+ invoiceInFk: invoice in
+ dueDated: due date
+ bankFk: bank
+ amount: amount
+ foreignValue : foreign amount
+ created: created
diff --git a/modules/invoiceIn/back/locale/invoiceInDueDay/es.yml b/modules/invoiceIn/back/locale/invoiceInDueDay/es.yml
new file mode 100644
index 000000000..168db9803
--- /dev/null
+++ b/modules/invoiceIn/back/locale/invoiceInDueDay/es.yml
@@ -0,0 +1,9 @@
+name: vencimientos factura recibida
+columns:
+ id: id
+ invoiceInFk: factura
+ dueDated: fecha vto.
+ bankFk: banco
+ amount: importe
+ foreignValue : importe divisa
+ created: creado
diff --git a/modules/invoiceIn/back/locale/invoiceInTax/en.yml b/modules/invoiceIn/back/locale/invoiceInTax/en.yml
new file mode 100644
index 000000000..86a9e42c3
--- /dev/null
+++ b/modules/invoiceIn/back/locale/invoiceInTax/en.yml
@@ -0,0 +1,12 @@
+name: invoice in tax
+colmns:
+ id: id
+ invoiceInFk: invoice in
+ taxCodeFk: tax
+ taxableBase: taxable base
+ expenceFk: expence
+ foreignValue: foreign amount
+ taxTypeSageFk: tax type
+ transactionTypeSageFk: transaction type
+ created: created
+ editorFk: editor
diff --git a/modules/invoiceIn/back/locale/invoiceInTax/es.yml b/modules/invoiceIn/back/locale/invoiceInTax/es.yml
new file mode 100644
index 000000000..233c591e9
--- /dev/null
+++ b/modules/invoiceIn/back/locale/invoiceInTax/es.yml
@@ -0,0 +1,12 @@
+name: factura recibida impuesto
+colmns:
+ id: id
+ invoiceInFk: factura recibida
+ taxCodeFk: código IVA
+ taxableBase: base imponible
+ expenceFk: código gasto
+ foreignValue: importe divisa
+ taxTypeSageFk: código impuesto
+ transactionTypeSageFk: código transacción
+ created: creado
+ editorFk: editor
\ No newline at end of file
From 7367d1cdfeb5f5b4ba9114229ced38bd920e70c9 Mon Sep 17 00:00:00 2001
From: vicent
Date: Thu, 27 Jul 2023 14:41:53 +0200
Subject: [PATCH 0483/1087] refs #6013 fix: add await
---
.../back/methods/worker-time-control/weeklyHourRecordEmail.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/modules/worker/back/methods/worker-time-control/weeklyHourRecordEmail.js b/modules/worker/back/methods/worker-time-control/weeklyHourRecordEmail.js
index f44080559..3203dea82 100644
--- a/modules/worker/back/methods/worker-time-control/weeklyHourRecordEmail.js
+++ b/modules/worker/back/methods/worker-time-control/weeklyHourRecordEmail.js
@@ -51,7 +51,7 @@ module.exports = Self => {
const salix = await models.Url.findOne({
where: {
appName: 'salix',
- environment: process.env.NODE_ENV || 'dev'
+ environment: process.env.NODE_ENV || 'development'
}
}, myOptions);
@@ -61,7 +61,7 @@ module.exports = Self => {
const url = `${salix.url}worker/${args.workerId}/time-control?timestamp=${timestamp}`;
ctx.args.url = url;
- Self.sendTemplate(ctx, 'weekly-hour-record');
+ await Self.sendTemplate(ctx, 'weekly-hour-record');
return models.WorkerTimeControl.updateWorkerTimeControlMail(ctx, myOptions);
};
From 0054f2d82f04b3a26bbf341be66f499918ee8676 Mon Sep 17 00:00:00 2001
From: vicent
Date: Thu, 27 Jul 2023 15:07:10 +0200
Subject: [PATCH 0484/1087] refs #6013 fix: codigo no bloqueante
---
.../methods/worker-time-control/sendMail.js | 47 +++++++++++++++----
1 file changed, 37 insertions(+), 10 deletions(-)
diff --git a/modules/worker/back/methods/worker-time-control/sendMail.js b/modules/worker/back/methods/worker-time-control/sendMail.js
index ab5e56a77..13317fc65 100644
--- a/modules/worker/back/methods/worker-time-control/sendMail.js
+++ b/modules/worker/back/methods/worker-time-control/sendMail.js
@@ -121,15 +121,18 @@ module.exports = Self => {
`, [started, ended]);
stmts.push(stmt);
- stmt = new ParameterizedSQL(`INSERT INTO mail (receiver, subject, body)
- SELECT CONCAT(u.name, '@verdnatura.es'),
- CONCAT('Error registro de horas semana ', ?, ' año ', ?) ,
- CONCAT('No se ha podido enviar el registro de horas al empleado/s: ', GROUP_CONCAT(DISTINCT CONCAT(' ', w.id, ' ', w.firstName, ' ', w.lastName)))
- FROM tmp.timeControlError tce
- JOIN vn.workerTimeControl wtc ON wtc.id = tce.id
- JOIN worker w ON w.id = wtc.userFK
- JOIN account.user u ON u.id = w.bossFk
- GROUP BY w.bossFk`, [args.week, args.year]);
+ stmt = new ParameterizedSQL(`
+ INSERT INTO mail (receiver, subject, body)
+ SELECT CONCAT(u.name, '@verdnatura.es'),
+ CONCAT('Error registro de horas semana ', ?, ' año ', ?) ,
+ CONCAT('No se ha podido enviar el registro de horas al empleado/s: ',
+ GROUP_CONCAT(DISTINCT CONCAT(' ', w.id, ' ', w.firstName, ' ', w.lastName)))
+ FROM tmp.timeControlError tce
+ JOIN vn.workerTimeControl wtc ON wtc.id = tce.id
+ JOIN worker w ON w.id = wtc.userFK
+ JOIN account.user u ON u.id = w.bossFk
+ GROUP BY w.bossFk
+ `, [args.week, args.year]);
stmts.push(stmt);
stmt = new ParameterizedSQL(`
@@ -176,6 +179,7 @@ module.exports = Self => {
const workerTimeControlConfig = await models.WorkerTimeControlConfig.findOne(null, myOptions);
+ console.log(days[index]);
for (let day of days[index]) {
if (!myOptions.transaction) {
tx = await Self.beginTransaction({});
@@ -371,7 +375,30 @@ module.exports = Self => {
}
} catch (e) {
if (tx) await tx.rollback();
- throw e;
+ delete myOptions.transaction;
+
+ const stmts = [];
+ let stmt;
+ stmt = new ParameterizedSQL(`
+ INSERT INTO mail (receiver, subject, body)
+ SELECT CONCAT(u.name, '@verdnatura.es'),
+ CONCAT('Error registro de horas semana ', ?, ' año ', ?) ,
+ CONCAT('No se ha podido enviar el registro de horas al empleado/s: ',
+ GROUP_CONCAT(DISTINCT CONCAT(' ', w.id, ' ', w.firstName, ' ', w.lastName)))
+ FROM worker w
+ JOIN account.user u ON u.id = w.bossFk
+ WHERE w.id = ?
+ GROUP BY w.bossFk
+ `, [args.week, args.year, day.workerFk]);
+ stmts.push(stmt);
+
+ const sql = ParameterizedSQL.join(stmts, ';');
+ await conn.executeStmt(sql);
+
+ previousWorkerFk = day.workerFk;
+ previousReceiver = day.receiver;
+
+ continue;
}
}
From d01584bfb32d10797f0c117502d99d7f0b0fce8a Mon Sep 17 00:00:00 2001
From: carlossa
Date: Thu, 27 Jul 2023 15:15:55 +0200
Subject: [PATCH 0485/1087] refs #4764 service
---
loopback/locale/es.json | 3 +-
modules/ticket/front/services/index.html | 17 +++----
modules/ticket/front/services/index.js | 59 ++++++++----------------
3 files changed, 27 insertions(+), 52 deletions(-)
diff --git a/loopback/locale/es.json b/loopback/locale/es.json
index ac62d62e1..e26153caa 100644
--- a/loopback/locale/es.json
+++ b/loopback/locale/es.json
@@ -311,5 +311,6 @@
"You don't have enough privileges.": "No tienes suficientes permisos.",
"This ticket is locked.": "Este ticket está bloqueado.",
"This ticket is not editable.": "Este ticket no es editable.",
- "The ticket doesn't exist.": "No existe el ticket."
+ "The ticket doesn't exist.": "No existe el ticket.",
+ "There is no zone for these parameters": "There is no zone for these parameters"
}
\ No newline at end of file
diff --git a/modules/ticket/front/services/index.html b/modules/ticket/front/services/index.html
index 9c4ec0ce4..53c02b304 100644
--- a/modules/ticket/front/services/index.html
+++ b/modules/ticket/front/services/index.html
@@ -26,16 +26,19 @@
+ {{ watcher.dataChanged() }}
-
+
-
-
+
this.$.model.refresh())
- .then(() => this.$.watcher.notifySaved())
- .then(() => {
- this.isDataSaved = true;
- });
- }
-
- selectedServices() {
- if (!this.services) return;
-
- return this.services.filter(service => {
- return service.checked;
- });
- }
-
- selectedValidServices() {
- if (!this.services) return;
-
- const selectedServices = this.selectedServices();
- return selectedServices.filter(service => {
- return service.id != undefined;
- });
- }
-
- hasSelectedServices() {
- const selected = this.selectedServices() || [];
- return selected.length > 0;
+ .then(() => this.$.watcher.notifySaved());
}
createRefund() {
- this.$.model.save()
- .then(() => {
- const services = this.selectedValidServices();
- if (!services) return;
- const servicesIds = services.map(service => service.id);
+ const services = this.services;
+ if (!services) return;
+ const servicesIds = services.map(service => service.id);
- const params = {servicesIds: servicesIds};
- const query = 'Sales/refund';
- this.$http.post(query, params).then(res => {
- const refundTicket = res.data;
- this.vnApp.showSuccess(this.$t('The following refund ticket have been created', {
- ticketId: refundTicket.id
- }));
- this.$state.go('ticket.card.sale', {id: refundTicket.id});
- });
- });
+ const params = {servicesIds: servicesIds, withWarehouse: false};
+ const query = 'Sales/refund';
+ this.$http.post(query, params).then(res => {
+ const refundTicket = res.data;
+ this.vnApp.showSuccess(this.$t('The following refund ticket have been created', {
+ ticketId: refundTicket.id
+ }));
+ this.$state.go('ticket.card.sale', {id: refundTicket.id});
+ });
+ }
+
+ addChecked(id) {
+ this.checkeds.push(id);
}
}
From d3aa6ddf6b7973a424c330b4492e2f03d81dd1c4 Mon Sep 17 00:00:00 2001
From: carlossa
Date: Thu, 27 Jul 2023 17:26:36 +0200
Subject: [PATCH 0486/1087] refs change fixtures acls
---
db/changes/232801/01-deliveryAssistantACL.sql | 21 -------------------
1 file changed, 21 deletions(-)
delete mode 100644 db/changes/232801/01-deliveryAssistantACL.sql
diff --git a/db/changes/232801/01-deliveryAssistantACL.sql b/db/changes/232801/01-deliveryAssistantACL.sql
deleted file mode 100644
index 22ee9d796..000000000
--- a/db/changes/232801/01-deliveryAssistantACL.sql
+++ /dev/null
@@ -1,21 +0,0 @@
--- Auto-generated SQL script. Actual values for binary/complex data types may differ - what you see is the default string representation of values.
-INSERT INTO `account`.`role` (name,description)
- VALUES ('deliveryAssistant','Asistencia de envios');
-
-INSERT INTO `account`.`roleInherit` (role,inheritsFrom)
- SELECT (SELECT id FROM account.role r WHERE r.name = 'deliveryAssistant'), ri.inheritsFrom
- FROM account.roleInherit ri
- JOIN account.role r ON r.id = ri.`role`
- WHERE r.name = 'deliveryBoss';
-
-
-DELETE FROM `account`.`roleInherit` WHERE role = 57;
-
-INSERT INTO `account`.`roleInherit` (role, inheritsFrom)
- SELECT (SELECT id FROM account.role WHERE name = 'deliveryBoss') role,
- (SELECT id FROM account.role WHERE name = 'deliveryAssistant') roleInherit;
-
-
-CALL account.role_syncPrivileges();
-
-
From 0546ae99eb6e518373f818b9e91f8f2c77ff7266 Mon Sep 17 00:00:00 2001
From: carlossa
Date: Thu, 27 Jul 2023 17:27:06 +0200
Subject: [PATCH 0487/1087] refs #5660 add fixtures
---
db/changes/233201/01-deliveryAssistantACL.sql | 21 +++++++++++++++++++
db/dump/dumpedFixtures.sql | 4 ++--
2 files changed, 23 insertions(+), 2 deletions(-)
create mode 100644 db/changes/233201/01-deliveryAssistantACL.sql
diff --git a/db/changes/233201/01-deliveryAssistantACL.sql b/db/changes/233201/01-deliveryAssistantACL.sql
new file mode 100644
index 000000000..22ee9d796
--- /dev/null
+++ b/db/changes/233201/01-deliveryAssistantACL.sql
@@ -0,0 +1,21 @@
+-- Auto-generated SQL script. Actual values for binary/complex data types may differ - what you see is the default string representation of values.
+INSERT INTO `account`.`role` (name,description)
+ VALUES ('deliveryAssistant','Asistencia de envios');
+
+INSERT INTO `account`.`roleInherit` (role,inheritsFrom)
+ SELECT (SELECT id FROM account.role r WHERE r.name = 'deliveryAssistant'), ri.inheritsFrom
+ FROM account.roleInherit ri
+ JOIN account.role r ON r.id = ri.`role`
+ WHERE r.name = 'deliveryBoss';
+
+
+DELETE FROM `account`.`roleInherit` WHERE role = 57;
+
+INSERT INTO `account`.`roleInherit` (role, inheritsFrom)
+ SELECT (SELECT id FROM account.role WHERE name = 'deliveryBoss') role,
+ (SELECT id FROM account.role WHERE name = 'deliveryAssistant') roleInherit;
+
+
+CALL account.role_syncPrivileges();
+
+
diff --git a/db/dump/dumpedFixtures.sql b/db/dump/dumpedFixtures.sql
index d32996bd8..b4965766c 100644
--- a/db/dump/dumpedFixtures.sql
+++ b/db/dump/dumpedFixtures.sql
@@ -78,7 +78,7 @@ USE `account`;
LOCK TABLES `role` WRITE;
/*!40000 ALTER TABLE `role` DISABLE KEYS */;
-INSERT INTO `role` VALUES (1,'employee','Empleado básico',1,'2017-05-19 07:04:58','2023-06-08 16:47:57',NULL),(2,'customer','Privilegios básicos de un cliente',1,'2017-05-19 07:04:58','2023-06-02 20:33:28',NULL),(3,'agency','Consultar tablas de predicciones de bultos',1,'2017-05-19 07:04:58','2017-05-19 07:04:58',NULL),(5,'administrative','Tareas relacionadas con la contabilidad',1,'2017-05-19 07:04:58','2017-05-19 07:04:58',NULL),(6,'guest','Privilegios para usuarios sin cuenta',1,'2017-05-19 07:04:58','2017-05-19 07:04:58',NULL),(9,'developer','Desarrolladores del sistema',1,'2017-05-19 07:04:58','2017-05-19 07:04:58',NULL),(11,'account','Privilegios relacionados con el login',0,'2017-05-19 07:04:58','2017-09-20 17:06:35',NULL),(13,'teamBoss','Jefe de equipo/departamento',1,'2017-05-19 07:04:58','2021-06-30 13:29:30',NULL),(15,'logistic','Departamento de compras, responsables de la logistica',1,'2017-05-19 07:04:58','2018-02-12 10:50:10',NULL),(16,'logisticBoss','Jefe del departamento de logística',1,'2017-05-19 07:04:58','2017-05-19 07:04:58',NULL),(17,'adminBoss','Jefe del departamento de administración',1,'2017-05-19 07:04:58','2017-05-19 07:04:58',NULL),(18,'salesPerson','Departamento de ventas',1,'2017-05-19 07:04:58','2017-05-19 07:04:58',NULL),(19,'salesBoss','Jefe del departamento de ventas',1,'2017-05-19 07:04:58','2017-08-16 12:38:27',NULL),(20,'manager','Gerencia',1,'2017-06-01 14:57:02','2022-07-29 07:36:15',NULL),(21,'salesAssistant','Jefe auxiliar de ventas',1,'2017-08-16 12:40:52','2017-08-16 12:40:52',NULL),(22,'teamManager','Jefe de departamento con privilegios de auxiliar de venta.',1,'2017-09-07 09:08:12','2017-09-07 09:08:12',NULL),(30,'financialBoss','Director finaciero',1,'2017-09-21 11:05:36','2017-09-21 11:05:36',NULL),(31,'freelancer','Trabajadores por cuenta ajena',1,'2017-10-10 12:57:26','2017-10-10 12:59:27',NULL),(32,'ett','Trabajadores de empresa temporal',1,'2017-10-10 12:58:58','2017-10-10 12:59:20',NULL),(33,'invoicing','Personal con acceso a facturación',0,'2018-01-29 16:43:34','2018-01-29 16:43:34',NULL),(34,'agencyBoss','Jefe/a del departamento de agencias',1,'2018-01-29 16:44:39','2018-02-23 07:58:53',NULL),(35,'buyer','Departamento de compras',1,'2018-02-12 10:35:42','2018-02-12 10:35:42',NULL),(36,'replenisher','Trabajadores de camara',1,'2018-02-16 14:07:10','2019-04-12 05:38:08',NULL),(37,'hr','Gestor/a de recursos humanos',1,'2018-02-22 17:34:53','2018-02-22 17:34:53',NULL),(38,'hrBoss','Jefe/a de recursos humanos',1,'2018-02-22 17:35:09','2018-02-22 17:35:09',NULL),(39,'adminAssistant','Jefe auxiliar administrativo',1,'2018-02-23 10:37:36','2018-02-23 10:38:41',NULL),(40,'handmade','Departamento de confección',1,'2018-02-23 11:14:53','2018-02-23 11:39:12',NULL),(41,'handmadeBoss','Jefe de departamento de confección',1,'2018-02-23 11:15:09','2018-02-23 11:39:26',NULL),(42,'artificial','Departamento de artificial',1,'2018-02-23 11:39:59','2018-02-23 11:39:59',NULL),(43,'artificialBoss','Jefe del departamento de artificial',1,'2018-02-23 11:40:16','2018-02-23 11:40:16',NULL),(44,'accessory','Departamento de complementos',1,'2018-02-23 11:41:12','2018-02-23 11:41:12',NULL),(45,'accessoryBoss','Jefe del departamento de complementos',1,'2018-02-23 11:41:23','2018-02-23 11:41:23',NULL),(47,'cooler','Empleados de cámara',1,'2018-02-23 13:08:18','2018-02-23 13:08:18',NULL),(48,'coolerBoss','Jefe de cámara',1,'2018-02-23 13:12:01','2023-03-13 08:49:43',NULL),(49,'production','Empleado de producción',1,'2018-02-26 15:28:23','2021-02-12 09:42:35',NULL),(50,'productionBoss','Jefe de producción',1,'2018-02-26 15:34:12','2018-02-26 15:34:12',NULL),(51,'marketing','Departamento de marketing',1,'2018-03-01 07:28:39','2018-03-01 07:28:39',NULL),(52,'marketingBoss','Jefe del departamento de marketing',1,'2018-03-01 07:28:57','2018-03-01 07:28:57',NULL),(53,'insurance','Gestor de seguros de cambio',0,'2018-03-05 07:44:35','2019-02-01 13:47:57',NULL),(54,'itemPicker','Sacador en cámara',1,'2018-03-05 12:08:17','2018-03-05 12:08:17',NULL),(55,'itemPickerBoss','Jefe de sacadores',1,'2018-03-05 12:08:31','2018-03-05 12:08:31',NULL),(56,'delivery','Personal de reparto',1,'2018-05-30 06:07:02','2018-05-30 06:07:02',NULL),(57,'deliveryBoss','Jefe de personal de reparto',1,'2018-05-30 06:07:19','2018-05-30 06:07:19',NULL),(58,'packager','Departamento encajadores',1,'2019-01-21 12:43:45','2019-01-21 12:43:45',NULL),(59,'packagerBoss','Jefe departamento encajadores',1,'2019-01-21 12:44:10','2019-01-21 12:44:10',NULL),(60,'productionAssi','Tareas relacionadas con producción y administración',1,'2019-01-29 13:29:01','2019-01-29 13:29:01',NULL),(61,'replenisherBos','Jefe de Complementos/Camara',1,'2019-07-01 06:44:07','2019-07-01 06:44:07',NULL),(62,'noLogin','Role without login access to MySQL',0,'2019-07-01 06:50:19','2019-07-02 13:42:05',NULL),(64,'balanceSheet','Consulta de Balance',0,'2019-07-16 12:12:08','2019-07-16 12:12:08',NULL),(65,'officeBoss','Jefe de filial',1,'2019-08-02 06:54:26','2019-08-02 06:54:26',NULL),(66,'sysadmin','Administrador de sistema',1,'2019-08-08 06:58:56','2019-08-08 06:58:56',NULL),(67,'adminOfficer','categoria profesional oficial de administración',1,'2020-01-03 08:09:23','2020-01-03 08:09:23',NULL),(69,'coolerAssist','Asistente de cámara con permiso compras',1,'2020-02-05 12:36:09','2023-03-13 08:50:07',NULL),(70,'trainee','Alumno de prácticas',1,'2020-03-04 11:00:25','2020-03-04 11:00:25',NULL),(71,'checker','Rol de revisor con privilegios de itemPicker',1,'2020-10-02 10:50:07','2020-10-02 10:50:07',NULL),(72,'claimManager','Personal de reclamaciones',1,'2020-10-13 10:01:32','2020-10-26 07:29:46',NULL),(73,'financial','Departamento de finanzas',1,'2020-11-16 09:30:27','2020-11-16 09:30:27',NULL),(74,'userPhotos','Privilegios para subir fotos de usuario',1,'2021-02-03 10:24:27','2021-02-03 10:24:27',NULL),(75,'catalogPhotos','Privilegios para subir fotos del catálogo',1,'2021-02-03 10:24:27','2021-02-03 10:24:27',NULL),(76,'chat','Rol para utilizar el rocket chat',1,'2020-11-27 13:06:50','2020-12-17 07:49:41',NULL),(100,'root','Rol con todos los privilegios',0,'2018-04-23 14:33:36','2020-11-12 06:50:07',NULL),(101,'buyerBoss','Jefe del departamento de compras',1,'2021-06-16 09:53:17','2021-06-16 09:53:17',NULL),(102,'preservedBoss','Responsable preservado',1,'2021-09-14 13:45:37','2021-09-14 13:45:37',NULL),(103,'it','Departamento de informática',1,'2021-11-11 09:48:22','2021-11-11 09:48:22',NULL),(104,'itBoss','Jefe de departamento de informática',1,'2021-11-11 09:48:49','2021-11-11 09:48:49',NULL),(105,'grant','Adjudicar roles a usuarios',1,'2021-11-11 12:41:09','2021-11-11 12:41:09',NULL),(106,'ext','Usuarios externos de la Base de datos',1,'2021-11-23 14:51:16','2021-11-23 14:51:16',NULL),(107,'productionPlus','Creado para pepe por orden de Juanvi',1,'2022-02-08 06:47:10','2022-02-08 06:47:10',NULL),(108,'system','System user',1,'2022-05-16 08:09:51','2022-05-16 08:09:51',NULL),(109,'salesTeamBoss','Jefe de equipo de comerciales',1,'2022-06-14 13:45:56','2022-06-14 13:45:56',NULL),(110,'palletizer','Paletizadores',1,'2022-12-02 12:56:22','2022-12-02 12:56:30',NULL),(111,'entryEditor','Entry editor',1,'2023-01-13 11:21:55','2023-01-13 11:21:55',NULL),(112,'maintenance','Personal de mantenimiento',1,'2023-01-19 06:23:35','2023-01-19 06:23:35',NULL),(114,'maintenanceBos','Jefe de mantenimiento',1,'2023-01-19 06:31:16','2023-05-17 11:07:21',NULL),(115,'itManagement','TI management',1,'2023-03-29 07:27:55','2023-03-29 07:28:04',NULL),(119,'palletizerBoss','Jefe de paletizadores',1,'2023-06-07 11:51:54','2023-06-07 11:51:54',NULL),(120,'developerBoss','Jefe de proyecto de desarrollo',1,'2023-06-19 07:07:21','2023-06-19 07:07:21',21709),(121,'buyerSalesAssistant','Rol para compradores que también son responsables de ventas',1,'2023-06-23 14:48:19','2023-06-23 14:48:19',NULL);
+INSERT INTO `role` VALUES (1,'employee','Empleado básico',1,'2017-05-19 07:04:58','2023-06-08 16:47:57',NULL),(2,'customer','Privilegios básicos de un cliente',1,'2017-05-19 07:04:58','2023-06-02 20:33:28',NULL),(3,'agency','Consultar tablas de predicciones de bultos',1,'2017-05-19 07:04:58','2017-05-19 07:04:58',NULL),(5,'administrative','Tareas relacionadas con la contabilidad',1,'2017-05-19 07:04:58','2017-05-19 07:04:58',NULL),(6,'guest','Privilegios para usuarios sin cuenta',1,'2017-05-19 07:04:58','2017-05-19 07:04:58',NULL),(9,'developer','Desarrolladores del sistema',1,'2017-05-19 07:04:58','2017-05-19 07:04:58',NULL),(11,'account','Privilegios relacionados con el login',0,'2017-05-19 07:04:58','2017-09-20 17:06:35',NULL),(13,'teamBoss','Jefe de equipo/departamento',1,'2017-05-19 07:04:58','2021-06-30 13:29:30',NULL),(15,'logistic','Departamento de compras, responsables de la logistica',1,'2017-05-19 07:04:58','2018-02-12 10:50:10',NULL),(16,'logisticBoss','Jefe del departamento de logística',1,'2017-05-19 07:04:58','2017-05-19 07:04:58',NULL),(17,'adminBoss','Jefe del departamento de administración',1,'2017-05-19 07:04:58','2017-05-19 07:04:58',NULL),(18,'salesPerson','Departamento de ventas',1,'2017-05-19 07:04:58','2017-05-19 07:04:58',NULL),(19,'salesBoss','Jefe del departamento de ventas',1,'2017-05-19 07:04:58','2017-08-16 12:38:27',NULL),(20,'manager','Gerencia',1,'2017-06-01 14:57:02','2022-07-29 07:36:15',NULL),(21,'salesAssistant','Jefe auxiliar de ventas',1,'2017-08-16 12:40:52','2017-08-16 12:40:52',NULL),(22,'teamManager','Jefe de departamento con privilegios de auxiliar de venta.',1,'2017-09-07 09:08:12','2017-09-07 09:08:12',NULL),(30,'financialBoss','Director finaciero',1,'2017-09-21 11:05:36','2017-09-21 11:05:36',NULL),(31,'freelancer','Trabajadores por cuenta ajena',1,'2017-10-10 12:57:26','2017-10-10 12:59:27',NULL),(32,'ett','Trabajadores de empresa temporal',1,'2017-10-10 12:58:58','2017-10-10 12:59:20',NULL),(33,'invoicing','Personal con acceso a facturación',0,'2018-01-29 16:43:34','2018-01-29 16:43:34',NULL),(34,'agencyBoss','Jefe/a del departamento de agencias',1,'2018-01-29 16:44:39','2018-02-23 07:58:53',NULL),(35,'buyer','Departamento de compras',1,'2018-02-12 10:35:42','2018-02-12 10:35:42',NULL),(36,'replenisher','Trabajadores de camara',1,'2018-02-16 14:07:10','2019-04-12 05:38:08',NULL),(37,'hr','Gestor/a de recursos humanos',1,'2018-02-22 17:34:53','2018-02-22 17:34:53',NULL),(38,'hrBoss','Jefe/a de recursos humanos',1,'2018-02-22 17:35:09','2018-02-22 17:35:09',NULL),(39,'adminAssistant','Jefe auxiliar administrativo',1,'2018-02-23 10:37:36','2018-02-23 10:38:41',NULL),(40,'handmade','Departamento de confección',1,'2018-02-23 11:14:53','2018-02-23 11:39:12',NULL),(41,'handmadeBoss','Jefe de departamento de confección',1,'2018-02-23 11:15:09','2018-02-23 11:39:26',NULL),(42,'artificial','Departamento de artificial',1,'2018-02-23 11:39:59','2018-02-23 11:39:59',NULL),(43,'artificialBoss','Jefe del departamento de artificial',1,'2018-02-23 11:40:16','2018-02-23 11:40:16',NULL),(44,'accessory','Departamento de complementos',1,'2018-02-23 11:41:12','2018-02-23 11:41:12',NULL),(45,'accessoryBoss','Jefe del departamento de complementos',1,'2018-02-23 11:41:23','2018-02-23 11:41:23',NULL),(47,'cooler','Empleados de cámara',1,'2018-02-23 13:08:18','2018-02-23 13:08:18',NULL),(48,'coolerBoss','Jefe de cámara',1,'2018-02-23 13:12:01','2023-03-13 08:49:43',NULL),(49,'production','Empleado de producción',1,'2018-02-26 15:28:23','2021-02-12 09:42:35',NULL),(50,'productionBoss','Jefe de producción',1,'2018-02-26 15:34:12','2018-02-26 15:34:12',NULL),(51,'marketing','Departamento de marketing',1,'2018-03-01 07:28:39','2018-03-01 07:28:39',NULL),(52,'marketingBoss','Jefe del departamento de marketing',1,'2018-03-01 07:28:57','2018-03-01 07:28:57',NULL),(53,'insurance','Gestor de seguros de cambio',0,'2018-03-05 07:44:35','2019-02-01 13:47:57',NULL),(54,'itemPicker','Sacador en cámara',1,'2018-03-05 12:08:17','2018-03-05 12:08:17',NULL),(55,'itemPickerBoss','Jefe de sacadores',1,'2018-03-05 12:08:31','2018-03-05 12:08:31',NULL),(56,'delivery','Personal de reparto',1,'2018-05-30 06:07:02','2018-05-30 06:07:02',NULL),(57,'deliveryAssistant','Jefe de personal de reparto',1,'2018-05-30 06:07:19','2018-05-30 06:07:19',NULL),(58,'packager','Departamento encajadores',1,'2019-01-21 12:43:45','2019-01-21 12:43:45',NULL),(59,'packagerBoss','Jefe departamento encajadores',1,'2019-01-21 12:44:10','2019-01-21 12:44:10',NULL),(60,'productionAssi','Tareas relacionadas con producción y administración',1,'2019-01-29 13:29:01','2019-01-29 13:29:01',NULL),(61,'replenisherBos','Jefe de Complementos/Camara',1,'2019-07-01 06:44:07','2019-07-01 06:44:07',NULL),(62,'noLogin','Role without login access to MySQL',0,'2019-07-01 06:50:19','2019-07-02 13:42:05',NULL),(64,'balanceSheet','Consulta de Balance',0,'2019-07-16 12:12:08','2019-07-16 12:12:08',NULL),(65,'officeBoss','Jefe de filial',1,'2019-08-02 06:54:26','2019-08-02 06:54:26',NULL),(66,'sysadmin','Administrador de sistema',1,'2019-08-08 06:58:56','2019-08-08 06:58:56',NULL),(67,'adminOfficer','categoria profesional oficial de administración',1,'2020-01-03 08:09:23','2020-01-03 08:09:23',NULL),(69,'coolerAssist','Asistente de cámara con permiso compras',1,'2020-02-05 12:36:09','2023-03-13 08:50:07',NULL),(70,'trainee','Alumno de prácticas',1,'2020-03-04 11:00:25','2020-03-04 11:00:25',NULL),(71,'checker','Rol de revisor con privilegios de itemPicker',1,'2020-10-02 10:50:07','2020-10-02 10:50:07',NULL),(72,'claimManager','Personal de reclamaciones',1,'2020-10-13 10:01:32','2020-10-26 07:29:46',NULL),(73,'financial','Departamento de finanzas',1,'2020-11-16 09:30:27','2020-11-16 09:30:27',NULL),(74,'userPhotos','Privilegios para subir fotos de usuario',1,'2021-02-03 10:24:27','2021-02-03 10:24:27',NULL),(75,'catalogPhotos','Privilegios para subir fotos del catálogo',1,'2021-02-03 10:24:27','2021-02-03 10:24:27',NULL),(76,'chat','Rol para utilizar el rocket chat',1,'2020-11-27 13:06:50','2020-12-17 07:49:41',NULL),(100,'root','Rol con todos los privilegios',0,'2018-04-23 14:33:36','2020-11-12 06:50:07',NULL),(101,'buyerBoss','Jefe del departamento de compras',1,'2021-06-16 09:53:17','2021-06-16 09:53:17',NULL),(102,'preservedBoss','Responsable preservado',1,'2021-09-14 13:45:37','2021-09-14 13:45:37',NULL),(103,'it','Departamento de informática',1,'2021-11-11 09:48:22','2021-11-11 09:48:22',NULL),(104,'itBoss','Jefe de departamento de informática',1,'2021-11-11 09:48:49','2021-11-11 09:48:49',NULL),(105,'grant','Adjudicar roles a usuarios',1,'2021-11-11 12:41:09','2021-11-11 12:41:09',NULL),(106,'ext','Usuarios externos de la Base de datos',1,'2021-11-23 14:51:16','2021-11-23 14:51:16',NULL),(107,'productionPlus','Creado para pepe por orden de Juanvi',1,'2022-02-08 06:47:10','2022-02-08 06:47:10',NULL),(108,'system','System user',1,'2022-05-16 08:09:51','2022-05-16 08:09:51',NULL),(109,'salesTeamBoss','Jefe de equipo de comerciales',1,'2022-06-14 13:45:56','2022-06-14 13:45:56',NULL),(110,'palletizer','Paletizadores',1,'2022-12-02 12:56:22','2022-12-02 12:56:30',NULL),(111,'entryEditor','Entry editor',1,'2023-01-13 11:21:55','2023-01-13 11:21:55',NULL),(112,'maintenance','Personal de mantenimiento',1,'2023-01-19 06:23:35','2023-01-19 06:23:35',NULL),(114,'maintenanceBos','Jefe de mantenimiento',1,'2023-01-19 06:31:16','2023-05-17 11:07:21',NULL),(115,'itManagement','TI management',1,'2023-03-29 07:27:55','2023-03-29 07:28:04',NULL),(119,'palletizerBoss','Jefe de paletizadores',1,'2023-06-07 11:51:54','2023-06-07 11:51:54',NULL),(120,'developerBoss','Jefe de proyecto de desarrollo',1,'2023-06-19 07:07:21','2023-06-19 07:07:21',21709),(121,'buyerSalesAssistant','Rol para compradores que también son responsables de ventas',1,'2023-06-23 14:48:19','2023-06-23 14:48:19',NULL);
/*!40000 ALTER TABLE `role` ENABLE KEYS */;
UNLOCK TABLES;
@@ -164,7 +164,7 @@ USE `salix`;
LOCK TABLES `ACL` WRITE;
/*!40000 ALTER TABLE `ACL` DISABLE KEYS */;
-INSERT INTO `ACL` VALUES (1,'Account','*','*','ALLOW','ROLE','employee'),(3,'Address','*','*','ALLOW','ROLE','employee'),(5,'AgencyService','*','READ','ALLOW','ROLE','employee'),(9,'ClientObservation','*','*','ALLOW','ROLE','employee'),(11,'ContactChannel','*','READ','ALLOW','ROLE','trainee'),(13,'Employee','*','READ','ALLOW','ROLE','employee'),(14,'PayMethod','*','READ','ALLOW','ROLE','trainee'),(16,'FakeProduction','*','READ','ALLOW','ROLE','employee'),(17,'Warehouse','* ','READ','ALLOW','ROLE','trainee'),(18,'State','*','READ','ALLOW','ROLE','employee'),(20,'TicketState','*','*','ALLOW','ROLE','employee'),(24,'Delivery','*','READ','ALLOW','ROLE','employee'),(25,'Zone','*','READ','ALLOW','ROLE','employee'),(26,'ClientCredit','*','*','ALLOW','ROLE','employee'),(27,'ClientCreditLimit','*','READ','ALLOW','ROLE','trainee'),(30,'GreugeType','*','READ','ALLOW','ROLE','trainee'),(31,'Mandate','*','READ','ALLOW','ROLE','trainee'),(32,'MandateType','*','READ','ALLOW','ROLE','trainee'),(33,'Company','*','READ','ALLOW','ROLE','trainee'),(34,'Greuge','*','READ','ALLOW','ROLE','trainee'),(35,'AddressObservation','*','*','ALLOW','ROLE','employee'),(36,'ObservationType','*','*','ALLOW','ROLE','employee'),(37,'Greuge','*','WRITE','ALLOW','ROLE','employee'),(38,'AgencyMode','*','READ','ALLOW','ROLE','employee'),(39,'ItemTag','*','WRITE','ALLOW','ROLE','buyer'),(40,'ItemBotanical','*','WRITE','ALLOW','ROLE','buyer'),(41,'ItemBotanical','*','READ','ALLOW','ROLE','employee'),(42,'ItemPlacement','*','WRITE','ALLOW','ROLE','buyer'),(43,'ItemPlacement','*','WRITE','ALLOW','ROLE','replenisher'),(44,'ItemPlacement','*','READ','ALLOW','ROLE','employee'),(45,'ItemBarcode','*','READ','ALLOW','ROLE','employee'),(46,'ItemBarcode','*','WRITE','ALLOW','ROLE','buyer'),(47,'ItemBarcode','*','WRITE','ALLOW','ROLE','replenisher'),(51,'ItemTag','*','READ','ALLOW','ROLE','employee'),(53,'Item','*','READ','ALLOW','ROLE','employee'),(54,'Item','*','WRITE','ALLOW','ROLE','buyer'),(55,'Recovery','*','READ','ALLOW','ROLE','trainee'),(56,'Recovery','*','WRITE','ALLOW','ROLE','administrative'),(58,'CreditClassification','*','*','ALLOW','ROLE','insurance'),(60,'CreditInsurance','*','*','ALLOW','ROLE','insurance'),(61,'InvoiceOut','*','READ','ALLOW','ROLE','employee'),(62,'Ticket','*','*','ALLOW','ROLE','employee'),(63,'TicketObservation','*','*','ALLOW','ROLE','employee'),(64,'Route','*','READ','ALLOW','ROLE','employee'),(65,'Sale','*','READ','ALLOW','ROLE','employee'),(66,'TicketTracking','*','READ','ALLOW','ROLE','employee'),(68,'TicketPackaging','*','*','ALLOW','ROLE','employee'),(69,'Packaging','*','READ','ALLOW','ROLE','employee'),(70,'Packaging','*','WRITE','ALLOW','ROLE','logistic'),(72,'SaleComponent','*','READ','ALLOW','ROLE','employee'),(73,'Expedition','*','READ','ALLOW','ROLE','employee'),(74,'Expedition','*','WRITE','ALLOW','ROLE','deliveryBoss'),(75,'Expedition','*','WRITE','ALLOW','ROLE','production'),(76,'AnnualAverageInvoiced','*','READ','ALLOW','ROLE','employee'),(77,'WorkerMana','*','READ','ALLOW','ROLE','employee'),(78,'TicketTracking','*','WRITE','ALLOW','ROLE','production'),(79,'TicketTracking','changeState','*','ALLOW','ROLE','employee'),(80,'Sale','deleteSales','*','ALLOW','ROLE','employee'),(81,'Sale','moveToTicket','*','ALLOW','ROLE','employee'),(82,'Sale','updateQuantity','*','ALLOW','ROLE','employee'),(83,'Sale','updatePrice','*','ALLOW','ROLE','employee'),(84,'Sale','updateDiscount','*','ALLOW','ROLE','employee'),(85,'SaleTracking','*','READ','ALLOW','ROLE','employee'),(86,'Order','*','*','ALLOW','ROLE','employee'),(87,'OrderRow','*','*','ALLOW','ROLE','employee'),(88,'ClientContact','*','*','ALLOW','ROLE','employee'),(89,'Sale','moveToNewTicket','*','ALLOW','ROLE','employee'),(90,'Sale','reserve','*','ALLOW','ROLE','employee'),(91,'TicketWeekly','*','READ','ALLOW','ROLE','employee'),(94,'Agency','landsThatDay','*','ALLOW','ROLE','employee'),(96,'ClaimEnd','*','READ','ALLOW','ROLE','employee'),(97,'ClaimEnd','*','WRITE','ALLOW','ROLE','claimManager'),(98,'ClaimBeginning','*','*','ALLOW','ROLE','employee'),(99,'ClaimDevelopment','*','READ','ALLOW','ROLE','employee'),(100,'ClaimDevelopment','*','WRITE','ALLOW','ROLE','claimManager'),(101,'Claim','*','*','ALLOW','ROLE','employee'),(102,'Claim','createFromSales','*','ALLOW','ROLE','employee'),(104,'Item','*','WRITE','ALLOW','ROLE','marketingBoss'),(105,'ItemBarcode','*','WRITE','ALLOW','ROLE','marketingBoss'),(106,'ItemBotanical','*','WRITE','ALLOW','ROLE','marketingBoss'),(108,'ItemPlacement','*','WRITE','ALLOW','ROLE','marketingBoss'),(109,'UserConfig','*','*','ALLOW','ROLE','employee'),(110,'Bank','*','READ','ALLOW','ROLE','trainee'),(111,'ClientLog','*','READ','ALLOW','ROLE','trainee'),(112,'Defaulter','*','READ','ALLOW','ROLE','employee'),(113,'ClientRisk','*','READ','ALLOW','ROLE','trainee'),(114,'Receipt','*','READ','ALLOW','ROLE','trainee'),(115,'Receipt','*','WRITE','ALLOW','ROLE','administrative'),(116,'BankEntity','*','*','ALLOW','ROLE','employee'),(117,'ClientSample','*','*','ALLOW','ROLE','employee'),(118,'WorkerTeam','*','*','ALLOW','ROLE','salesPerson'),(119,'Travel','*','READ','ALLOW','ROLE','employee'),(120,'Travel','*','WRITE','ALLOW','ROLE','buyer'),(121,'Item','regularize','*','ALLOW','ROLE','employee'),(122,'TicketRequest','*','*','ALLOW','ROLE','employee'),(123,'Worker','*','READ','ALLOW','ROLE','employee'),(124,'Client','confirmTransaction','WRITE','ALLOW','ROLE','administrative'),(125,'Agency','getAgenciesWithWarehouse','*','ALLOW','ROLE','employee'),(126,'Client','activeWorkersWithRole','*','ALLOW','ROLE','employee'),(127,'TicketLog','*','READ','ALLOW','ROLE','employee'),(129,'TicketService','*','*','ALLOW','ROLE','employee'),(130,'Expedition','*','WRITE','ALLOW','ROLE','packager'),(131,'CreditInsurance','*','READ','ALLOW','ROLE','trainee'),(132,'CreditClassification','*','READ','ALLOW','ROLE','trainee'),(133,'ItemTag','*','WRITE','ALLOW','ROLE','marketingBoss'),(135,'ZoneGeo','*','READ','ALLOW','ROLE','employee'),(136,'ZoneCalendar','*','READ','ALLOW','ROLE','employee'),(137,'ZoneIncluded','*','READ','ALLOW','ROLE','employee'),(138,'LabourHoliday','*','READ','ALLOW','ROLE','employee'),(139,'LabourHolidayLegend','*','READ','ALLOW','ROLE','employee'),(140,'LabourHolidayType','*','READ','ALLOW','ROLE','employee'),(141,'Zone','*','*','ALLOW','ROLE','logisticBoss'),(142,'ZoneCalendar','*','WRITE','ALLOW','ROLE','deliveryBoss'),(143,'ZoneIncluded','*','*','ALLOW','ROLE','deliveryBoss'),(144,'Stowaway','*','*','ALLOW','ROLE','employee'),(145,'Ticket','getPossibleStowaways','READ','ALLOW','ROLE','employee'),(147,'UserConfigView','*','*','ALLOW','ROLE','employee'),(148,'UserConfigView','*','*','ALLOW','ROLE','employee'),(149,'Sip','*','READ','ALLOW','ROLE','employee'),(150,'Sip','*','WRITE','ALLOW','ROLE','hr'),(151,'Department','*','READ','ALLOW','ROLE','employee'),(152,'Department','*','WRITE','ALLOW','ROLE','hr'),(153,'Route','*','READ','ALLOW','ROLE','employee'),(154,'Route','*','WRITE','ALLOW','ROLE','delivery'),(155,'Calendar','*','READ','ALLOW','ROLE','hr'),(156,'WorkerLabour','*','READ','ALLOW','ROLE','hr'),(157,'Calendar','absences','READ','ALLOW','ROLE','employee'),(158,'ItemTag','*','WRITE','ALLOW','ROLE','accessory'),(160,'TicketServiceType','*','READ','ALLOW','ROLE','employee'),(161,'TicketConfig','*','READ','ALLOW','ROLE','employee'),(162,'InvoiceOut','delete','WRITE','ALLOW','ROLE','invoicing'),(163,'InvoiceOut','book','WRITE','ALLOW','ROLE','invoicing'),(165,'TicketDms','*','*','ALLOW','ROLE','employee'),(167,'Worker','isSubordinate','READ','ALLOW','ROLE','employee'),(168,'Worker','mySubordinates','READ','ALLOW','ROLE','employee'),(169,'WorkerTimeControl','filter','READ','ALLOW','ROLE','employee'),(170,'WorkerTimeControl','addTime','WRITE','ALLOW','ROLE','employee'),(171,'TicketServiceType','*','WRITE','ALLOW','ROLE','administrative'),(172,'Sms','*','READ','ALLOW','ROLE','employee'),(173,'Sms','send','WRITE','ALLOW','ROLE','employee'),(174,'Agency','getLanded','READ','ALLOW','ROLE','employee'),(175,'Agency','getShipped','READ','ALLOW','ROLE','employee'),(176,'Device','*','*','ALLOW','ROLE','employee'),(177,'Device','*','*','ALLOW','ROLE','employee'),(178,'WorkerTimeControl','*','*','ALLOW','ROLE','employee'),(179,'ItemLog','*','READ','ALLOW','ROLE','employee'),(180,'RouteLog','*','READ','ALLOW','ROLE','employee'),(181,'Dms','removeFile','WRITE','ALLOW','ROLE','employee'),(182,'Dms','uploadFile','WRITE','ALLOW','ROLE','employee'),(183,'Dms','downloadFile','READ','ALLOW','ROLE','employee'),(184,'Client','uploadFile','WRITE','ALLOW','ROLE','employee'),(185,'ClientDms','removeFile','WRITE','ALLOW','ROLE','employee'),(186,'ClientDms','*','READ','ALLOW','ROLE','trainee'),(187,'Ticket','uploadFile','WRITE','ALLOW','ROLE','employee'),(190,'Route','updateVolume','WRITE','ALLOW','ROLE','deliveryBoss'),(191,'Agency','getLanded','READ','ALLOW','ROLE','employee'),(192,'Agency','getShipped','READ','ALLOW','ROLE','employee'),(194,'Postcode','*','WRITE','ALLOW','ROLE','deliveryBoss'),(195,'Ticket','addSale','WRITE','ALLOW','ROLE','employee'),(196,'Dms','updateFile','WRITE','ALLOW','ROLE','employee'),(197,'Dms','*','READ','ALLOW','ROLE','trainee'),(198,'ClaimDms','removeFile','WRITE','ALLOW','ROLE','employee'),(199,'ClaimDms','*','READ','ALLOW','ROLE','employee'),(200,'Claim','uploadFile','WRITE','ALLOW','ROLE','employee'),(201,'Sale','updateConcept','WRITE','ALLOW','ROLE','employee'),(202,'Claim','updateClaimAction','WRITE','ALLOW','ROLE','claimManager'),(203,'UserPhone','*','*','ALLOW','ROLE','employee'),(204,'WorkerDms','removeFile','WRITE','ALLOW','ROLE','hr'),(205,'WorkerDms','*','READ','ALLOW','ROLE','hr'),(206,'Chat','*','*','ALLOW','ROLE','employee'),(207,'Chat','sendMessage','*','ALLOW','ROLE','employee'),(208,'Sale','recalculatePrice','WRITE','ALLOW','ROLE','employee'),(209,'Ticket','recalculateComponents','WRITE','ALLOW','ROLE','employee'),(211,'TravelLog','*','READ','ALLOW','ROLE','buyer'),(212,'Thermograph','*','*','ALLOW','ROLE','buyer'),(213,'TravelThermograph','*','WRITE','ALLOW','ROLE','buyer'),(214,'Entry','*','*','ALLOW','ROLE','buyer'),(215,'TicketWeekly','*','WRITE','ALLOW','ROLE','buyer'),(216,'TravelThermograph','*','READ','ALLOW','ROLE','employee'),(218,'Intrastat','*','*','ALLOW','ROLE','buyer'),(221,'UserConfig','getUserConfig','READ','ALLOW','ROLE','account'),(222,'Client','*','READ','ALLOW','ROLE','trainee'),(226,'ClientObservation','*','READ','ALLOW','ROLE','trainee'),(227,'Address','*','READ','ALLOW','ROLE','trainee'),(228,'AddressObservation','*','READ','ALLOW','ROLE','trainee'),(230,'ClientCredit','*','READ','ALLOW','ROLE','trainee'),(231,'ClientContact','*','READ','ALLOW','ROLE','trainee'),(232,'ClientSample','*','READ','ALLOW','ROLE','trainee'),(233,'EntryLog','*','READ','ALLOW','ROLE','buyer'),(234,'WorkerLog','*','READ','ALLOW','ROLE','salesAssistant'),(235,'CustomsAgent','*','*','ALLOW','ROLE','employee'),(236,'Buy','*','*','ALLOW','ROLE','buyer'),(237,'WorkerDms','filter','*','ALLOW','ROLE','employee'),(238,'Town','*','WRITE','ALLOW','ROLE','deliveryBoss'),(239,'Province','*','WRITE','ALLOW','ROLE','deliveryBoss'),(240,'supplier','*','WRITE','ALLOW','ROLE','administrative'),(241,'SupplierContact','*','WRITE','ALLOW','ROLE','administrative'),(242,'supplier','*','WRITE','ALLOW','ROLE','administrative'),(244,'supplier','*','WRITE','ALLOW','ROLE','administrative'),(248,'RoleMapping','*','READ','ALLOW','ROLE','account'),(249,'UserPassword','*','READ','ALLOW','ROLE','account'),(250,'Town','*','WRITE','ALLOW','ROLE','deliveryBoss'),(251,'Province','*','WRITE','ALLOW','ROLE','deliveryBoss'),(252,'Supplier','*','READ','ALLOW','ROLE','employee'),(253,'Supplier','*','WRITE','ALLOW','ROLE','administrative'),(254,'SupplierLog','*','READ','ALLOW','ROLE','employee'),(256,'Image','*','WRITE','ALLOW','ROLE','employee'),(257,'FixedPrice','*','*','ALLOW','ROLE','buyer'),(258,'PayDem','*','READ','ALLOW','ROLE','employee'),(259,'Client','createReceipt','*','ALLOW','ROLE','salesAssistant'),(260,'PrintServerQueue','*','WRITE','ALLOW','ROLE','employee'),(261,'SupplierAccount','*','*','ALLOW','ROLE','administrative'),(262,'Entry','*','*','ALLOW','ROLE','administrative'),(263,'InvoiceIn','*','*','ALLOW','ROLE','administrative'),(264,'StarredModule','*','*','ALLOW','ROLE','employee'),(265,'ItemBotanical','*','WRITE','ALLOW','ROLE','logisticBoss'),(266,'ZoneLog','*','READ','ALLOW','ROLE','employee'),(267,'Genus','*','WRITE','ALLOW','ROLE','logisticBoss'),(268,'Specie','*','WRITE','ALLOW','ROLE','logisticBoss'),(269,'InvoiceOut','createPdf','WRITE','ALLOW','ROLE','employee'),(270,'SupplierAddress','*','*','ALLOW','ROLE','employee'),(271,'SalesMonitor','*','*','ALLOW','ROLE','employee'),(272,'InvoiceInLog','*','READ','ALLOW','ROLE','employee'),(273,'InvoiceInTax','*','*','ALLOW','ROLE','administrative'),(274,'InvoiceInLog','*','READ','ALLOW','ROLE','administrative'),(275,'InvoiceOut','createManualInvoice','WRITE','ALLOW','ROLE','invoicing'),(276,'InvoiceOut','globalInvoicing','WRITE','ALLOW','ROLE','invoicing'),(277,'Role','*','*','ALLOW','ROLE','it'),(278,'RoleInherit','*','WRITE','ALLOW','ROLE','grant'),(279,'MailAlias','*','*','ALLOW','ROLE','marketing'),(283,'EntryObservation','*','*','ALLOW','ROLE','buyer'),(284,'LdapConfig','*','*','ALLOW','ROLE','sysadmin'),(285,'SambaConfig','*','*','ALLOW','ROLE','sysadmin'),(286,'ACL','*','*','ALLOW','ROLE','developer'),(287,'AccessToken','*','*','ALLOW','ROLE','developer'),(288,'MailAliasAccount','*','*','ALLOW','ROLE','marketing'),(289,'MailAliasAccount','*','*','ALLOW','ROLE','hr'),(290,'MailAlias','*','*','ALLOW','ROLE','hr'),(291,'MailForward','*','*','ALLOW','ROLE','marketing'),(292,'MailForward','*','*','ALLOW','ROLE','hr'),(293,'RoleInherit','*','*','ALLOW','ROLE','it'),(294,'RoleRole','*','*','ALLOW','ROLE','it'),(295,'AccountConfig','*','*','ALLOW','ROLE','sysadmin'),(296,'Collection','*','READ','ALLOW','ROLE','employee'),(297,'Sale','refund','WRITE','ALLOW','ROLE','invoicing'),(298,'InvoiceInDueDay','*','*','ALLOW','ROLE','administrative'),(299,'Collection','setSaleQuantity','*','ALLOW','ROLE','employee'),(300,'Docuware','*','*','ALLOW','ROLE','employee'),(301,'Agency','*','READ','ALLOW','ROLE','employee'),(302,'AgencyTerm','*','*','ALLOW','ROLE','administrative'),(303,'ClaimLog','*','READ','ALLOW','ROLE','claimManager'),(304,'Edi','updateData','WRITE','ALLOW','ROLE','employee'),(305,'EducationLevel','*','*','ALLOW','ROLE','employee'),(306,'InvoiceInIntrastat','*','*','ALLOW','ROLE','employee'),(307,'SupplierAgencyTerm','*','*','ALLOW','ROLE','administrative'),(308,'InvoiceInIntrastat','*','*','ALLOW','ROLE','employee'),(309,'Zone','getZoneClosing','*','ALLOW','ROLE','employee'),(310,'ExpeditionState','*','READ','ALLOW','ROLE','employee'),(311,'Expense','*','READ','ALLOW','ROLE','employee'),(312,'Expense','*','WRITE','ALLOW','ROLE','administrative'),(314,'SupplierActivity','*','READ','ALLOW','ROLE','employee'),(315,'SupplierActivity','*','WRITE','ALLOW','ROLE','administrative'),(316,'Dms','deleteTrashFiles','WRITE','ALLOW','ROLE','employee'),(317,'ClientUnpaid','*','*','ALLOW','ROLE','administrative'),(318,'MdbVersion','*','*','ALLOW','ROLE','developer'),(319,'ItemType','*','READ','ALLOW','ROLE','employee'),(320,'ItemType','*','WRITE','ALLOW','ROLE','buyer'),(321,'InvoiceOut','refund','WRITE','ALLOW','ROLE','invoicing'),(322,'InvoiceOut','refund','WRITE','ALLOW','ROLE','salesAssistant'),(323,'InvoiceOut','refund','WRITE','ALLOW','ROLE','claimManager'),(324,'Ticket','refund','WRITE','ALLOW','ROLE','invoicing'),(325,'Ticket','refund','WRITE','ALLOW','ROLE','salesAssistant'),(326,'Ticket','refund','WRITE','ALLOW','ROLE','claimManager'),(327,'Sale','refund','WRITE','ALLOW','ROLE','salesAssistant'),(328,'Sale','refund','WRITE','ALLOW','ROLE','claimManager'),(329,'TicketRefund','*','WRITE','ALLOW','ROLE','invoicing'),(330,'ClaimObservation','*','WRITE','ALLOW','ROLE','salesPerson'),(331,'ClaimObservation','*','READ','ALLOW','ROLE','salesPerson'),(332,'Client','setPassword','WRITE','ALLOW','ROLE','salesPerson'),(333,'Client','updateUser','WRITE','ALLOW','ROLE','salesPerson'),(334,'ShelvingLog','*','READ','ALLOW','ROLE','employee'),(335,'ZoneExclusionGeo','*','READ','ALLOW','ROLE','employee'),(336,'ZoneExclusionGeo','*','WRITE','ALLOW','ROLE','deliveryBoss'),(337,'Parking','*','*','ALLOW','ROLE','employee'),(338,'Shelving','*','*','ALLOW','ROLE','employee'),(339,'OsTicket','*','*','ALLOW','ROLE','employee'),(340,'OsTicketConfig','*','*','ALLOW','ROLE','it'),(341,'ClientConsumptionQueue','*','WRITE','ALLOW','ROLE','employee'),(342,'Ticket','deliveryNotePdf','READ','ALLOW','ROLE','employee'),(343,'Ticket','deliveryNoteEmail','WRITE','ALLOW','ROLE','employee'),(344,'Ticket','deliveryNoteCsvPdf','READ','ALLOW','ROLE','employee'),(345,'Ticket','deliveryNoteCsvEmail','WRITE','ALLOW','ROLE','employee'),(346,'Client','campaignMetricsPdf','READ','ALLOW','ROLE','employee'),(347,'Client','campaignMetricsEmail','WRITE','ALLOW','ROLE','employee'),(348,'Client','clientWelcomeHtml','READ','ALLOW','ROLE','employee'),(349,'Client','clientWelcomeEmail','WRITE','ALLOW','ROLE','employee'),(350,'Client','creditRequestPdf','READ','ALLOW','ROLE','employee'),(351,'Client','creditRequestHtml','READ','ALLOW','ROLE','employee'),(352,'Client','creditRequestEmail','WRITE','ALLOW','ROLE','employee'),(353,'Client','printerSetupHtml','READ','ALLOW','ROLE','employee'),(354,'Client','printerSetupEmail','WRITE','ALLOW','ROLE','employee'),(355,'Client','sepaCoreEmail','WRITE','ALLOW','ROLE','employee'),(356,'Client','letterDebtorPdf','READ','ALLOW','ROLE','employee'),(357,'Client','letterDebtorStHtml','READ','ALLOW','ROLE','employee'),(358,'Client','letterDebtorStEmail','WRITE','ALLOW','ROLE','employee'),(359,'Client','letterDebtorNdHtml','READ','ALLOW','ROLE','employee'),(360,'Client','letterDebtorNdEmail','WRITE','ALLOW','ROLE','employee'),(361,'Client','clientDebtStatementPdf','READ','ALLOW','ROLE','employee'),(362,'Client','clientDebtStatementHtml','READ','ALLOW','ROLE','employee'),(363,'Client','clientDebtStatementEmail','WRITE','ALLOW','ROLE','employee'),(364,'Client','incotermsAuthorizationPdf','READ','ALLOW','ROLE','employee'),(365,'Client','incotermsAuthorizationHtml','READ','ALLOW','ROLE','employee'),(366,'Client','incotermsAuthorizationEmail','WRITE','ALLOW','ROLE','employee'),(367,'Client','consumptionSendQueued','WRITE','ALLOW','ROLE','system'),(368,'InvoiceOut','invoiceEmail','WRITE','ALLOW','ROLE','employee'),(369,'InvoiceOut','exportationPdf','READ','ALLOW','ROLE','employee'),(370,'InvoiceOut','sendQueued','WRITE','ALLOW','ROLE','system'),(371,'Ticket','invoiceCsvPdf','READ','ALLOW','ROLE','employee'),(372,'Ticket','invoiceCsvEmail','WRITE','ALLOW','ROLE','employee'),(373,'Supplier','campaignMetricsPdf','READ','ALLOW','ROLE','employee'),(374,'Supplier','campaignMetricsEmail','WRITE','ALLOW','ROLE','employee'),(375,'Travel','extraCommunityPdf','READ','ALLOW','ROLE','employee'),(376,'Travel','extraCommunityEmail','WRITE','ALLOW','ROLE','employee'),(377,'Entry','entryOrderPdf','READ','ALLOW','ROLE','employee'),(378,'OsTicket','osTicketReportEmail','WRITE','ALLOW','ROLE','system'),(379,'Item','buyerWasteEmail','WRITE','ALLOW','ROLE','system'),(380,'Claim','claimPickupPdf','READ','ALLOW','ROLE','employee'),(381,'Claim','claimPickupEmail','WRITE','ALLOW','ROLE','claimManager'),(382,'Item','labelPdf','READ','ALLOW','ROLE','employee'),(383,'Sector','*','READ','ALLOW','ROLE','employee'),(384,'Sector','*','WRITE','ALLOW','ROLE','employee'),(385,'Route','driverRoutePdf','READ','ALLOW','ROLE','employee'),(386,'Route','driverRouteEmail','WRITE','ALLOW','ROLE','employee'),(387,'Ticket','deliveryNotePdf','READ','ALLOW','ROLE','customer'),(388,'Supplier','newSupplier','WRITE','ALLOW','ROLE','administrative'),(389,'ClaimRma','*','READ','ALLOW','ROLE','claimManager'),(390,'ClaimRma','*','WRITE','ALLOW','ROLE','claimManager'),(391,'Notification','*','WRITE','ALLOW','ROLE','system'),(392,'Boxing','*','*','ALLOW','ROLE','employee'),(393,'Url','*','READ','ALLOW','ROLE','employee'),(394,'Url','*','WRITE','ALLOW','ROLE','it'),(395,'ItemShelving','*','READ','ALLOW','ROLE','employee'),(396,'ItemShelving','*','WRITE','ALLOW','ROLE','production'),(397,'ItemShelvingPlacementSupplyStock','*','READ','ALLOW','ROLE','employee'),(398,'NotificationQueue','*','*','ALLOW','ROLE','employee'),(399,'InvoiceOut','clientsToInvoice','WRITE','ALLOW','ROLE','invoicing'),(400,'InvoiceOut','invoiceClient','WRITE','ALLOW','ROLE','invoicing'),(401,'Sale','editTracked','WRITE','ALLOW','ROLE','production'),(402,'Sale','editFloramondo','WRITE','ALLOW','ROLE','salesAssistant'),(403,'Receipt','balanceCompensationEmail','WRITE','ALLOW','ROLE','employee'),(404,'Receipt','balanceCompensationPdf','READ','ALLOW','ROLE','employee'),(405,'Ticket','getTicketsFuture','READ','ALLOW','ROLE','employee'),(406,'Ticket','merge','WRITE','ALLOW','ROLE','employee'),(407,'Sale','editFloramondo','WRITE','ALLOW','ROLE','logistic'),(408,'ZipConfig','*','*','ALLOW','ROLE','employee'),(409,'Item','*','WRITE','ALLOW','ROLE','administrative'),(410,'Sale','editCloned','WRITE','ALLOW','ROLE','buyer'),(411,'Sale','editCloned','WRITE','ALLOW','ROLE','salesAssistant'),(414,'MdbVersion','*','READ','ALLOW','ROLE','$everyone'),(416,'TicketLog','getChanges','READ','ALLOW','ROLE','employee'),(417,'Ticket','getTicketsAdvance','READ','ALLOW','ROLE','employee'),(418,'EntryLog','*','READ','ALLOW','ROLE','administrative'),(419,'Sale','editTracked','WRITE','ALLOW','ROLE','buyer'),(420,'MdbBranch','*','READ','ALLOW','ROLE','$everyone'),(421,'ItemShelvingSale','*','*','ALLOW','ROLE','employee'),(422,'Docuware','checkFile','READ','ALLOW','ROLE','employee'),(423,'Docuware','download','READ','ALLOW','ROLE','salesPerson'),(424,'Docuware','upload','WRITE','ALLOW','ROLE','productionAssi'),(425,'Docuware','deliveryNoteEmail','WRITE','ALLOW','ROLE','salesPerson'),(426,'TpvTransaction','confirm','WRITE','ALLOW','ROLE','$everyone'),(427,'TpvTransaction','start','WRITE','ALLOW','ROLE','$authenticated'),(428,'TpvTransaction','end','WRITE','ALLOW','ROLE','$authenticated'),(429,'ItemConfig','*','READ','ALLOW','ROLE','employee'),(431,'Tag','onSubmit','WRITE','ALLOW','ROLE','employee'),(432,'Worker','updateAttributes','WRITE','ALLOW','ROLE','hr'),(433,'Worker','createAbsence','*','ALLOW','ROLE','employee'),(434,'Worker','updateAbsence','WRITE','ALLOW','ROLE','employee'),(435,'Worker','deleteAbsence','*','ALLOW','ROLE','employee'),(436,'Worker','new','WRITE','ALLOW','ROLE','hr'),(437,'Role','*','READ','ALLOW','ROLE','hr'),(438,'Client','getClientOrSupplierReference','READ','ALLOW','ROLE','employee'),(439,'NotificationSubscription','*','*','ALLOW','ROLE','employee'),(440,'NotificationAcl','*','READ','ALLOW','ROLE','employee'),(441,'MdbApp','*','READ','ALLOW','ROLE','$everyone'),(442,'MdbApp','*','*','ALLOW','ROLE','developer'),(443,'ItemConfig','*','*','ALLOW','ROLE','employee'),(444,'DeviceProduction','*','*','ALLOW','ROLE','hr'),(445,'DeviceProductionModels','*','*','ALLOW','ROLE','hr'),(446,'DeviceProductionState','*','*','ALLOW','ROLE','hr'),(447,'DeviceProductionUser','*','*','ALLOW','ROLE','hr'),(448,'DeviceProduction','*','*','ALLOW','ROLE','productionAssi'),(449,'DeviceProductionModels','*','*','ALLOW','ROLE','productionAssi'),(450,'DeviceProductionState','*','*','ALLOW','ROLE','productionAssi'),(451,'DeviceProductionUser','*','*','ALLOW','ROLE','productionAssi'),(452,'Worker','deallocatePDA','*','ALLOW','ROLE','hr'),(453,'Worker','allocatePDA','*','ALLOW','ROLE','hr'),(454,'Worker','deallocatePDA','*','ALLOW','ROLE','productionAssi'),(455,'Worker','allocatePDA','*','ALLOW','ROLE','productionAssi'),(456,'Zone','*','*','ALLOW','ROLE','deliveryBoss'),(457,'Account','setPassword','WRITE','ALLOW','ROLE','itManagement'),(458,'Operator','*','READ','ALLOW','ROLE','employee'),(459,'Operator','*','WRITE','ALLOW','ROLE','employee'),(460,'InvoiceIn','getSerial','READ','ALLOW','ROLE','administrative'),(461,'Ticket','saveSign','WRITE','ALLOW','ROLE','employee'),(462,'InvoiceOut','negativeBases','READ','ALLOW','ROLE','administrative'),(463,'InvoiceOut','negativeBasesCsv','READ','ALLOW','ROLE','administrative'),(464,'WorkerObservation','*','*','ALLOW','ROLE','hr'),(465,'ClientInforma','*','READ','ALLOW','ROLE','employee'),(466,'ClientInforma','*','WRITE','ALLOW','ROLE','financial'),(467,'Receipt','receiptEmail','*','ALLOW','ROLE','salesAssistant'),(468,'Client','setRating','WRITE','ALLOW','ROLE','financial'),(469,'Client','*','READ','ALLOW','ROLE','employee'),(470,'Client','addressesPropagateRe','*','ALLOW','ROLE','employee'),(471,'Client','canBeInvoiced','*','ALLOW','ROLE','employee'),(472,'Client','canCreateTicket','*','ALLOW','ROLE','employee'),(473,'Client','consumption','*','ALLOW','ROLE','employee'),(474,'Client','createAddress','*','ALLOW','ROLE','employee'),(475,'Client','createWithUser','*','ALLOW','ROLE','employee'),(476,'Client','extendedListFilter','*','ALLOW','ROLE','employee'),(477,'Client','getAverageInvoiced','*','ALLOW','ROLE','employee'),(478,'Client','getCard','*','ALLOW','ROLE','employee'),(479,'Client','getDebt','*','ALLOW','ROLE','employee'),(480,'Client','getMana','*','ALLOW','ROLE','employee'),(481,'Client','transactions','*','ALLOW','ROLE','employee'),(482,'Client','hasCustomerRole','*','ALLOW','ROLE','employee'),(483,'Client','isValidClient','*','ALLOW','ROLE','employee'),(484,'Client','lastActiveTickets','*','ALLOW','ROLE','employee'),(485,'Client','sendSms','*','ALLOW','ROLE','employee'),(486,'Client','setPassword','*','ALLOW','ROLE','employee'),(487,'Client','summary','*','ALLOW','ROLE','employee'),(488,'Client','updateAddress','*','ALLOW','ROLE','employee'),(489,'Client','updateFiscalData','*','ALLOW','ROLE','employee'),(490,'Client','updateUser','*','ALLOW','ROLE','employee'),(491,'Client','uploadFile','*','ALLOW','ROLE','employee'),(492,'Client','campaignMetricsPdf','*','ALLOW','ROLE','employee'),(493,'Client','campaignMetricsEmail','*','ALLOW','ROLE','employee'),(494,'Client','clientWelcomeHtml','*','ALLOW','ROLE','employee'),(495,'Client','clientWelcomeEmail','*','ALLOW','ROLE','employee'),(496,'Client','printerSetupHtml','*','ALLOW','ROLE','employee'),(497,'Client','printerSetupEmail','*','ALLOW','ROLE','employee'),(498,'Client','sepaCoreEmail','*','ALLOW','ROLE','employee'),(499,'Client','letterDebtorPdf','*','ALLOW','ROLE','employee'),(500,'Client','letterDebtorStHtml','*','ALLOW','ROLE','employee'),(501,'Client','letterDebtorStEmail','*','ALLOW','ROLE','employee'),(502,'Client','letterDebtorNdHtml','*','ALLOW','ROLE','employee'),(503,'Client','letterDebtorNdEmail','*','ALLOW','ROLE','employee'),(504,'Client','clientDebtStatementPdf','*','ALLOW','ROLE','employee'),(505,'Client','clientDebtStatementHtml','*','ALLOW','ROLE','employee'),(506,'Client','clientDebtStatementEmail','*','ALLOW','ROLE','employee'),(507,'Client','creditRequestPdf','*','ALLOW','ROLE','employee'),(508,'Client','creditRequestHtml','*','ALLOW','ROLE','employee'),(509,'Client','creditRequestEmail','*','ALLOW','ROLE','employee'),(510,'Client','incotermsAuthorizationPdf','*','ALLOW','ROLE','employee'),(511,'Client','incotermsAuthorizationHtml','*','ALLOW','ROLE','employee'),(512,'Client','incotermsAuthorizationEmail','*','ALLOW','ROLE','employee'),(513,'Client','consumptionSendQueued','*','ALLOW','ROLE','employee'),(514,'Client','filter','*','ALLOW','ROLE','employee'),(515,'Client','getClientOrSupplierReference','*','ALLOW','ROLE','employee'),(516,'Client','upsert','*','ALLOW','ROLE','employee'),(517,'Client','create','*','ALLOW','ROLE','employee'),(518,'Client','replaceById','*','ALLOW','ROLE','employee'),(519,'Client','updateAttributes','*','ALLOW','ROLE','employee'),(520,'Client','updateAttributes','*','ALLOW','ROLE','employee'),(521,'Client','deleteById','*','ALLOW','ROLE','employee'),(522,'Client','replaceOrCreate','*','ALLOW','ROLE','employee'),(523,'Client','updateAll','*','ALLOW','ROLE','employee'),(524,'Client','upsertWithWhere','*','ALLOW','ROLE','employee'),(525,'Defaulter','observationEmail','WRITE','ALLOW','ROLE','employee'),(526,'VnUser','*','*','ALLOW','ROLE','employee'),(527,'VnUser','acl','READ','ALLOW','ROLE','account'),(528,'VnUser','getCurrentUserData','READ','ALLOW','ROLE','account'),(529,'VnUser','changePassword','WRITE','ALLOW','ROLE','account'),(530,'Account','exists','READ','ALLOW','ROLE','account'),(531,'Account','exists','READ','ALLOW','ROLE','account'),(532,'UserLog','*','READ','ALLOW','ROLE','employee'),(533,'RoleLog','*','READ','ALLOW','ROLE','employee');
+INSERT INTO `ACL` VALUES (1,'Account','*','*','ALLOW','ROLE','employee'),(3,'Address','*','*','ALLOW','ROLE','employee'),(5,'AgencyService','*','READ','ALLOW','ROLE','employee'),(9,'ClientObservation','*','*','ALLOW','ROLE','employee'),(11,'ContactChannel','*','READ','ALLOW','ROLE','trainee'),(13,'Employee','*','READ','ALLOW','ROLE','employee'),(14,'PayMethod','*','READ','ALLOW','ROLE','trainee'),(16,'FakeProduction','*','READ','ALLOW','ROLE','employee'),(17,'Warehouse','* ','READ','ALLOW','ROLE','trainee'),(18,'State','*','READ','ALLOW','ROLE','employee'),(20,'TicketState','*','*','ALLOW','ROLE','employee'),(24,'Delivery','*','READ','ALLOW','ROLE','employee'),(25,'Zone','*','READ','ALLOW','ROLE','employee'),(26,'ClientCredit','*','*','ALLOW','ROLE','employee'),(27,'ClientCreditLimit','*','READ','ALLOW','ROLE','trainee'),(30,'GreugeType','*','READ','ALLOW','ROLE','trainee'),(31,'Mandate','*','READ','ALLOW','ROLE','trainee'),(32,'MandateType','*','READ','ALLOW','ROLE','trainee'),(33,'Company','*','READ','ALLOW','ROLE','trainee'),(34,'Greuge','*','READ','ALLOW','ROLE','trainee'),(35,'AddressObservation','*','*','ALLOW','ROLE','employee'),(36,'ObservationType','*','*','ALLOW','ROLE','employee'),(37,'Greuge','*','WRITE','ALLOW','ROLE','employee'),(38,'AgencyMode','*','READ','ALLOW','ROLE','employee'),(39,'ItemTag','*','WRITE','ALLOW','ROLE','buyer'),(40,'ItemBotanical','*','WRITE','ALLOW','ROLE','buyer'),(41,'ItemBotanical','*','READ','ALLOW','ROLE','employee'),(42,'ItemPlacement','*','WRITE','ALLOW','ROLE','buyer'),(43,'ItemPlacement','*','WRITE','ALLOW','ROLE','replenisher'),(44,'ItemPlacement','*','READ','ALLOW','ROLE','employee'),(45,'ItemBarcode','*','READ','ALLOW','ROLE','employee'),(46,'ItemBarcode','*','WRITE','ALLOW','ROLE','buyer'),(47,'ItemBarcode','*','WRITE','ALLOW','ROLE','replenisher'),(51,'ItemTag','*','READ','ALLOW','ROLE','employee'),(53,'Item','*','READ','ALLOW','ROLE','employee'),(54,'Item','*','WRITE','ALLOW','ROLE','buyer'),(55,'Recovery','*','READ','ALLOW','ROLE','trainee'),(56,'Recovery','*','WRITE','ALLOW','ROLE','administrative'),(58,'CreditClassification','*','*','ALLOW','ROLE','insurance'),(60,'CreditInsurance','*','*','ALLOW','ROLE','insurance'),(61,'InvoiceOut','*','READ','ALLOW','ROLE','employee'),(62,'Ticket','*','*','ALLOW','ROLE','employee'),(63,'TicketObservation','*','*','ALLOW','ROLE','employee'),(64,'Route','*','READ','ALLOW','ROLE','employee'),(65,'Sale','*','READ','ALLOW','ROLE','employee'),(66,'TicketTracking','*','READ','ALLOW','ROLE','employee'),(68,'TicketPackaging','*','*','ALLOW','ROLE','employee'),(69,'Packaging','*','READ','ALLOW','ROLE','employee'),(70,'Packaging','*','WRITE','ALLOW','ROLE','logistic'),(72,'SaleComponent','*','READ','ALLOW','ROLE','employee'),(73,'Expedition','*','READ','ALLOW','ROLE','employee'),(74,'Expedition','*','WRITE','ALLOW','ROLE','deliveryAssistant'),(75,'Expedition','*','WRITE','ALLOW','ROLE','production'),(76,'AnnualAverageInvoiced','*','READ','ALLOW','ROLE','employee'),(77,'WorkerMana','*','READ','ALLOW','ROLE','employee'),(78,'TicketTracking','*','WRITE','ALLOW','ROLE','production'),(79,'TicketTracking','changeState','*','ALLOW','ROLE','employee'),(80,'Sale','deleteSales','*','ALLOW','ROLE','employee'),(81,'Sale','moveToTicket','*','ALLOW','ROLE','employee'),(82,'Sale','updateQuantity','*','ALLOW','ROLE','employee'),(83,'Sale','updatePrice','*','ALLOW','ROLE','employee'),(84,'Sale','updateDiscount','*','ALLOW','ROLE','employee'),(85,'SaleTracking','*','READ','ALLOW','ROLE','employee'),(86,'Order','*','*','ALLOW','ROLE','employee'),(87,'OrderRow','*','*','ALLOW','ROLE','employee'),(88,'ClientContact','*','*','ALLOW','ROLE','employee'),(89,'Sale','moveToNewTicket','*','ALLOW','ROLE','employee'),(90,'Sale','reserve','*','ALLOW','ROLE','employee'),(91,'TicketWeekly','*','READ','ALLOW','ROLE','employee'),(94,'Agency','landsThatDay','*','ALLOW','ROLE','employee'),(96,'ClaimEnd','*','READ','ALLOW','ROLE','employee'),(97,'ClaimEnd','*','WRITE','ALLOW','ROLE','claimManager'),(98,'ClaimBeginning','*','*','ALLOW','ROLE','employee'),(99,'ClaimDevelopment','*','READ','ALLOW','ROLE','employee'),(100,'ClaimDevelopment','*','WRITE','ALLOW','ROLE','claimManager'),(101,'Claim','*','*','ALLOW','ROLE','employee'),(102,'Claim','createFromSales','*','ALLOW','ROLE','employee'),(104,'Item','*','WRITE','ALLOW','ROLE','marketingBoss'),(105,'ItemBarcode','*','WRITE','ALLOW','ROLE','marketingBoss'),(106,'ItemBotanical','*','WRITE','ALLOW','ROLE','marketingBoss'),(108,'ItemPlacement','*','WRITE','ALLOW','ROLE','marketingBoss'),(109,'UserConfig','*','*','ALLOW','ROLE','employee'),(110,'Bank','*','READ','ALLOW','ROLE','trainee'),(111,'ClientLog','*','READ','ALLOW','ROLE','trainee'),(112,'Defaulter','*','READ','ALLOW','ROLE','employee'),(113,'ClientRisk','*','READ','ALLOW','ROLE','trainee'),(114,'Receipt','*','READ','ALLOW','ROLE','trainee'),(115,'Receipt','*','WRITE','ALLOW','ROLE','administrative'),(116,'BankEntity','*','*','ALLOW','ROLE','employee'),(117,'ClientSample','*','*','ALLOW','ROLE','employee'),(118,'WorkerTeam','*','*','ALLOW','ROLE','salesPerson'),(119,'Travel','*','READ','ALLOW','ROLE','employee'),(120,'Travel','*','WRITE','ALLOW','ROLE','buyer'),(121,'Item','regularize','*','ALLOW','ROLE','employee'),(122,'TicketRequest','*','*','ALLOW','ROLE','employee'),(123,'Worker','*','READ','ALLOW','ROLE','employee'),(124,'Client','confirmTransaction','WRITE','ALLOW','ROLE','administrative'),(125,'Agency','getAgenciesWithWarehouse','*','ALLOW','ROLE','employee'),(126,'Client','activeWorkersWithRole','*','ALLOW','ROLE','employee'),(127,'TicketLog','*','READ','ALLOW','ROLE','employee'),(129,'TicketService','*','*','ALLOW','ROLE','employee'),(130,'Expedition','*','WRITE','ALLOW','ROLE','packager'),(131,'CreditInsurance','*','READ','ALLOW','ROLE','trainee'),(132,'CreditClassification','*','READ','ALLOW','ROLE','trainee'),(133,'ItemTag','*','WRITE','ALLOW','ROLE','marketingBoss'),(135,'ZoneGeo','*','READ','ALLOW','ROLE','employee'),(136,'ZoneCalendar','*','READ','ALLOW','ROLE','employee'),(137,'ZoneIncluded','*','READ','ALLOW','ROLE','employee'),(138,'LabourHoliday','*','READ','ALLOW','ROLE','employee'),(139,'LabourHolidayLegend','*','READ','ALLOW','ROLE','employee'),(140,'LabourHolidayType','*','READ','ALLOW','ROLE','employee'),(141,'Zone','*','*','ALLOW','ROLE','logisticBoss'),(142,'ZoneCalendar','*','WRITE','ALLOW','ROLE','deliveryAssistant'),(143,'ZoneIncluded','*','*','ALLOW','ROLE','deliveryAssistant'),(144,'Stowaway','*','*','ALLOW','ROLE','employee'),(145,'Ticket','getPossibleStowaways','READ','ALLOW','ROLE','employee'),(147,'UserConfigView','*','*','ALLOW','ROLE','employee'),(148,'UserConfigView','*','*','ALLOW','ROLE','employee'),(149,'Sip','*','READ','ALLOW','ROLE','employee'),(150,'Sip','*','WRITE','ALLOW','ROLE','hr'),(151,'Department','*','READ','ALLOW','ROLE','employee'),(152,'Department','*','WRITE','ALLOW','ROLE','hr'),(153,'Route','*','READ','ALLOW','ROLE','employee'),(154,'Route','*','WRITE','ALLOW','ROLE','delivery'),(155,'Calendar','*','READ','ALLOW','ROLE','hr'),(156,'WorkerLabour','*','READ','ALLOW','ROLE','hr'),(157,'Calendar','absences','READ','ALLOW','ROLE','employee'),(158,'ItemTag','*','WRITE','ALLOW','ROLE','accessory'),(160,'TicketServiceType','*','READ','ALLOW','ROLE','employee'),(161,'TicketConfig','*','READ','ALLOW','ROLE','employee'),(162,'InvoiceOut','delete','WRITE','ALLOW','ROLE','invoicing'),(163,'InvoiceOut','book','WRITE','ALLOW','ROLE','invoicing'),(165,'TicketDms','*','*','ALLOW','ROLE','employee'),(167,'Worker','isSubordinate','READ','ALLOW','ROLE','employee'),(168,'Worker','mySubordinates','READ','ALLOW','ROLE','employee'),(169,'WorkerTimeControl','filter','READ','ALLOW','ROLE','employee'),(170,'WorkerTimeControl','addTime','WRITE','ALLOW','ROLE','employee'),(171,'TicketServiceType','*','WRITE','ALLOW','ROLE','administrative'),(172,'Sms','*','READ','ALLOW','ROLE','employee'),(173,'Sms','send','WRITE','ALLOW','ROLE','employee'),(174,'Agency','getLanded','READ','ALLOW','ROLE','employee'),(175,'Agency','getShipped','READ','ALLOW','ROLE','employee'),(176,'Device','*','*','ALLOW','ROLE','employee'),(177,'Device','*','*','ALLOW','ROLE','employee'),(178,'WorkerTimeControl','*','*','ALLOW','ROLE','employee'),(179,'ItemLog','*','READ','ALLOW','ROLE','employee'),(180,'RouteLog','*','READ','ALLOW','ROLE','employee'),(181,'Dms','removeFile','WRITE','ALLOW','ROLE','employee'),(182,'Dms','uploadFile','WRITE','ALLOW','ROLE','employee'),(183,'Dms','downloadFile','READ','ALLOW','ROLE','employee'),(184,'Client','uploadFile','WRITE','ALLOW','ROLE','employee'),(185,'ClientDms','removeFile','WRITE','ALLOW','ROLE','employee'),(186,'ClientDms','*','READ','ALLOW','ROLE','trainee'),(187,'Ticket','uploadFile','WRITE','ALLOW','ROLE','employee'),(190,'Route','updateVolume','WRITE','ALLOW','ROLE','deliveryAssistant'),(191,'Agency','getLanded','READ','ALLOW','ROLE','employee'),(192,'Agency','getShipped','READ','ALLOW','ROLE','employee'),(194,'Postcode','*','WRITE','ALLOW','ROLE','deliveryAssistant'),(195,'Ticket','addSale','WRITE','ALLOW','ROLE','employee'),(196,'Dms','updateFile','WRITE','ALLOW','ROLE','employee'),(197,'Dms','*','READ','ALLOW','ROLE','trainee'),(198,'ClaimDms','removeFile','WRITE','ALLOW','ROLE','employee'),(199,'ClaimDms','*','READ','ALLOW','ROLE','employee'),(200,'Claim','uploadFile','WRITE','ALLOW','ROLE','employee'),(201,'Sale','updateConcept','WRITE','ALLOW','ROLE','employee'),(202,'Claim','updateClaimAction','WRITE','ALLOW','ROLE','claimManager'),(203,'UserPhone','*','*','ALLOW','ROLE','employee'),(204,'WorkerDms','removeFile','WRITE','ALLOW','ROLE','hr'),(205,'WorkerDms','*','READ','ALLOW','ROLE','hr'),(206,'Chat','*','*','ALLOW','ROLE','employee'),(207,'Chat','sendMessage','*','ALLOW','ROLE','employee'),(208,'Sale','recalculatePrice','WRITE','ALLOW','ROLE','employee'),(209,'Ticket','recalculateComponents','WRITE','ALLOW','ROLE','employee'),(211,'TravelLog','*','READ','ALLOW','ROLE','buyer'),(212,'Thermograph','*','*','ALLOW','ROLE','buyer'),(213,'TravelThermograph','*','WRITE','ALLOW','ROLE','buyer'),(214,'Entry','*','*','ALLOW','ROLE','buyer'),(215,'TicketWeekly','*','WRITE','ALLOW','ROLE','buyer'),(216,'TravelThermograph','*','READ','ALLOW','ROLE','employee'),(218,'Intrastat','*','*','ALLOW','ROLE','buyer'),(221,'UserConfig','getUserConfig','READ','ALLOW','ROLE','account'),(222,'Client','*','READ','ALLOW','ROLE','trainee'),(226,'ClientObservation','*','READ','ALLOW','ROLE','trainee'),(227,'Address','*','READ','ALLOW','ROLE','trainee'),(228,'AddressObservation','*','READ','ALLOW','ROLE','trainee'),(230,'ClientCredit','*','READ','ALLOW','ROLE','trainee'),(231,'ClientContact','*','READ','ALLOW','ROLE','trainee'),(232,'ClientSample','*','READ','ALLOW','ROLE','trainee'),(233,'EntryLog','*','READ','ALLOW','ROLE','buyer'),(234,'WorkerLog','*','READ','ALLOW','ROLE','salesAssistant'),(235,'CustomsAgent','*','*','ALLOW','ROLE','employee'),(236,'Buy','*','*','ALLOW','ROLE','buyer'),(237,'WorkerDms','filter','*','ALLOW','ROLE','employee'),(238,'Town','*','WRITE','ALLOW','ROLE','deliveryAssistant'),(239,'Province','*','WRITE','ALLOW','ROLE','deliveryAssistant'),(240,'supplier','*','WRITE','ALLOW','ROLE','administrative'),(241,'SupplierContact','*','WRITE','ALLOW','ROLE','administrative'),(242,'supplier','*','WRITE','ALLOW','ROLE','administrative'),(244,'supplier','*','WRITE','ALLOW','ROLE','administrative'),(248,'RoleMapping','*','READ','ALLOW','ROLE','account'),(249,'UserPassword','*','READ','ALLOW','ROLE','account'),(250,'Town','*','WRITE','ALLOW','ROLE','deliveryAssistant'),(251,'Province','*','WRITE','ALLOW','ROLE','deliveryAssistant'),(252,'Supplier','*','READ','ALLOW','ROLE','employee'),(253,'Supplier','*','WRITE','ALLOW','ROLE','administrative'),(254,'SupplierLog','*','READ','ALLOW','ROLE','employee'),(256,'Image','*','WRITE','ALLOW','ROLE','employee'),(257,'FixedPrice','*','*','ALLOW','ROLE','buyer'),(258,'PayDem','*','READ','ALLOW','ROLE','employee'),(259,'Client','createReceipt','*','ALLOW','ROLE','salesAssistant'),(260,'PrintServerQueue','*','WRITE','ALLOW','ROLE','employee'),(261,'SupplierAccount','*','*','ALLOW','ROLE','administrative'),(262,'Entry','*','*','ALLOW','ROLE','administrative'),(263,'InvoiceIn','*','*','ALLOW','ROLE','administrative'),(264,'StarredModule','*','*','ALLOW','ROLE','employee'),(265,'ItemBotanical','*','WRITE','ALLOW','ROLE','logisticBoss'),(266,'ZoneLog','*','READ','ALLOW','ROLE','employee'),(267,'Genus','*','WRITE','ALLOW','ROLE','logisticBoss'),(268,'Specie','*','WRITE','ALLOW','ROLE','logisticBoss'),(269,'InvoiceOut','createPdf','WRITE','ALLOW','ROLE','employee'),(270,'SupplierAddress','*','*','ALLOW','ROLE','employee'),(271,'SalesMonitor','*','*','ALLOW','ROLE','employee'),(272,'InvoiceInLog','*','READ','ALLOW','ROLE','employee'),(273,'InvoiceInTax','*','*','ALLOW','ROLE','administrative'),(274,'InvoiceInLog','*','READ','ALLOW','ROLE','administrative'),(275,'InvoiceOut','createManualInvoice','WRITE','ALLOW','ROLE','invoicing'),(276,'InvoiceOut','globalInvoicing','WRITE','ALLOW','ROLE','invoicing'),(277,'Role','*','*','ALLOW','ROLE','it'),(278,'RoleInherit','*','WRITE','ALLOW','ROLE','grant'),(279,'MailAlias','*','*','ALLOW','ROLE','marketing'),(283,'EntryObservation','*','*','ALLOW','ROLE','buyer'),(284,'LdapConfig','*','*','ALLOW','ROLE','sysadmin'),(285,'SambaConfig','*','*','ALLOW','ROLE','sysadmin'),(286,'ACL','*','*','ALLOW','ROLE','developer'),(287,'AccessToken','*','*','ALLOW','ROLE','developer'),(288,'MailAliasAccount','*','*','ALLOW','ROLE','marketing'),(289,'MailAliasAccount','*','*','ALLOW','ROLE','hr'),(290,'MailAlias','*','*','ALLOW','ROLE','hr'),(291,'MailForward','*','*','ALLOW','ROLE','marketing'),(292,'MailForward','*','*','ALLOW','ROLE','hr'),(293,'RoleInherit','*','*','ALLOW','ROLE','it'),(294,'RoleRole','*','*','ALLOW','ROLE','it'),(295,'AccountConfig','*','*','ALLOW','ROLE','sysadmin'),(296,'Collection','*','READ','ALLOW','ROLE','employee'),(297,'Sale','refund','WRITE','ALLOW','ROLE','invoicing'),(298,'InvoiceInDueDay','*','*','ALLOW','ROLE','administrative'),(299,'Collection','setSaleQuantity','*','ALLOW','ROLE','employee'),(300,'Docuware','*','*','ALLOW','ROLE','employee'),(301,'Agency','*','READ','ALLOW','ROLE','employee'),(302,'AgencyTerm','*','*','ALLOW','ROLE','administrative'),(303,'ClaimLog','*','READ','ALLOW','ROLE','claimManager'),(304,'Edi','updateData','WRITE','ALLOW','ROLE','employee'),(305,'EducationLevel','*','*','ALLOW','ROLE','employee'),(306,'InvoiceInIntrastat','*','*','ALLOW','ROLE','employee'),(307,'SupplierAgencyTerm','*','*','ALLOW','ROLE','administrative'),(308,'InvoiceInIntrastat','*','*','ALLOW','ROLE','employee'),(309,'Zone','getZoneClosing','*','ALLOW','ROLE','employee'),(310,'ExpeditionState','*','READ','ALLOW','ROLE','employee'),(311,'Expense','*','READ','ALLOW','ROLE','employee'),(312,'Expense','*','WRITE','ALLOW','ROLE','administrative'),(314,'SupplierActivity','*','READ','ALLOW','ROLE','employee'),(315,'SupplierActivity','*','WRITE','ALLOW','ROLE','administrative'),(316,'Dms','deleteTrashFiles','WRITE','ALLOW','ROLE','employee'),(317,'ClientUnpaid','*','*','ALLOW','ROLE','administrative'),(318,'MdbVersion','*','*','ALLOW','ROLE','developer'),(319,'ItemType','*','READ','ALLOW','ROLE','employee'),(320,'ItemType','*','WRITE','ALLOW','ROLE','buyer'),(321,'InvoiceOut','refund','WRITE','ALLOW','ROLE','invoicing'),(322,'InvoiceOut','refund','WRITE','ALLOW','ROLE','salesAssistant'),(323,'InvoiceOut','refund','WRITE','ALLOW','ROLE','claimManager'),(324,'Ticket','refund','WRITE','ALLOW','ROLE','invoicing'),(325,'Ticket','refund','WRITE','ALLOW','ROLE','salesAssistant'),(326,'Ticket','refund','WRITE','ALLOW','ROLE','claimManager'),(327,'Sale','refund','WRITE','ALLOW','ROLE','salesAssistant'),(328,'Sale','refund','WRITE','ALLOW','ROLE','claimManager'),(329,'TicketRefund','*','WRITE','ALLOW','ROLE','invoicing'),(330,'ClaimObservation','*','WRITE','ALLOW','ROLE','salesPerson'),(331,'ClaimObservation','*','READ','ALLOW','ROLE','salesPerson'),(332,'Client','setPassword','WRITE','ALLOW','ROLE','salesPerson'),(333,'Client','updateUser','WRITE','ALLOW','ROLE','salesPerson'),(334,'ShelvingLog','*','READ','ALLOW','ROLE','employee'),(335,'ZoneExclusionGeo','*','READ','ALLOW','ROLE','employee'),(336,'ZoneExclusionGeo','*','WRITE','ALLOW','ROLE','deliveryAssistant'),(337,'Parking','*','*','ALLOW','ROLE','employee'),(338,'Shelving','*','*','ALLOW','ROLE','employee'),(339,'OsTicket','*','*','ALLOW','ROLE','employee'),(340,'OsTicketConfig','*','*','ALLOW','ROLE','it'),(341,'ClientConsumptionQueue','*','WRITE','ALLOW','ROLE','employee'),(342,'Ticket','deliveryNotePdf','READ','ALLOW','ROLE','employee'),(343,'Ticket','deliveryNoteEmail','WRITE','ALLOW','ROLE','employee'),(344,'Ticket','deliveryNoteCsvPdf','READ','ALLOW','ROLE','employee'),(345,'Ticket','deliveryNoteCsvEmail','WRITE','ALLOW','ROLE','employee'),(346,'Client','campaignMetricsPdf','READ','ALLOW','ROLE','employee'),(347,'Client','campaignMetricsEmail','WRITE','ALLOW','ROLE','employee'),(348,'Client','clientWelcomeHtml','READ','ALLOW','ROLE','employee'),(349,'Client','clientWelcomeEmail','WRITE','ALLOW','ROLE','employee'),(350,'Client','creditRequestPdf','READ','ALLOW','ROLE','employee'),(351,'Client','creditRequestHtml','READ','ALLOW','ROLE','employee'),(352,'Client','creditRequestEmail','WRITE','ALLOW','ROLE','employee'),(353,'Client','printerSetupHtml','READ','ALLOW','ROLE','employee'),(354,'Client','printerSetupEmail','WRITE','ALLOW','ROLE','employee'),(355,'Client','sepaCoreEmail','WRITE','ALLOW','ROLE','employee'),(356,'Client','letterDebtorPdf','READ','ALLOW','ROLE','employee'),(357,'Client','letterDebtorStHtml','READ','ALLOW','ROLE','employee'),(358,'Client','letterDebtorStEmail','WRITE','ALLOW','ROLE','employee'),(359,'Client','letterDebtorNdHtml','READ','ALLOW','ROLE','employee'),(360,'Client','letterDebtorNdEmail','WRITE','ALLOW','ROLE','employee'),(361,'Client','clientDebtStatementPdf','READ','ALLOW','ROLE','employee'),(362,'Client','clientDebtStatementHtml','READ','ALLOW','ROLE','employee'),(363,'Client','clientDebtStatementEmail','WRITE','ALLOW','ROLE','employee'),(364,'Client','incotermsAuthorizationPdf','READ','ALLOW','ROLE','employee'),(365,'Client','incotermsAuthorizationHtml','READ','ALLOW','ROLE','employee'),(366,'Client','incotermsAuthorizationEmail','WRITE','ALLOW','ROLE','employee'),(367,'Client','consumptionSendQueued','WRITE','ALLOW','ROLE','system'),(368,'InvoiceOut','invoiceEmail','WRITE','ALLOW','ROLE','employee'),(369,'InvoiceOut','exportationPdf','READ','ALLOW','ROLE','employee'),(370,'InvoiceOut','sendQueued','WRITE','ALLOW','ROLE','system'),(371,'Ticket','invoiceCsvPdf','READ','ALLOW','ROLE','employee'),(372,'Ticket','invoiceCsvEmail','WRITE','ALLOW','ROLE','employee'),(373,'Supplier','campaignMetricsPdf','READ','ALLOW','ROLE','employee'),(374,'Supplier','campaignMetricsEmail','WRITE','ALLOW','ROLE','employee'),(375,'Travel','extraCommunityPdf','READ','ALLOW','ROLE','employee'),(376,'Travel','extraCommunityEmail','WRITE','ALLOW','ROLE','employee'),(377,'Entry','entryOrderPdf','READ','ALLOW','ROLE','employee'),(378,'OsTicket','osTicketReportEmail','WRITE','ALLOW','ROLE','system'),(379,'Item','buyerWasteEmail','WRITE','ALLOW','ROLE','system'),(380,'Claim','claimPickupPdf','READ','ALLOW','ROLE','employee'),(381,'Claim','claimPickupEmail','WRITE','ALLOW','ROLE','claimManager'),(382,'Item','labelPdf','READ','ALLOW','ROLE','employee'),(383,'Sector','*','READ','ALLOW','ROLE','employee'),(384,'Sector','*','WRITE','ALLOW','ROLE','employee'),(385,'Route','driverRoutePdf','READ','ALLOW','ROLE','employee'),(386,'Route','driverRouteEmail','WRITE','ALLOW','ROLE','employee'),(387,'Ticket','deliveryNotePdf','READ','ALLOW','ROLE','customer'),(388,'Supplier','newSupplier','WRITE','ALLOW','ROLE','administrative'),(389,'ClaimRma','*','READ','ALLOW','ROLE','claimManager'),(390,'ClaimRma','*','WRITE','ALLOW','ROLE','claimManager'),(391,'Notification','*','WRITE','ALLOW','ROLE','system'),(392,'Boxing','*','*','ALLOW','ROLE','employee'),(393,'Url','*','READ','ALLOW','ROLE','employee'),(394,'Url','*','WRITE','ALLOW','ROLE','it'),(395,'ItemShelving','*','READ','ALLOW','ROLE','employee'),(396,'ItemShelving','*','WRITE','ALLOW','ROLE','production'),(397,'ItemShelvingPlacementSupplyStock','*','READ','ALLOW','ROLE','employee'),(398,'NotificationQueue','*','*','ALLOW','ROLE','employee'),(399,'InvoiceOut','clientsToInvoice','WRITE','ALLOW','ROLE','invoicing'),(400,'InvoiceOut','invoiceClient','WRITE','ALLOW','ROLE','invoicing'),(401,'Sale','editTracked','WRITE','ALLOW','ROLE','production'),(402,'Sale','editFloramondo','WRITE','ALLOW','ROLE','salesAssistant'),(403,'Receipt','balanceCompensationEmail','WRITE','ALLOW','ROLE','employee'),(404,'Receipt','balanceCompensationPdf','READ','ALLOW','ROLE','employee'),(405,'Ticket','getTicketsFuture','READ','ALLOW','ROLE','employee'),(406,'Ticket','merge','WRITE','ALLOW','ROLE','employee'),(407,'Sale','editFloramondo','WRITE','ALLOW','ROLE','logistic'),(408,'ZipConfig','*','*','ALLOW','ROLE','employee'),(409,'Item','*','WRITE','ALLOW','ROLE','administrative'),(410,'Sale','editCloned','WRITE','ALLOW','ROLE','buyer'),(411,'Sale','editCloned','WRITE','ALLOW','ROLE','salesAssistant'),(414,'MdbVersion','*','READ','ALLOW','ROLE','$everyone'),(416,'TicketLog','getChanges','READ','ALLOW','ROLE','employee'),(417,'Ticket','getTicketsAdvance','READ','ALLOW','ROLE','employee'),(418,'EntryLog','*','READ','ALLOW','ROLE','administrative'),(419,'Sale','editTracked','WRITE','ALLOW','ROLE','buyer'),(420,'MdbBranch','*','READ','ALLOW','ROLE','$everyone'),(421,'ItemShelvingSale','*','*','ALLOW','ROLE','employee'),(422,'Docuware','checkFile','READ','ALLOW','ROLE','employee'),(423,'Docuware','download','READ','ALLOW','ROLE','salesPerson'),(424,'Docuware','upload','WRITE','ALLOW','ROLE','productionAssi'),(425,'Docuware','deliveryNoteEmail','WRITE','ALLOW','ROLE','salesPerson'),(426,'TpvTransaction','confirm','WRITE','ALLOW','ROLE','$everyone'),(427,'TpvTransaction','start','WRITE','ALLOW','ROLE','$authenticated'),(428,'TpvTransaction','end','WRITE','ALLOW','ROLE','$authenticated'),(429,'ItemConfig','*','READ','ALLOW','ROLE','employee'),(431,'Tag','onSubmit','WRITE','ALLOW','ROLE','employee'),(432,'Worker','updateAttributes','WRITE','ALLOW','ROLE','hr'),(433,'Worker','createAbsence','*','ALLOW','ROLE','employee'),(434,'Worker','updateAbsence','WRITE','ALLOW','ROLE','employee'),(435,'Worker','deleteAbsence','*','ALLOW','ROLE','employee'),(436,'Worker','new','WRITE','ALLOW','ROLE','hr'),(437,'Role','*','READ','ALLOW','ROLE','hr'),(438,'Client','getClientOrSupplierReference','READ','ALLOW','ROLE','employee'),(439,'NotificationSubscription','*','*','ALLOW','ROLE','employee'),(440,'NotificationAcl','*','READ','ALLOW','ROLE','employee'),(441,'MdbApp','*','READ','ALLOW','ROLE','$everyone'),(442,'MdbApp','*','*','ALLOW','ROLE','developer'),(443,'ItemConfig','*','*','ALLOW','ROLE','employee'),(444,'DeviceProduction','*','*','ALLOW','ROLE','hr'),(445,'DeviceProductionModels','*','*','ALLOW','ROLE','hr'),(446,'DeviceProductionState','*','*','ALLOW','ROLE','hr'),(447,'DeviceProductionUser','*','*','ALLOW','ROLE','hr'),(448,'DeviceProduction','*','*','ALLOW','ROLE','productionAssi'),(449,'DeviceProductionModels','*','*','ALLOW','ROLE','productionAssi'),(450,'DeviceProductionState','*','*','ALLOW','ROLE','productionAssi'),(451,'DeviceProductionUser','*','*','ALLOW','ROLE','productionAssi'),(452,'Worker','deallocatePDA','*','ALLOW','ROLE','hr'),(453,'Worker','allocatePDA','*','ALLOW','ROLE','hr'),(454,'Worker','deallocatePDA','*','ALLOW','ROLE','productionAssi'),(455,'Worker','allocatePDA','*','ALLOW','ROLE','productionAssi'),(456,'Zone','*','*','ALLOW','ROLE','deliveryAssistant'),(457,'Account','setPassword','WRITE','ALLOW','ROLE','itManagement'),(458,'Operator','*','READ','ALLOW','ROLE','employee'),(459,'Operator','*','WRITE','ALLOW','ROLE','employee'),(460,'InvoiceIn','getSerial','READ','ALLOW','ROLE','administrative'),(461,'Ticket','saveSign','WRITE','ALLOW','ROLE','employee'),(462,'InvoiceOut','negativeBases','READ','ALLOW','ROLE','administrative'),(463,'InvoiceOut','negativeBasesCsv','READ','ALLOW','ROLE','administrative'),(464,'WorkerObservation','*','*','ALLOW','ROLE','hr'),(465,'ClientInforma','*','READ','ALLOW','ROLE','employee'),(466,'ClientInforma','*','WRITE','ALLOW','ROLE','financial'),(467,'Receipt','receiptEmail','*','ALLOW','ROLE','salesAssistant'),(468,'Client','setRating','WRITE','ALLOW','ROLE','financial'),(469,'Client','*','READ','ALLOW','ROLE','employee'),(470,'Client','addressesPropagateRe','*','ALLOW','ROLE','employee'),(471,'Client','canBeInvoiced','*','ALLOW','ROLE','employee'),(472,'Client','canCreateTicket','*','ALLOW','ROLE','employee'),(473,'Client','consumption','*','ALLOW','ROLE','employee'),(474,'Client','createAddress','*','ALLOW','ROLE','employee'),(475,'Client','createWithUser','*','ALLOW','ROLE','employee'),(476,'Client','extendedListFilter','*','ALLOW','ROLE','employee'),(477,'Client','getAverageInvoiced','*','ALLOW','ROLE','employee'),(478,'Client','getCard','*','ALLOW','ROLE','employee'),(479,'Client','getDebt','*','ALLOW','ROLE','employee'),(480,'Client','getMana','*','ALLOW','ROLE','employee'),(481,'Client','transactions','*','ALLOW','ROLE','employee'),(482,'Client','hasCustomerRole','*','ALLOW','ROLE','employee'),(483,'Client','isValidClient','*','ALLOW','ROLE','employee'),(484,'Client','lastActiveTickets','*','ALLOW','ROLE','employee'),(485,'Client','sendSms','*','ALLOW','ROLE','employee'),(486,'Client','setPassword','*','ALLOW','ROLE','employee'),(487,'Client','summary','*','ALLOW','ROLE','employee'),(488,'Client','updateAddress','*','ALLOW','ROLE','employee'),(489,'Client','updateFiscalData','*','ALLOW','ROLE','employee'),(490,'Client','updateUser','*','ALLOW','ROLE','employee'),(491,'Client','uploadFile','*','ALLOW','ROLE','employee'),(492,'Client','campaignMetricsPdf','*','ALLOW','ROLE','employee'),(493,'Client','campaignMetricsEmail','*','ALLOW','ROLE','employee'),(494,'Client','clientWelcomeHtml','*','ALLOW','ROLE','employee'),(495,'Client','clientWelcomeEmail','*','ALLOW','ROLE','employee'),(496,'Client','printerSetupHtml','*','ALLOW','ROLE','employee'),(497,'Client','printerSetupEmail','*','ALLOW','ROLE','employee'),(498,'Client','sepaCoreEmail','*','ALLOW','ROLE','employee'),(499,'Client','letterDebtorPdf','*','ALLOW','ROLE','employee'),(500,'Client','letterDebtorStHtml','*','ALLOW','ROLE','employee'),(501,'Client','letterDebtorStEmail','*','ALLOW','ROLE','employee'),(502,'Client','letterDebtorNdHtml','*','ALLOW','ROLE','employee'),(503,'Client','letterDebtorNdEmail','*','ALLOW','ROLE','employee'),(504,'Client','clientDebtStatementPdf','*','ALLOW','ROLE','employee'),(505,'Client','clientDebtStatementHtml','*','ALLOW','ROLE','employee'),(506,'Client','clientDebtStatementEmail','*','ALLOW','ROLE','employee'),(507,'Client','creditRequestPdf','*','ALLOW','ROLE','employee'),(508,'Client','creditRequestHtml','*','ALLOW','ROLE','employee'),(509,'Client','creditRequestEmail','*','ALLOW','ROLE','employee'),(510,'Client','incotermsAuthorizationPdf','*','ALLOW','ROLE','employee'),(511,'Client','incotermsAuthorizationHtml','*','ALLOW','ROLE','employee'),(512,'Client','incotermsAuthorizationEmail','*','ALLOW','ROLE','employee'),(513,'Client','consumptionSendQueued','*','ALLOW','ROLE','employee'),(514,'Client','filter','*','ALLOW','ROLE','employee'),(515,'Client','getClientOrSupplierReference','*','ALLOW','ROLE','employee'),(516,'Client','upsert','*','ALLOW','ROLE','employee'),(517,'Client','create','*','ALLOW','ROLE','employee'),(518,'Client','replaceById','*','ALLOW','ROLE','employee'),(519,'Client','updateAttributes','*','ALLOW','ROLE','employee'),(520,'Client','updateAttributes','*','ALLOW','ROLE','employee'),(521,'Client','deleteById','*','ALLOW','ROLE','employee'),(522,'Client','replaceOrCreate','*','ALLOW','ROLE','employee'),(523,'Client','updateAll','*','ALLOW','ROLE','employee'),(524,'Client','upsertWithWhere','*','ALLOW','ROLE','employee'),(525,'Defaulter','observationEmail','WRITE','ALLOW','ROLE','employee'),(526,'VnUser','*','*','ALLOW','ROLE','employee'),(527,'VnUser','acl','READ','ALLOW','ROLE','account'),(528,'VnUser','getCurrentUserData','READ','ALLOW','ROLE','account'),(529,'VnUser','changePassword','WRITE','ALLOW','ROLE','account'),(530,'Account','exists','READ','ALLOW','ROLE','account'),(531,'Account','exists','READ','ALLOW','ROLE','account'),(532,'UserLog','*','READ','ALLOW','ROLE','employee'),(533,'RoleLog','*','READ','ALLOW','ROLE','employee');
/*!40000 ALTER TABLE `ACL` ENABLE KEYS */;
UNLOCK TABLES;
From 251ed36eca664a9c015bcc15003d49dc39a774cc Mon Sep 17 00:00:00 2001
From: vicent
Date: Fri, 28 Jul 2023 10:51:48 +0200
Subject: [PATCH 0488/1087] refs #6013 feat: mostrar error en el mail
---
.../back/methods/worker-time-control/sendMail.js | 14 ++++++--------
1 file changed, 6 insertions(+), 8 deletions(-)
diff --git a/modules/worker/back/methods/worker-time-control/sendMail.js b/modules/worker/back/methods/worker-time-control/sendMail.js
index 13317fc65..4988d1f46 100644
--- a/modules/worker/back/methods/worker-time-control/sendMail.js
+++ b/modules/worker/back/methods/worker-time-control/sendMail.js
@@ -179,7 +179,6 @@ module.exports = Self => {
const workerTimeControlConfig = await models.WorkerTimeControlConfig.findOne(null, myOptions);
- console.log(days[index]);
for (let day of days[index]) {
if (!myOptions.transaction) {
tx = await Self.beginTransaction({});
@@ -374,22 +373,18 @@ module.exports = Self => {
delete myOptions.transaction;
}
} catch (e) {
- if (tx) await tx.rollback();
- delete myOptions.transaction;
-
const stmts = [];
let stmt;
stmt = new ParameterizedSQL(`
INSERT INTO mail (receiver, subject, body)
SELECT CONCAT(u.name, '@verdnatura.es'),
CONCAT('Error registro de horas semana ', ?, ' año ', ?) ,
- CONCAT('No se ha podido enviar el registro de horas al empleado/s: ',
- GROUP_CONCAT(DISTINCT CONCAT(' ', w.id, ' ', w.firstName, ' ', w.lastName)))
+ CONCAT('No se ha podido enviar el registro de horas al empleado: ',
+ w.id, ' ', w.firstName, ' ', w.lastName, ' por el motivo: ', ?)
FROM worker w
JOIN account.user u ON u.id = w.bossFk
WHERE w.id = ?
- GROUP BY w.bossFk
- `, [args.week, args.year, day.workerFk]);
+ `, [args.week, args.year, e.message, day.workerFk]);
stmts.push(stmt);
const sql = ParameterizedSQL.join(stmts, ';');
@@ -398,6 +393,9 @@ module.exports = Self => {
previousWorkerFk = day.workerFk;
previousReceiver = day.receiver;
+ if (tx) await tx.rollback();
+ delete myOptions.transaction;
+
continue;
}
}
From 1d4ce2c70342e01371143b317f80d5c17214c474 Mon Sep 17 00:00:00 2001
From: vicent
Date: Fri, 28 Jul 2023 12:24:24 +0200
Subject: [PATCH 0489/1087] refs #5804 fix: delete transaction
---
.../ticket/back/methods/ticket-request/getItemTypeWorker.js | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/modules/ticket/back/methods/ticket-request/getItemTypeWorker.js b/modules/ticket/back/methods/ticket-request/getItemTypeWorker.js
index f160cfaac..9ea859f7c 100644
--- a/modules/ticket/back/methods/ticket-request/getItemTypeWorker.js
+++ b/modules/ticket/back/methods/ticket-request/getItemTypeWorker.js
@@ -22,13 +22,9 @@ module.exports = Self => {
}
});
- Self.getItemTypeWorker = async(filter, options) => {
- const myOptions = {};
+ Self.getItemTypeWorker = async filter => {
const conn = Self.dataSource.connector;
- if (typeof options == 'object')
- Object.assign(myOptions, options);
-
const query =
`SELECT DISTINCT u.id, u.nickname
FROM itemType it
From 4061f3e5ce87668745a74e04986aaee49c35e926 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Carlos=20Andr=C3=A9s?=
Date: Fri, 28 Jul 2023 12:28:41 +0200
Subject: [PATCH 0490/1087] #refs 6077 espacios por tabulaciones
---
.../invoiceIn/back/locale/invoiceIn/en.yml | 36 +++++++++----------
.../invoiceIn/back/locale/invoiceIn/es.yml | 36 +++++++++----------
.../back/locale/invoiceInDueDay/en.yml | 14 ++++----
.../back/locale/invoiceInDueDay/es.yml | 14 ++++----
.../invoiceIn/back/locale/invoiceInTax/en.yml | 20 +++++------
.../invoiceIn/back/locale/invoiceInTax/es.yml | 20 +++++------
6 files changed, 70 insertions(+), 70 deletions(-)
diff --git a/modules/invoiceIn/back/locale/invoiceIn/en.yml b/modules/invoiceIn/back/locale/invoiceIn/en.yml
index 4110dcdbc..5aa81b9ff 100644
--- a/modules/invoiceIn/back/locale/invoiceIn/en.yml
+++ b/modules/invoiceIn/back/locale/invoiceIn/en.yml
@@ -1,20 +1,20 @@
name: invoice in
columns:
- id: id
- serialNumber: serial number
- serial: serial
- supplierFk: supplier
- issued: issued
- supplierRef: supplierRef
- isBooked: is booked
- currencyFk: currency
- created: created
- companyFk: company
- docFk: document
- booked: booked
- operated: operated
- bookEntried: book entried
- isVatDeductible: is VAT deductible
- withholdingSageFk: withholding
- expenceFkDeductible: expence deductible
- editorFk: editor
\ No newline at end of file
+ id: id
+ serialNumber: serial number
+ serial: serial
+ supplierFk: supplier
+ issued: issued
+ supplierRef: supplierRef
+ isBooked: is booked
+ currencyFk: currency
+ created: created
+ companyFk: company
+ docFk: document
+ booked: booked
+ operated: operated
+ bookEntried: book entried
+ isVatDeductible: is VAT deductible
+ withholdingSageFk: withholding
+ expenceFkDeductible: expence deductible
+ editorFk: editor
\ No newline at end of file
diff --git a/modules/invoiceIn/back/locale/invoiceIn/es.yml b/modules/invoiceIn/back/locale/invoiceIn/es.yml
index 432b27cb3..61f62f022 100644
--- a/modules/invoiceIn/back/locale/invoiceIn/es.yml
+++ b/modules/invoiceIn/back/locale/invoiceIn/es.yml
@@ -1,20 +1,20 @@
name: factura recibida
columns:
- id: id
- serialNumber: número de serie
- serial: serie
- supplierFk: proveedor
- issued: fecha emisión
- supplierRef: referéncia proveedor
- isBooked: facturado
- currencyFk: moneda
- created: creado
- companyFk: empresa
- docFk: documento
- booked: fecha contabilización
- operated: fecha entrega
- bookEntried: fecha asiento
- isVatDeductible: impuesto deducible
- withholdingSageFk: código de retención
- expenceFkDeductible: gasto deducible
- editorFk: editor
\ No newline at end of file
+ id: id
+ serialNumber: número de serie
+ serial: serie
+ supplierFk: proveedor
+ issued: fecha emisión
+ supplierRef: referéncia proveedor
+ isBooked: facturado
+ currencyFk: moneda
+ created: creado
+ companyFk: empresa
+ docFk: documento
+ booked: fecha contabilización
+ operated: fecha entrega
+ bookEntried: fecha asiento
+ isVatDeductible: impuesto deducible
+ withholdingSageFk: código de retención
+ expenceFkDeductible: gasto deducible
+ editorFk: editor
\ No newline at end of file
diff --git a/modules/invoiceIn/back/locale/invoiceInDueDay/en.yml b/modules/invoiceIn/back/locale/invoiceInDueDay/en.yml
index 5e42dfc66..f01a0de46 100644
--- a/modules/invoiceIn/back/locale/invoiceInDueDay/en.yml
+++ b/modules/invoiceIn/back/locale/invoiceInDueDay/en.yml
@@ -1,9 +1,9 @@
name: invoice in due day
columns:
- id: id
- invoiceInFk: invoice in
- dueDated: due date
- bankFk: bank
- amount: amount
- foreignValue : foreign amount
- created: created
+ id: id
+ invoiceInFk: invoice in
+ dueDated: due date
+ bankFk: bank
+ amount: amount
+ foreignValue : foreign amount
+ created: created
diff --git a/modules/invoiceIn/back/locale/invoiceInDueDay/es.yml b/modules/invoiceIn/back/locale/invoiceInDueDay/es.yml
index 168db9803..34b20b37d 100644
--- a/modules/invoiceIn/back/locale/invoiceInDueDay/es.yml
+++ b/modules/invoiceIn/back/locale/invoiceInDueDay/es.yml
@@ -1,9 +1,9 @@
name: vencimientos factura recibida
columns:
- id: id
- invoiceInFk: factura
- dueDated: fecha vto.
- bankFk: banco
- amount: importe
- foreignValue : importe divisa
- created: creado
+ id: id
+ invoiceInFk: factura
+ dueDated: fecha vto.
+ bankFk: banco
+ amount: importe
+ foreignValue : importe divisa
+ created: creado
diff --git a/modules/invoiceIn/back/locale/invoiceInTax/en.yml b/modules/invoiceIn/back/locale/invoiceInTax/en.yml
index 86a9e42c3..374f62e7d 100644
--- a/modules/invoiceIn/back/locale/invoiceInTax/en.yml
+++ b/modules/invoiceIn/back/locale/invoiceInTax/en.yml
@@ -1,12 +1,12 @@
name: invoice in tax
colmns:
- id: id
- invoiceInFk: invoice in
- taxCodeFk: tax
- taxableBase: taxable base
- expenceFk: expence
- foreignValue: foreign amount
- taxTypeSageFk: tax type
- transactionTypeSageFk: transaction type
- created: created
- editorFk: editor
+ id: id
+ invoiceInFk: invoice in
+ taxCodeFk: tax
+ taxableBase: taxable base
+ expenceFk: expence
+ foreignValue: foreign amount
+ taxTypeSageFk: tax type
+ transactionTypeSageFk: transaction type
+ created: created
+ editorFk: editor
diff --git a/modules/invoiceIn/back/locale/invoiceInTax/es.yml b/modules/invoiceIn/back/locale/invoiceInTax/es.yml
index 233c591e9..b20663dd4 100644
--- a/modules/invoiceIn/back/locale/invoiceInTax/es.yml
+++ b/modules/invoiceIn/back/locale/invoiceInTax/es.yml
@@ -1,12 +1,12 @@
name: factura recibida impuesto
colmns:
- id: id
- invoiceInFk: factura recibida
- taxCodeFk: código IVA
- taxableBase: base imponible
- expenceFk: código gasto
- foreignValue: importe divisa
- taxTypeSageFk: código impuesto
- transactionTypeSageFk: código transacción
- created: creado
- editorFk: editor
\ No newline at end of file
+ id: id
+ invoiceInFk: factura recibida
+ taxCodeFk: código IVA
+ taxableBase: base imponible
+ expenceFk: código gasto
+ foreignValue: importe divisa
+ taxTypeSageFk: código impuesto
+ transactionTypeSageFk: código transacción
+ created: creado
+ editorFk: editor
\ No newline at end of file
From 136b401ede36eed3d0e3cc9025a429bf74d48ee8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Carlos=20Andr=C3=A9s?=
Date: Fri, 28 Jul 2023 14:17:50 +0200
Subject: [PATCH 0491/1087] refs #6077 espacios correctos
---
.../invoiceIn/back/locale/invoiceIn/en.yml | 36 +++++++++----------
.../invoiceIn/back/locale/invoiceIn/es.yml | 36 +++++++++----------
.../back/locale/invoiceInDueDay/en.yml | 14 ++++----
.../back/locale/invoiceInDueDay/es.yml | 14 ++++----
.../invoiceIn/back/locale/invoiceInTax/en.yml | 22 ++++++------
.../invoiceIn/back/locale/invoiceInTax/es.yml | 22 ++++++------
6 files changed, 72 insertions(+), 72 deletions(-)
diff --git a/modules/invoiceIn/back/locale/invoiceIn/en.yml b/modules/invoiceIn/back/locale/invoiceIn/en.yml
index 5aa81b9ff..ec9a824b6 100644
--- a/modules/invoiceIn/back/locale/invoiceIn/en.yml
+++ b/modules/invoiceIn/back/locale/invoiceIn/en.yml
@@ -1,20 +1,20 @@
name: invoice in
columns:
- id: id
- serialNumber: serial number
- serial: serial
- supplierFk: supplier
- issued: issued
- supplierRef: supplierRef
- isBooked: is booked
- currencyFk: currency
- created: created
- companyFk: company
- docFk: document
- booked: booked
- operated: operated
- bookEntried: book entried
- isVatDeductible: is VAT deductible
- withholdingSageFk: withholding
- expenceFkDeductible: expence deductible
- editorFk: editor
\ No newline at end of file
+ id: id
+ serialNumber: serial number
+ serial: serial
+ supplierFk: supplier
+ issued: issued
+ supplierRef: supplierRef
+ isBooked: is booked
+ currencyFk: currency
+ created: created
+ companyFk: company
+ docFk: document
+ booked: booked
+ operated: operated
+ bookEntried: book entried
+ isVatDeductible: is VAT deductible
+ withholdingSageFk: withholding
+ expenceFkDeductible: expence deductible
+ editorFk: editor
\ No newline at end of file
diff --git a/modules/invoiceIn/back/locale/invoiceIn/es.yml b/modules/invoiceIn/back/locale/invoiceIn/es.yml
index 61f62f022..64e96b379 100644
--- a/modules/invoiceIn/back/locale/invoiceIn/es.yml
+++ b/modules/invoiceIn/back/locale/invoiceIn/es.yml
@@ -1,20 +1,20 @@
name: factura recibida
columns:
- id: id
- serialNumber: número de serie
- serial: serie
- supplierFk: proveedor
- issued: fecha emisión
- supplierRef: referéncia proveedor
- isBooked: facturado
- currencyFk: moneda
- created: creado
- companyFk: empresa
- docFk: documento
- booked: fecha contabilización
- operated: fecha entrega
- bookEntried: fecha asiento
- isVatDeductible: impuesto deducible
- withholdingSageFk: código de retención
- expenceFkDeductible: gasto deducible
- editorFk: editor
\ No newline at end of file
+ id: id
+ serialNumber: número de serie
+ serial: serie
+ supplierFk: proveedor
+ issued: fecha emisión
+ supplierRef: referéncia proveedor
+ isBooked: facturado
+ currencyFk: moneda
+ created: creado
+ companyFk: empresa
+ docFk: documento
+ booked: fecha contabilización
+ operated: fecha entrega
+ bookEntried: fecha asiento
+ isVatDeductible: impuesto deducible
+ withholdingSageFk: código de retención
+ expenceFkDeductible: gasto deducible
+ editorFk: editor
\ No newline at end of file
diff --git a/modules/invoiceIn/back/locale/invoiceInDueDay/en.yml b/modules/invoiceIn/back/locale/invoiceInDueDay/en.yml
index f01a0de46..7a6c0dfaf 100644
--- a/modules/invoiceIn/back/locale/invoiceInDueDay/en.yml
+++ b/modules/invoiceIn/back/locale/invoiceInDueDay/en.yml
@@ -1,9 +1,9 @@
name: invoice in due day
columns:
- id: id
- invoiceInFk: invoice in
- dueDated: due date
- bankFk: bank
- amount: amount
- foreignValue : foreign amount
- created: created
+ id: id
+ invoiceInFk: invoice in
+ dueDated: due date
+ bankFk: bank
+ amount: amount
+ foreignValue : foreign amount
+ created: created
diff --git a/modules/invoiceIn/back/locale/invoiceInDueDay/es.yml b/modules/invoiceIn/back/locale/invoiceInDueDay/es.yml
index 34b20b37d..993437b05 100644
--- a/modules/invoiceIn/back/locale/invoiceInDueDay/es.yml
+++ b/modules/invoiceIn/back/locale/invoiceInDueDay/es.yml
@@ -1,9 +1,9 @@
name: vencimientos factura recibida
columns:
- id: id
- invoiceInFk: factura
- dueDated: fecha vto.
- bankFk: banco
- amount: importe
- foreignValue : importe divisa
- created: creado
+ id: id
+ invoiceInFk: factura
+ dueDated: fecha vto.
+ bankFk: banco
+ amount: importe
+ foreignValue : importe divisa
+ created: creado
diff --git a/modules/invoiceIn/back/locale/invoiceInTax/en.yml b/modules/invoiceIn/back/locale/invoiceInTax/en.yml
index 374f62e7d..c0d12c37d 100644
--- a/modules/invoiceIn/back/locale/invoiceInTax/en.yml
+++ b/modules/invoiceIn/back/locale/invoiceInTax/en.yml
@@ -1,12 +1,12 @@
name: invoice in tax
-colmns:
- id: id
- invoiceInFk: invoice in
- taxCodeFk: tax
- taxableBase: taxable base
- expenceFk: expence
- foreignValue: foreign amount
- taxTypeSageFk: tax type
- transactionTypeSageFk: transaction type
- created: created
- editorFk: editor
+columns:
+ id: id
+ invoiceInFk: invoice in
+ taxCodeFk: tax
+ taxableBase: taxable base
+ expenceFk: expence
+ foreignValue: foreign amount
+ taxTypeSageFk: tax type
+ transactionTypeSageFk: transaction type
+ created: created
+ editorFk: editor
diff --git a/modules/invoiceIn/back/locale/invoiceInTax/es.yml b/modules/invoiceIn/back/locale/invoiceInTax/es.yml
index b20663dd4..7cb847ed8 100644
--- a/modules/invoiceIn/back/locale/invoiceInTax/es.yml
+++ b/modules/invoiceIn/back/locale/invoiceInTax/es.yml
@@ -1,12 +1,12 @@
name: factura recibida impuesto
-colmns:
- id: id
- invoiceInFk: factura recibida
- taxCodeFk: código IVA
- taxableBase: base imponible
- expenceFk: código gasto
- foreignValue: importe divisa
- taxTypeSageFk: código impuesto
- transactionTypeSageFk: código transacción
- created: creado
- editorFk: editor
\ No newline at end of file
+columns:
+ id: id
+ invoiceInFk: factura recibida
+ taxCodeFk: código IVA
+ taxableBase: base imponible
+ expenceFk: código gasto
+ foreignValue: importe divisa
+ taxTypeSageFk: código impuesto
+ transactionTypeSageFk: código transacción
+ created: creado
+ editorFk: editor
\ No newline at end of file
From e253dd79822b068849a43dc78f5167bfb15388a8 Mon Sep 17 00:00:00 2001
From: alexm
Date: Fri, 28 Jul 2023 14:39:01 +0200
Subject: [PATCH 0492/1087] refs #5351 fix(worker_model): remove required
userFk
---
modules/worker/back/models/worker.json | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/modules/worker/back/models/worker.json b/modules/worker/back/models/worker.json
index 6d23c1b66..6e1371055 100644
--- a/modules/worker/back/models/worker.json
+++ b/modules/worker/back/models/worker.json
@@ -25,8 +25,7 @@
"type" : "string"
},
"userFk": {
- "type" : "number",
- "required": true
+ "type" : "number"
},
"bossFk": {
"type" : "number"
From 81dc163819fb45e288d004378f7f916cb7e7b5d1 Mon Sep 17 00:00:00 2001
From: vicent
Date: Fri, 28 Jul 2023 14:40:03 +0200
Subject: [PATCH 0493/1087] ya no muestra error en el front
---
modules/worker/front/card/index.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/worker/front/card/index.js b/modules/worker/front/card/index.js
index 0bf9ae5c4..b8b533c5d 100644
--- a/modules/worker/front/card/index.js
+++ b/modules/worker/front/card/index.js
@@ -36,7 +36,7 @@ class Controller extends ModuleCard {
this.$http.get(`Workers/${this.$params.id}`, {filter})
.then(res => this.worker = res.data),
this.$http.get(`Workers/${this.$params.id}/activeContract`)
- .then(res => this.hasWorkCenter = res.data.workCenterFk)
+ .then(res => this.hasWorkCenter = res.data?.workCenterFk)
]);
}
}
From 50155cea8d5e3669b5293764f7666f0223a35c9c Mon Sep 17 00:00:00 2001
From: jorgep
Date: Fri, 28 Jul 2023 15:21:43 +0200
Subject: [PATCH 0494/1087] refs #5914 WIP transfer invoiceOut
---
.../233201/00-transferInvoiceOutACL.sql | 6 +
db/dump/fixtures.sql | 13 ++
loopback/locale/es.json | 3 +-
.../methods/invoiceOut/transferInvoiceOut.js | 81 +++++++++++
modules/invoiceOut/back/model-config.json | 12 ++
.../back/models/cplus-correcting-type.json | 19 +++
.../back/models/cplus-rectification-type.json | 19 +++
.../back/models/invoice-correction-type.json | 19 +++
modules/invoiceOut/back/models/invoice-out.js | 1 +
.../back/models/invoiceCorrection.json | 28 ++++
.../front/descriptor-menu/index.html | 89 ++++++++++++
.../invoiceOut/front/descriptor-menu/index.js | 13 ++
.../front/descriptor-menu/locale/en.yml | 2 +
.../front/descriptor-menu/locale/es.yml | 2 +
modules/ticket/back/methods/sale/clone.js | 76 ++++++++++
.../back/methods/sale/createTicketRefund.js | 25 ++++
modules/ticket/back/methods/sale/refund.js | 137 +++++++++++++++++-
17 files changed, 543 insertions(+), 2 deletions(-)
create mode 100644 db/changes/233201/00-transferInvoiceOutACL.sql
create mode 100644 modules/invoiceOut/back/methods/invoiceOut/transferInvoiceOut.js
create mode 100644 modules/invoiceOut/back/models/cplus-correcting-type.json
create mode 100644 modules/invoiceOut/back/models/cplus-rectification-type.json
create mode 100644 modules/invoiceOut/back/models/invoice-correction-type.json
create mode 100644 modules/invoiceOut/back/models/invoiceCorrection.json
create mode 100644 modules/ticket/back/methods/sale/clone.js
create mode 100644 modules/ticket/back/methods/sale/createTicketRefund.js
diff --git a/db/changes/233201/00-transferInvoiceOutACL.sql b/db/changes/233201/00-transferInvoiceOutACL.sql
new file mode 100644
index 000000000..b549e52a8
--- /dev/null
+++ b/db/changes/233201/00-transferInvoiceOutACL.sql
@@ -0,0 +1,6 @@
+INSERT INTO `salix`.`ACL` (model, property, accessType, permission, principalType, principalId)
+ VALUES
+ ('CplusRectificationType', '*', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('CplusCorrectingType', '*', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('InvoiceCorrectionType', '*', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('InvoiceOut', 'transferInvoiceOut', 'WRITE', 'ALLOW', 'ROLE', 'employee');
\ No newline at end of file
diff --git a/db/dump/fixtures.sql b/db/dump/fixtures.sql
index eaa00a3de..0a17e2e42 100644
--- a/db/dump/fixtures.sql
+++ b/db/dump/fixtures.sql
@@ -2958,3 +2958,16 @@ INSERT INTO `vn`.`invoiceInSerial` (`code`, `description`, `cplusTerIdNifFk`, `t
INSERT INTO `hedera`.`imageConfig` (`id`, `maxSize`, `useXsendfile`, `url`)
VALUES
(1, 0, 0, 'marvel.com');
+
+INSERT INTO `vn`.`cplusCorrectingType` (`description`)
+ VALUES
+ ('Embalajes'),
+ ('Anulación'),
+ ('Impagado'),
+ ('Moroso');
+
+INSERT INTO `vn`.`invoiceCorrectionType` (`description`)
+ VALUES
+ ('Error en el cálculo del IVA'),
+ ('Error en el detalle de las ventas'),
+ ('Error en los datos del cliente');
diff --git a/loopback/locale/es.json b/loopback/locale/es.json
index ac62d62e1..3439adcde 100644
--- a/loopback/locale/es.json
+++ b/loopback/locale/es.json
@@ -311,5 +311,6 @@
"You don't have enough privileges.": "No tienes suficientes permisos.",
"This ticket is locked.": "Este ticket está bloqueado.",
"This ticket is not editable.": "Este ticket no es editable.",
- "The ticket doesn't exist.": "No existe el ticket."
+ "The ticket doesn't exist.": "No existe el ticket.",
+ "There are missing fields.": "There are missing fields."
}
\ No newline at end of file
diff --git a/modules/invoiceOut/back/methods/invoiceOut/transferInvoiceOut.js b/modules/invoiceOut/back/methods/invoiceOut/transferInvoiceOut.js
new file mode 100644
index 000000000..b50e4b1a7
--- /dev/null
+++ b/modules/invoiceOut/back/methods/invoiceOut/transferInvoiceOut.js
@@ -0,0 +1,81 @@
+const UserError = require('vn-loopback/util/user-error');
+
+module.exports = Self => {
+ Self.remoteMethodCtx('transferInvoiceOut', {
+ description: 'Transfer an invoice out to another client',
+ accessType: 'WRITE',
+ accepts: [
+ {
+ arg: 'data',
+ type: 'Object',
+ required: true
+ }
+ ],
+ returns: {
+ type: 'boolean',
+ root: true
+ },
+ http: {
+ path: '/transferInvoice',
+ verb: 'post'
+ }
+ });
+
+ Self.transferInvoiceOut = async(ctx, params, options) => {
+ const models = Self.app.models;
+ const myOptions = {};
+ let tx;
+
+ if (typeof options == 'object')
+ Object.assign(myOptions, options);
+
+ if (!myOptions.transaction) {
+ tx = await Self.beginTransaction({});
+ myOptions.transaction = tx;
+ }
+ try {
+ const {ref, newClientFk, cplusRectificationId, cplusCorrectingTypeId, invoiceCorrectionTypeId} = params;
+ if (!ref || !newClientFk || !cplusRectificationId || !cplusCorrectingTypeId || !invoiceCorrectionTypeId)
+ throw new UserError(`There are missing fields.`);
+
+ const filter = {where: {refFk: ref}};
+ const tickets = await models.Ticket.find(filter, myOptions);
+ const ticketsIds = tickets.map(ticket => ticket.id);
+ const refundTicket = await models.Ticket.refund(ctx, ticketsIds, null, myOptions);
+ // Clonar tickets
+ const refundAgencyMode = await models.AgencyMode.findOne({
+ include: {
+ relation: 'zones',
+ scope: {
+ limit: 1,
+ field: ['id', 'name']
+ }
+ },
+ where: {code: 'refund'}
+ }, myOptions);
+ const refoundZoneId = refundAgencyMode.zones()[0].id;
+ const services = await models.TicketService.find(filter, myOptions);
+ const servicesIds = services.map(service => service.id);
+ const salesFilter = {
+ where: {id: {inq: salesIds}},
+ include: {
+ relation: 'components',
+ scope: {
+ fields: ['saleFk', 'componentFk', 'value']
+ }
+ }
+ };
+ const sales = await models.Sale.find(salesFilter, myOptions);
+ // Actualizar cliente
+
+ // Invoice Ticket - Factura rápida ??
+
+ // Insert InvoiceCorrection
+ if (tx) await tx.commit();
+ } catch (e) {
+ if (tx) await tx.rollback();
+ throw e;
+ }
+ return true;
+ };
+};
diff --git a/modules/invoiceOut/back/model-config.json b/modules/invoiceOut/back/model-config.json
index 9e8b119ab..995ea976b 100644
--- a/modules/invoiceOut/back/model-config.json
+++ b/modules/invoiceOut/back/model-config.json
@@ -31,5 +31,17 @@
},
"ZipConfig": {
"dataSource": "vn"
+ },
+ "CplusRectificationType": {
+ "dataSource": "vn"
+ },
+ "CplusCorrectingType": {
+ "dataSource": "vn"
+ },
+ "InvoiceCorrectionType": {
+ "dataSource": "vn"
+ },
+ "InvoiceCorrection": {
+ "dataSource": "vn"
}
}
diff --git a/modules/invoiceOut/back/models/cplus-correcting-type.json b/modules/invoiceOut/back/models/cplus-correcting-type.json
new file mode 100644
index 000000000..660f60008
--- /dev/null
+++ b/modules/invoiceOut/back/models/cplus-correcting-type.json
@@ -0,0 +1,19 @@
+{
+ "name": "CplusCorrectingType",
+ "base": "VnModel",
+ "options": {
+ "mysql": {
+ "table": "cplusCorrectingType"
+ }
+ },
+ "properties": {
+ "id": {
+ "id": true,
+ "type": "number",
+ "description": "Identifier"
+ },
+ "description": {
+ "type": "string"
+ }
+ }
+}
\ No newline at end of file
diff --git a/modules/invoiceOut/back/models/cplus-rectification-type.json b/modules/invoiceOut/back/models/cplus-rectification-type.json
new file mode 100644
index 000000000..e7bfb957f
--- /dev/null
+++ b/modules/invoiceOut/back/models/cplus-rectification-type.json
@@ -0,0 +1,19 @@
+{
+ "name": "CplusRectificationType",
+ "base": "VnModel",
+ "options": {
+ "mysql": {
+ "table": "cplusRectificationType"
+ }
+ },
+ "properties": {
+ "id": {
+ "id": true,
+ "type": "number",
+ "description": "Identifier"
+ },
+ "description": {
+ "type": "string"
+ }
+ }
+}
\ No newline at end of file
diff --git a/modules/invoiceOut/back/models/invoice-correction-type.json b/modules/invoiceOut/back/models/invoice-correction-type.json
new file mode 100644
index 000000000..ad3f034ea
--- /dev/null
+++ b/modules/invoiceOut/back/models/invoice-correction-type.json
@@ -0,0 +1,19 @@
+{
+ "name": "InvoiceCorrectionType",
+ "base": "VnModel",
+ "options": {
+ "mysql": {
+ "table": "invoiceCorrectionType"
+ }
+ },
+ "properties": {
+ "id": {
+ "id": true,
+ "type": "number",
+ "description": "Identifier"
+ },
+ "description": {
+ "type": "string"
+ }
+ }
+}
\ No newline at end of file
diff --git a/modules/invoiceOut/back/models/invoice-out.js b/modules/invoiceOut/back/models/invoice-out.js
index d3aaf3b3d..0bb31ce12 100644
--- a/modules/invoiceOut/back/models/invoice-out.js
+++ b/modules/invoiceOut/back/models/invoice-out.js
@@ -23,6 +23,7 @@ module.exports = Self => {
require('../methods/invoiceOut/getInvoiceDate')(Self);
require('../methods/invoiceOut/negativeBases')(Self);
require('../methods/invoiceOut/negativeBasesCsv')(Self);
+ require('../methods/invoiceOut/transferInvoiceOut')(Self);
Self.filePath = async function(id, options) {
const fields = ['ref', 'issued'];
diff --git a/modules/invoiceOut/back/models/invoiceCorrection.json b/modules/invoiceOut/back/models/invoiceCorrection.json
new file mode 100644
index 000000000..48bd172a6
--- /dev/null
+++ b/modules/invoiceOut/back/models/invoiceCorrection.json
@@ -0,0 +1,28 @@
+{
+ "name": "InvoiceCorrection",
+ "base": "VnModel",
+ "options": {
+ "mysql": {
+ "table": "invoiceCorrection"
+ }
+ },
+ "properties": {
+ "correctingFk": {
+ "id": true,
+ "type": "number",
+ "description": "Identifier"
+ },
+ "correctedFk": {
+ "type": "number"
+ },
+ "cplusRectificationTypeFk": {
+ "type": "number"
+ },
+ "cplusInvoiceType477Fk": {
+ "type": "number"
+ },
+ "invoiceCorrectionTypeFk": {
+ "type": "number"
+ }
+ }
+}
\ No newline at end of file
diff --git a/modules/invoiceOut/front/descriptor-menu/index.html b/modules/invoiceOut/front/descriptor-menu/index.html
index 106f8e3cc..d6eaa1cc7 100644
--- a/modules/invoiceOut/front/descriptor-menu/index.html
+++ b/modules/invoiceOut/front/descriptor-menu/index.html
@@ -1,3 +1,19 @@
+
+
+
+
+
+
+
+ Transfer invoice to...
+ Confirm
+
+
+
+
+
+
+ #{{id}} - {{::name}}
+
+
+
+
+ {{::description}}
+
+
+
+
+
+
+
+
+
+
+
+ Transfer client
+
+
\ No newline at end of file
diff --git a/modules/invoiceOut/front/descriptor-menu/index.js b/modules/invoiceOut/front/descriptor-menu/index.js
index 38c3c9434..0b43b73a7 100644
--- a/modules/invoiceOut/front/descriptor-menu/index.js
+++ b/modules/invoiceOut/front/descriptor-menu/index.js
@@ -125,6 +125,19 @@ class Controller extends Section {
this.$state.go('ticket.card.sale', {id: refundTicket.id});
});
}
+
+ transferInvoice() {
+ const params = {
+ data: {
+ ref: this.invoiceOut.ref,
+ newClientFk: this.invoiceOut.client.id,
+ cplusRectificationId: this.cplusRectificationType,
+ cplusCorrectingTypeId: this.cplusCorrectingType,
+ invoiceCorrectionTypeId: this.invoiceCorrectionType
+ }
+ };
+ this.$http.post(`InvoiceOuts/transferInvoice`, params).then(res => console.log(res.data));
+ }
}
Controller.$inject = ['$element', '$scope', 'vnReport', 'vnEmail'];
diff --git a/modules/invoiceOut/front/descriptor-menu/locale/en.yml b/modules/invoiceOut/front/descriptor-menu/locale/en.yml
index d299155d7..8fad5f25e 100644
--- a/modules/invoiceOut/front/descriptor-menu/locale/en.yml
+++ b/modules/invoiceOut/front/descriptor-menu/locale/en.yml
@@ -1 +1,3 @@
The following refund tickets have been created: "The following refund tickets have been created: {{ticketIds}}"
+Transfer invoice to...: Transfer invoice to...
+Cplus Type: Cplus Type
\ No newline at end of file
diff --git a/modules/invoiceOut/front/descriptor-menu/locale/es.yml b/modules/invoiceOut/front/descriptor-menu/locale/es.yml
index 393efd58c..0f74b5fec 100644
--- a/modules/invoiceOut/front/descriptor-menu/locale/es.yml
+++ b/modules/invoiceOut/front/descriptor-menu/locale/es.yml
@@ -21,3 +21,5 @@ The invoice PDF document has been regenerated: El documento PDF de la factura ha
The email can't be empty: El correo no puede estar vacío
The following refund tickets have been created: "Se han creado los siguientes tickets de abono: {{ticketIds}}"
Refund...: Abono...
+Transfer invoice to...: Transferir factura a...
+Cplus Type: Cplus Tipo
diff --git a/modules/ticket/back/methods/sale/clone.js b/modules/ticket/back/methods/sale/clone.js
new file mode 100644
index 000000000..1d69ca158
--- /dev/null
+++ b/modules/ticket/back/methods/sale/clone.js
@@ -0,0 +1,76 @@
+module.exports = async function clone(ctx, Self, sales, refundAgencyMode, refoundZoneId, servicesIds, withWarehouse, group, isRefund, myOptions) {
+ const models = Self.app.models;
+ const ticketsIds = [...new Set(sales.map(sale => sale.ticketFk))];
+ const [firstTicketId] = ticketsIds;
+
+ const now = Date.vnNew();
+ let refundTickets = [];
+ let refundTicket;
+
+ if (!group) {
+ for (const ticketId of ticketsIds) {
+ refundTicket = await createTicketRefund(
+ ticketId,
+ now,
+ refundAgencyMode,
+ refoundZoneId,
+ null,
+ myOptions
+ );
+ refundTickets.push(refundTicket);
+ }
+ } else {
+ refundTicket = await createTicketRefund(
+ firstTicketId,
+ now,
+ refundAgencyMode,
+ refoundZoneId,
+ withWarehouse,
+ myOptions
+ );
+ }
+
+ for (const sale of sales) {
+ const createdSale = await models.Sale.create({
+ ticketFk: (group) ? refundTicket.id : sale.ticketFk,
+ itemFk: sale.itemFk,
+ quantity: (isRefund) ? - sale.quantity : sale.quantity,
+ concept: sale.concept,
+ price: sale.price,
+ discount: sale.discount,
+ }, myOptions);
+
+ const components = sale.components();
+ for (const component of components)
+ component.saleFk = createdSale.id;
+
+ await models.SaleComponent.create(components, myOptions);
+ }
+
+ if (servicesIds && servicesIds.length > 0) {
+ const servicesFilter = {
+ where: {id: {inq: servicesIds}}
+ };
+ const services = await models.TicketService.find(servicesFilter, myOptions);
+ for (const service of services) {
+ await models.TicketService.create({
+ description: service.description,
+ quantity: (isRefund) ? - service.quantity : service.quantity,
+ price: service.price,
+ taxClassFk: service.taxClassFk,
+ ticketFk: (group) ? refundTicket.id : service.ticketFk,
+ ticketServiceTypeFk: service.ticketServiceTypeFk,
+ }, myOptions);
+ }
+ }
+
+ const query = `CALL vn.ticket_recalc(?, NULL)`;
+ if (refundTickets.length > 0) {
+ for (const refundTicket of refundTickets)
+ await Self.rawSql(query, [refundTicket.id], myOptions);
+ return refundTickets.map(refundTicket => refundTicket.id);
+ } else {
+ await Self.rawSql(query, [refundTicket.id], myOptions);
+ return refundTicket;
+ }
+};
diff --git a/modules/ticket/back/methods/sale/createTicketRefund.js b/modules/ticket/back/methods/sale/createTicketRefund.js
new file mode 100644
index 000000000..0ecc62e0c
--- /dev/null
+++ b/modules/ticket/back/methods/sale/createTicketRefund.js
@@ -0,0 +1,25 @@
+module.exports = async function createTicketRefund(models, ticketId, now, refundAgencyMode, refoundZoneId, withWarehouse, myOptions) {
+ // const models = Self.app.models;
+
+ const filter = {include: {relation: 'address'}};
+ const ticket = await models.Ticket.findById(ticketId, filter, myOptions);
+
+ const refundTicket = await models.Ticket.create({
+ clientFk: ticket.clientFk,
+ shipped: now,
+ addressFk: ticket.address().id,
+ agencyModeFk: refundAgencyMode.id,
+ nickname: ticket.address().nickname,
+ warehouseFk: withWarehouse ? ticket.warehouseFk : null,
+ companyFk: ticket.companyFk,
+ landed: now,
+ zoneFk: refoundZoneId
+ }, myOptions);
+
+ await models.TicketRefund.create({
+ refundTicketFk: refundTicket.id,
+ originalTicketFk: ticket.id,
+ }, myOptions);
+
+ return refundTicket;
+};
diff --git a/modules/ticket/back/methods/sale/refund.js b/modules/ticket/back/methods/sale/refund.js
index a8191610a..fc6d8bbc2 100644
--- a/modules/ticket/back/methods/sale/refund.js
+++ b/modules/ticket/back/methods/sale/refund.js
@@ -28,7 +28,7 @@ module.exports = Self => {
}
});
- Self.refund = async(ctx, salesIds, servicesIds, withWarehouse, options) => {
+ /* Self.refund = async(ctx, salesIds, servicesIds, withWarehouse, options) => {
const models = Self.app.models;
const myOptions = {userId: ctx.req.accessToken.userId};
let tx;
@@ -111,6 +111,64 @@ module.exports = Self => {
if (tx) await tx.commit();
+ return refundTicket;
+ } catch (e) {
+ if (tx) await tx.rollback();
+ throw e;
+ }
+ }; */
+
+ Self.refund = async(ctx, salesIds, servicesIds, withWarehouse, options) => {
+ const models = Self.app.models;
+ const myOptions = {userId: ctx.req.accessToken.userId};
+ let tx;
+
+ if (typeof options == 'object')
+ Object.assign(myOptions, options);
+
+ if (!myOptions.transaction) {
+ tx = await Self.beginTransaction({});
+ myOptions.transaction = tx;
+ }
+
+ try {
+ const refundAgencyMode = await models.AgencyMode.findOne({
+ include: {
+ relation: 'zones',
+ scope: {
+ limit: 1,
+ field: ['id', 'name']
+ }
+ },
+ where: {code: 'refund'}
+ }, myOptions);
+
+ const refoundZoneId = refundAgencyMode.zones()[0].id;
+
+ const salesFilter = {
+ where: {id: {inq: salesIds}},
+ include: {
+ relation: 'components',
+ scope: {
+ fields: ['saleFk', 'componentFk', 'value']
+ }
+ }
+ };
+ const sales = await models.Sale.find(salesFilter, myOptions);
+ const group = true;
+ const isRefund = true;
+
+ const refundTicket = await clone(
+ sales,
+ refundAgencyMode,
+ refoundZoneId, servicesIds,
+ withWarehouse,
+ group,
+ isRefund,
+ myOptions
+ );
+ if (tx) await tx.commit();
+
return refundTicket;
} catch (e) {
if (tx) await tx.rollback();
@@ -118,6 +176,83 @@ module.exports = Self => {
}
};
+ async function clone(sales, refundAgencyMode, refoundZoneId, servicesIds, withWarehouse, group, isRefund, myOptions) {
+ const models = Self.app.models;
+ const ticketsIds = [...new Set(sales.map(sale => sale.ticketFk))];
+ const [firstTicketId] = ticketsIds;
+
+ const now = Date.vnNew();
+ let refundTickets = [];
+ let refundTicket;
+
+ if (!group) {
+ for (const ticketId of ticketsIds) {
+ refundTicket = await createTicketRefund(
+ ticketId,
+ now,
+ refundAgencyMode,
+ refoundZoneId,
+ null,
+ myOptions
+ );
+ refundTickets.push(refundTicket);
+ }
+ } else {
+ refundTicket = await createTicketRefund(
+ firstTicketId,
+ now,
+ refundAgencyMode,
+ refoundZoneId,
+ withWarehouse,
+ myOptions
+ );
+ }
+
+ for (const sale of sales) {
+ const createdSale = await models.Sale.create({
+ ticketFk: (group) ? refundTicket.id : sale.ticketFk,
+ itemFk: sale.itemFk,
+ quantity: (isRefund) ? - sale.quantity : sale.quantity,
+ concept: sale.concept,
+ price: sale.price,
+ discount: sale.discount,
+ }, myOptions);
+
+ const components = sale.components();
+ for (const component of components)
+ component.saleFk = createdSale.id;
+
+ await models.SaleComponent.create(components, myOptions);
+ }
+
+ if (servicesIds && servicesIds.length > 0) {
+ const servicesFilter = {
+ where: {id: {inq: servicesIds}}
+ };
+ const services = await models.TicketService.find(servicesFilter, myOptions);
+ for (const service of services) {
+ await models.TicketService.create({
+ description: service.description,
+ quantity: (isRefund) ? - service.quantity : service.quantity,
+ price: service.price,
+ taxClassFk: service.taxClassFk,
+ ticketFk: (group) ? refundTicket.id : service.ticketFk,
+ ticketServiceTypeFk: service.ticketServiceTypeFk,
+ }, myOptions);
+ }
+ }
+
+ const query = `CALL vn.ticket_recalc(?, NULL)`;
+ if (refundTickets.length > 0) {
+ for (const refundTicket of refundTickets)
+ await Self.rawSql(query, [refundTicket.id], myOptions);
+ return refundTickets.map(refundTicket => refundTicket.id);
+ } else {
+ await Self.rawSql(query, [refundTicket.id], myOptions);
+ return refundTicket;
+ }
+ }
+
async function createTicketRefund(ticketId, now, refundAgencyMode, refoundZoneId, withWarehouse, myOptions) {
const models = Self.app.models;
From 22f76ec6a943282c8e870e54f17b2cebe79f1d5a Mon Sep 17 00:00:00 2001
From: jorgep
Date: Mon, 31 Jul 2023 10:33:51 +0200
Subject: [PATCH 0495/1087] refs #5914 WIP clone method created
---
.../233201/00-transferInvoiceOutACL.sql | 2 +-
.../methods/invoiceOut/transferInvoiceOut.js | 31 ++++-
modules/invoiceOut/back/model-config.json | 6 +-
...-type.json => cplus-invoice-type-477.json} | 4 +-
.../front/descriptor-menu/index.html | 10 +-
.../invoiceOut/front/descriptor-menu/index.js | 3 +-
modules/ticket/back/methods/sale/clone.js | 127 ++++++++----------
.../back/methods/sale/createTicketRefund.js | 25 ----
modules/ticket/back/methods/sale/refund.js | 71 +++++-----
modules/ticket/back/models/sale.js | 1 +
10 files changed, 129 insertions(+), 151 deletions(-)
rename modules/invoiceOut/back/models/{cplus-correcting-type.json => cplus-invoice-type-477.json} (78%)
delete mode 100644 modules/ticket/back/methods/sale/createTicketRefund.js
diff --git a/db/changes/233201/00-transferInvoiceOutACL.sql b/db/changes/233201/00-transferInvoiceOutACL.sql
index b549e52a8..6e8d88c5d 100644
--- a/db/changes/233201/00-transferInvoiceOutACL.sql
+++ b/db/changes/233201/00-transferInvoiceOutACL.sql
@@ -1,6 +1,6 @@
INSERT INTO `salix`.`ACL` (model, property, accessType, permission, principalType, principalId)
VALUES
('CplusRectificationType', '*', 'READ', 'ALLOW', 'ROLE', 'employee'),
- ('CplusCorrectingType', '*', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('CplusInvoiceType477', '*', 'READ', 'ALLOW', 'ROLE', 'employee'),
('InvoiceCorrectionType', '*', 'READ', 'ALLOW', 'ROLE', 'employee'),
('InvoiceOut', 'transferInvoiceOut', 'WRITE', 'ALLOW', 'ROLE', 'employee');
\ No newline at end of file
diff --git a/modules/invoiceOut/back/methods/invoiceOut/transferInvoiceOut.js b/modules/invoiceOut/back/methods/invoiceOut/transferInvoiceOut.js
index b50e4b1a7..d53581ac6 100644
--- a/modules/invoiceOut/back/methods/invoiceOut/transferInvoiceOut.js
+++ b/modules/invoiceOut/back/methods/invoiceOut/transferInvoiceOut.js
@@ -34,15 +34,17 @@ module.exports = Self => {
myOptions.transaction = tx;
}
try {
- const {ref, newClientFk, cplusRectificationId, cplusCorrectingTypeId, invoiceCorrectionTypeId} = params;
- if (!ref || !newClientFk || !cplusRectificationId || !cplusCorrectingTypeId || !invoiceCorrectionTypeId)
+ const {id, ref, newClientFk, cplusRectificationId, cplusInvoiceType477FkId, invoiceCorrectionTypeId} = params;
+ if (!id || !ref || !newClientFk || !cplusRectificationId || !cplusInvoiceType477FkId || !invoiceCorrectionTypeId)
throw new UserError(`There are missing fields.`);
+ // Refund tickets and group
const filter = {where: {refFk: ref}};
const tickets = await models.Ticket.find(filter, myOptions);
const ticketsIds = tickets.map(ticket => ticket.id);
- const refundTicket = await models.Ticket.refund(ctx, ticketsIds, null, myOptions);
- // Clonar tickets
+ await models.Ticket.refund(ctx, ticketsIds, null, myOptions);
+
+ // Clone tickets
const refundAgencyMode = await models.AgencyMode.findOne({
include: {
relation: 'zones',
@@ -66,11 +68,28 @@ module.exports = Self => {
}
};
const sales = await models.Sale.find(salesFilter, myOptions);
- // Actualizar cliente
+ const isRefund = false;
+ const clonedTicketIds = await models.Sale.clone(sales, refundAgencyMode, refoundZoneId, servicesIds, null, isRefund, myOptions);
- // Invoice Ticket - Factura rápida ??
+ // Update client
+ for (const clonedTicketId of clonedTicketIds) {
+ const ticket = await models.Ticket.findById(clonedTicketId, myOptions);
+ await ticket.updateAttributes({clientFk: newClientFk});
+ }
+ // Quick invoice
+ const invoiceIds = await models.Ticket.invoiceTickets(ctx, clonedTicketIds, myOptions);
// Insert InvoiceCorrection
+ for (const invoiceId of invoiceIds) {
+ await models.invoiceCorrection.create({
+ correctingFk: invoiceId,
+ correctedFk: id,
+ cplusRectificationTypeFk: cplusRectificationId,
+ cplusInvoiceType477Fk: cplusInvoiceType477FkId,
+ invoiceCorrectionType: invoiceCorrectionTypeId
+ });
+ }
+
if (tx) await tx.commit();
} catch (e) {
if (tx) await tx.rollback();
diff --git a/modules/invoiceOut/back/model-config.json b/modules/invoiceOut/back/model-config.json
index 995ea976b..23246893b 100644
--- a/modules/invoiceOut/back/model-config.json
+++ b/modules/invoiceOut/back/model-config.json
@@ -35,13 +35,13 @@
"CplusRectificationType": {
"dataSource": "vn"
},
- "CplusCorrectingType": {
- "dataSource": "vn"
- },
"InvoiceCorrectionType": {
"dataSource": "vn"
},
"InvoiceCorrection": {
"dataSource": "vn"
+ },
+ "CplusInvoiceType477": {
+ "dataSource": "vn"
}
}
diff --git a/modules/invoiceOut/back/models/cplus-correcting-type.json b/modules/invoiceOut/back/models/cplus-invoice-type-477.json
similarity index 78%
rename from modules/invoiceOut/back/models/cplus-correcting-type.json
rename to modules/invoiceOut/back/models/cplus-invoice-type-477.json
index 660f60008..840a9a7e4 100644
--- a/modules/invoiceOut/back/models/cplus-correcting-type.json
+++ b/modules/invoiceOut/back/models/cplus-invoice-type-477.json
@@ -1,9 +1,9 @@
{
- "name": "CplusCorrectingType",
+ "name": "CplusInvoiceType477",
"base": "VnModel",
"options": {
"mysql": {
- "table": "cplusCorrectingType"
+ "table": "cplusInvoiceType477"
}
},
"properties": {
diff --git a/modules/invoiceOut/front/descriptor-menu/index.html b/modules/invoiceOut/front/descriptor-menu/index.html
index d6eaa1cc7..1655290f4 100644
--- a/modules/invoiceOut/front/descriptor-menu/index.html
+++ b/modules/invoiceOut/front/descriptor-menu/index.html
@@ -6,8 +6,8 @@
+ url="CplusInvoiceType477s"
+ data="cplusInvoiceType477">
sale.ticketFk))];
- const [firstTicketId] = ticketsIds;
+module.exports = Self => {
+ Self.clone = async(sales, refundAgencyMode, refoundZoneId, servicesIds, withWarehouse, isRefund, myOptions) => {
+ const models = Self.app.models;
+ const ticketsIds = [...new Set(sales.map(sale => sale.ticketFk))];
- const now = Date.vnNew();
- let refundTickets = [];
- let refundTicket;
+ const now = Date.vnNew();
+ let updatedTickets = [];
- if (!group) {
for (const ticketId of ticketsIds) {
- refundTicket = await createTicketRefund(
- ticketId,
- now,
- refundAgencyMode,
- refoundZoneId,
- null,
- myOptions
- );
- refundTickets.push(refundTicket);
- }
- } else {
- refundTicket = await createTicketRefund(
- firstTicketId,
- now,
- refundAgencyMode,
- refoundZoneId,
- withWarehouse,
- myOptions
- );
- }
+ const filter = {include: {relation: 'address'}};
+ const ticket = await models.Ticket.findById(ticketId, filter, myOptions);
- for (const sale of sales) {
- const createdSale = await models.Sale.create({
- ticketFk: (group) ? refundTicket.id : sale.ticketFk,
- itemFk: sale.itemFk,
- quantity: (isRefund) ? - sale.quantity : sale.quantity,
- concept: sale.concept,
- price: sale.price,
- discount: sale.discount,
- }, myOptions);
-
- const components = sale.components();
- for (const component of components)
- component.saleFk = createdSale.id;
-
- await models.SaleComponent.create(components, myOptions);
- }
-
- if (servicesIds && servicesIds.length > 0) {
- const servicesFilter = {
- where: {id: {inq: servicesIds}}
- };
- const services = await models.TicketService.find(servicesFilter, myOptions);
- for (const service of services) {
- await models.TicketService.create({
- description: service.description,
- quantity: (isRefund) ? - service.quantity : service.quantity,
- price: service.price,
- taxClassFk: service.taxClassFk,
- ticketFk: (group) ? refundTicket.id : service.ticketFk,
- ticketServiceTypeFk: service.ticketServiceTypeFk,
+ const ticketUpdated = await models.Ticket.create({
+ clientFk: ticket.clientFk,
+ shipped: now,
+ addressFk: ticket.address().id,
+ agencyModeFk: refundAgencyMode.id,
+ nickname: ticket.address().nickname,
+ warehouseFk: withWarehouse ? ticket.warehouseFk : null,
+ companyFk: ticket.companyFk,
+ landed: now,
+ zoneFk: refoundZoneId
}, myOptions);
+ updatedTickets.push(ticketUpdated);
}
- }
- const query = `CALL vn.ticket_recalc(?, NULL)`;
- if (refundTickets.length > 0) {
- for (const refundTicket of refundTickets)
- await Self.rawSql(query, [refundTicket.id], myOptions);
- return refundTickets.map(refundTicket => refundTicket.id);
- } else {
- await Self.rawSql(query, [refundTicket.id], myOptions);
- return refundTicket;
- }
+ for (const sale of sales) {
+ const createdSale = await models.Sale.create({
+ ticketFk: sale.ticketFk,
+ itemFk: sale.itemFk,
+ quantity: (isRefund) ? - sale.quantity : sale.quantity,
+ concept: sale.concept,
+ price: sale.price,
+ discount: sale.discount,
+ }, myOptions);
+
+ const components = sale.components();
+ for (const component of components)
+ component.saleFk = createdSale.id;
+
+ await models.SaleComponent.create(components, myOptions);
+ }
+
+ if (servicesIds && servicesIds.length > 0) {
+ const servicesFilter = {
+ where: {id: {inq: servicesIds}}
+ };
+ const services = await models.TicketService.find(servicesFilter, myOptions);
+ for (const service of services) {
+ await models.TicketService.create({
+ description: service.description,
+ quantity: (isRefund) ? - service.quantity : service.quantity,
+ price: service.price,
+ taxClassFk: service.taxClassFk,
+ ticketFk: service.ticketFk,
+ ticketServiceTypeFk: service.ticketServiceTypeFk,
+ }, myOptions);
+ }
+ }
+
+ const query = `CALL vn.ticket_recalc(?, NULL)`;
+
+ for (const updatedTicket of updatedTickets)
+ await Self.rawSql(query, [updatedTicket.id], myOptions);
+ return updatedTickets.map(updatedTicket => updatedTicket.id);
+ };
};
diff --git a/modules/ticket/back/methods/sale/createTicketRefund.js b/modules/ticket/back/methods/sale/createTicketRefund.js
deleted file mode 100644
index 0ecc62e0c..000000000
--- a/modules/ticket/back/methods/sale/createTicketRefund.js
+++ /dev/null
@@ -1,25 +0,0 @@
-module.exports = async function createTicketRefund(models, ticketId, now, refundAgencyMode, refoundZoneId, withWarehouse, myOptions) {
- // const models = Self.app.models;
-
- const filter = {include: {relation: 'address'}};
- const ticket = await models.Ticket.findById(ticketId, filter, myOptions);
-
- const refundTicket = await models.Ticket.create({
- clientFk: ticket.clientFk,
- shipped: now,
- addressFk: ticket.address().id,
- agencyModeFk: refundAgencyMode.id,
- nickname: ticket.address().nickname,
- warehouseFk: withWarehouse ? ticket.warehouseFk : null,
- companyFk: ticket.companyFk,
- landed: now,
- zoneFk: refoundZoneId
- }, myOptions);
-
- await models.TicketRefund.create({
- refundTicketFk: refundTicket.id,
- originalTicketFk: ticket.id,
- }, myOptions);
-
- return refundTicket;
-};
diff --git a/modules/ticket/back/methods/sale/refund.js b/modules/ticket/back/methods/sale/refund.js
index fc6d8bbc2..6bb131e4d 100644
--- a/modules/ticket/back/methods/sale/refund.js
+++ b/modules/ticket/back/methods/sale/refund.js
@@ -158,10 +158,11 @@ module.exports = Self => {
const group = true;
const isRefund = true;
- const refundTicket = await clone(
+ const refundTicket = await cloneAndGroup(
sales,
refundAgencyMode,
- refoundZoneId, servicesIds,
+ refoundZoneId,
+ servicesIds,
withWarehouse,
group,
isRefund,
@@ -176,41 +177,37 @@ module.exports = Self => {
}
};
- async function clone(sales, refundAgencyMode, refoundZoneId, servicesIds, withWarehouse, group, isRefund, myOptions) {
- const models = Self.app.models;
+ async function cloneAndGroup(sales, refundAgencyMode, refoundZoneId, servicesIds, withWarehouse, group, isRefund, myOptions) {
+ if (!group) {
+ const tickets = await models.Sale.clone(sales,
+ refundAgencyMode,
+ refoundZoneId, servicesIds,
+ withWarehouse,
+ isRefund,
+ myOptions);
+ return tickets;
+ }
+
const ticketsIds = [...new Set(sales.map(sale => sale.ticketFk))];
const [firstTicketId] = ticketsIds;
+ const filter = {include: {relation: 'address'}};
+ const ticket = await models.Ticket.findById(firstTicketId, filter, myOptions);
- const now = Date.vnNew();
- let refundTickets = [];
- let refundTicket;
-
- if (!group) {
- for (const ticketId of ticketsIds) {
- refundTicket = await createTicketRefund(
- ticketId,
- now,
- refundAgencyMode,
- refoundZoneId,
- null,
- myOptions
- );
- refundTickets.push(refundTicket);
- }
- } else {
- refundTicket = await createTicketRefund(
- firstTicketId,
- now,
- refundAgencyMode,
- refoundZoneId,
- withWarehouse,
- myOptions
- );
- }
+ const ticketUpdated = await models.Ticket.create({
+ clientFk: ticket.clientFk,
+ shipped: now,
+ addressFk: ticket.address().id,
+ agencyModeFk: refundAgencyMode.id,
+ nickname: ticket.address().nickname,
+ warehouseFk: withWarehouse ? ticket.warehouseFk : null,
+ companyFk: ticket.companyFk,
+ landed: now,
+ zoneFk: refoundZoneId
+ }, myOptions);
for (const sale of sales) {
const createdSale = await models.Sale.create({
- ticketFk: (group) ? refundTicket.id : sale.ticketFk,
+ ticketFk: ticketUpdated.id,
itemFk: sale.itemFk,
quantity: (isRefund) ? - sale.quantity : sale.quantity,
concept: sale.concept,
@@ -236,21 +233,15 @@ module.exports = Self => {
quantity: (isRefund) ? - service.quantity : service.quantity,
price: service.price,
taxClassFk: service.taxClassFk,
- ticketFk: (group) ? refundTicket.id : service.ticketFk,
+ ticketFk: ticketUpdated.id,
ticketServiceTypeFk: service.ticketServiceTypeFk,
}, myOptions);
}
}
const query = `CALL vn.ticket_recalc(?, NULL)`;
- if (refundTickets.length > 0) {
- for (const refundTicket of refundTickets)
- await Self.rawSql(query, [refundTicket.id], myOptions);
- return refundTickets.map(refundTicket => refundTicket.id);
- } else {
- await Self.rawSql(query, [refundTicket.id], myOptions);
- return refundTicket;
- }
+ await Self.rawSql(query, [refundTicket.id], myOptions);
+ return ticketUpdated;
}
async function createTicketRefund(ticketId, now, refundAgencyMode, refoundZoneId, withWarehouse, myOptions) {
diff --git a/modules/ticket/back/models/sale.js b/modules/ticket/back/models/sale.js
index bab201fdd..e65c98fea 100644
--- a/modules/ticket/back/models/sale.js
+++ b/modules/ticket/back/models/sale.js
@@ -10,6 +10,7 @@ module.exports = Self => {
require('../methods/sale/refund')(Self);
require('../methods/sale/canEdit')(Self);
require('../methods/sale/usesMana')(Self);
+ require('../methods/sale/clone')(Self);
Self.validatesPresenceOf('concept', {
message: `Concept cannot be blank`
From 12acda0b1ca5e901bfb69503ade0e13c4b34ab56 Mon Sep 17 00:00:00 2001
From: carlossa
Date: Mon, 31 Jul 2023 11:06:19 +0200
Subject: [PATCH 0496/1087] refs #4764 ticketSerivce refund add
---
modules/ticket/back/methods/sale/refund.js | 2 +-
modules/ticket/front/services/index.html | 2 +-
modules/ticket/front/services/index.js | 8 ++++----
3 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/modules/ticket/back/methods/sale/refund.js b/modules/ticket/back/methods/sale/refund.js
index f74dea5e4..3c41aab1e 100644
--- a/modules/ticket/back/methods/sale/refund.js
+++ b/modules/ticket/back/methods/sale/refund.js
@@ -103,7 +103,7 @@ module.exports = Self => {
const [firstTicketId] = ticketsIds;
// eslint-disable-next-line max-len
- refundTicket = await createTicketRefund(firstTicketId, now, refundAgencyMode, refoundZoneId, myOptions);
+ refundTicket = await createTicketRefund(firstTicketId, now, refundAgencyMode, refoundZoneId, withWarehouse, myOptions);
}
if (servicesIds && servicesIds.length > 0) {
diff --git a/modules/ticket/front/services/index.html b/modules/ticket/front/services/index.html
index 53c02b304..244170d3e 100644
--- a/modules/ticket/front/services/index.html
+++ b/modules/ticket/front/services/index.html
@@ -32,7 +32,7 @@
vn-acl="invoicing, claimManager, salesAssistant"
vn-acl-action="remove">
- {{ watcher.dataChanged() }}
+ {{ $ctrl.checkeds }}
service.id);
+ if (!this.checkeds.length) return;
- const params = {servicesIds: servicesIds, withWarehouse: false};
+ const params = {servicesIds: this.checkeds, withWarehouse: false};
const query = 'Sales/refund';
this.$http.post(query, params).then(res => {
const refundTicket = res.data;
@@ -69,6 +67,8 @@ class Controller extends Section {
}
addChecked(id) {
+ if (this.checkeds.includes(id))
+ return this.checkeds = this.checkeds.filter(check => check != id);
this.checkeds.push(id);
}
}
From 40607a42cfc37606bf4496dc1d759d1e6d4757a3 Mon Sep 17 00:00:00 2001
From: carlossa
Date: Tue, 1 Aug 2023 10:25:44 +0200
Subject: [PATCH 0497/1087] hotfix-loadData
---
.../front/department/descriptor/index.js | 22 +++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/modules/worker/front/department/descriptor/index.js b/modules/worker/front/department/descriptor/index.js
index 5ab1059d9..388a7f776 100644
--- a/modules/worker/front/department/descriptor/index.js
+++ b/modules/worker/front/department/descriptor/index.js
@@ -32,6 +32,28 @@ class Controller extends Descriptor {
this.vnApp.showSuccess(this.$t('Department deleted.'));
});
}
+
+ loadData() {
+ const filter = {
+ fields: ['id', 'name', 'code', 'workerFk', 'isProduction', 'chatName',
+ 'isTeleworking', 'notificationEmail', 'hasToRefill', 'hasToSendMail', 'hasToMistake', 'clientFk'],
+ include: [
+ {relation: 'client',
+ scope: {
+ fields: ['id', 'name']
+ }},
+ {
+ relation: 'worker',
+ scope: {
+ fields: ['id', 'firstName', 'lastName']
+ }
+ }
+ ]
+ };
+
+ return this.getData(`Departments/${this.id}`, {filter})
+ .then(res => this.entity = res.data);
+ }
}
Controller.$inject = ['$element', '$scope', '$rootScope'];
From 30c5e8d8ccd638e57e85f35f55de8f16fe7c1103 Mon Sep 17 00:00:00 2001
From: alexm
Date: Tue, 1 Aug 2023 11:11:29 +0200
Subject: [PATCH 0498/1087] hotFix(canBeInvoiced): no de vuelve error si hay
mas de un ticket y uno esta a 0
---
modules/ticket/back/methods/ticket/canBeInvoiced.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/ticket/back/methods/ticket/canBeInvoiced.js b/modules/ticket/back/methods/ticket/canBeInvoiced.js
index 0f6cb476b..348f02348 100644
--- a/modules/ticket/back/methods/ticket/canBeInvoiced.js
+++ b/modules/ticket/back/methods/ticket/canBeInvoiced.js
@@ -67,7 +67,7 @@ module.exports = function(Self) {
throw new UserError(`This ticket is already invoiced`);
const priceZero = ticket.totalWithVat == 0;
- if (priceZero)
+ if (ticketsIds.length == 1 && priceZero)
throw new UserError(`A ticket with an amount of zero can't be invoiced`);
});
From 79d88facc30d3b5d68563c591f99bf3df997726d Mon Sep 17 00:00:00 2001
From: carlossa
Date: Tue, 1 Aug 2023 12:33:56 +0200
Subject: [PATCH 0499/1087] refs #4764 add test front
---
modules/ticket/front/services/index.html | 1 -
modules/ticket/front/services/index.spec.js | 33 +++++++++++++++------
2 files changed, 24 insertions(+), 10 deletions(-)
diff --git a/modules/ticket/front/services/index.html b/modules/ticket/front/services/index.html
index 244170d3e..bc288a8a2 100644
--- a/modules/ticket/front/services/index.html
+++ b/modules/ticket/front/services/index.html
@@ -32,7 +32,6 @@
vn-acl="invoicing, claimManager, salesAssistant"
vn-acl-action="remove">
- {{ $ctrl.checkeds }}
{
describe('getDefaultTaxClass', () => {
it('should set the default tax class in the controller', () => {
- $httpBackend.whenRoute('GET', `TaxClasses/findOne`)
- .respond({
- id: 4000,
- name: 'Whatever',
- code: 'GG'
- });
+ $httpBackend.whenRoute('GET', `TaxClasses/findOne`).respond({
+ id: 4000,
+ name: 'Whatever',
+ code: 'GG',
+ });
controller.getDefaultTaxClass();
$httpBackend.flush();
@@ -49,15 +48,15 @@ describe('Ticket component vnTicketService', () => {
it('should set the description of the selected service upon service type creation', () => {
const service = {
id: 1,
- quantity: 10
+ quantity: 10,
};
$scope.newServiceType = {
- name: 'Totally new stuff'
+ name: 'Totally new stuff',
};
$httpBackend.when('POST', 'TicketServiceTypes').respond({
id: 4001,
- name: 'Totally new stuff'
+ name: 'Totally new stuff',
});
controller.onNewServiceTypeAccept(service);
$httpBackend.flush();
@@ -65,4 +64,20 @@ describe('Ticket component vnTicketService', () => {
expect(service.ticketServiceTypeFk).toEqual(4001);
});
});
+
+ describe('addChecked', () => {
+ it('should add an item to the checkeds array', () => {
+ controller.checkeds = [];
+ controller.addChecked(1);
+
+ expect(controller.checkeds).toEqual([1]);
+ });
+
+ it('should remove an item if it is already in the checkeds array', () => {
+ controller.checkeds = [1, 2, 3];
+ controller.addChecked(2);
+
+ expect(controller.checkeds).toEqual([1, 3]);
+ });
+ });
});
From 3ef74cab5c00ee70ebc8ad78e15a5b0f40145f59 Mon Sep 17 00:00:00 2001
From: jorgep
Date: Tue, 1 Aug 2023 12:45:57 +0200
Subject: [PATCH 0500/1087] refs #5914 WIP created transferInvoiceOut
---
.../methods/invoiceOut/transferInvoiceOut.js | 66 +++++---
.../front/descriptor-menu/index.html | 3 +-
.../invoiceOut/front/descriptor-menu/index.js | 14 +-
modules/ticket/back/methods/sale/clone.js | 151 +++++++++++-------
modules/ticket/back/methods/sale/refund.js | 87 ++--------
.../back/methods/sale/specs/refund.spec.js | 2 +-
modules/ticket/back/methods/ticket/refund.js | 1 -
modules/ticket/back/models/ticket.json | 5 +
8 files changed, 161 insertions(+), 168 deletions(-)
diff --git a/modules/invoiceOut/back/methods/invoiceOut/transferInvoiceOut.js b/modules/invoiceOut/back/methods/invoiceOut/transferInvoiceOut.js
index d53581ac6..86de59e9d 100644
--- a/modules/invoiceOut/back/methods/invoiceOut/transferInvoiceOut.js
+++ b/modules/invoiceOut/back/methods/invoiceOut/transferInvoiceOut.js
@@ -6,10 +6,35 @@ module.exports = Self => {
accessType: 'WRITE',
accepts: [
{
- arg: 'data',
- type: 'Object',
+ arg: 'id',
+ type: 'number',
required: true
- }
+ },
+ {
+ arg: 'ref',
+ type: 'string',
+ required: true
+ },
+ {
+ arg: 'newClientFk',
+ type: 'number',
+ required: true
+ },
+ {
+ arg: 'cplusRectificationId',
+ type: 'number',
+ required: true
+ },
+ {
+ arg: 'cplusInvoiceType477Id',
+ type: 'number',
+ required: true
+ },
+ {
+ arg: 'invoiceCorrectionTypeId',
+ type: 'number',
+ required: true
+ },
],
returns: {
type: 'boolean',
@@ -21,7 +46,7 @@ module.exports = Self => {
}
});
- Self.transferInvoiceOut = async(ctx, params, options) => {
+ Self.transferInvoiceOut = async(ctx, id, ref, newClientFk, cplusRectificationId, cplusInvoiceType477Id, invoiceCorrectionTypeId, options) => {
const models = Self.app.models;
const myOptions = {};
let tx;
@@ -34,16 +59,12 @@ module.exports = Self => {
myOptions.transaction = tx;
}
try {
- const {id, ref, newClientFk, cplusRectificationId, cplusInvoiceType477FkId, invoiceCorrectionTypeId} = params;
- if (!id || !ref || !newClientFk || !cplusRectificationId || !cplusInvoiceType477FkId || !invoiceCorrectionTypeId)
- throw new UserError(`There are missing fields.`);
-
// Refund tickets and group
const filter = {where: {refFk: ref}};
const tickets = await models.Ticket.find(filter, myOptions);
const ticketsIds = tickets.map(ticket => ticket.id);
await models.Ticket.refund(ctx, ticketsIds, null, myOptions);
-
+ console.log('Ticket refunded');
// Clone tickets
const refundAgencyMode = await models.AgencyMode.findOne({
include: {
@@ -58,25 +79,20 @@ module.exports = Self => {
const refoundZoneId = refundAgencyMode.zones()[0].id;
const services = await models.TicketService.find(filter, myOptions);
const servicesIds = services.map(service => service.id);
- const salesFilter = {
- where: {id: {inq: salesIds}},
- include: {
- relation: 'components',
- scope: {
- fields: ['saleFk', 'componentFk', 'value']
- }
- }
- };
+ const salesFilter = {where: {ticketFk: {inq: ticketsIds}}};
const sales = await models.Sale.find(salesFilter, myOptions);
- const isRefund = false;
- const clonedTicketIds = await models.Sale.clone(sales, refundAgencyMode, refoundZoneId, servicesIds, null, isRefund, myOptions);
-
+ const clonedTickets = await models.Sale.clone(sales, refundAgencyMode, refoundZoneId, servicesIds, null, false, false, myOptions);
+ console.log('cloned tickets');
// Update client
- for (const clonedTicketId of clonedTicketIds) {
- const ticket = await models.Ticket.findById(clonedTicketId, myOptions);
- await ticket.updateAttributes({clientFk: newClientFk});
+ for (const clonedTicket of clonedTickets) {
+ // const ticket = await models.Ticket.findById(clonedTicketId, myOptions);
+ console.log(clonedTicket);
+ await clonedTicket.updateAttributes({clientFk: newClientFk}, myOptions);
+ console.log(clonedTicket);
}
// Quick invoice
+ const clonedTicketIds = clonedTickets.map(clonedTicket => clonedTicket.id);
+ console.log(clonedTicketIds);
const invoiceIds = await models.Ticket.invoiceTickets(ctx, clonedTicketIds, myOptions);
// Insert InvoiceCorrection
@@ -85,7 +101,7 @@ module.exports = Self => {
correctingFk: invoiceId,
correctedFk: id,
cplusRectificationTypeFk: cplusRectificationId,
- cplusInvoiceType477Fk: cplusInvoiceType477FkId,
+ cplusInvoiceType477Fk: cplusInvoiceType477Id,
invoiceCorrectionType: invoiceCorrectionTypeId
});
}
diff --git a/modules/invoiceOut/front/descriptor-menu/index.html b/modules/invoiceOut/front/descriptor-menu/index.html
index 1655290f4..dc5c2a8e9 100644
--- a/modules/invoiceOut/front/descriptor-menu/index.html
+++ b/modules/invoiceOut/front/descriptor-menu/index.html
@@ -222,12 +222,13 @@
console.log(res.data));
}
diff --git a/modules/ticket/back/methods/sale/clone.js b/modules/ticket/back/methods/sale/clone.js
index 96e66de2c..e1793d088 100644
--- a/modules/ticket/back/methods/sale/clone.js
+++ b/modules/ticket/back/methods/sale/clone.js
@@ -1,67 +1,104 @@
module.exports = Self => {
- Self.clone = async(sales, refundAgencyMode, refoundZoneId, servicesIds, withWarehouse, isRefund, myOptions) => {
+ Self.clone = async(sales, refundAgencyMode, refoundZoneId, servicesIds, withWarehouse, group, negative, myOptions) => {
const models = Self.app.models;
- const ticketsIds = [...new Set(sales.map(sale => sale.ticketFk))];
+ let tx;
+ if (!myOptions.transaction) {
+ tx = await Self.beginTransaction({});
+ myOptions.transaction = tx;
+ }
+
+ const ticketsIds = [...new Set(sales.map(sale => sale.ticketFk))];
+ const [firstTicketId] = ticketsIds;
const now = Date.vnNew();
let updatedTickets = [];
+ let newTicket;
+ const filter = {
+ include: [
+ {relation: 'address'},
+ {
+ relation: 'sale',
+ inq: sales,
+ },
+ ]
+ };
+ try {
+ for (const [index, ticketId] of ticketsIds.entries()) {
+ const ticket = await models.Ticket.findById(ticketId, filter, myOptions);
+ if (!group || !index) {
+ newTicket = await models.Ticket.create({
+ clientFk: ticket.clientFk,
+ shipped: now,
+ addressFk: ticket.address().id,
+ agencyModeFk: refundAgencyMode.id,
+ nickname: ticket.address().nickname,
+ warehouseFk: withWarehouse ? ticket.warehouseFk : null,
+ companyFk: ticket.companyFk,
+ landed: now,
+ zoneFk: refoundZoneId
+ }, myOptions);
+ updatedTickets.push(newTicket);
+ }
+ const sales = ticket.sale();
+ const saleIds = sales.map(sale => sale.id);
+ const saleComponentsFilter = {
+ where: {saleFk: {inq: saleIds}},
+ scope: {
+ fields: ['saleFk', 'componentFk', 'value']
+ }
+ };
+ for (const sale of sales) {
+ const createdSale = await models.Sale.create({
+ ticketFk: newTicket.id,
+ itemFk: sale.itemFk,
+ quantity: (negative) ? - sale.quantity : sale.quantity,
+ concept: sale.concept,
+ price: sale.price,
+ discount: sale.discount,
+ }, myOptions);
+ const components = await models.SaleComponent.find(saleComponentsFilter, myOptions);
+ // const components = sale.components();
+ for (const component of components)
+ component.saleFk = createdSale.id;
- for (const ticketId of ticketsIds) {
- const filter = {include: {relation: 'address'}};
- const ticket = await models.Ticket.findById(ticketId, filter, myOptions);
-
- const ticketUpdated = await models.Ticket.create({
- clientFk: ticket.clientFk,
- shipped: now,
- addressFk: ticket.address().id,
- agencyModeFk: refundAgencyMode.id,
- nickname: ticket.address().nickname,
- warehouseFk: withWarehouse ? ticket.warehouseFk : null,
- companyFk: ticket.companyFk,
- landed: now,
- zoneFk: refoundZoneId
- }, myOptions);
- updatedTickets.push(ticketUpdated);
- }
-
- for (const sale of sales) {
- const createdSale = await models.Sale.create({
- ticketFk: sale.ticketFk,
- itemFk: sale.itemFk,
- quantity: (isRefund) ? - sale.quantity : sale.quantity,
- concept: sale.concept,
- price: sale.price,
- discount: sale.discount,
- }, myOptions);
-
- const components = sale.components();
- for (const component of components)
- component.saleFk = createdSale.id;
-
- await models.SaleComponent.create(components, myOptions);
- }
-
- if (servicesIds && servicesIds.length > 0) {
- const servicesFilter = {
- where: {id: {inq: servicesIds}}
- };
- const services = await models.TicketService.find(servicesFilter, myOptions);
- for (const service of services) {
- await models.TicketService.create({
- description: service.description,
- quantity: (isRefund) ? - service.quantity : service.quantity,
- price: service.price,
- taxClassFk: service.taxClassFk,
- ticketFk: service.ticketFk,
- ticketServiceTypeFk: service.ticketServiceTypeFk,
- }, myOptions);
+ await models.SaleComponent.create(components, myOptions);
+ }
}
+ if (servicesIds && servicesIds.length > 0) {
+ const servicesFilter = {
+ where: {id: {inq: servicesIds}}
+ };
+ const services = await models.TicketService.find(servicesFilter, myOptions);
+ for (const service of services) {
+ await models.TicketService.create({
+ description: service.description,
+ quantity: (negative) ? - service.quantity : service.quantity,
+ price: service.price,
+ taxClassFk: service.taxClassFk,
+ ticketFk: service.ticketFk,
+ ticketServiceTypeFk: service.ticketServiceTypeFk,
+ }, myOptions);
+ }
+ }
+
+ const query = `CALL vn.ticket_recalc(?, NULL)`;
+
+ if (group) {
+ await Self.rawSql(query, [newTicket.id], myOptions);
+ if (tx) await tx.commit();
+ return {
+ refundTicket: newTicket,
+ originalTicketFk: firstTicketId
+ };
+ } else {
+ for (const updatedTicket of updatedTickets)
+ await Self.rawSql(query, [updatedTicket.id], myOptions);
+ if (tx) await tx.commit();
+ return updatedTickets/* updatedTickets.map(updatedTicket => updatedTicket.id) */;
+ }
+ } catch (e) {
+ if (tx) await tx.rollback();
+ throw e;
}
-
- const query = `CALL vn.ticket_recalc(?, NULL)`;
-
- for (const updatedTicket of updatedTickets)
- await Self.rawSql(query, [updatedTicket.id], myOptions);
- return updatedTickets.map(updatedTicket => updatedTicket.id);
};
};
diff --git a/modules/ticket/back/methods/sale/refund.js b/modules/ticket/back/methods/sale/refund.js
index 6bb131e4d..c85bcd834 100644
--- a/modules/ticket/back/methods/sale/refund.js
+++ b/modules/ticket/back/methods/sale/refund.js
@@ -155,19 +155,23 @@ module.exports = Self => {
}
};
const sales = await models.Sale.find(salesFilter, myOptions);
- const group = true;
- const isRefund = true;
-
- const refundTicket = await cloneAndGroup(
+ const clonedTicket = await models.Sale.clone(
sales,
refundAgencyMode,
refoundZoneId,
servicesIds,
withWarehouse,
- group,
- isRefund,
+ true,
+ true,
myOptions
);
+
+ const refundTicket = clonedTicket.refundTicket;
+
+ await models.TicketRefund.create({
+ refundTicketFk: refundTicket.id,
+ originalTicketFk: clonedTicket.originalTicketFk,
+ }, myOptions);
if (tx) await tx.commit();
return refundTicket;
@@ -177,74 +181,7 @@ module.exports = Self => {
}
};
- async function cloneAndGroup(sales, refundAgencyMode, refoundZoneId, servicesIds, withWarehouse, group, isRefund, myOptions) {
- if (!group) {
- const tickets = await models.Sale.clone(sales,
- refundAgencyMode,
- refoundZoneId, servicesIds,
- withWarehouse,
- isRefund,
- myOptions);
- return tickets;
- }
-
- const ticketsIds = [...new Set(sales.map(sale => sale.ticketFk))];
- const [firstTicketId] = ticketsIds;
- const filter = {include: {relation: 'address'}};
- const ticket = await models.Ticket.findById(firstTicketId, filter, myOptions);
-
- const ticketUpdated = await models.Ticket.create({
- clientFk: ticket.clientFk,
- shipped: now,
- addressFk: ticket.address().id,
- agencyModeFk: refundAgencyMode.id,
- nickname: ticket.address().nickname,
- warehouseFk: withWarehouse ? ticket.warehouseFk : null,
- companyFk: ticket.companyFk,
- landed: now,
- zoneFk: refoundZoneId
- }, myOptions);
-
- for (const sale of sales) {
- const createdSale = await models.Sale.create({
- ticketFk: ticketUpdated.id,
- itemFk: sale.itemFk,
- quantity: (isRefund) ? - sale.quantity : sale.quantity,
- concept: sale.concept,
- price: sale.price,
- discount: sale.discount,
- }, myOptions);
-
- const components = sale.components();
- for (const component of components)
- component.saleFk = createdSale.id;
-
- await models.SaleComponent.create(components, myOptions);
- }
-
- if (servicesIds && servicesIds.length > 0) {
- const servicesFilter = {
- where: {id: {inq: servicesIds}}
- };
- const services = await models.TicketService.find(servicesFilter, myOptions);
- for (const service of services) {
- await models.TicketService.create({
- description: service.description,
- quantity: (isRefund) ? - service.quantity : service.quantity,
- price: service.price,
- taxClassFk: service.taxClassFk,
- ticketFk: ticketUpdated.id,
- ticketServiceTypeFk: service.ticketServiceTypeFk,
- }, myOptions);
- }
- }
-
- const query = `CALL vn.ticket_recalc(?, NULL)`;
- await Self.rawSql(query, [refundTicket.id], myOptions);
- return ticketUpdated;
- }
-
- async function createTicketRefund(ticketId, now, refundAgencyMode, refoundZoneId, withWarehouse, myOptions) {
+ /* async function createTicketRefund(ticketId, now, refundAgencyMode, refoundZoneId, withWarehouse, myOptions) {
const models = Self.app.models;
const filter = {include: {relation: 'address'}};
@@ -268,5 +205,5 @@ module.exports = Self => {
}, myOptions);
return refundTicket;
- }
+ } */
};
diff --git a/modules/ticket/back/methods/sale/specs/refund.spec.js b/modules/ticket/back/methods/sale/specs/refund.spec.js
index b81f7f84d..727ce2fac 100644
--- a/modules/ticket/back/methods/sale/specs/refund.spec.js
+++ b/modules/ticket/back/methods/sale/specs/refund.spec.js
@@ -1,7 +1,7 @@
const models = require('vn-loopback/server/server').models;
const LoopBackContext = require('loopback-context');
-describe('Sale refund()', () => {
+fdescribe('Sale refund()', () => {
const userId = 5;
const ctx = {req: {accessToken: userId}};
const activeCtx = {
diff --git a/modules/ticket/back/methods/ticket/refund.js b/modules/ticket/back/methods/ticket/refund.js
index c99b6aa83..758384ae2 100644
--- a/modules/ticket/back/methods/ticket/refund.js
+++ b/modules/ticket/back/methods/ticket/refund.js
@@ -39,7 +39,6 @@ module.exports = Self => {
try {
const filter = {where: {ticketFk: {inq: ticketsIds}}};
-
const sales = await models.Sale.find(filter, myOptions);
const salesIds = sales.map(sale => sale.id);
diff --git a/modules/ticket/back/models/ticket.json b/modules/ticket/back/models/ticket.json
index ec4193bed..1c5610a2a 100644
--- a/modules/ticket/back/models/ticket.json
+++ b/modules/ticket/back/models/ticket.json
@@ -136,6 +136,11 @@
"type": "belongsTo",
"model": "Zone",
"foreignKey": "zoneFk"
+ },
+ "sale": {
+ "type": "hasMany",
+ "model": "Sale",
+ "foreignKey": "ticketFk"
}
}
}
From bd122e6327024b2ad885cfcd340d9bcb2f5e42e5 Mon Sep 17 00:00:00 2001
From: jorgep
Date: Tue, 1 Aug 2023 16:13:24 +0200
Subject: [PATCH 0501/1087] refs #5014 WIP trasactions added
---
.../methods/invoiceOut/transferInvoiceOut.js | 17 +++++------------
...orrection.json => invoice-correction.json} | 0
modules/ticket/back/methods/sale/clone.js | 19 ++++++++++---------
modules/ticket/back/methods/sale/refund.js | 14 ++++++++------
4 files changed, 23 insertions(+), 27 deletions(-)
rename modules/invoiceOut/back/models/{invoiceCorrection.json => invoice-correction.json} (100%)
diff --git a/modules/invoiceOut/back/methods/invoiceOut/transferInvoiceOut.js b/modules/invoiceOut/back/methods/invoiceOut/transferInvoiceOut.js
index 86de59e9d..e059aa431 100644
--- a/modules/invoiceOut/back/methods/invoiceOut/transferInvoiceOut.js
+++ b/modules/invoiceOut/back/methods/invoiceOut/transferInvoiceOut.js
@@ -48,7 +48,7 @@ module.exports = Self => {
Self.transferInvoiceOut = async(ctx, id, ref, newClientFk, cplusRectificationId, cplusInvoiceType477Id, invoiceCorrectionTypeId, options) => {
const models = Self.app.models;
- const myOptions = {};
+ const myOptions = {userId: ctx.req.accessToken.userId};
let tx;
if (typeof options == 'object')
@@ -64,7 +64,6 @@ module.exports = Self => {
const tickets = await models.Ticket.find(filter, myOptions);
const ticketsIds = tickets.map(ticket => ticket.id);
await models.Ticket.refund(ctx, ticketsIds, null, myOptions);
- console.log('Ticket refunded');
// Clone tickets
const refundAgencyMode = await models.AgencyMode.findOne({
include: {
@@ -82,22 +81,17 @@ module.exports = Self => {
const salesFilter = {where: {ticketFk: {inq: ticketsIds}}};
const sales = await models.Sale.find(salesFilter, myOptions);
const clonedTickets = await models.Sale.clone(sales, refundAgencyMode, refoundZoneId, servicesIds, null, false, false, myOptions);
- console.log('cloned tickets');
// Update client
- for (const clonedTicket of clonedTickets) {
- // const ticket = await models.Ticket.findById(clonedTicketId, myOptions);
- console.log(clonedTicket);
+ for (const clonedTicket of clonedTickets)
await clonedTicket.updateAttributes({clientFk: newClientFk}, myOptions);
- console.log(clonedTicket);
- }
+
// Quick invoice
const clonedTicketIds = clonedTickets.map(clonedTicket => clonedTicket.id);
- console.log(clonedTicketIds);
const invoiceIds = await models.Ticket.invoiceTickets(ctx, clonedTicketIds, myOptions);
// Insert InvoiceCorrection
for (const invoiceId of invoiceIds) {
- await models.invoiceCorrection.create({
+ await models.InvoiceCorrection.create({
correctingFk: invoiceId,
correctedFk: id,
cplusRectificationTypeFk: cplusRectificationId,
@@ -105,12 +99,11 @@ module.exports = Self => {
invoiceCorrectionType: invoiceCorrectionTypeId
});
}
-
if (tx) await tx.commit();
+ return true;
} catch (e) {
if (tx) await tx.rollback();
throw e;
}
- return true;
};
};
diff --git a/modules/invoiceOut/back/models/invoiceCorrection.json b/modules/invoiceOut/back/models/invoice-correction.json
similarity index 100%
rename from modules/invoiceOut/back/models/invoiceCorrection.json
rename to modules/invoiceOut/back/models/invoice-correction.json
diff --git a/modules/ticket/back/methods/sale/clone.js b/modules/ticket/back/methods/sale/clone.js
index e1793d088..dae15d7df 100644
--- a/modules/ticket/back/methods/sale/clone.js
+++ b/modules/ticket/back/methods/sale/clone.js
@@ -1,8 +1,12 @@
module.exports = Self => {
- Self.clone = async(sales, refundAgencyMode, refoundZoneId, servicesIds, withWarehouse, group, negative, myOptions) => {
+ Self.clone = async(sales, refundAgencyMode, refoundZoneId, servicesIds, withWarehouse, group, negative, options) => {
const models = Self.app.models;
+ const myOptions = {};
let tx;
+ if (typeof options == 'object')
+ Object.assign(myOptions, options);
+
if (!myOptions.transaction) {
tx = await Self.beginTransaction({});
myOptions.transaction = tx;
@@ -39,15 +43,15 @@ module.exports = Self => {
}, myOptions);
updatedTickets.push(newTicket);
}
- const sales = ticket.sale();
- const saleIds = sales.map(sale => sale.id);
+ const salesByTicket = ticket.sale();
+ const saleIds = salesByTicket.map(sale => sale.id);
const saleComponentsFilter = {
where: {saleFk: {inq: saleIds}},
scope: {
fields: ['saleFk', 'componentFk', 'value']
}
};
- for (const sale of sales) {
+ for (const sale of salesByTicket) {
const createdSale = await models.Sale.create({
ticketFk: newTicket.id,
itemFk: sale.itemFk,
@@ -56,7 +60,7 @@ module.exports = Self => {
price: sale.price,
discount: sale.discount,
}, myOptions);
- const components = await models.SaleComponent.find(saleComponentsFilter, myOptions);
+ const components = await models.SaleComponent.find(saleComponentsFilter, myOptions); // Revisar con Alex
// const components = sale.components();
for (const component of components)
component.saleFk = createdSale.id;
@@ -86,10 +90,7 @@ module.exports = Self => {
if (group) {
await Self.rawSql(query, [newTicket.id], myOptions);
if (tx) await tx.commit();
- return {
- refundTicket: newTicket,
- originalTicketFk: firstTicketId
- };
+ return newTicket;
} else {
for (const updatedTicket of updatedTickets)
await Self.rawSql(query, [updatedTicket.id], myOptions);
diff --git a/modules/ticket/back/methods/sale/refund.js b/modules/ticket/back/methods/sale/refund.js
index c85bcd834..a69c05f36 100644
--- a/modules/ticket/back/methods/sale/refund.js
+++ b/modules/ticket/back/methods/sale/refund.js
@@ -155,7 +155,7 @@ module.exports = Self => {
}
};
const sales = await models.Sale.find(salesFilter, myOptions);
- const clonedTicket = await models.Sale.clone(
+ const refundTicket = await models.Sale.clone(
sales,
refundAgencyMode,
refoundZoneId,
@@ -166,12 +166,14 @@ module.exports = Self => {
myOptions
);
- const refundTicket = clonedTicket.refundTicket;
+ const ticketsIds = [...new Set(sales.map(sale => sale.ticketFk))];
+ for (const ticketId of ticketsIds) {
+ await models.TicketRefund.create({
+ refundTicketFk: refundTicket.id,
+ originalTicketFk: ticketId,
+ }, myOptions);
+ }
- await models.TicketRefund.create({
- refundTicketFk: refundTicket.id,
- originalTicketFk: clonedTicket.originalTicketFk,
- }, myOptions);
if (tx) await tx.commit();
return refundTicket;
From 16353dfddc1fab62c3b3e16a7b1aa040af632486 Mon Sep 17 00:00:00 2001
From: guillermo
Date: Wed, 2 Aug 2023 07:35:40 +0200
Subject: [PATCH 0502/1087] refs #5995 First commit
---
modules/route/back/methods/route/cmr.js | 36 ++
modules/route/back/models/route.js | 1 +
modules/ticket/back/methods/ticket/closure.js | 319 ++++++++++--------
.../reports/cmr/assets/css/import.js | 12 +
.../reports/cmr/assets/css/style.css | 101 ++++++
.../reports/cmr/assets/images/signature.png | Bin 0 -> 27129 bytes
print/templates/reports/cmr/cmr.html | 212 ++++++++++++
print/templates/reports/cmr/cmr.js | 38 +++
print/templates/reports/cmr/locale/es.yml | 1 +
print/templates/reports/cmr/options.json | 3 +
print/templates/reports/cmr/sql/data.sql | 49 +++
.../templates/reports/cmr/sql/merchandise.sql | 11 +
.../templates/reports/cmr/sql/signatures.sql | 7 +
13 files changed, 646 insertions(+), 144 deletions(-)
create mode 100644 modules/route/back/methods/route/cmr.js
create mode 100644 print/templates/reports/cmr/assets/css/import.js
create mode 100644 print/templates/reports/cmr/assets/css/style.css
create mode 100644 print/templates/reports/cmr/assets/images/signature.png
create mode 100644 print/templates/reports/cmr/cmr.html
create mode 100644 print/templates/reports/cmr/cmr.js
create mode 100644 print/templates/reports/cmr/locale/es.yml
create mode 100644 print/templates/reports/cmr/options.json
create mode 100644 print/templates/reports/cmr/sql/data.sql
create mode 100644 print/templates/reports/cmr/sql/merchandise.sql
create mode 100644 print/templates/reports/cmr/sql/signatures.sql
diff --git a/modules/route/back/methods/route/cmr.js b/modules/route/back/methods/route/cmr.js
new file mode 100644
index 000000000..cd7ef57ce
--- /dev/null
+++ b/modules/route/back/methods/route/cmr.js
@@ -0,0 +1,36 @@
+module.exports = Self => {
+ Self.remoteMethodCtx('cmr', {
+ description: 'Returns the cmr',
+ accessType: 'READ',
+ accepts: [
+ {
+ arg: 'id',
+ type: 'number',
+ required: true,
+ description: 'The cmr id',
+ http: {source: 'path'}
+ }
+ ],
+ returns: [
+ {
+ arg: 'body',
+ type: 'file',
+ root: true
+ }, {
+ arg: 'Content-Type',
+ type: 'String',
+ http: {target: 'header'}
+ }, {
+ arg: 'Content-Disposition',
+ type: 'String',
+ http: {target: 'header'}
+ }
+ ],
+ http: {
+ path: '/:id/cmr',
+ verb: 'GET'
+ }
+ });
+
+ Self.cmr = (ctx, id) => Self.printReport(ctx, id, 'cmr');
+};
diff --git a/modules/route/back/models/route.js b/modules/route/back/models/route.js
index 883f4597e..96e7ed04f 100644
--- a/modules/route/back/models/route.js
+++ b/modules/route/back/models/route.js
@@ -14,6 +14,7 @@ module.exports = Self => {
require('../methods/route/driverRouteEmail')(Self);
require('../methods/route/sendSms')(Self);
require('../methods/route/downloadZip')(Self);
+ require('../methods/route/cmr')(Self);
Self.validate('kmStart', validateDistance, {
message: 'Distance must be lesser than 1000'
diff --git a/modules/ticket/back/methods/ticket/closure.js b/modules/ticket/back/methods/ticket/closure.js
index eee5e28e2..493a2c3a0 100644
--- a/modules/ticket/back/methods/ticket/closure.js
+++ b/modules/ticket/back/methods/ticket/closure.js
@@ -5,177 +5,208 @@ const config = require('vn-print/core/config');
const storage = require('vn-print/core/storage');
module.exports = async function(ctx, Self, tickets, reqArgs = {}) {
- const userId = ctx.req.accessToken.userId;
- if (tickets.length == 0) return;
+ const userId = ctx.req.accessToken.userId;
+ if (tickets.length == 0) return;
- const failedtickets = [];
- for (const ticket of tickets) {
- try {
- await Self.rawSql(`CALL vn.ticket_closeByTicket(?)`, [ticket.id], {userId});
+ const failedtickets = [];
+ for (const ticket of tickets) {
+ try {
+ await Self.rawSql(`CALL vn.ticket_closeByTicket(?)`, [ticket.id], {userId});
- const [invoiceOut] = await Self.rawSql(`
- SELECT io.id, io.ref, io.serial, cny.code companyCode, io.issued
- FROM ticket t
- JOIN invoiceOut io ON io.ref = t.refFk
- JOIN company cny ON cny.id = io.companyFk
- WHERE t.id = ?
- `, [ticket.id]);
+ const [invoiceOut] = await Self.rawSql(`
+ SELECT io.id, io.ref, io.serial, cny.code companyCode, io.issued
+ FROM ticket t
+ JOIN invoiceOut io ON io.ref = t.refFk
+ JOIN company cny ON cny.id = io.companyFk
+ WHERE t.id = ?
+ `, [ticket.id]);
- const mailOptions = {
- overrideAttachments: true,
- attachments: []
- };
+ const mailOptions = {
+ overrideAttachments: true,
+ attachments: []
+ };
- const isToBeMailed = ticket.recipient && ticket.salesPersonFk && ticket.isToBeMailed;
+ const isToBeMailed = ticket.recipient && ticket.salesPersonFk && ticket.isToBeMailed;
- if (invoiceOut) {
- const args = {
- reference: invoiceOut.ref,
- recipientId: ticket.clientFk,
- recipient: ticket.recipient,
- replyTo: ticket.salesPersonEmail
- };
+ if (invoiceOut) {
+ const args = {
+ reference: invoiceOut.ref,
+ recipientId: ticket.clientFk,
+ recipient: ticket.recipient,
+ replyTo: ticket.salesPersonEmail
+ };
- const invoiceReport = new Report('invoice', args);
- const stream = await invoiceReport.toPdfStream();
+ const invoiceReport = new Report('invoice', args);
+ const stream = await invoiceReport.toPdfStream();
- const issued = invoiceOut.issued;
- const year = issued.getFullYear().toString();
- const month = (issued.getMonth() + 1).toString();
- const day = issued.getDate().toString();
+ const issued = invoiceOut.issued;
+ const year = issued.getFullYear().toString();
+ const month = (issued.getMonth() + 1).toString();
+ const day = issued.getDate().toString();
- const fileName = `${year}${invoiceOut.ref}.pdf`;
+ const fileName = `${year}${invoiceOut.ref}.pdf`;
- // Store invoice
- await storage.write(stream, {
- type: 'invoice',
- path: `${year}/${month}/${day}`,
- fileName: fileName
- });
+ // Store invoice
+ await storage.write(stream, {
+ type: 'invoice',
+ path: `${year}/${month}/${day}`,
+ fileName: fileName
+ });
- await Self.rawSql('UPDATE invoiceOut SET hasPdf = true WHERE id = ?', [invoiceOut.id], {userId});
+ await Self.rawSql('UPDATE invoiceOut SET hasPdf = true WHERE id = ?', [invoiceOut.id], {userId});
- if (isToBeMailed) {
- const invoiceAttachment = {
- filename: fileName,
- content: stream
- };
+ if (isToBeMailed) {
+ const invoiceAttachment = {
+ filename: fileName,
+ content: stream
+ };
- if (invoiceOut.serial == 'E' && invoiceOut.companyCode == 'VNL') {
- const exportation = new Report('exportation', args);
- const stream = await exportation.toPdfStream();
- const fileName = `CITES-${invoiceOut.ref}.pdf`;
+ if (invoiceOut.serial == 'E' && invoiceOut.companyCode == 'VNL') {
+ const exportation = new Report('exportation', args);
+ const stream = await exportation.toPdfStream();
+ const fileName = `CITES-${invoiceOut.ref}.pdf`;
- mailOptions.attachments.push({
- filename: fileName,
- content: stream
- });
- }
+ mailOptions.attachments.push({
+ filename: fileName,
+ content: stream
+ });
+ }
- mailOptions.attachments.push(invoiceAttachment);
+ mailOptions.attachments.push(invoiceAttachment);
- const email = new Email('invoice', args);
- await email.send(mailOptions);
- }
- } else if (isToBeMailed) {
- const args = {
- id: ticket.id,
- recipientId: ticket.clientFk,
- recipient: ticket.recipient,
- replyTo: ticket.salesPersonEmail
- };
+ const email = new Email('invoice', args);
+ await email.send(mailOptions);
+ }
+ } else if (isToBeMailed) {
+ const args = {
+ id: ticket.id,
+ recipientId: ticket.clientFk,
+ recipient: ticket.recipient,
+ replyTo: ticket.salesPersonEmail
+ };
- const email = new Email('delivery-note-link', args);
- await email.send();
- }
+ const email = new Email('delivery-note-link', args);
+ await email.send();
+ }
- // Incoterms authorization
- const [{firstOrder}] = await Self.rawSql(`
- SELECT COUNT(*) as firstOrder
- FROM ticket t
- JOIN client c ON c.id = t.clientFk
- WHERE t.clientFk = ?
- AND NOT t.isDeleted
- AND c.isVies
- `, [ticket.clientFk]);
+ // Incoterms authorization
+ const [{firstOrder}] = await Self.rawSql(`
+ SELECT COUNT(*) as firstOrder
+ FROM ticket t
+ JOIN client c ON c.id = t.clientFk
+ WHERE t.clientFk = ?
+ AND NOT t.isDeleted
+ AND c.isVies
+ `, [ticket.clientFk]);
- if (firstOrder == 1) {
- const args = {
- id: ticket.clientFk,
- companyId: ticket.companyFk,
- recipientId: ticket.clientFk,
- recipient: ticket.recipient,
- replyTo: ticket.salesPersonEmail
- };
+ if (firstOrder == 1) {
+ const args = {
+ id: ticket.clientFk,
+ companyId: ticket.companyFk,
+ recipientId: ticket.clientFk,
+ recipient: ticket.recipient,
+ replyTo: ticket.salesPersonEmail
+ };
- const email = new Email('incoterms-authorization', args);
- await email.send();
+ const email = new Email('incoterms-authorization', args);
+ await email.send();
- const [sample] = await Self.rawSql(
- `SELECT id
- FROM sample
- WHERE code = 'incoterms-authorization'
- `);
+ const [sample] = await Self.rawSql(
+ `SELECT id
+ FROM sample
+ WHERE code = 'incoterms-authorization'
+ `);
- await Self.rawSql(`
- INSERT INTO clientSample (clientFk, typeFk, companyFk) VALUES(?, ?, ?)
- `, [ticket.clientFk, sample.id, ticket.companyFk], {userId});
- }
- } catch (error) {
- // Domain not found
- if (error.responseCode == 450)
- return invalidEmail(ticket);
+ await Self.rawSql(`
+ INSERT INTO clientSample (clientFk, typeFk, companyFk) VALUES(?, ?, ?)
+ `, [ticket.clientFk, sample.id, ticket.companyFk], {userId});
+ }
- // Save tickets on a list of failed ids
- failedtickets.push({
- id: ticket.id,
- stacktrace: error
- });
- }
- }
+ await Self.rawSql(`
+ INSERT INTO cmr (ticketFk, companyFk, addressToFk, addressFromFk, supplierFk, ead)
+ SELECT t.id,
+ com.id,
+ a.id,
+ c2.defaultAddressFk,
+ su.id,
+ t.landed
+ FROM ticket t
+ JOIN ticketState ts ON ts.ticketFk = t.id
+ JOIN state s ON s.id = ts.stateFk
+ JOIN alertLevel al ON al.id = s.alertLevel
+ JOIN client c ON c.id = t.clientFk
+ JOIN address a ON a.id = t.addressFk
+ JOIN province p ON p.id = a.provinceFk
+ JOIN country co ON co.id = p.countryFk
+ JOIN agencyMode am ON am.id = t.agencyModeFk
+ JOIN deliveryMethod dm ON dm.id = am.deliveryMethodFk
+ JOIN warehouse w ON w.id = t.warehouseFk
+ JOIN company com ON com.id = t.companyFk
+ JOIN client c2 ON c2.id = com.clientFk
+ JOIN supplierAccount sa ON sa.id = com.supplierAccountFk
+ JOIN supplier su ON su.id = sa.supplierFk
+ WHERE shipped BETWEEN util.yesterday() AND util.dayEnd(util.yesterday())
+ AND al.code IN ('PACKED', 'DELIVERED')
+ AND co.code <> 'ES'
+ AND am.name <> 'ABONO'
+ AND w.code = 'ALG'
+ AND dm.code = 'DELIVERY'
+ `);
+ } catch (error) {
+ // Domain not found
+ if (error.responseCode == 450)
+ return invalidEmail(ticket);
- // Send email with failed tickets
- if (failedtickets.length > 0) {
- let body = 'This following tickets have failed:
';
+ // Save tickets on a list of failed ids
+ failedtickets.push({
+ id: ticket.id,
+ stacktrace: error
+ });
+ }
+ }
- for (const ticket of failedtickets) {
- body += `Ticket: ${ticket.id}
- ${ticket.stacktrace}
`;
- }
+ // Send email with failed tickets
+ if (failedtickets.length > 0) {
+ let body = 'This following tickets have failed:
';
- smtp.send({
- to: config.app.reportEmail,
- subject: '[API] Nightly ticket closure report',
- html: body
- });
- }
+ for (const ticket of failedtickets) {
+ body += `Ticket: ${ticket.id}
+ ${ticket.stacktrace}
`;
+ }
- async function invalidEmail(ticket) {
- await Self.rawSql(`UPDATE client SET email = NULL WHERE id = ?`, [
- ticket.clientFk
- ], {userId});
+ smtp.send({
+ to: config.app.reportEmail,
+ subject: '[API] Nightly ticket closure report',
+ html: body
+ });
+ }
- const oldInstance = `{"email": "${ticket.recipient}"}`;
- const newInstance = `{"email": ""}`;
- await Self.rawSql(`
- INSERT INTO clientLog (originFk, userFk, action, changedModel, oldInstance, newInstance)
- VALUES (?, NULL, 'UPDATE', 'Client', ?, ?)`, [
- ticket.clientFk,
- oldInstance,
- newInstance
- ], {userId});
+ async function invalidEmail(ticket) {
+ await Self.rawSql(`UPDATE client SET email = NULL WHERE id = ?`, [
+ ticket.clientFk
+ ], {userId});
- const body = `No se ha podido enviar el albarán ${ticket.id}
- al cliente ${ticket.clientFk} - ${ticket.clientName}
- porque la dirección de email "${ticket.recipient}" no es correcta
- o no está disponible.
- Para evitar que se repita este error, se ha eliminado la dirección de email de la ficha del cliente.
- Actualiza la dirección de email con una correcta.`;
+ const oldInstance = `{"email": "${ticket.recipient}"}`;
+ const newInstance = `{"email": ""}`;
+ await Self.rawSql(`
+ INSERT INTO clientLog (originFk, userFk, action, changedModel, oldInstance, newInstance)
+ VALUES (?, NULL, 'UPDATE', 'Client', ?, ?)`, [
+ ticket.clientFk,
+ oldInstance,
+ newInstance
+ ], {userId});
- smtp.send({
- to: ticket.salesPersonEmail,
- subject: 'No se ha podido enviar el albarán',
- html: body
- });
- }
+ const body = `No se ha podido enviar el albarán ${ticket.id}
+ al cliente ${ticket.clientFk} - ${ticket.clientName}
+ porque la dirección de email "${ticket.recipient}" no es correcta
+ o no está disponible.