Merge branch 'dev' into 5063-item-module-doPhoto
gitea/salix/pipeline/head This commit looks good
Details
gitea/salix/pipeline/head This commit looks good
Details
This commit is contained in:
commit
6a732819ba
24
CHANGELOG.md
24
CHANGELOG.md
|
@ -5,19 +5,41 @@ 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/),
|
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).
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
## [2306.01] - 2023-02-23
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- (Tickets -> Datos Básicos) Mensaje de confirmación al intentar generar tickets con negativos
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- (General -> Inicio) Ahora permite recuperar la contraseña tanto con el correo de recuperación como el usuario
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- (Monitor de tickets) Cuando ordenas por columna, ya no se queda deshabilitado el botón de 'Actualizar'
|
||||||
|
- (Zone -> Días de entrega) Al hacer click en un día, muestra correctamente las zonas
|
||||||
|
|
||||||
## [2304.01] - 2023-02-09
|
## [2304.01] - 2023-02-09
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
- (Rutas) Al descargar varias facturas se comprime en un zip
|
- (Rutas) Al descargar varias facturas se comprime en un zip
|
||||||
- (Trabajadores -> Nuevo trabajador) Nueva sección
|
- (Trabajadores -> Nuevo trabajador) Nueva sección
|
||||||
|
- (Tickets -> Adelantar tickets) Añadidos campos "líneas" y "litros" al ticket origen
|
||||||
|
- (Tickets -> Adelantar tickets) Nuevo icono muestra cuando las agencias de los tickets origen/destino son distintas
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
- (Entradas -> Compras) Cambiados los campos "Precio Grouping/Packing" por "PVP" y "Precio" por "Coste"
|
- (Entradas -> Compras) Cambiados los campos "Precio Grouping/Packing" por "PVP" y "Precio" por "Coste"
|
||||||
- (Artículos -> Últimas entradas) Cambiados los campos "P.P.U." y "P.P.P." por "PVP"
|
- (Artículos -> Últimas entradas) Cambiados los campos "P.P.U." y "P.P.P." por "PVP"
|
||||||
|
- (Rutas -> Sumario/Tickets) Actualizados campos de los tickets
|
||||||
|
- (Proveedores -> Crear/Editar) Permite añadir Proveedores con la misma razón social pero con países distintos
|
||||||
|
- (Tickets -> Adelantar tickets) Cambiados selectores de estado por checks "Pendiente origen/destino"
|
||||||
|
- (Tickets -> Adelantar tickets) Cambiado stock de destino a origen.
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
- (Artículos -> Etiquetas) Permite intercambiar la relevancia entre dos etiquetas.
|
- (Artículos -> Etiquetas) Permite intercambiar la relevancia entre dos etiquetas.
|
||||||
|
- (Cliente -> Datos Fiscales) No se permite seleccionar 'Notificar vía e-mail' a los clientes sin e-mail
|
||||||
|
- (Tickets -> Datos básicos) Permite guardar la hora de envío
|
||||||
- (Tickets -> Añadir pago) Eliminado "null" en las referencias
|
- (Tickets -> Añadir pago) Eliminado "null" en las referencias
|
||||||
|
- (Tickets -> Adelantar tickets) Permite ordenar por importe
|
||||||
|
- (Tickets -> Adelantar tickets) El filtrado por encajado muestra también los tickets sin tipo de encajado
|
||||||
|
|
||||||
## [2302.01] - 2023-01-26
|
## [2302.01] - 2023-01-26
|
||||||
|
|
||||||
|
|
|
@ -3,9 +3,9 @@ module.exports = Self => {
|
||||||
description: 'Send email to the user',
|
description: 'Send email to the user',
|
||||||
accepts: [
|
accepts: [
|
||||||
{
|
{
|
||||||
arg: 'email',
|
arg: 'user',
|
||||||
type: 'string',
|
type: 'string',
|
||||||
description: 'The email of user',
|
description: 'The user name or email',
|
||||||
required: true
|
required: true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
@ -15,11 +15,20 @@ module.exports = Self => {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Self.recoverPassword = async function(email) {
|
Self.recoverPassword = async function(user) {
|
||||||
const models = Self.app.models;
|
const models = Self.app.models;
|
||||||
|
|
||||||
|
const usesEmail = user.indexOf('@') !== -1;
|
||||||
|
if (!usesEmail) {
|
||||||
|
const account = await models.Account.findOne({
|
||||||
|
fields: ['email'],
|
||||||
|
where: {name: user}
|
||||||
|
});
|
||||||
|
user = account.email;
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await models.user.resetPassword({email, emailTemplate: 'recover-password'});
|
await models.user.resetPassword({email: user, emailTemplate: 'recover-password'});
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (err.code === 'EMAIL_NOT_FOUND')
|
if (err.code === 'EMAIL_NOT_FOUND')
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -22,7 +22,7 @@ module.exports = Self => {
|
||||||
|
|
||||||
Self.latest = async filter => {
|
Self.latest = async filter => {
|
||||||
const conn = Self.dataSource.connector;
|
const conn = Self.dataSource.connector;
|
||||||
const minDate = new Date();
|
const minDate = Date.vnNew();
|
||||||
minDate.setFullYear(minDate.getFullYear() - 1);
|
minDate.setFullYear(minDate.getFullYear() - 1);
|
||||||
|
|
||||||
const where = {dated: {gte: minDate}};
|
const where = {dated: {gte: minDate}};
|
||||||
|
|
|
@ -2,7 +2,7 @@ const app = require('vn-loopback/server/server');
|
||||||
|
|
||||||
describe('campaign latest()', () => {
|
describe('campaign latest()', () => {
|
||||||
it('should return the campaigns from the last year', async() => {
|
it('should return the campaigns from the last year', async() => {
|
||||||
const now = new Date();
|
const now = Date.vnNew();
|
||||||
const result = await app.models.Campaign.latest();
|
const result = await app.models.Campaign.latest();
|
||||||
const randomIndex = Math.floor(Math.random() * result.length);
|
const randomIndex = Math.floor(Math.random() * result.length);
|
||||||
const campaignDated = result[randomIndex].dated;
|
const campaignDated = result[randomIndex].dated;
|
||||||
|
@ -12,7 +12,7 @@ describe('campaign latest()', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should return the campaigns from the current year', async() => {
|
it('should return the campaigns from the current year', async() => {
|
||||||
const now = new Date();
|
const now = Date.vnNew();
|
||||||
const currentYear = now.getFullYear();
|
const currentYear = now.getFullYear();
|
||||||
const result = await app.models.Campaign.latest({
|
const result = await app.models.Campaign.latest({
|
||||||
where: {dated: {like: `%${currentYear}%`}}
|
where: {dated: {like: `%${currentYear}%`}}
|
||||||
|
|
|
@ -4,7 +4,7 @@ describe('campaign upcoming()', () => {
|
||||||
it('should return the upcoming campaign but from the last year', async() => {
|
it('should return the upcoming campaign but from the last year', async() => {
|
||||||
const response = await app.models.Campaign.upcoming();
|
const response = await app.models.Campaign.upcoming();
|
||||||
const campaignDated = response.dated;
|
const campaignDated = response.dated;
|
||||||
const now = new Date();
|
const now = Date.vnNew();
|
||||||
|
|
||||||
expect(campaignDated).toEqual(jasmine.any(Date));
|
expect(campaignDated).toEqual(jasmine.any(Date));
|
||||||
expect(campaignDated).toBeLessThanOrEqual(now);
|
expect(campaignDated).toBeLessThanOrEqual(now);
|
||||||
|
|
|
@ -14,7 +14,7 @@ module.exports = Self => {
|
||||||
});
|
});
|
||||||
|
|
||||||
Self.upcoming = async() => {
|
Self.upcoming = async() => {
|
||||||
const minDate = new Date();
|
const minDate = Date.vnNew();
|
||||||
minDate.setFullYear(minDate.getFullYear() - 1);
|
minDate.setFullYear(minDate.getFullYear() - 1);
|
||||||
|
|
||||||
return Self.findOne({
|
return Self.findOne({
|
||||||
|
|
|
@ -21,7 +21,7 @@ module.exports = Self => {
|
||||||
|
|
||||||
if (!this.login) return;
|
if (!this.login) return;
|
||||||
|
|
||||||
if (Date.now() > this.login.expires)
|
if (Date.vnNow() > this.login.expires)
|
||||||
this.login = await requestToken();
|
this.login = await requestToken();
|
||||||
|
|
||||||
return this.login;
|
return this.login;
|
||||||
|
@ -48,7 +48,7 @@ module.exports = Self => {
|
||||||
userId: requestData.userId,
|
userId: requestData.userId,
|
||||||
token: requestData.authToken
|
token: requestData.authToken
|
||||||
},
|
},
|
||||||
expires: Date.now() + (1000 * 60 * tokenLifespan)
|
expires: Date.vnNow() + (1000 * 60 * tokenLifespan)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,7 @@ module.exports = Self => {
|
||||||
await models.Chat.create({
|
await models.Chat.create({
|
||||||
senderFk: sender.id,
|
senderFk: sender.id,
|
||||||
recipient: to,
|
recipient: to,
|
||||||
dated: new Date(),
|
dated: Date.vnNew(),
|
||||||
checkUserStatus: 0,
|
checkUserStatus: 0,
|
||||||
message: message,
|
message: message,
|
||||||
status: 0,
|
status: 0,
|
||||||
|
|
|
@ -49,7 +49,7 @@ module.exports = Self => {
|
||||||
await models.Chat.create({
|
await models.Chat.create({
|
||||||
senderFk: sender.id,
|
senderFk: sender.id,
|
||||||
recipient: `@${recipient.name}`,
|
recipient: `@${recipient.name}`,
|
||||||
dated: new Date(),
|
dated: Date.vnNew(),
|
||||||
checkUserStatus: 1,
|
checkUserStatus: 1,
|
||||||
message: message,
|
message: message,
|
||||||
status: 0,
|
status: 0,
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
const models = require('vn-loopback/server/server').models;
|
const models = require('vn-loopback/server/server').models;
|
||||||
|
|
||||||
describe('Chat sendCheckingPresence()', () => {
|
describe('Chat sendCheckingPresence()', () => {
|
||||||
const today = new Date();
|
const today = Date.vnNew();
|
||||||
today.setHours(6, 0);
|
today.setHours(6, 0);
|
||||||
const chatModel = models.Chat;
|
const chatModel = models.Chat;
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@ module.exports = Self => {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Self.setSaleQuantity = async(saleId, quantity) => {
|
Self.setSaleQuantity = async(saleId, quantity, options) => {
|
||||||
const models = Self.app.models;
|
const models = Self.app.models;
|
||||||
const myOptions = {};
|
const myOptions = {};
|
||||||
let tx;
|
let tx;
|
||||||
|
|
|
@ -32,7 +32,7 @@ module.exports = Self => {
|
||||||
where: {code: 'trash'}
|
where: {code: 'trash'}
|
||||||
}, myOptions);
|
}, myOptions);
|
||||||
|
|
||||||
const date = new Date();
|
const date = Date.vnNew();
|
||||||
date.setMonth(date.getMonth() - 4);
|
date.setMonth(date.getMonth() - 4);
|
||||||
|
|
||||||
const dmsToDelete = await models.Dms.find({
|
const dmsToDelete = await models.Dms.find({
|
||||||
|
|
|
@ -163,7 +163,7 @@ module.exports = Self => {
|
||||||
fields: ['alertLevel']
|
fields: ['alertLevel']
|
||||||
});
|
});
|
||||||
|
|
||||||
signedTime ? signedTime != undefined : signedTime = new Date();
|
signedTime ? signedTime != undefined : signedTime = Date.vnNew();
|
||||||
|
|
||||||
if (alertLevel >= 2) {
|
if (alertLevel >= 2) {
|
||||||
let dir;
|
let dir;
|
||||||
|
|
|
@ -127,7 +127,7 @@ module.exports = Self => {
|
||||||
const uploadOptions = {
|
const uploadOptions = {
|
||||||
headers: {
|
headers: {
|
||||||
'Content-Type': 'multipart/form-data',
|
'Content-Type': 'multipart/form-data',
|
||||||
'X-File-ModifiedDate': new Date(),
|
'X-File-ModifiedDate': Date.vnNew(),
|
||||||
'Cookie': options.headers.headers.Cookie,
|
'Cookie': options.headers.headers.Cookie,
|
||||||
...data.getHeaders()
|
...data.getHeaders()
|
||||||
},
|
},
|
||||||
|
|
|
@ -230,7 +230,7 @@ module.exports = Self => {
|
||||||
UPDATE edi.tableConfig
|
UPDATE edi.tableConfig
|
||||||
SET updated = ?
|
SET updated = ?
|
||||||
WHERE fileName = ?
|
WHERE fileName = ?
|
||||||
`, [new Date(), baseName], options);
|
`, [Date.vnNew(), baseName], options);
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log(`Updated table ${toTable}\n`);
|
console.log(`Updated table ${toTable}\n`);
|
||||||
|
|
|
@ -32,7 +32,7 @@ module.exports = Self => {
|
||||||
|
|
||||||
if (!config.cleanDays) return;
|
if (!config.cleanDays) return;
|
||||||
|
|
||||||
const cleanDate = new Date();
|
const cleanDate = Date.vnNew();
|
||||||
cleanDate.setDate(cleanDate.getDate() - config.cleanDays);
|
cleanDate.setDate(cleanDate.getDate() - config.cleanDays);
|
||||||
|
|
||||||
await models.NotificationQueue.destroyAll({
|
await models.NotificationQueue.destroyAll({
|
||||||
|
|
|
@ -10,7 +10,7 @@ describe('Notification Clean()', () => {
|
||||||
const notification = await models.Notification.findOne({}, options);
|
const notification = await models.Notification.findOne({}, options);
|
||||||
const notificationConfig = await models.NotificationConfig.findOne({});
|
const notificationConfig = await models.NotificationConfig.findOne({});
|
||||||
|
|
||||||
const cleanDate = new Date();
|
const cleanDate = Date.vnNew();
|
||||||
cleanDate.setDate(cleanDate.getDate() - (notificationConfig.cleanDays + 1));
|
cleanDate.setDate(cleanDate.getDate() - (notificationConfig.cleanDays + 1));
|
||||||
|
|
||||||
let before;
|
let before;
|
||||||
|
|
|
@ -77,7 +77,7 @@ module.exports = Self => {
|
||||||
const newImage = await Self.upsertWithWhere(data, {
|
const newImage = await Self.upsertWithWhere(data, {
|
||||||
name: fileName,
|
name: fileName,
|
||||||
collectionFk: collectionName,
|
collectionFk: collectionName,
|
||||||
updated: (new Date).getTime()
|
updated: Date.vnNow()
|
||||||
}, myOptions);
|
}, myOptions);
|
||||||
|
|
||||||
// Resizes and saves the image
|
// Resizes and saves the image
|
||||||
|
|
|
@ -6,6 +6,16 @@
|
||||||
"table": "util.notificationAcl"
|
"table": "util.notificationAcl"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"properties":{
|
||||||
|
"notificationFk": {
|
||||||
|
"id": true,
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"roleFk":{
|
||||||
|
"id": true,
|
||||||
|
"type": "number"
|
||||||
|
}
|
||||||
|
},
|
||||||
"relations": {
|
"relations": {
|
||||||
"notification": {
|
"notification": {
|
||||||
"type": "belongsTo",
|
"type": "belongsTo",
|
||||||
|
|
|
@ -0,0 +1,62 @@
|
||||||
|
const UserError = require('vn-loopback/util/user-error');
|
||||||
|
|
||||||
|
module.exports = Self => {
|
||||||
|
Self.observe('before save', async function(ctx) {
|
||||||
|
const models = Self.app.models;
|
||||||
|
const userId = ctx.options.accessToken.userId;
|
||||||
|
const user = await ctx.instance.userFk;
|
||||||
|
const modifiedUser = await getUserToModify(null, user, models);
|
||||||
|
|
||||||
|
if (userId != modifiedUser.id && userId != modifiedUser.bossFk)
|
||||||
|
throw new UserError('You dont have permission to modify this user');
|
||||||
|
});
|
||||||
|
|
||||||
|
Self.remoteMethod('deleteNotification', {
|
||||||
|
description: 'Deletes a notification subscription',
|
||||||
|
accepts: [
|
||||||
|
{
|
||||||
|
arg: 'ctx',
|
||||||
|
type: 'object',
|
||||||
|
http: {source: 'context'}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
arg: 'notificationId',
|
||||||
|
type: 'number',
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
],
|
||||||
|
returns: {
|
||||||
|
type: 'object',
|
||||||
|
root: true
|
||||||
|
},
|
||||||
|
http: {
|
||||||
|
verb: 'POST',
|
||||||
|
path: '/deleteNotification'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Self.deleteNotification = async function(ctx, notificationId) {
|
||||||
|
const models = Self.app.models;
|
||||||
|
const user = ctx.req.accessToken.userId;
|
||||||
|
const modifiedUser = await getUserToModify(notificationId, null, models);
|
||||||
|
|
||||||
|
if (user != modifiedUser.id && user != modifiedUser.bossFk)
|
||||||
|
throw new UserError('You dont have permission to modify this user');
|
||||||
|
|
||||||
|
await models.NotificationSubscription.destroyById(notificationId);
|
||||||
|
};
|
||||||
|
|
||||||
|
async function getUserToModify(notificationId, userFk, models) {
|
||||||
|
let userToModify = userFk;
|
||||||
|
if (notificationId) {
|
||||||
|
const subscription = await models.NotificationSubscription.findById(notificationId);
|
||||||
|
userToModify = subscription.userFk;
|
||||||
|
}
|
||||||
|
return await models.Worker.findOne({
|
||||||
|
fields: ['id', 'bossFk'],
|
||||||
|
where: {
|
||||||
|
id: userToModify
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
|
@ -7,15 +7,18 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"properties": {
|
"properties": {
|
||||||
"notificationFk": {
|
"id": {
|
||||||
"type": "number",
|
"type": "number",
|
||||||
"id": true,
|
"id": true,
|
||||||
"description": "Identifier"
|
"description": "Primary key"
|
||||||
|
},
|
||||||
|
"notificationFk": {
|
||||||
|
"type": "number",
|
||||||
|
"description": "Foreign key to Notification"
|
||||||
},
|
},
|
||||||
"userFk": {
|
"userFk": {
|
||||||
"type": "number",
|
"type": "number",
|
||||||
"id": true,
|
"description": "Foreign key to Account"
|
||||||
"description": "Identifier"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"relations": {
|
"relations": {
|
||||||
|
|
|
@ -0,0 +1,74 @@
|
||||||
|
const models = require('vn-loopback/server/server').models;
|
||||||
|
|
||||||
|
describe('loopback model NotificationSubscription', () => {
|
||||||
|
it('Should fail to delete a notification if the user is not editing itself or a subordinate', async() => {
|
||||||
|
const tx = await models.NotificationSubscription.beginTransaction({});
|
||||||
|
|
||||||
|
try {
|
||||||
|
const options = {transaction: tx};
|
||||||
|
const user = 9;
|
||||||
|
const notificationSubscriptionId = 2;
|
||||||
|
const ctx = {req: {accessToken: {userId: user}}};
|
||||||
|
const notification = await models.NotificationSubscription.findById(notificationSubscriptionId);
|
||||||
|
|
||||||
|
let error;
|
||||||
|
|
||||||
|
try {
|
||||||
|
await models.NotificationSubscription.deleteNotification(ctx, notification.id, options);
|
||||||
|
} catch (e) {
|
||||||
|
error = e;
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(error.message).toContain('You dont have permission to modify this user');
|
||||||
|
await tx.rollback();
|
||||||
|
} catch (e) {
|
||||||
|
await tx.rollback();
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Should delete a notification if the user is editing itself', async() => {
|
||||||
|
const tx = await models.NotificationSubscription.beginTransaction({});
|
||||||
|
|
||||||
|
try {
|
||||||
|
const options = {transaction: tx};
|
||||||
|
const user = 9;
|
||||||
|
const notificationSubscriptionId = 4;
|
||||||
|
const ctx = {req: {accessToken: {userId: user}}};
|
||||||
|
const notification = await models.NotificationSubscription.findById(notificationSubscriptionId);
|
||||||
|
|
||||||
|
await models.NotificationSubscription.deleteNotification(ctx, notification.id, options);
|
||||||
|
|
||||||
|
const deletedNotification = await models.NotificationSubscription.findById(notificationSubscriptionId);
|
||||||
|
|
||||||
|
expect(deletedNotification).toBeNull();
|
||||||
|
await tx.rollback();
|
||||||
|
} catch (e) {
|
||||||
|
await tx.rollback();
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Should delete a notification if the user is editing a subordinate', async() => {
|
||||||
|
const tx = await models.NotificationSubscription.beginTransaction({});
|
||||||
|
|
||||||
|
try {
|
||||||
|
const options = {transaction: tx};
|
||||||
|
const user = 9;
|
||||||
|
const notificationSubscriptionId = 5;
|
||||||
|
const ctx = {req: {accessToken: {userId: user}}};
|
||||||
|
const notification = await models.NotificationSubscription.findById(notificationSubscriptionId);
|
||||||
|
|
||||||
|
await models.NotificationSubscription.deleteNotification(ctx, notification.id, options);
|
||||||
|
|
||||||
|
const deletedNotification = await models.NotificationSubscription.findById(notificationSubscriptionId);
|
||||||
|
|
||||||
|
expect(deletedNotification).toBeNull();
|
||||||
|
await tx.rollback();
|
||||||
|
} catch (e) {
|
||||||
|
await tx.rollback();
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
ALTER TABLE `vn`.`supplier` ADD UNIQUE (name, countryFk);
|
|
@ -1,2 +1,173 @@
|
||||||
DELETE FROM `salix`.`ACL` WHERE model="SaleChecked";
|
DELETE FROM `salix`.`ACL` WHERE model="SaleChecked";
|
||||||
DROP TABLE IF EXISTS `vn`.`saleChecked`;
|
DROP TABLE IF EXISTS `vn`.`saleChecked`;
|
||||||
|
DROP PROCEDURE IF EXISTS `vn`.`clean`;
|
||||||
|
|
||||||
|
DELIMITER $$
|
||||||
|
$$
|
||||||
|
CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`clean`()
|
||||||
|
BEGIN
|
||||||
|
DECLARE vDateShort DATETIME;
|
||||||
|
DECLARE vOneYearAgo DATE;
|
||||||
|
DECLARE vFourYearsAgo DATE;
|
||||||
|
DECLARE v18Month DATE;
|
||||||
|
DECLARE v26Month DATE;
|
||||||
|
DECLARE v3Month DATE;
|
||||||
|
DECLARE vTrashId VARCHAR(15);
|
||||||
|
|
||||||
|
SET vDateShort = util.VN_CURDATE() - INTERVAL 2 MONTH;
|
||||||
|
SET vOneYearAgo = util.VN_CURDATE() - INTERVAL 1 YEAR;
|
||||||
|
SET vFourYearsAgo = util.VN_CURDATE() - INTERVAL 4 YEAR;
|
||||||
|
SET v18Month = util.VN_CURDATE() - INTERVAL 18 MONTH;
|
||||||
|
SET v26Month = util.VN_CURDATE() - INTERVAL 26 MONTH;
|
||||||
|
SET v3Month = util.VN_CURDATE() - INTERVAL 3 MONTH;
|
||||||
|
|
||||||
|
DELETE FROM ticketParking WHERE created < vDateShort;
|
||||||
|
DELETE FROM routesMonitor WHERE dated < vDateShort;
|
||||||
|
DELETE FROM workerTimeControlLog WHERE created < vDateShort;
|
||||||
|
DELETE FROM `message` WHERE sendDate < vDateShort;
|
||||||
|
DELETE FROM messageInbox WHERE sendDate < vDateShort;
|
||||||
|
DELETE FROM messageInbox WHERE sendDate < vDateShort;
|
||||||
|
DELETE FROM workerTimeControl WHERE timed < vFourYearsAgo;
|
||||||
|
DELETE FROM itemShelving WHERE created < util.VN_CURDATE() AND visible = 0;
|
||||||
|
DELETE FROM ticketDown WHERE created < TIMESTAMPADD(DAY,-1,util.VN_CURDATE());
|
||||||
|
DELETE FROM entryLog WHERE creationDate < vDateShort;
|
||||||
|
DELETE IGNORE FROM expedition WHERE created < v26Month;
|
||||||
|
DELETE FROM sms WHERE created < v18Month;
|
||||||
|
DELETE FROM saleTracking WHERE created < vOneYearAgo;
|
||||||
|
DELETE FROM ticketTracking WHERE created < v18Month;
|
||||||
|
DELETE tobs FROM ticketObservation tobs
|
||||||
|
JOIN ticket t ON tobs.ticketFk = t.id WHERE t.shipped < TIMESTAMPADD(YEAR,-2,util.VN_CURDATE());
|
||||||
|
DELETE sc.* FROM saleCloned sc JOIN sale s ON s.id = sc.saleClonedFk JOIN ticket t ON t.id = s.ticketFk WHERE t.shipped < vOneYearAgo;
|
||||||
|
DELETE FROM sharingCart where ended < vDateShort;
|
||||||
|
DELETE FROM sharingClient where ended < vDateShort;
|
||||||
|
DELETE tw.* FROM ticketWeekly tw
|
||||||
|
LEFT JOIN sale s ON s.ticketFk = tw.ticketFk WHERE s.itemFk IS NULL;
|
||||||
|
DELETE FROM claim WHERE ticketCreated < vFourYearsAgo;
|
||||||
|
DELETE FROM message WHERE sendDate < vDateShort;
|
||||||
|
-- Robert ubicacion anterior de trevelLog comentario para debug
|
||||||
|
DELETE FROM zoneEvent WHERE `type` = 'day' AND dated < v3Month;
|
||||||
|
DELETE bm
|
||||||
|
FROM buyMark bm
|
||||||
|
JOIN buy b ON b.id = bm.id
|
||||||
|
JOIN entry e ON e.id = b.entryFk
|
||||||
|
JOIN travel t ON t.id = e.travelFk
|
||||||
|
WHERE t.landed <= vDateShort;
|
||||||
|
DELETE FROM vn.buy WHERE created < vDateShort AND entryFk = 9200;
|
||||||
|
DELETE FROM vn.itemShelvingLog WHERE created < vDateShort;
|
||||||
|
DELETE FROM vn.stockBuyed WHERE creationDate < vDateShort;
|
||||||
|
DELETE FROM vn.itemCleanLog WHERE created < util.VN_NOW() - INTERVAL 1 YEAR;
|
||||||
|
DELETE FROM printQueue WHERE statusCode = 'printed' AND created < vDateShort;
|
||||||
|
|
||||||
|
-- Equipos duplicados
|
||||||
|
DELETE w.*
|
||||||
|
FROM workerTeam w
|
||||||
|
JOIN (SELECT id, team, workerFk, COUNT(*) - 1 as duplicated
|
||||||
|
FROM workerTeam
|
||||||
|
GROUP BY team,workerFk
|
||||||
|
HAVING duplicated
|
||||||
|
) d ON d.team = w.team AND d.workerFk = w.workerFk AND d.id != w.id;
|
||||||
|
|
||||||
|
DELETE sc
|
||||||
|
FROM saleComponent sc
|
||||||
|
JOIN sale s ON s.id= sc.saleFk
|
||||||
|
JOIN ticket t ON t.id= s.ticketFk
|
||||||
|
WHERE t.shipped < v18Month;
|
||||||
|
|
||||||
|
DELETE c
|
||||||
|
FROM vn.claim c
|
||||||
|
JOIN vn.claimState cs ON cs.id = c.claimStateFk
|
||||||
|
WHERE cs.description = "Anulado" AND
|
||||||
|
c.created < vDateShort;
|
||||||
|
DELETE
|
||||||
|
FROM vn.expeditionTruck
|
||||||
|
WHERE ETD < v3Month;
|
||||||
|
|
||||||
|
-- borrar travels sin entradas
|
||||||
|
DROP TEMPORARY TABLE IF EXISTS tmp.thermographToDelete;
|
||||||
|
CREATE TEMPORARY TABLE tmp.thermographToDelete
|
||||||
|
SELECT th.id,th.dmsFk
|
||||||
|
FROM vn.travel t
|
||||||
|
LEFT JOIN vn.entry e ON e.travelFk = t.id
|
||||||
|
JOIN vn.travelThermograph th ON th.travelFk = t.id
|
||||||
|
WHERE t.shipped < TIMESTAMPADD(MONTH, -3, util.VN_CURDATE()) AND e.travelFk IS NULL;
|
||||||
|
|
||||||
|
SELECT dt.id INTO vTrashId
|
||||||
|
FROM vn.dmsType dt
|
||||||
|
WHERE dt.code = 'trash';
|
||||||
|
|
||||||
|
UPDATE tmp.thermographToDelete th
|
||||||
|
JOIN vn.dms d ON d.id = th.dmsFk
|
||||||
|
SET d.dmsTypeFk = vTrashId;
|
||||||
|
|
||||||
|
DELETE th
|
||||||
|
FROM tmp.thermographToDelete tmp
|
||||||
|
JOIN vn.travelThermograph th ON th.id = tmp.id;
|
||||||
|
|
||||||
|
DELETE t
|
||||||
|
FROM vn.travel t
|
||||||
|
LEFT JOIN vn.entry e ON e.travelFk = t.id
|
||||||
|
WHERE t.shipped < TIMESTAMPADD(MONTH, -3, util.VN_CURDATE()) AND e.travelFk IS NULL;
|
||||||
|
|
||||||
|
UPDATE dms d
|
||||||
|
JOIN dmsType dt ON dt.id = d.dmsTypeFk
|
||||||
|
SET d.dmsTypeFk = vTrashId
|
||||||
|
WHERE created < TIMESTAMPADD(MONTH, -dt.monthToDelete, util.VN_CURDATE());
|
||||||
|
|
||||||
|
-- borrar entradas sin compras
|
||||||
|
DROP TEMPORARY TABLE IF EXISTS tmp.entryToDelete;
|
||||||
|
CREATE TEMPORARY TABLE tmp.entryToDelete
|
||||||
|
SELECT e.*
|
||||||
|
FROM vn.entry e
|
||||||
|
LEFT JOIN vn.buy b ON b.entryFk = e.id
|
||||||
|
JOIN vn.entryConfig ec ON e.id != ec.defaultEntry
|
||||||
|
WHERE e.dated < TIMESTAMPADD(MONTH, -3, util.VN_CURDATE()) AND b.entryFK IS NULL;
|
||||||
|
|
||||||
|
DELETE e
|
||||||
|
FROM vn.entry e
|
||||||
|
JOIN tmp.entryToDelete tmp ON tmp.id = e.id;
|
||||||
|
|
||||||
|
-- borrar de route registros menores a 4 años
|
||||||
|
DROP TEMPORARY TABLE IF EXISTS tmp.routeToDelete;
|
||||||
|
CREATE TEMPORARY TABLE tmp.routeToDelete
|
||||||
|
SELECT *
|
||||||
|
FROM vn.route r
|
||||||
|
WHERE created < TIMESTAMPADD(YEAR,-4,util.VN_CURDATE());
|
||||||
|
|
||||||
|
UPDATE tmp.routeToDelete tmp
|
||||||
|
JOIN vn.dms d ON d.id = tmp.gestdocFk
|
||||||
|
SET d.dmsTypeFk = vTrashId;
|
||||||
|
|
||||||
|
DELETE r
|
||||||
|
FROM tmp.routeToDelete tmp
|
||||||
|
JOIN vn.route r ON r.id = tmp.id;
|
||||||
|
|
||||||
|
-- borrar registros de dua y awb menores a 2 años
|
||||||
|
DROP TEMPORARY TABLE IF EXISTS tmp.duaToDelete;
|
||||||
|
CREATE TEMPORARY TABLE tmp.duaToDelete
|
||||||
|
SELECT *
|
||||||
|
FROM vn.dua
|
||||||
|
WHERE operated < TIMESTAMPADD(YEAR,-2,util.VN_CURDATE());
|
||||||
|
|
||||||
|
UPDATE tmp.duaToDelete tm
|
||||||
|
JOIN vn.dms d ON d.id = tm.gestdocFk
|
||||||
|
SET d.dmsTypeFk = vTrashId;
|
||||||
|
|
||||||
|
DELETE d
|
||||||
|
FROM tmp.duaToDelete tmp
|
||||||
|
JOIN vn.dua d ON d.id = tmp.id;
|
||||||
|
|
||||||
|
DELETE FROM vn.awb WHERE created < TIMESTAMPADD(YEAR,-2,util.VN_CURDATE());
|
||||||
|
|
||||||
|
-- Borra los registros de collection y ticketcollection
|
||||||
|
DELETE FROM vn.collection WHERE created < vDateShort;
|
||||||
|
|
||||||
|
DROP TEMPORARY TABLE IF EXISTS tmp.thermographToDelete;
|
||||||
|
DROP TEMPORARY TABLE IF EXISTS tmp.entryToDelete;
|
||||||
|
DROP TEMPORARY TABLE IF EXISTS tmp.duaToDelete;
|
||||||
|
|
||||||
|
DELETE FROM travelLog WHERE creationDate < v3Month;
|
||||||
|
|
||||||
|
CALL shelving_clean;
|
||||||
|
|
||||||
|
END$$
|
||||||
|
DELIMITER ;
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
ALTER TABLE `vn`.`itemConfig` ADD defaultTag INT DEFAULT 56 NOT NULL;
|
||||||
|
ALTER TABLE `vn`.`itemConfig` ADD CONSTRAINT itemConfig_FK FOREIGN KEY (defaultTag) REFERENCES vn.tag(id);
|
||||||
|
ALTER TABLE `vn`.`itemConfig` ADD validPriorities varchar(50) DEFAULT '[1,2,3]' NOT NULL;
|
||||||
|
ALTER TABLE `vn`.`itemConfig` ADD defaultPriority INT DEFAULT 2 NOT NULL;
|
||||||
|
ALTER TABLE `vn`.`item` MODIFY COLUMN relevancy tinyint(1) DEFAULT 0 NOT NULL COMMENT 'La web ordena de forma descendiente por este campo para mostrar los artículos';
|
||||||
|
|
||||||
|
INSERT INTO `salix`.`ACL`
|
||||||
|
(model, property, accessType, permission, principalType, principalId)
|
||||||
|
VALUES('ItemConfig', '*', 'READ', 'ALLOW', 'ROLE', 'buyer');
|
|
@ -0,0 +1,4 @@
|
||||||
|
INSERT INTO `salix`.`ACL` (model,property,accessType,principalId)
|
||||||
|
VALUES
|
||||||
|
('NotificationSubscription','*','*','employee'),
|
||||||
|
('NotificationAcl','*','READ','employee');
|
|
@ -0,0 +1,110 @@
|
||||||
|
DROP PROCEDURE IF EXISTS vn.ticket_canAdvance;
|
||||||
|
|
||||||
|
DELIMITER $$
|
||||||
|
$$
|
||||||
|
CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`ticket_canAdvance`(vDateFuture DATE, vDateToAdvance DATE, vWarehouseFk INT)
|
||||||
|
BEGIN
|
||||||
|
/**
|
||||||
|
* Devuelve los tickets y la cantidad de lineas de venta que se pueden adelantar.
|
||||||
|
*
|
||||||
|
* @param vDateFuture Fecha de los tickets que se quieren adelantar.
|
||||||
|
* @param vDateToAdvance Fecha a cuando se quiere adelantar.
|
||||||
|
* @param vWarehouseFk Almacén
|
||||||
|
*/
|
||||||
|
|
||||||
|
DECLARE vDateInventory DATE;
|
||||||
|
|
||||||
|
SELECT inventoried INTO vDateInventory FROM vn.config;
|
||||||
|
|
||||||
|
DROP TEMPORARY TABLE IF EXISTS tmp.stock;
|
||||||
|
CREATE TEMPORARY TABLE tmp.stock
|
||||||
|
(itemFk INT PRIMARY KEY,
|
||||||
|
amount INT)
|
||||||
|
ENGINE = MEMORY;
|
||||||
|
|
||||||
|
INSERT INTO tmp.stock(itemFk, amount)
|
||||||
|
SELECT itemFk, SUM(quantity) amount FROM
|
||||||
|
(
|
||||||
|
SELECT itemFk, quantity
|
||||||
|
FROM vn.itemTicketOut
|
||||||
|
WHERE shipped >= vDateInventory
|
||||||
|
AND shipped < vDateFuture
|
||||||
|
AND warehouseFk = vWarehouseFk
|
||||||
|
UNION ALL
|
||||||
|
SELECT itemFk, quantity
|
||||||
|
FROM vn.itemEntryIn
|
||||||
|
WHERE landed >= vDateInventory
|
||||||
|
AND landed < vDateFuture
|
||||||
|
AND isVirtualStock = FALSE
|
||||||
|
AND warehouseInFk = vWarehouseFk
|
||||||
|
UNION ALL
|
||||||
|
SELECT itemFk, quantity
|
||||||
|
FROM vn.itemEntryOut
|
||||||
|
WHERE shipped >= vDateInventory
|
||||||
|
AND shipped < vDateFuture
|
||||||
|
AND warehouseOutFk = vWarehouseFk
|
||||||
|
) t
|
||||||
|
GROUP BY itemFk HAVING amount != 0;
|
||||||
|
|
||||||
|
DROP TEMPORARY TABLE IF EXISTS tmp.filter;
|
||||||
|
CREATE TEMPORARY TABLE tmp.filter
|
||||||
|
(INDEX (id))
|
||||||
|
SELECT s.ticketFk futureId,
|
||||||
|
t2.ticketFk id,
|
||||||
|
count(DISTINCT s.id) saleCount,
|
||||||
|
t2.state,
|
||||||
|
t2.isNotValidated,
|
||||||
|
st.name futureState,
|
||||||
|
st.isNotValidated futureIsNotValidated,
|
||||||
|
GROUP_CONCAT(DISTINCT ipt.code ORDER BY ipt.code) futureIpt,
|
||||||
|
t2.ipt,
|
||||||
|
t.workerFk,
|
||||||
|
CAST(SUM(litros) AS DECIMAL(10,0)) futureLiters,
|
||||||
|
CAST(COUNT(*) AS DECIMAL(10,0)) `futureLines`,
|
||||||
|
t2.shipped,
|
||||||
|
t.shipped futureShipped,
|
||||||
|
t2.totalWithVat,
|
||||||
|
t.totalWithVat futureTotalWithVat,
|
||||||
|
t2.agency,
|
||||||
|
am.name futureAgency,
|
||||||
|
t2.lines,
|
||||||
|
t2.liters,
|
||||||
|
SUM((s.quantity <= IFNULL(st.amount,0))) hasStock
|
||||||
|
FROM vn.ticket t
|
||||||
|
JOIN vn.ticketState ts ON ts.ticketFk = t.id
|
||||||
|
JOIN vn.state st ON st.id = ts.stateFk
|
||||||
|
JOIN vn.saleVolume sv ON t.id = sv.ticketFk
|
||||||
|
JOIN (SELECT
|
||||||
|
t2.id ticketFk,
|
||||||
|
t2.addressFk,
|
||||||
|
st.isNotValidated,
|
||||||
|
st.name state,
|
||||||
|
GROUP_CONCAT(DISTINCT ipt.code ORDER BY ipt.code) ipt,
|
||||||
|
t2.shipped,
|
||||||
|
t2.totalWithVat,
|
||||||
|
am.name agency,
|
||||||
|
CAST(SUM(litros) AS DECIMAL(10,0)) liters,
|
||||||
|
CAST(COUNT(*) AS DECIMAL(10,0)) `lines`
|
||||||
|
FROM vn.ticket t2
|
||||||
|
JOIN vn.saleVolume sv ON t2.id = sv.ticketFk
|
||||||
|
JOIN vn.sale s ON s.ticketFk = t2.id
|
||||||
|
JOIN vn.item i ON i.id = s.itemFk
|
||||||
|
JOIN vn.ticketState ts ON ts.ticketFk = t2.id
|
||||||
|
JOIN vn.state st ON st.id = ts.stateFk
|
||||||
|
JOIN vn.agencyMode am ON t2.agencyModeFk = am.id
|
||||||
|
LEFT JOIN vn.itemPackingType ipt ON ipt.code = i.itemPackingTypeFk
|
||||||
|
WHERE t2.shipped BETWEEN vDateToAdvance AND util.dayend(vDateToAdvance)
|
||||||
|
AND t2.warehouseFk = vWarehouseFk
|
||||||
|
GROUP BY t2.id) t2 ON t2.addressFk = t.addressFk
|
||||||
|
JOIN vn.sale s ON s.ticketFk = t.id
|
||||||
|
JOIN vn.item i ON i.id = s.itemFk
|
||||||
|
JOIN vn.agencyMode am ON t.agencyModeFk = am.id
|
||||||
|
LEFT JOIN vn.itemPackingType ipt ON ipt.code = i.itemPackingTypeFk
|
||||||
|
LEFT JOIN tmp.stock st ON st.itemFk = s.itemFk
|
||||||
|
WHERE t.shipped BETWEEN vDateFuture AND util.dayend(vDateFuture)
|
||||||
|
AND t.warehouseFk = vWarehouseFk
|
||||||
|
GROUP BY t.id;
|
||||||
|
|
||||||
|
DROP TEMPORARY TABLE tmp.stock;
|
||||||
|
END$$
|
||||||
|
DELIMITER ;
|
|
@ -0,0 +1,4 @@
|
||||||
|
ALTER TABLE
|
||||||
|
`util`.`notificationSubscription`
|
||||||
|
ADD
|
||||||
|
CONSTRAINT `notificationSubscription_UN` UNIQUE KEY (`notificationFk`, `userFk`);
|
|
@ -0,0 +1,6 @@
|
||||||
|
UPDATE `vn`.`client`
|
||||||
|
SET isToBeMailed = FALSE
|
||||||
|
WHERE
|
||||||
|
mailAddress is NULL
|
||||||
|
AND email is NULL
|
||||||
|
AND isToBeMailed = TRUE;
|
|
@ -0,0 +1,7 @@
|
||||||
|
ALTER TABLE `util`.`notificationSubscription`
|
||||||
|
ADD `id` int(11) auto_increment NULL,
|
||||||
|
DROP PRIMARY KEY,
|
||||||
|
ADD CONSTRAINT PRIMARY KEY (`id`);
|
||||||
|
|
||||||
|
ALTER TABLE `util`.`notificationSubscription`
|
||||||
|
ADD KEY `notificationSubscription_ibfk_1` (`notificationFk`);
|
|
@ -2,7 +2,33 @@ CREATE SCHEMA IF NOT EXISTS `vn2008`;
|
||||||
CREATE SCHEMA IF NOT EXISTS `tmp`;
|
CREATE SCHEMA IF NOT EXISTS `tmp`;
|
||||||
|
|
||||||
UPDATE `util`.`config`
|
UPDATE `util`.`config`
|
||||||
SET `environment`= 'test';
|
SET `environment`= 'development';
|
||||||
|
|
||||||
|
-- FOR MOCK vn.time
|
||||||
|
|
||||||
|
DROP PROCEDURE IF EXISTS `vn`.`mockVnTime`;
|
||||||
|
|
||||||
|
DELIMITER $$
|
||||||
|
$$
|
||||||
|
CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`mockVnTime`()
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
DECLARE vDate DATE;
|
||||||
|
SET vDate = '2000-01-01';
|
||||||
|
|
||||||
|
WHILE ( YEAR(vDate) <= 2002 ) DO
|
||||||
|
INSERT IGNORE INTO vn.`time` (dated, period, `month`, `year`, `day`, week, yearMonth, salesYear)
|
||||||
|
VALUES (vDate, CONCAT(YEAR(vDate), (WEEK(vDate)+1)), MONTH(vDate), YEAR(vDate), DAY(vDate), WEEK(vDate)+1, CONCAT(YEAR(vDate), MONTH(vDate)), YEAR(vDate));
|
||||||
|
|
||||||
|
SET vDate = DATE_ADD(vDate, INTERVAL 1 DAY);
|
||||||
|
END WHILE;
|
||||||
|
|
||||||
|
END$$
|
||||||
|
DELIMITER ;
|
||||||
|
|
||||||
|
CALL `vn`.`mockVnTime`();
|
||||||
|
DROP PROCEDURE IF EXISTS `vn`.`mockVnTime`;
|
||||||
|
-- END MOCK vn.time
|
||||||
|
|
||||||
ALTER TABLE `vn`.`itemTaxCountry` AUTO_INCREMENT = 1;
|
ALTER TABLE `vn`.`itemTaxCountry` AUTO_INCREMENT = 1;
|
||||||
ALTER TABLE `vn`.`address` AUTO_INCREMENT = 1;
|
ALTER TABLE `vn`.`address` AUTO_INCREMENT = 1;
|
||||||
|
@ -934,10 +960,10 @@ INSERT INTO `vn`.`expedition`(`id`, `agencyModeFk`, `ticketFk`, `freightItemFk`,
|
||||||
(7, 2, 4, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -3 MONTH), 1, 18, NULL, 94, NULL,NULL),
|
(7, 2, 4, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -3 MONTH), 1, 18, NULL, 94, NULL,NULL),
|
||||||
(8, 3, 5, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -4 MONTH), 1, 18, NULL, 94, 1, NULL),
|
(8, 3, 5, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -4 MONTH), 1, 18, NULL, 94, 1, NULL),
|
||||||
(9, 3, 6, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 18, NULL, 94, 2, NULL),
|
(9, 3, 6, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 18, NULL, 94, 2, NULL),
|
||||||
(10, 7, 7, 71, NOW(), 1, 18, NULL, 94, 3, NULL),
|
(10, 7, 7, 71, util.VN_NOW(), 1, 18, NULL, 94, 3, NULL),
|
||||||
(11, 7, 8, 71, NOW(), 1, 18, NULL, 94, 3, NULL),
|
(11, 7, 8, 71, util.VN_NOW(), 1, 18, NULL, 94, 3, NULL),
|
||||||
(12, 7, 9, 71, NOW(), 1, 18, NULL, 94, 3, NULL),
|
(12, 7, 9, 71, util.VN_NOW(), 1, 18, NULL, 94, 3, NULL),
|
||||||
(13, 1, 10,71, NOW(), 1, 18, NULL, 94, 3, NULL);
|
(13, 1, 10,71, util.VN_NOW(), 1, 18, NULL, 94, 3, NULL);
|
||||||
|
|
||||||
|
|
||||||
INSERT INTO `vn`.`expeditionState`(`id`, `created`, `expeditionFk`, `typeFk`, `userFk`)
|
INSERT INTO `vn`.`expeditionState`(`id`, `created`, `expeditionFk`, `typeFk`, `userFk`)
|
||||||
|
@ -1910,7 +1936,7 @@ DROP TEMPORARY TABLE IF EXISTS tmp.worker;
|
||||||
CREATE TEMPORARY TABLE tmp.worker
|
CREATE TEMPORARY TABLE tmp.worker
|
||||||
(PRIMARY KEY (id))
|
(PRIMARY KEY (id))
|
||||||
ENGINE = MEMORY
|
ENGINE = MEMORY
|
||||||
SELECT w.id, w.id as `workerFk`, 'VNL', CONCAT(YEAR(DATE_ADD(CURDATE(), INTERVAL -1 YEAR)), '-12-25'), CONCAT(YEAR(DATE_ADD(CURDATE(), INTERVAL +1 YEAR)), '-12-25'), CONCAT('E-46-', RPAD(CONCAT(w.id, 9), 8, w.id)), NULL as `notes`, NULL as `departmentFk`, 23, 1 as `workerBusinessProfessionalCategoryFk`, 1 as `calendarTypeFk`, 1 as `isHourlyLabor`, 1 as `workerBusinessAgreementFk`, 1 as `workcenterFk`
|
SELECT w.id, w.id as `workerFk`, 'VNL', CONCAT(YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 YEAR)), '-12-25') as started, CONCAT(YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL +1 YEAR)), '-12-25') as ended, CONCAT('E-46-', RPAD(CONCAT(w.id, 9), 8, w.id)), NULL as `notes`, NULL as `departmentFk`, 23, 1 as `workerBusinessProfessionalCategoryFk`, 1 as `calendarTypeFk`, 1 as `isHourlyLabor`, 1 as `workerBusinessAgreementFk`, 1 as `workcenterFk`
|
||||||
FROM `vn`.`worker` `w`;
|
FROM `vn`.`worker` `w`;
|
||||||
|
|
||||||
INSERT INTO `vn`.`business`(`id`, `workerFk`, `companyCodeFk`, `started`, `ended`, `workerBusiness`, `reasonEndFk`, `notes`, `departmentFk`, `workerBusinessProfessionalCategoryFk`, `calendarTypeFk`, `isHourlyLabor`, `workerBusinessAgreementFk`, `workcenterFk`)
|
INSERT INTO `vn`.`business`(`id`, `workerFk`, `companyCodeFk`, `started`, `ended`, `workerBusiness`, `reasonEndFk`, `notes`, `departmentFk`, `workerBusinessProfessionalCategoryFk`, `calendarTypeFk`, `isHourlyLabor`, `workerBusinessAgreementFk`, `workcenterFk`)
|
||||||
|
@ -1920,7 +1946,7 @@ DROP TEMPORARY TABLE IF EXISTS tmp.worker;
|
||||||
CREATE TEMPORARY TABLE tmp.worker
|
CREATE TEMPORARY TABLE tmp.worker
|
||||||
(PRIMARY KEY (id))
|
(PRIMARY KEY (id))
|
||||||
ENGINE = MEMORY
|
ENGINE = MEMORY
|
||||||
SELECT '1111' as 'id', w.id as `workerFk`, 'VNL', CONCAT(YEAR(DATE_ADD(CURDATE(), INTERVAL -2 YEAR)), '-12-25'), CONCAT(YEAR(DATE_ADD(CURDATE(), INTERVAL -1 YEAR)), '-12-24'), CONCAT('E-46-', RPAD(CONCAT(w.id, 9), 8, w.id)), NULL as `notes`, NULL as `departmentFk`, 23, 1 as `workerBusinessProfessionalCategoryFk`, 1 as `calendarTypeFk`, 1 as `isHourlyLabor`, 1 as `workerBusinessAgreementFk`, 1 as `workcenterFk`
|
SELECT '1111' as 'id', w.id as `workerFk`, 'VNL', CONCAT(YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -2 YEAR)), '-12-25') as started, CONCAT(YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 YEAR)) as ended, '-12-24'), CONCAT('E-46-', RPAD(CONCAT(w.id, 9), 8, w.id)), NULL as `notes`, NULL as `departmentFk`, 23, 1 as `workerBusinessProfessionalCategoryFk`, 1 as `calendarTypeFk`, 1 as `isHourlyLabor`, 1 as `workerBusinessAgreementFk`, 1 as `workcenterFk`
|
||||||
FROM `vn`.`worker` `w`
|
FROM `vn`.`worker` `w`
|
||||||
WHERE `w`.`id` = 1109;
|
WHERE `w`.`id` = 1109;
|
||||||
|
|
||||||
|
@ -1954,10 +1980,6 @@ INSERT INTO `vn`.`workerBusinessType` (`id`, `name`, `isFullTime`, `isPermanent`
|
||||||
(100, 'INDEFINIDO A TIEMPO COMPLETO', 1, 1, 1),
|
(100, 'INDEFINIDO A TIEMPO COMPLETO', 1, 1, 1),
|
||||||
(109, 'CONVERSION DE TEMPORAL EN INDEFINIDO T.COMPLETO', 1, 1, 1);
|
(109, 'CONVERSION DE TEMPORAL EN INDEFINIDO T.COMPLETO', 1, 1, 1);
|
||||||
|
|
||||||
INSERT INTO `vn`.`businessCategory` (`id`, `description`, `rate`)
|
|
||||||
VALUES
|
|
||||||
(1, 'basic employee', 1);
|
|
||||||
|
|
||||||
UPDATE `vn`.`business` b
|
UPDATE `vn`.`business` b
|
||||||
SET `rate` = 7,
|
SET `rate` = 7,
|
||||||
`workerBusinessCategoryFk` = 1,
|
`workerBusinessCategoryFk` = 1,
|
||||||
|
@ -2705,7 +2727,10 @@ INSERT INTO `util`.`notificationSubscription` (`notificationFk`, `userFk`)
|
||||||
VALUES
|
VALUES
|
||||||
(1, 1109),
|
(1, 1109),
|
||||||
(1, 1110),
|
(1, 1110),
|
||||||
(3, 1109);
|
(3, 1109),
|
||||||
|
(1,9),
|
||||||
|
(1,3);
|
||||||
|
|
||||||
|
|
||||||
INSERT INTO `vn`.`routeConfig` (`id`, `defaultWorkCenterFk`)
|
INSERT INTO `vn`.`routeConfig` (`id`, `defaultWorkCenterFk`)
|
||||||
VALUES
|
VALUES
|
||||||
|
|
|
@ -3,18 +3,17 @@ USE `util`;
|
||||||
|
|
||||||
DELIMITER ;;
|
DELIMITER ;;
|
||||||
DROP FUNCTION IF EXISTS `util`.`mockedDate`;
|
DROP FUNCTION IF EXISTS `util`.`mockedDate`;
|
||||||
CREATE FUNCTION `util`.`mockedDate`()
|
CREATE FUNCTION `util`.`mockedDate`()
|
||||||
RETURNS DATETIME
|
RETURNS DATETIME
|
||||||
DETERMINISTIC
|
DETERMINISTIC
|
||||||
BEGIN
|
BEGIN
|
||||||
RETURN NOW();
|
RETURN CONVERT_TZ('2001-01-01 11:00:00', 'utc', 'Europe/Madrid');
|
||||||
-- '2022-01-19 08:00:00'
|
|
||||||
END ;;
|
END ;;
|
||||||
DELIMITER ;
|
DELIMITER ;
|
||||||
|
|
||||||
DELIMITER ;;
|
DELIMITER ;;
|
||||||
DROP FUNCTION IF EXISTS `util`.`VN_CURDATE`;
|
DROP FUNCTION IF EXISTS `util`.`VN_CURDATE`;
|
||||||
CREATE FUNCTION `util`.`VN_CURDATE`()
|
CREATE FUNCTION `util`.`VN_CURDATE`()
|
||||||
RETURNS DATE
|
RETURNS DATE
|
||||||
DETERMINISTIC
|
DETERMINISTIC
|
||||||
BEGIN
|
BEGIN
|
||||||
|
@ -24,7 +23,7 @@ DELIMITER ;
|
||||||
|
|
||||||
DELIMITER ;;
|
DELIMITER ;;
|
||||||
DROP FUNCTION IF EXISTS `util`.`VN_CURTIME`;
|
DROP FUNCTION IF EXISTS `util`.`VN_CURTIME`;
|
||||||
CREATE FUNCTION `util`.`VN_CURTIME`()
|
CREATE FUNCTION `util`.`VN_CURTIME`()
|
||||||
RETURNS TIME
|
RETURNS TIME
|
||||||
DETERMINISTIC
|
DETERMINISTIC
|
||||||
BEGIN
|
BEGIN
|
||||||
|
@ -34,10 +33,10 @@ DELIMITER ;
|
||||||
|
|
||||||
DELIMITER ;;
|
DELIMITER ;;
|
||||||
DROP FUNCTION IF EXISTS `util`.`VN_NOW`;
|
DROP FUNCTION IF EXISTS `util`.`VN_NOW`;
|
||||||
CREATE FUNCTION `util`.`VN_NOW`()
|
CREATE FUNCTION `util`.`VN_NOW`()
|
||||||
RETURNS DATETIME
|
RETURNS DATETIME
|
||||||
DETERMINISTIC
|
DETERMINISTIC
|
||||||
BEGIN
|
BEGIN
|
||||||
RETURN mockedDate();
|
RETURN mockedDate();
|
||||||
END ;;
|
END ;;
|
||||||
DELIMITER ;
|
DELIMITER ;
|
||||||
|
|
|
@ -80203,4 +80203,3 @@ USE `vncontrol`;
|
||||||
-- Dump completed on 2022-11-21 7:57:28
|
-- Dump completed on 2022-11-21 7:57:28
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ const app = require('vn-loopback/server/server');
|
||||||
const ParameterizedSQL = require('loopback-connector').ParameterizedSQL;
|
const ParameterizedSQL = require('loopback-connector').ParameterizedSQL;
|
||||||
|
|
||||||
describe('buyUltimate()', () => {
|
describe('buyUltimate()', () => {
|
||||||
const today = new Date();
|
const today = Date.vnNew();
|
||||||
it(`should create buyUltimate temporal table and update it's values`, async() => {
|
it(`should create buyUltimate temporal table and update it's values`, async() => {
|
||||||
let stmts = [];
|
let stmts = [];
|
||||||
let stmt;
|
let stmt;
|
||||||
|
|
|
@ -5,7 +5,7 @@ describe('buyUltimateFromInterval()', () => {
|
||||||
let today;
|
let today;
|
||||||
let future;
|
let future;
|
||||||
beforeAll(() => {
|
beforeAll(() => {
|
||||||
let now = new Date();
|
let now = Date.vnNew();
|
||||||
now.setHours(0, 0, 0, 0);
|
now.setHours(0, 0, 0, 0);
|
||||||
today = now;
|
today = now;
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ const app = require('vn-loopback/server/server');
|
||||||
const ParameterizedSQL = require('loopback-connector').ParameterizedSQL;
|
const ParameterizedSQL = require('loopback-connector').ParameterizedSQL;
|
||||||
|
|
||||||
describe('ticket ticketCalculateClon()', () => {
|
describe('ticket ticketCalculateClon()', () => {
|
||||||
const today = new Date();
|
const today = Date.vnNew();
|
||||||
it('should add the ticket to the order containing the original ticket', async() => {
|
it('should add the ticket to the order containing the original ticket', async() => {
|
||||||
let stmts = [];
|
let stmts = [];
|
||||||
let stmt;
|
let stmt;
|
||||||
|
|
|
@ -2,7 +2,7 @@ const app = require('vn-loopback/server/server');
|
||||||
const ParameterizedSQL = require('loopback-connector').ParameterizedSQL;
|
const ParameterizedSQL = require('loopback-connector').ParameterizedSQL;
|
||||||
|
|
||||||
describe('ticket ticketCreateWithUser()', () => {
|
describe('ticket ticketCreateWithUser()', () => {
|
||||||
const today = new Date();
|
const today = Date.vnNew();
|
||||||
it('should confirm the procedure creates the expected ticket', async() => {
|
it('should confirm the procedure creates the expected ticket', async() => {
|
||||||
let stmts = [];
|
let stmts = [];
|
||||||
let stmt;
|
let stmt;
|
||||||
|
|
|
@ -3,9 +3,9 @@ const ParameterizedSQL = require('loopback-connector').ParameterizedSQL;
|
||||||
|
|
||||||
describe('timeBusiness_calculateByUser()', () => {
|
describe('timeBusiness_calculateByUser()', () => {
|
||||||
it('should return the expected hours for today', async() => {
|
it('should return the expected hours for today', async() => {
|
||||||
let start = new Date();
|
let start = Date.vnNew();
|
||||||
start.setHours(0, 0, 0, 0);
|
start.setHours(0, 0, 0, 0);
|
||||||
let end = new Date();
|
let end = Date.vnNew();
|
||||||
end.setHours(0, 0, 0, 0);
|
end.setHours(0, 0, 0, 0);
|
||||||
|
|
||||||
let stmts = [];
|
let stmts = [];
|
||||||
|
|
|
@ -3,11 +3,11 @@ const ParameterizedSQL = require('loopback-connector').ParameterizedSQL;
|
||||||
|
|
||||||
describe('timeControl_calculateByUser()', () => {
|
describe('timeControl_calculateByUser()', () => {
|
||||||
it(`should return today's worked hours`, async() => {
|
it(`should return today's worked hours`, async() => {
|
||||||
let start = new Date();
|
let start = Date.vnNew();
|
||||||
start.setHours(0, 0, 0, 0);
|
start.setHours(0, 0, 0, 0);
|
||||||
start.setDate(start.getDate() - 1);
|
start.setDate(start.getDate() - 1);
|
||||||
|
|
||||||
let end = new Date();
|
let end = Date.vnNew();
|
||||||
end.setHours(0, 0, 0, 0);
|
end.setHours(0, 0, 0, 0);
|
||||||
end.setDate(end.getDate() + 1);
|
end.setDate(end.getDate() + 1);
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ describe('timeControl_calculateByUser()', () => {
|
||||||
stmts.push('START TRANSACTION');
|
stmts.push('START TRANSACTION');
|
||||||
|
|
||||||
stmts.push(`
|
stmts.push(`
|
||||||
DROP TEMPORARY TABLE IF EXISTS
|
DROP TEMPORARY TABLE IF EXISTS
|
||||||
tmp.timeControlCalculate,
|
tmp.timeControlCalculate,
|
||||||
tmp.timeBusinessCalculate
|
tmp.timeBusinessCalculate
|
||||||
`);
|
`);
|
||||||
|
@ -48,14 +48,14 @@ describe('timeControl_calculateByUser()', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it(`should return the worked hours between last sunday and monday`, async() => {
|
it(`should return the worked hours between last sunday and monday`, async() => {
|
||||||
let lastSunday = new Date();
|
let lastSunday = Date.vnNew();
|
||||||
let daysSinceSunday = lastSunday.getDay();
|
let daysSinceSunday = lastSunday.getDay();
|
||||||
if (daysSinceSunday === 0) // this means today is sunday but you need the previous sunday :)
|
if (daysSinceSunday === 0) // this means today is sunday but you need the previous sunday :)
|
||||||
daysSinceSunday = 7;
|
daysSinceSunday = 7;
|
||||||
lastSunday.setHours(23, 0, 0, 0);
|
lastSunday.setHours(23, 0, 0, 0);
|
||||||
lastSunday.setDate(lastSunday.getDate() - daysSinceSunday);
|
lastSunday.setDate(lastSunday.getDate() - daysSinceSunday);
|
||||||
|
|
||||||
let monday = new Date();
|
let monday = Date.vnNew();
|
||||||
let daysSinceMonday = daysSinceSunday - 1; // aiming for monday (today could be monday)
|
let daysSinceMonday = daysSinceSunday - 1; // aiming for monday (today could be monday)
|
||||||
monday.setHours(7, 0, 0, 0);
|
monday.setHours(7, 0, 0, 0);
|
||||||
monday.setDate(monday.getDate() - daysSinceMonday);
|
monday.setDate(monday.getDate() - daysSinceMonday);
|
||||||
|
@ -66,7 +66,7 @@ describe('timeControl_calculateByUser()', () => {
|
||||||
stmts.push('START TRANSACTION');
|
stmts.push('START TRANSACTION');
|
||||||
|
|
||||||
stmts.push(`
|
stmts.push(`
|
||||||
DROP TEMPORARY TABLE IF EXISTS
|
DROP TEMPORARY TABLE IF EXISTS
|
||||||
tmp.timeControlCalculate,
|
tmp.timeControlCalculate,
|
||||||
tmp.timeBusinessCalculate
|
tmp.timeBusinessCalculate
|
||||||
`);
|
`);
|
||||||
|
|
|
@ -6,7 +6,7 @@ describe('zone zone_getLanded()', () => {
|
||||||
let stmts = [];
|
let stmts = [];
|
||||||
let stmt;
|
let stmt;
|
||||||
stmts.push('START TRANSACTION');
|
stmts.push('START TRANSACTION');
|
||||||
const date = new Date();
|
const date = Date.vnNew();
|
||||||
date.setHours(0, 0, 0, 0);
|
date.setHours(0, 0, 0, 0);
|
||||||
|
|
||||||
let params = {
|
let params = {
|
||||||
|
@ -40,7 +40,7 @@ describe('zone zone_getLanded()', () => {
|
||||||
it(`should return data for a shipped tomorrow`, async() => {
|
it(`should return data for a shipped tomorrow`, async() => {
|
||||||
let stmts = [];
|
let stmts = [];
|
||||||
let stmt;
|
let stmt;
|
||||||
const date = new Date();
|
const date = Date.vnNew();
|
||||||
date.setHours(0, 0, 0, 0);
|
date.setHours(0, 0, 0, 0);
|
||||||
|
|
||||||
stmts.push('START TRANSACTION');
|
stmts.push('START TRANSACTION');
|
||||||
|
|
|
@ -436,7 +436,7 @@ let actions = {
|
||||||
},
|
},
|
||||||
|
|
||||||
pickDate: async function(selector, date) {
|
pickDate: async function(selector, date) {
|
||||||
date = date || new Date();
|
date = date || Date.vnNew();
|
||||||
|
|
||||||
const timeZoneOffset = date.getTimezoneOffset() * 60000;
|
const timeZoneOffset = date.getTimezoneOffset() * 60000;
|
||||||
const localDate = (new Date(date.getTime() - timeZoneOffset))
|
const localDate = (new Date(date.getTime() - timeZoneOffset))
|
||||||
|
|
|
@ -31,7 +31,7 @@ export default {
|
||||||
},
|
},
|
||||||
recoverPassword: {
|
recoverPassword: {
|
||||||
recoverPasswordButton: 'vn-login a[ui-sref="recover-password"]',
|
recoverPasswordButton: 'vn-login a[ui-sref="recover-password"]',
|
||||||
email: 'vn-recover-password vn-textfield[ng-model="$ctrl.email"]',
|
email: 'vn-recover-password vn-textfield[ng-model="$ctrl.user"]',
|
||||||
sendEmailButton: 'vn-recover-password vn-submit',
|
sendEmailButton: 'vn-recover-password vn-submit',
|
||||||
},
|
},
|
||||||
accountIndex: {
|
accountIndex: {
|
||||||
|
@ -562,15 +562,15 @@ export default {
|
||||||
payoutBank: '.vn-dialog vn-autocomplete[ng-model="$ctrl.bankFk"]',
|
payoutBank: '.vn-dialog vn-autocomplete[ng-model="$ctrl.bankFk"]',
|
||||||
payoutDescription: 'vn-textfield[ng-model="$ctrl.receipt.description"]',
|
payoutDescription: 'vn-textfield[ng-model="$ctrl.receipt.description"]',
|
||||||
submitPayout: '.vn-dialog button[response="accept"]',
|
submitPayout: '.vn-dialog button[response="accept"]',
|
||||||
searchWeeklyResult: 'vn-ticket-weekly-index vn-table vn-tbody > vn-tr',
|
searchWeeklyResult: 'vn-ticket-weekly-index vn-card smart-table slot-table table tbody tr',
|
||||||
searchResultDate: 'vn-ticket-summary [label=Landed] span',
|
searchResultDate: 'vn-ticket-summary [label=Landed] span',
|
||||||
topbarSearch: 'vn-searchbar',
|
topbarSearch: 'vn-searchbar',
|
||||||
moreMenu: 'vn-ticket-index vn-icon-button[icon=more_vert]',
|
moreMenu: 'vn-ticket-index vn-icon-button[icon=more_vert]',
|
||||||
fourthWeeklyTicket: 'vn-ticket-weekly-index vn-table vn-tbody vn-tr:nth-child(4)',
|
fourthWeeklyTicket: 'vn-ticket-weekly-index vn-card smart-table slot-table tr:nth-child(4)',
|
||||||
fiveWeeklyTicket: 'vn-ticket-weekly-index vn-table vn-tbody vn-tr:nth-child(5)',
|
fiveWeeklyTicket: 'vn-ticket-weekly-index vn-card smart-table slot-table tr:nth-child(5)',
|
||||||
weeklyTicket: 'vn-ticket-weekly-index vn-table > div > vn-tbody > vn-tr',
|
weeklyTicket: 'vn-ticket-weekly-index vn-card smart-table slot-table table tbody tr',
|
||||||
firstWeeklyTicketDeleteIcon: 'vn-ticket-weekly-index vn-tr:nth-child(1) vn-icon-button[icon="delete"]',
|
firstWeeklyTicketDeleteIcon: 'vn-ticket-weekly-index vn-card smart-table slot-table tr:nth-child(1) vn-icon-button[icon="delete"]',
|
||||||
firstWeeklyTicketAgency: 'vn-ticket-weekly-index vn-tr:nth-child(1) [ng-model="weekly.agencyModeFk"]',
|
firstWeeklyTicketAgency: 'vn-ticket-weekly-index vn-card smart-table slot-table tr:nth-child(1) [ng-model="weekly.agencyModeFk"]',
|
||||||
acceptDeleteTurn: '.vn-confirm.shown button[response="accept"]'
|
acceptDeleteTurn: '.vn-confirm.shown button[response="accept"]'
|
||||||
},
|
},
|
||||||
createTicketView: {
|
createTicketView: {
|
||||||
|
@ -778,8 +778,8 @@ export default {
|
||||||
ipt: 'vn-autocomplete[label="Destination IPT"]',
|
ipt: 'vn-autocomplete[label="Destination IPT"]',
|
||||||
tableIpt: 'vn-autocomplete[name="ipt"]',
|
tableIpt: 'vn-autocomplete[name="ipt"]',
|
||||||
tableFutureIpt: 'vn-autocomplete[name="futureIpt"]',
|
tableFutureIpt: 'vn-autocomplete[name="futureIpt"]',
|
||||||
futureState: 'vn-autocomplete[label="Origin Grouped State"]',
|
futureState: 'vn-check[label="Pending Origin"]',
|
||||||
state: 'vn-autocomplete[label="Destination Grouped State"]',
|
state: 'vn-check[label="Pending Destination"]',
|
||||||
warehouseFk: 'vn-autocomplete[label="Warehouse"]',
|
warehouseFk: 'vn-autocomplete[label="Warehouse"]',
|
||||||
tableButtonSearch: 'vn-button[vn-tooltip="Search"]',
|
tableButtonSearch: 'vn-button[vn-tooltip="Search"]',
|
||||||
moveButton: 'vn-button[vn-tooltip="Advance tickets"]',
|
moveButton: 'vn-button[vn-tooltip="Advance tickets"]',
|
||||||
|
@ -944,9 +944,9 @@ export default {
|
||||||
routeSummary: {
|
routeSummary: {
|
||||||
header: 'vn-route-summary > vn-card > h5',
|
header: 'vn-route-summary > vn-card > h5',
|
||||||
cost: 'vn-route-summary vn-label-value[label="Cost"]',
|
cost: 'vn-route-summary vn-label-value[label="Cost"]',
|
||||||
firstTicketID: 'vn-route-summary vn-tbody > vn-tr:nth-child(1) > vn-td:nth-child(2) > span',
|
firstTicketID: 'vn-route-summary vn-tbody > vn-tr:nth-child(1) > vn-td:nth-child(10) > span',
|
||||||
firstTicketDescriptor: '.vn-popover.shown vn-ticket-descriptor',
|
firstTicketDescriptor: '.vn-popover.shown vn-ticket-descriptor',
|
||||||
firstAlias: 'vn-route-summary vn-tbody > vn-tr:nth-child(1) > vn-td:nth-child(3) > span',
|
firstAlias: 'vn-route-summary vn-tbody > vn-tr:nth-child(1) > vn-td:nth-child(5) > span',
|
||||||
firstClientDescriptor: '.vn-popover.shown vn-client-descriptor',
|
firstClientDescriptor: '.vn-popover.shown vn-client-descriptor',
|
||||||
goToRouteSummaryButton: 'vn-route-summary > vn-card > h5 > a',
|
goToRouteSummaryButton: 'vn-route-summary > vn-card > h5 > a',
|
||||||
|
|
||||||
|
@ -1260,6 +1260,21 @@ export default {
|
||||||
importBuysButton: 'vn-entry-buy-import button[type="submit"]'
|
importBuysButton: 'vn-entry-buy-import button[type="submit"]'
|
||||||
},
|
},
|
||||||
entryLatestBuys: {
|
entryLatestBuys: {
|
||||||
|
table: 'tbody > tr:not(.empty-rows)',
|
||||||
|
chip: 'vn-chip > vn-icon',
|
||||||
|
generalSearchInput: 'vn-textfield[ng-model="$ctrl.filter.search"]',
|
||||||
|
firstReignIcon: 'vn-horizontal.item-category vn-one',
|
||||||
|
typeInput: 'vn-autocomplete[ng-model="$ctrl.filter.typeFk"]',
|
||||||
|
salesPersonInput: 'vn-autocomplete[ng-model="$ctrl.filter.salesPersonFk"]',
|
||||||
|
supplierInput: 'vn-autocomplete[ng-model="$ctrl.filter.supplierFk"]',
|
||||||
|
fromInput: 'vn-date-picker[ng-model="$ctrl.filter.from"]',
|
||||||
|
toInput: 'vn-date-picker[ng-model="$ctrl.filter.to"]',
|
||||||
|
activeCheck: 'vn-check[ng-model="$ctrl.filter.active"]',
|
||||||
|
floramondoCheck: 'vn-check[ng-model="$ctrl.filter.floramondo"]',
|
||||||
|
visibleCheck: 'vn-check[ng-model="$ctrl.filter.visible"]',
|
||||||
|
addTagButton: 'vn-icon-button[vn-tooltip="Add tag"]',
|
||||||
|
itemTagInput: 'vn-autocomplete[ng-model="itemTag.tagFk"]',
|
||||||
|
itemTagValueInput: 'vn-autocomplete[ng-model="itemTag.value"]',
|
||||||
firstBuy: 'vn-entry-latest-buys tbody > tr:nth-child(1)',
|
firstBuy: 'vn-entry-latest-buys tbody > tr:nth-child(1)',
|
||||||
allBuysCheckBox: 'vn-entry-latest-buys thead vn-check',
|
allBuysCheckBox: 'vn-entry-latest-buys thead vn-check',
|
||||||
secondBuyCheckBox: 'vn-entry-latest-buys tbody tr:nth-child(2) vn-check[ng-model="buy.checked"]',
|
secondBuyCheckBox: 'vn-entry-latest-buys tbody tr:nth-child(2) vn-check[ng-model="buy.checked"]',
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
require('@babel/register')({presets: ['@babel/env']});
|
require('@babel/register')({presets: ['@babel/env']});
|
||||||
require('core-js/stable');
|
require('core-js/stable');
|
||||||
require('regenerator-runtime/runtime');
|
require('regenerator-runtime/runtime');
|
||||||
|
require('vn-loopback/server/boot/date')();
|
||||||
|
|
||||||
const axios = require('axios');
|
const axios = require('axios');
|
||||||
const Docker = require('../../db/docker.js');
|
const Docker = require('../../db/docker.js');
|
||||||
|
|
|
@ -26,7 +26,7 @@ describe('RecoverPassword path', async() => {
|
||||||
expect(message.text).toContain('Notification sent!');
|
expect(message.text).toContain('Notification sent!');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should send email', async() => {
|
it('should send email using email', async() => {
|
||||||
await page.waitForState('login');
|
await page.waitForState('login');
|
||||||
await page.waitToClick(selectors.recoverPassword.recoverPasswordButton);
|
await page.waitToClick(selectors.recoverPassword.recoverPasswordButton);
|
||||||
|
|
||||||
|
@ -37,4 +37,16 @@ describe('RecoverPassword path', async() => {
|
||||||
|
|
||||||
expect(message.text).toContain('Notification sent!');
|
expect(message.text).toContain('Notification sent!');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should send email using username', async() => {
|
||||||
|
await page.waitForState('login');
|
||||||
|
await page.waitToClick(selectors.recoverPassword.recoverPasswordButton);
|
||||||
|
|
||||||
|
await page.write(selectors.recoverPassword.email, 'BruceWayne');
|
||||||
|
await page.waitToClick(selectors.recoverPassword.sendEmailButton);
|
||||||
|
const message = await page.waitForSnackbar();
|
||||||
|
await page.waitForState('login');
|
||||||
|
|
||||||
|
expect(message.text).toContain('Notification sent!');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -4,7 +4,7 @@ import getBrowser from '../../helpers/puppeteer';
|
||||||
describe('Client credit insurance path', () => {
|
describe('Client credit insurance path', () => {
|
||||||
let browser;
|
let browser;
|
||||||
let page;
|
let page;
|
||||||
let previousMonth = new Date();
|
let previousMonth = Date.vnNew();
|
||||||
previousMonth.setMonth(previousMonth.getMonth() - 1);
|
previousMonth.setMonth(previousMonth.getMonth() - 1);
|
||||||
|
|
||||||
beforeAll(async() => {
|
beforeAll(async() => {
|
||||||
|
|
|
@ -22,7 +22,7 @@ describe('Worker time control path', () => {
|
||||||
const hankPymId = 1107;
|
const hankPymId = 1107;
|
||||||
|
|
||||||
it('should go to the next month, go to current month and go 1 month in the past', async() => {
|
it('should go to the next month, go to current month and go 1 month in the past', async() => {
|
||||||
let date = new Date();
|
let date = Date.vnNew();
|
||||||
date.setDate(1);
|
date.setDate(1);
|
||||||
date.setMonth(date.getMonth() + 1);
|
date.setMonth(date.getMonth() + 1);
|
||||||
let month = date.toLocaleString('default', {month: 'long'});
|
let month = date.toLocaleString('default', {month: 'long'});
|
||||||
|
@ -32,7 +32,7 @@ describe('Worker time control path', () => {
|
||||||
|
|
||||||
expect(result).toContain(month);
|
expect(result).toContain(month);
|
||||||
|
|
||||||
date = new Date();
|
date = Date.vnNew();
|
||||||
date.setDate(1);
|
date.setDate(1);
|
||||||
month = date.toLocaleString('default', {month: 'long'});
|
month = date.toLocaleString('default', {month: 'long'});
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ describe('Worker time control path', () => {
|
||||||
|
|
||||||
expect(result).toContain(month);
|
expect(result).toContain(month);
|
||||||
|
|
||||||
date = new Date();
|
date = Date.vnNew();
|
||||||
date.setDate(1);
|
date.setDate(1);
|
||||||
date.setMonth(date.getMonth() - 1);
|
date.setMonth(date.getMonth() - 1);
|
||||||
const timestamp = Math.round(date.getTime() / 1000);
|
const timestamp = Math.round(date.getTime() / 1000);
|
||||||
|
|
|
@ -4,7 +4,7 @@ import getBrowser from '../../helpers/puppeteer';
|
||||||
|
|
||||||
describe('Worker calendar path', () => {
|
describe('Worker calendar path', () => {
|
||||||
const reasonableTimeBetweenClicks = 300;
|
const reasonableTimeBetweenClicks = 300;
|
||||||
const date = new Date();
|
const date = Date.vnNew();
|
||||||
const lastYear = (date.getFullYear() - 1).toString();
|
const lastYear = (date.getFullYear() - 1).toString();
|
||||||
|
|
||||||
let browser;
|
let browser;
|
||||||
|
|
|
@ -22,7 +22,7 @@ describe('Item fixed prices path', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should fill the fixed price data', async() => {
|
it('should fill the fixed price data', async() => {
|
||||||
const now = new Date();
|
const now = Date.vnNew();
|
||||||
await page.autocompleteSearch(selectors.itemFixedPrice.fourthWarehouse, 'Warehouse one');
|
await page.autocompleteSearch(selectors.itemFixedPrice.fourthWarehouse, 'Warehouse one');
|
||||||
await page.writeOnEditableTD(selectors.itemFixedPrice.fourthGroupingPrice, '1');
|
await page.writeOnEditableTD(selectors.itemFixedPrice.fourthGroupingPrice, '1');
|
||||||
await page.writeOnEditableTD(selectors.itemFixedPrice.fourthPackingPrice, '1');
|
await page.writeOnEditableTD(selectors.itemFixedPrice.fourthPackingPrice, '1');
|
||||||
|
|
|
@ -93,7 +93,7 @@ describe('Ticket Edit basic data path', () => {
|
||||||
|
|
||||||
it(`should split ticket without negatives`, async() => {
|
it(`should split ticket without negatives`, async() => {
|
||||||
const newAgency = 'Gotham247';
|
const newAgency = 'Gotham247';
|
||||||
const newDate = new Date();
|
const newDate = Date.vnNew();
|
||||||
newDate.setDate(newDate.getDate() - 1);
|
newDate.setDate(newDate.getDate() - 1);
|
||||||
|
|
||||||
await page.accessToSearchResult('14');
|
await page.accessToSearchResult('14');
|
||||||
|
@ -127,7 +127,7 @@ describe('Ticket Edit basic data path', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it(`should old ticket have old date and agency`, async() => {
|
it(`should old ticket have old date and agency`, async() => {
|
||||||
const oldDate = new Date();
|
const oldDate = Date.vnNew();
|
||||||
const oldAgency = 'Super-Man delivery';
|
const oldAgency = 'Super-Man delivery';
|
||||||
|
|
||||||
await page.accessToSearchResult('14');
|
await page.accessToSearchResult('14');
|
||||||
|
|
|
@ -4,7 +4,7 @@ import getBrowser from '../../helpers/puppeteer';
|
||||||
describe('Ticket create path', () => {
|
describe('Ticket create path', () => {
|
||||||
let browser;
|
let browser;
|
||||||
let page;
|
let page;
|
||||||
let nextMonth = new Date();
|
let nextMonth = Date.vnNew();
|
||||||
nextMonth.setMonth(nextMonth.getMonth() + 1);
|
nextMonth.setMonth(nextMonth.getMonth() + 1);
|
||||||
|
|
||||||
beforeAll(async() => {
|
beforeAll(async() => {
|
||||||
|
|
|
@ -63,6 +63,6 @@ describe('Ticket index payout path', () => {
|
||||||
const reference = await page.waitToGetProperty(selectors.clientBalance.firstLineReference, 'innerText');
|
const reference = await page.waitToGetProperty(selectors.clientBalance.firstLineReference, 'innerText');
|
||||||
|
|
||||||
expect(count).toEqual(4);
|
expect(count).toEqual(4);
|
||||||
expect(reference).toContain('Cash, Albaran: 7, 8Payment');
|
expect(reference).toContain('Cash,Albaran: 7, 8Payment');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -50,7 +50,7 @@ describe('Ticket Advance path', () => {
|
||||||
await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
|
await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
|
||||||
await page.autocompleteSearch(selectors.ticketAdvance.ipt, 'Horizontal');
|
await page.autocompleteSearch(selectors.ticketAdvance.ipt, 'Horizontal');
|
||||||
await page.waitToClick(selectors.ticketAdvance.submit);
|
await page.waitToClick(selectors.ticketAdvance.submit);
|
||||||
await page.waitForNumberOfElements(selectors.ticketAdvance.table, 0);
|
await page.waitForNumberOfElements(selectors.ticketAdvance.table, 1);
|
||||||
|
|
||||||
await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
|
await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
|
||||||
await page.clearInput(selectors.ticketAdvance.ipt);
|
await page.clearInput(selectors.ticketAdvance.ipt);
|
||||||
|
@ -62,7 +62,7 @@ describe('Ticket Advance path', () => {
|
||||||
await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
|
await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
|
||||||
await page.autocompleteSearch(selectors.ticketAdvance.futureIpt, 'Horizontal');
|
await page.autocompleteSearch(selectors.ticketAdvance.futureIpt, 'Horizontal');
|
||||||
await page.waitToClick(selectors.ticketAdvance.submit);
|
await page.waitToClick(selectors.ticketAdvance.submit);
|
||||||
await page.waitForNumberOfElements(selectors.ticketAdvance.table, 0);
|
await page.waitForNumberOfElements(selectors.ticketAdvance.table, 1);
|
||||||
|
|
||||||
await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
|
await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
|
||||||
await page.clearInput(selectors.ticketAdvance.futureIpt);
|
await page.clearInput(selectors.ticketAdvance.futureIpt);
|
||||||
|
@ -70,26 +70,36 @@ describe('Ticket Advance path', () => {
|
||||||
await page.waitForNumberOfElements(selectors.ticketAdvance.table, 1);
|
await page.waitForNumberOfElements(selectors.ticketAdvance.table, 1);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should search with the origin grouped state', async() => {
|
it('should search with the origin pending state', async() => {
|
||||||
await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
|
await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
|
||||||
await page.autocompleteSearch(selectors.ticketAdvance.futureState, 'Free');
|
await page.waitToClick(selectors.ticketAdvance.futureState);
|
||||||
await page.waitToClick(selectors.ticketAdvance.submit);
|
await page.waitToClick(selectors.ticketAdvance.submit);
|
||||||
await page.waitForNumberOfElements(selectors.ticketAdvance.table, 1);
|
await page.waitForNumberOfElements(selectors.ticketAdvance.table, 1);
|
||||||
|
|
||||||
await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
|
await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
|
||||||
await page.clearInput(selectors.ticketAdvance.futureState);
|
await page.waitToClick(selectors.ticketAdvance.futureState);
|
||||||
|
await page.waitToClick(selectors.ticketAdvance.submit);
|
||||||
|
await page.waitForNumberOfElements(selectors.ticketAdvance.table, 0);
|
||||||
|
|
||||||
|
await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
|
||||||
|
await page.waitToClick(selectors.ticketAdvance.futureState);
|
||||||
await page.waitToClick(selectors.ticketAdvance.submit);
|
await page.waitToClick(selectors.ticketAdvance.submit);
|
||||||
await page.waitForNumberOfElements(selectors.ticketAdvance.table, 1);
|
await page.waitForNumberOfElements(selectors.ticketAdvance.table, 1);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should search with the destination grouped state', async() => {
|
it('should search with the destination grouped state', async() => {
|
||||||
await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
|
await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
|
||||||
await page.autocompleteSearch(selectors.ticketAdvance.state, 'Free');
|
await page.waitToClick(selectors.ticketAdvance.state);
|
||||||
await page.waitToClick(selectors.ticketAdvance.submit);
|
await page.waitToClick(selectors.ticketAdvance.submit);
|
||||||
await page.waitForNumberOfElements(selectors.ticketAdvance.table, 0);
|
await page.waitForNumberOfElements(selectors.ticketAdvance.table, 0);
|
||||||
|
|
||||||
await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
|
await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
|
||||||
await page.clearInput(selectors.ticketAdvance.state);
|
await page.waitToClick(selectors.ticketAdvance.state);
|
||||||
|
await page.waitToClick(selectors.ticketAdvance.submit);
|
||||||
|
await page.waitForNumberOfElements(selectors.ticketAdvance.table, 1);
|
||||||
|
|
||||||
|
await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
|
||||||
|
await page.waitToClick(selectors.ticketAdvance.state);
|
||||||
await page.waitToClick(selectors.ticketAdvance.submit);
|
await page.waitToClick(selectors.ticketAdvance.submit);
|
||||||
await page.waitForNumberOfElements(selectors.ticketAdvance.table, 1);
|
await page.waitForNumberOfElements(selectors.ticketAdvance.table, 1);
|
||||||
});
|
});
|
||||||
|
@ -116,42 +126,7 @@ describe('Ticket Advance path', () => {
|
||||||
await page.waitForNumberOfElements(selectors.ticketAdvance.table, 1);
|
await page.waitForNumberOfElements(selectors.ticketAdvance.table, 1);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should search in smart-table with stock', async() => {
|
it('should check the one ticket and move to the present', async() => {
|
||||||
await page.waitToClick(selectors.ticketAdvance.tableButtonSearch);
|
|
||||||
await page.write(selectors.ticketAdvance.tableStock, '5');
|
|
||||||
await page.waitForNumberOfElements(selectors.ticketAdvance.table, 2);
|
|
||||||
|
|
||||||
await page.waitToClick(selectors.ticketAdvance.tableButtonSearch);
|
|
||||||
await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
|
|
||||||
await page.waitToClick(selectors.ticketAdvance.submit);
|
|
||||||
await page.waitForNumberOfElements(selectors.ticketAdvance.table, 1);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should search in smart-table with especified Lines', async() => {
|
|
||||||
await page.waitToClick(selectors.ticketAdvance.tableButtonSearch);
|
|
||||||
await page.write(selectors.ticketAdvance.tableLines, '0');
|
|
||||||
await page.keyboard.press('Enter');
|
|
||||||
await page.waitForNumberOfElements(selectors.ticketAdvance.table, 1);
|
|
||||||
|
|
||||||
await page.waitToClick(selectors.ticketAdvance.tableButtonSearch);
|
|
||||||
await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
|
|
||||||
await page.waitToClick(selectors.ticketAdvance.submit);
|
|
||||||
await page.waitForNumberOfElements(selectors.ticketAdvance.table, 1);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should search in smart-table with especified Liters', async() => {
|
|
||||||
await page.waitToClick(selectors.ticketAdvance.tableButtonSearch);
|
|
||||||
await page.write(selectors.ticketAdvance.tableLiters, '0');
|
|
||||||
await page.keyboard.press('Enter');
|
|
||||||
await page.waitForNumberOfElements(selectors.ticketAdvance.table, 1);
|
|
||||||
|
|
||||||
await page.waitToClick(selectors.ticketAdvance.tableButtonSearch);
|
|
||||||
await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
|
|
||||||
await page.waitToClick(selectors.ticketAdvance.submit);
|
|
||||||
await page.waitForNumberOfElements(selectors.ticketAdvance.table, 1);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should check the three last tickets and move to the future', async() => {
|
|
||||||
await page.waitToClick(selectors.ticketAdvance.multiCheck);
|
await page.waitToClick(selectors.ticketAdvance.multiCheck);
|
||||||
await page.waitToClick(selectors.ticketAdvance.moveButton);
|
await page.waitToClick(selectors.ticketAdvance.moveButton);
|
||||||
await page.waitToClick(selectors.ticketAdvance.acceptButton);
|
await page.waitToClick(selectors.ticketAdvance.acceptButton);
|
||||||
|
|
|
@ -18,7 +18,7 @@ describe('Route basic Data path', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should edit the route basic data', async() => {
|
it('should edit the route basic data', async() => {
|
||||||
const nextMonth = new Date();
|
const nextMonth = Date.vnNew();
|
||||||
nextMonth.setMonth(nextMonth.getMonth() + 1);
|
nextMonth.setMonth(nextMonth.getMonth() + 1);
|
||||||
|
|
||||||
await page.autocompleteSearch(selectors.routeBasicData.worker, 'adminBossNick');
|
await page.autocompleteSearch(selectors.routeBasicData.worker, 'adminBossNick');
|
||||||
|
|
|
@ -19,7 +19,7 @@ describe('InvoiceIn basic data path', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it(`should edit the invoiceIn basic data`, async() => {
|
it(`should edit the invoiceIn basic data`, async() => {
|
||||||
const now = new Date();
|
const now = Date.vnNew();
|
||||||
await page.pickDate(selectors.invoiceInBasicData.issued, now);
|
await page.pickDate(selectors.invoiceInBasicData.issued, now);
|
||||||
await page.pickDate(selectors.invoiceInBasicData.operated, now);
|
await page.pickDate(selectors.invoiceInBasicData.operated, now);
|
||||||
await page.autocompleteSearch(selectors.invoiceInBasicData.supplier, 'Verdnatura');
|
await page.autocompleteSearch(selectors.invoiceInBasicData.supplier, 'Verdnatura');
|
||||||
|
|
|
@ -100,7 +100,7 @@ describe('InvoiceOut descriptor path', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it(`should check the invoiceOut booked in the summary data`, async() => {
|
it(`should check the invoiceOut booked in the summary data`, async() => {
|
||||||
let today = new Date();
|
let today = Date.vnNew();
|
||||||
|
|
||||||
let day = today.getDate();
|
let day = today.getDate();
|
||||||
if (day < 10) day = `0${day}`;
|
if (day < 10) day = `0${day}`;
|
||||||
|
|
|
@ -4,7 +4,7 @@ import getBrowser from '../../helpers/puppeteer';
|
||||||
describe('Travel create path', () => {
|
describe('Travel create path', () => {
|
||||||
let browser;
|
let browser;
|
||||||
let page;
|
let page;
|
||||||
const date = new Date();
|
const date = Date.vnNew();
|
||||||
const day = 15;
|
const day = 15;
|
||||||
date.setDate(day);
|
date.setDate(day);
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ describe('Travel basic data path', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should set a wrong delivery date then receive an error on submit', async() => {
|
it('should set a wrong delivery date then receive an error on submit', async() => {
|
||||||
const lastMonth = new Date();
|
const lastMonth = Date.vnNew();
|
||||||
lastMonth.setMonth(lastMonth.getMonth() - 1);
|
lastMonth.setMonth(lastMonth.getMonth() - 1);
|
||||||
|
|
||||||
await page.pickDate(selectors.travelBasicData.deliveryDate, lastMonth);
|
await page.pickDate(selectors.travelBasicData.deliveryDate, lastMonth);
|
||||||
|
|
|
@ -123,7 +123,7 @@ describe('Travel descriptor path', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should update the landed date to a future date to enable cloneWithEntries', async() => {
|
it('should update the landed date to a future date to enable cloneWithEntries', async() => {
|
||||||
const nextMonth = new Date();
|
const nextMonth = Date.vnNew();
|
||||||
nextMonth.setMonth(nextMonth.getMonth() + 1);
|
nextMonth.setMonth(nextMonth.getMonth() + 1);
|
||||||
await page.pickDate(selectors.travelBasicData.deliveryDate, nextMonth);
|
await page.pickDate(selectors.travelBasicData.deliveryDate, nextMonth);
|
||||||
await page.waitToClick(selectors.travelBasicData.save);
|
await page.waitToClick(selectors.travelBasicData.save);
|
||||||
|
|
|
@ -4,10 +4,15 @@ import getBrowser from '../../helpers/puppeteer';
|
||||||
describe('Entry lastest buys path', () => {
|
describe('Entry lastest buys path', () => {
|
||||||
let browser;
|
let browser;
|
||||||
let page;
|
let page;
|
||||||
|
const httpRequests = [];
|
||||||
|
|
||||||
beforeAll(async() => {
|
beforeAll(async() => {
|
||||||
browser = await getBrowser();
|
browser = await getBrowser();
|
||||||
page = browser.page;
|
page = browser.page;
|
||||||
|
page.on('request', req => {
|
||||||
|
if (req.url().includes(`Buys/latestBuysFilter`))
|
||||||
|
httpRequests.push(req.url());
|
||||||
|
});
|
||||||
await page.loginAndModule('buyer', 'entry');
|
await page.loginAndModule('buyer', 'entry');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -20,6 +25,87 @@ describe('Entry lastest buys path', () => {
|
||||||
await page.waitForSelector(selectors.entryLatestBuys.editBuysButton, {visible: false});
|
await page.waitForSelector(selectors.entryLatestBuys.editBuysButton, {visible: false});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should filter by name', async() => {
|
||||||
|
await page.write(selectors.entryLatestBuys.generalSearchInput, 'Melee');
|
||||||
|
await page.keyboard.press('Enter');
|
||||||
|
await page.waitToClick(selectors.entryLatestBuys.chip);
|
||||||
|
|
||||||
|
expect(httpRequests.find(req => req.includes(('search=Melee')))).toBeDefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should filter by reign and type', async() => {
|
||||||
|
await page.click(selectors.entryLatestBuys.firstReignIcon);
|
||||||
|
await page.autocompleteSearch(selectors.entryLatestBuys.typeInput, 'Alstroemeria');
|
||||||
|
await page.click(selectors.entryLatestBuys.chip);
|
||||||
|
|
||||||
|
expect(httpRequests.find(req => req.includes(('categoryFk')))).toBeDefined();
|
||||||
|
expect(httpRequests.find(req => req.includes(('typeFk')))).toBeDefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should filter by from date', async() => {
|
||||||
|
await page.pickDate(selectors.entryLatestBuys.fromInput, new Date());
|
||||||
|
await page.waitToClick(selectors.entryLatestBuys.chip);
|
||||||
|
|
||||||
|
expect(httpRequests.find(req => req.includes(('from')))).toBeDefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should filter by to date', async() => {
|
||||||
|
await page.pickDate(selectors.entryLatestBuys.toInput, new Date());
|
||||||
|
await page.waitToClick(selectors.entryLatestBuys.chip);
|
||||||
|
|
||||||
|
expect(httpRequests.find(req => req.includes(('to')))).toBeDefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should filter by sales person', async() => {
|
||||||
|
await page.autocompleteSearch(selectors.entryLatestBuys.salesPersonInput, 'buyerNick');
|
||||||
|
await page.waitToClick(selectors.entryLatestBuys.chip);
|
||||||
|
|
||||||
|
expect(httpRequests.find(req => req.includes(('salesPersonFk')))).toBeDefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should filter by supplier', async() => {
|
||||||
|
await page.autocompleteSearch(selectors.entryLatestBuys.supplierInput, 'Farmer King');
|
||||||
|
await page.waitToClick(selectors.entryLatestBuys.chip);
|
||||||
|
|
||||||
|
expect(httpRequests.find(req => req.includes(('supplierFk')))).toBeDefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should filter by active', async() => {
|
||||||
|
await page.waitToClick(selectors.entryLatestBuys.activeCheck);
|
||||||
|
await page.waitToClick(selectors.entryLatestBuys.activeCheck);
|
||||||
|
await page.waitToClick(selectors.entryLatestBuys.chip);
|
||||||
|
|
||||||
|
expect(httpRequests.find(req => req.includes(('active=true')))).toBeDefined();
|
||||||
|
expect(httpRequests.find(req => req.includes(('active=false')))).toBeDefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should filter by visible', async() => {
|
||||||
|
await page.waitToClick(selectors.entryLatestBuys.visibleCheck);
|
||||||
|
await page.waitToClick(selectors.entryLatestBuys.visibleCheck);
|
||||||
|
await page.waitToClick(selectors.entryLatestBuys.chip);
|
||||||
|
|
||||||
|
expect(httpRequests.find(req => req.includes(('visible=true')))).toBeDefined();
|
||||||
|
expect(httpRequests.find(req => req.includes(('visible=false')))).toBeDefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should filter by floramondo', async() => {
|
||||||
|
await page.waitToClick(selectors.entryLatestBuys.floramondoCheck);
|
||||||
|
await page.waitToClick(selectors.entryLatestBuys.floramondoCheck);
|
||||||
|
await page.waitToClick(selectors.entryLatestBuys.chip);
|
||||||
|
|
||||||
|
expect(httpRequests.find(req => req.includes(('floramondo=true')))).toBeDefined();
|
||||||
|
expect(httpRequests.find(req => req.includes(('floramondo=false')))).toBeDefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should filter by tag Color', async() => {
|
||||||
|
await page.waitToClick(selectors.entryLatestBuys.addTagButton);
|
||||||
|
await page.autocompleteSearch(selectors.entryLatestBuys.itemTagInput, 'Color');
|
||||||
|
await page.autocompleteSearch(selectors.entryLatestBuys.itemTagValueInput, 'Brown');
|
||||||
|
await page.waitToClick(selectors.entryLatestBuys.chip);
|
||||||
|
|
||||||
|
expect(httpRequests.find(req => req.includes(('tags')))).toBeDefined();
|
||||||
|
});
|
||||||
|
|
||||||
it('should select all lines but one and then check the edit buys button appears', async() => {
|
it('should select all lines but one and then check the edit buys button appears', async() => {
|
||||||
await page.waitToClick(selectors.entryLatestBuys.allBuysCheckBox);
|
await page.waitToClick(selectors.entryLatestBuys.allBuysCheckBox);
|
||||||
await page.waitToClick(selectors.entryLatestBuys.secondBuyCheckBox);
|
await page.waitToClick(selectors.entryLatestBuys.secondBuyCheckBox);
|
||||||
|
|
|
@ -15,7 +15,7 @@ export default class Calendar extends FormInput {
|
||||||
constructor($element, $scope, vnWeekDays, moment) {
|
constructor($element, $scope, vnWeekDays, moment) {
|
||||||
super($element, $scope);
|
super($element, $scope);
|
||||||
this.weekDays = vnWeekDays.locales;
|
this.weekDays = vnWeekDays.locales;
|
||||||
this.defaultDate = new Date();
|
this.defaultDate = Date.vnNew();
|
||||||
this.displayControls = true;
|
this.displayControls = true;
|
||||||
this.moment = moment;
|
this.moment = moment;
|
||||||
}
|
}
|
||||||
|
@ -115,8 +115,8 @@ export default class Calendar extends FormInput {
|
||||||
let wday = date.getDay();
|
let wday = date.getDay();
|
||||||
let month = date.getMonth();
|
let month = date.getMonth();
|
||||||
|
|
||||||
const currentDay = new Date().getDate();
|
const currentDay = Date.vnNew().getDate();
|
||||||
const currentMonth = new Date().getMonth();
|
const currentMonth = Date.vnNew().getMonth();
|
||||||
|
|
||||||
let classes = {
|
let classes = {
|
||||||
today: day === currentDay && month === currentMonth,
|
today: day === currentDay && month === currentMonth,
|
||||||
|
|
|
@ -2,7 +2,7 @@ describe('Component vnCalendar', () => {
|
||||||
let controller;
|
let controller;
|
||||||
let $element;
|
let $element;
|
||||||
|
|
||||||
let date = new Date();
|
let date = Date.vnNew();
|
||||||
date.setHours(0, 0, 0, 0);
|
date.setHours(0, 0, 0, 0);
|
||||||
date.setDate(1);
|
date.setDate(1);
|
||||||
|
|
||||||
|
@ -48,7 +48,7 @@ describe('Component vnCalendar', () => {
|
||||||
it(`should return the selected element, then emit a 'selection' event`, () => {
|
it(`should return the selected element, then emit a 'selection' event`, () => {
|
||||||
jest.spyOn(controller, 'emit');
|
jest.spyOn(controller, 'emit');
|
||||||
|
|
||||||
const day = new Date();
|
const day = Date.vnNew();
|
||||||
day.setHours(0, 0, 0, 0);
|
day.setHours(0, 0, 0, 0);
|
||||||
|
|
||||||
const clickEvent = new Event('click');
|
const clickEvent = new Event('click');
|
||||||
|
|
|
@ -4,7 +4,7 @@ describe('Component vnDatePicker', () => {
|
||||||
let $ctrl;
|
let $ctrl;
|
||||||
|
|
||||||
let today;
|
let today;
|
||||||
today = new Date();
|
today = Date.vnNew();
|
||||||
today.setHours(0, 0, 0, 0);
|
today.setHours(0, 0, 0, 0);
|
||||||
|
|
||||||
beforeEach(ngModule('vnCore'));
|
beforeEach(ngModule('vnCore'));
|
||||||
|
|
|
@ -82,8 +82,6 @@
|
||||||
}
|
}
|
||||||
&[type=time],
|
&[type=time],
|
||||||
&[type=date] {
|
&[type=date] {
|
||||||
clip-path: inset(0 20px 0 0);
|
|
||||||
|
|
||||||
&::-webkit-inner-spin-button,
|
&::-webkit-inner-spin-button,
|
||||||
&::-webkit-clear-button {
|
&::-webkit-clear-button {
|
||||||
display: none;
|
display: none;
|
||||||
|
@ -99,7 +97,7 @@
|
||||||
}
|
}
|
||||||
&[type=number] {
|
&[type=number] {
|
||||||
-moz-appearance: textfield;
|
-moz-appearance: textfield;
|
||||||
|
|
||||||
&::-webkit-outer-spin-button,
|
&::-webkit-outer-spin-button,
|
||||||
&::-webkit-inner-spin-button {
|
&::-webkit-inner-spin-button {
|
||||||
-webkit-appearance: none;
|
-webkit-appearance: none;
|
||||||
|
|
|
@ -31,7 +31,7 @@ export default class InputTime extends Field {
|
||||||
|
|
||||||
date = this.modelDate
|
date = this.modelDate
|
||||||
? new Date(this.modelDate)
|
? new Date(this.modelDate)
|
||||||
: new Date();
|
: Date.vnNew();
|
||||||
date.setHours(split[0], split[1], 0, 0);
|
date.setHours(split[0], split[1], 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ describe('Component vnInputTime', () => {
|
||||||
|
|
||||||
describe('field() setter', () => {
|
describe('field() setter', () => {
|
||||||
it(`should display the formated the date`, () => {
|
it(`should display the formated the date`, () => {
|
||||||
let date = new Date();
|
let date = Date.vnNew();
|
||||||
$ctrl.field = date;
|
$ctrl.field = date;
|
||||||
let displayed = $filter('date')(date, 'HH:mm');
|
let displayed = $filter('date')(date, 'HH:mm');
|
||||||
|
|
||||||
|
|
|
@ -478,8 +478,8 @@ export default class SmartTable extends Component {
|
||||||
|
|
||||||
const params = {q: JSON.stringify(stateFilter)};
|
const params = {q: JSON.stringify(stateFilter)};
|
||||||
|
|
||||||
this.$state.go(this.$state.current.name, params, {location: 'replace'});
|
this.$state.go(this.$state.current.name, params, {location: 'replace'})
|
||||||
this.refresh();
|
.then(() => this.refresh());
|
||||||
}
|
}
|
||||||
|
|
||||||
applySort() {
|
applySort() {
|
||||||
|
@ -499,8 +499,8 @@ export default class SmartTable extends Component {
|
||||||
stateFilter.tableOrder = order;
|
stateFilter.tableOrder = order;
|
||||||
|
|
||||||
const params = {q: JSON.stringify(stateFilter)};
|
const params = {q: JSON.stringify(stateFilter)};
|
||||||
this.$state.go(this.$state.current.name, params, {location: 'replace'});
|
this.$state.go(this.$state.current.name, params, {location: 'replace'})
|
||||||
this.refresh();
|
.then(() => this.refresh());
|
||||||
}
|
}
|
||||||
|
|
||||||
filterSanitizer(field) {
|
filterSanitizer(field) {
|
||||||
|
@ -589,7 +589,7 @@ export default class SmartTable extends Component {
|
||||||
refresh() {
|
refresh() {
|
||||||
this.isRefreshing = true;
|
this.isRefreshing = true;
|
||||||
this.model.refresh()
|
this.model.refresh()
|
||||||
.then(() => this.isRefreshing = false);
|
.finally(() => this.isRefreshing = false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -160,7 +160,7 @@ describe('Component smartTable', () => {
|
||||||
describe('applySort()', () => {
|
describe('applySort()', () => {
|
||||||
it('should call the $state go and model refresh without making changes on the model order', () => {
|
it('should call the $state go and model refresh without making changes on the model order', () => {
|
||||||
controller.$state = {
|
controller.$state = {
|
||||||
go: jest.fn(),
|
go: jest.fn().mockReturnValue(new Promise(resolve => resolve())),
|
||||||
current: {
|
current: {
|
||||||
name: 'section'
|
name: 'section'
|
||||||
}
|
}
|
||||||
|
@ -171,13 +171,12 @@ describe('Component smartTable', () => {
|
||||||
|
|
||||||
expect(controller.model.order).toBeUndefined();
|
expect(controller.model.order).toBeUndefined();
|
||||||
expect(controller.$state.go).toHaveBeenCalled();
|
expect(controller.$state.go).toHaveBeenCalled();
|
||||||
expect(controller.refresh).toHaveBeenCalled();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should call the $state go and model refresh after setting model order according to the controller sortCriteria', () => {
|
it('should call the $state go and model refresh after setting model order according to the controller sortCriteria', () => {
|
||||||
const orderBy = {field: 'myField', sortType: 'ASC'};
|
const orderBy = {field: 'myField', sortType: 'ASC'};
|
||||||
controller.$state = {
|
controller.$state = {
|
||||||
go: jest.fn(),
|
go: jest.fn().mockReturnValue(new Promise(resolve => resolve())),
|
||||||
current: {
|
current: {
|
||||||
name: 'section'
|
name: 'section'
|
||||||
}
|
}
|
||||||
|
@ -190,7 +189,6 @@ describe('Component smartTable', () => {
|
||||||
|
|
||||||
expect(controller.model.order).toEqual(`${orderBy.field} ${orderBy.sortType}`);
|
expect(controller.model.order).toEqual(`${orderBy.field} ${orderBy.sortType}`);
|
||||||
expect(controller.$state.go).toHaveBeenCalled();
|
expect(controller.$state.go).toHaveBeenCalled();
|
||||||
expect(controller.refresh).toHaveBeenCalled();
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -293,12 +291,10 @@ describe('Component smartTable', () => {
|
||||||
controller.$inputsScope = {
|
controller.$inputsScope = {
|
||||||
searchProps: {}
|
searchProps: {}
|
||||||
};
|
};
|
||||||
jest.spyOn(controller, 'refresh');
|
|
||||||
|
|
||||||
controller.defaultFilter();
|
controller.defaultFilter();
|
||||||
|
|
||||||
expect(controller.model.addFilter).toHaveBeenCalled();
|
expect(controller.model.addFilter).toHaveBeenCalled();
|
||||||
expect(controller.refresh).toHaveBeenCalled();
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
import * as date from 'vn-loopback/server/boot/date';
|
||||||
|
date.default();
|
|
@ -10,3 +10,4 @@ import './week-days';
|
||||||
import './report';
|
import './report';
|
||||||
import './email';
|
import './email';
|
||||||
import './file';
|
import './file';
|
||||||
|
import './date';
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
|
|
||||||
<vn-dialog
|
<vn-dialog
|
||||||
vn-id="instanceLog">
|
vn-id="instanceLog">
|
||||||
<tpl-body>
|
<tpl-body>
|
||||||
<vn-log
|
<vn-log
|
||||||
|
class="vn-instance-log"
|
||||||
url="{{$ctrl.url}}"
|
url="{{$ctrl.url}}"
|
||||||
origin-id="$ctrl.originId"
|
origin-id="$ctrl.originId"
|
||||||
changed-model="$ctrl.changedModel"
|
changed-model="$ctrl.changedModel"
|
||||||
|
|
|
@ -1,13 +1,9 @@
|
||||||
.vn-dialog {
|
vn-log.vn-instance-log {
|
||||||
& > .window:not(:has(.empty-rows)) {
|
vn-card {
|
||||||
width:60%;
|
width: 900px;
|
||||||
vn-log {
|
visibility: hidden;
|
||||||
vn-card {
|
& > * {
|
||||||
visibility: hidden;
|
visibility: visible;
|
||||||
& > * {
|
|
||||||
visibility: visible;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<h5 class="vn-mb-md vn-mt-lg" translate>Recover password</h5>
|
<h5 class="vn-mb-md vn-mt-lg" translate>Recover password</h5>
|
||||||
<vn-textfield
|
<vn-textfield
|
||||||
label="Email"
|
label="User or recovery email"
|
||||||
ng-model="$ctrl.email"
|
ng-model="$ctrl.user"
|
||||||
vn-focus>
|
vn-focus>
|
||||||
</vn-textfield>
|
</vn-textfield>
|
||||||
<div
|
<div
|
||||||
|
|
|
@ -20,7 +20,7 @@ export default class Controller {
|
||||||
|
|
||||||
submit() {
|
submit() {
|
||||||
const params = {
|
const params = {
|
||||||
email: this.email
|
user: this.user
|
||||||
};
|
};
|
||||||
|
|
||||||
this.$http.post('Accounts/recoverPassword', params)
|
this.$http.post('Accounts/recoverPassword', params)
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
Recover password: Recuperar contraseña
|
Recover password: Recuperar contraseña
|
||||||
We will sent you an email to recover your password: Te enviaremos un correo para restablecer tu contraseña
|
We will sent you an email to recover your password: Te enviaremos un correo para restablecer tu contraseña
|
||||||
Notification sent!: ¡Notificación enviada!
|
Notification sent!: ¡Notificación enviada!
|
||||||
|
User or recovery email: Usuario o correo de recuperación
|
||||||
|
|
|
@ -197,7 +197,7 @@ export default class UploadPhoto extends Component {
|
||||||
timeout: this.canceler.promise,
|
timeout: this.canceler.promise,
|
||||||
transformRequest: ([file]) => {
|
transformRequest: ([file]) => {
|
||||||
const formData = new FormData();
|
const formData = new FormData();
|
||||||
const now = new Date();
|
const now = Date.vnNew();
|
||||||
const timestamp = now.getTime();
|
const timestamp = now.getTime();
|
||||||
const fileName = `${file.name}_${timestamp}`;
|
const fileName = `${file.name}_${timestamp}`;
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import './module';
|
import './module';
|
||||||
import './routes';
|
import './routes';
|
||||||
import './components';
|
import './components';
|
||||||
import './services';
|
|
||||||
import './styles';
|
import './styles';
|
||||||
|
import 'vn-loopback/server/boot/date';
|
||||||
|
|
|
@ -14,6 +14,10 @@ import './modules/ticket/front/module.js';
|
||||||
import './modules/travel/front/module.js';
|
import './modules/travel/front/module.js';
|
||||||
import './modules/worker/front/module.js';
|
import './modules/worker/front/module.js';
|
||||||
import './modules/shelving/front/module.js';
|
import './modules/shelving/front/module.js';
|
||||||
|
import 'vn-loopback/server/boot/date';
|
||||||
|
|
||||||
|
// Set NODE_ENV
|
||||||
|
process.env.NODE_ENV = 'development';
|
||||||
|
|
||||||
core.run(vnInterceptor => {
|
core.run(vnInterceptor => {
|
||||||
vnInterceptor.setApiPath(null);
|
vnInterceptor.setApiPath(null);
|
||||||
|
@ -39,3 +43,4 @@ window.ngModule = function(moduleName, ...args) {
|
||||||
|
|
||||||
return angular.mock.module(...fns);
|
return angular.mock.module(...fns);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// For a detailed explanation regarding each configuration property, visit:
|
// For a detailed explanation regarding each configuration property, visit:
|
||||||
// https://jestjs.io/docs/en/configuration.html
|
// https://jestjs.io/docs/en/configuration.html
|
||||||
|
/* eslint max-len: ["error", { "code": 150 }]*/
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
name: 'front end',
|
name: 'front end',
|
||||||
|
|
|
@ -261,5 +261,8 @@
|
||||||
"The DOCUWARE PDF document does not exists": "El documento PDF Docuware no existe",
|
"The DOCUWARE PDF document does not exists": "El documento PDF Docuware no existe",
|
||||||
"It is not possible to modify tracked sales": "No es posible modificar líneas de pedido que se hayan empezado a preparar",
|
"It is not possible to modify tracked sales": "No es posible modificar líneas de pedido que se hayan empezado a preparar",
|
||||||
"It is not possible to modify sales that their articles are from Floramondo": "No es posible modificar líneas de pedido cuyos artículos sean de Floramondo",
|
"It is not possible to modify sales that their articles are from Floramondo": "No es posible modificar líneas de pedido cuyos artículos sean de Floramondo",
|
||||||
"It is not possible to modify cloned sales": "No es posible modificar líneas de pedido clonadas"
|
"It is not possible to modify cloned sales": "No es posible modificar líneas de pedido clonadas",
|
||||||
|
"A supplier with the same name already exists. Change the country.": "Un proveedor con el mismo nombre ya existe. Cambie el país.",
|
||||||
|
"There is no assigned email for this client": "No hay correo asignado para este cliente"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
module.exports = () => {
|
||||||
|
Date.vnUTC = () => {
|
||||||
|
const env = process.env.NODE_ENV;
|
||||||
|
if (!env || env === 'development')
|
||||||
|
return new Date(Date.UTC(2001, 0, 1, 11));
|
||||||
|
|
||||||
|
return new Date(Date.UTC());
|
||||||
|
};
|
||||||
|
|
||||||
|
Date.vnNew = () => {
|
||||||
|
return new Date(Date.vnUTC());
|
||||||
|
};
|
||||||
|
|
||||||
|
Date.vnNow = () => {
|
||||||
|
return new Date(Date.vnUTC()).getTime();
|
||||||
|
};
|
||||||
|
};
|
|
@ -95,7 +95,7 @@ module.exports = Self => {
|
||||||
}, myOptions);
|
}, myOptions);
|
||||||
|
|
||||||
const claim = await models.Claim.findOne(filter, myOptions);
|
const claim = await models.Claim.findOne(filter, myOptions);
|
||||||
const today = new Date();
|
const today = Date.vnNew();
|
||||||
|
|
||||||
const newRefundTicket = await models.Ticket.create({
|
const newRefundTicket = await models.Ticket.create({
|
||||||
clientFk: claim.ticket().clientFk,
|
clientFk: claim.ticket().clientFk,
|
||||||
|
@ -172,7 +172,7 @@ module.exports = Self => {
|
||||||
|
|
||||||
async function saveObservation(observation, options) {
|
async function saveObservation(observation, options) {
|
||||||
const query = `INSERT INTO vn.ticketObservation (ticketFk, observationTypeFk, description) VALUES(?, ?, ?)
|
const query = `INSERT INTO vn.ticketObservation (ticketFk, observationTypeFk, description) VALUES(?, ?, ?)
|
||||||
ON DUPLICATE KEY
|
ON DUPLICATE KEY
|
||||||
UPDATE description = CONCAT(vn.ticketObservation.description, VALUES(description),' ')`;
|
UPDATE description = CONCAT(vn.ticketObservation.description, VALUES(description),' ')`;
|
||||||
await Self.rawSql(query, [
|
await Self.rawSql(query, [
|
||||||
observation.ticketFk,
|
observation.ticketFk,
|
||||||
|
|
|
@ -60,7 +60,7 @@ module.exports = Self => {
|
||||||
const landedPlusWeek = new Date(ticket.landed);
|
const landedPlusWeek = new Date(ticket.landed);
|
||||||
landedPlusWeek.setDate(landedPlusWeek.getDate() + 7);
|
landedPlusWeek.setDate(landedPlusWeek.getDate() + 7);
|
||||||
const hasClaimManagerRole = await models.Account.hasRole(userId, 'claimManager', myOptions);
|
const hasClaimManagerRole = await models.Account.hasRole(userId, 'claimManager', myOptions);
|
||||||
const isClaimable = landedPlusWeek >= new Date();
|
const isClaimable = landedPlusWeek >= Date.vnNew();
|
||||||
|
|
||||||
if (ticket.isDeleted)
|
if (ticket.isDeleted)
|
||||||
throw new UserError(`You can't create a claim for a removed ticket`);
|
throw new UserError(`You can't create a claim for a removed ticket`);
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
module.exports = Self => {
|
module.exports = Self => {
|
||||||
Self.remoteMethodCtx('regularizeClaim', {
|
Self.remoteMethodCtx('regularizeClaim', {
|
||||||
description: `Imports lines from claimBeginning to a new ticket
|
description: `Imports lines from claimBeginning to a new ticket
|
||||||
with specific shipped, landed dates, agency and company`,
|
with specific shipped, landed dates, agency and company`,
|
||||||
accessType: 'WRITE',
|
accessType: 'WRITE',
|
||||||
accepts: [{
|
accepts: [{
|
||||||
|
@ -135,10 +135,10 @@ module.exports = Self => {
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getTicketId(params, options) {
|
async function getTicketId(params, options) {
|
||||||
const minDate = new Date();
|
const minDate = Date.vnNew();
|
||||||
minDate.setHours(0, 0, 0, 0);
|
minDate.setHours(0, 0, 0, 0);
|
||||||
|
|
||||||
const maxDate = new Date();
|
const maxDate = Date.vnNew();
|
||||||
maxDate.setHours(23, 59, 59, 59);
|
maxDate.setHours(23, 59, 59, 59);
|
||||||
|
|
||||||
let ticket = await Self.app.models.Ticket.findOne({
|
let ticket = await Self.app.models.Ticket.findOne({
|
||||||
|
@ -155,8 +155,8 @@ module.exports = Self => {
|
||||||
}
|
}
|
||||||
|
|
||||||
async function createTicket(ctx, options) {
|
async function createTicket(ctx, options) {
|
||||||
ctx.args.shipped = new Date();
|
ctx.args.shipped = Date.vnNew();
|
||||||
ctx.args.landed = new Date();
|
ctx.args.landed = Date.vnNew();
|
||||||
ctx.args.agencyModeId = null;
|
ctx.args.agencyModeId = null;
|
||||||
ctx.args.routeId = null;
|
ctx.args.routeId = null;
|
||||||
|
|
||||||
|
|
|
@ -54,7 +54,7 @@ describe('Claim createFromSales()', () => {
|
||||||
try {
|
try {
|
||||||
const options = {transaction: tx};
|
const options = {transaction: tx};
|
||||||
|
|
||||||
const todayMinusEightDays = new Date();
|
const todayMinusEightDays = Date.vnNew();
|
||||||
todayMinusEightDays.setDate(todayMinusEightDays.getDate() - 8);
|
todayMinusEightDays.setDate(todayMinusEightDays.getDate() - 8);
|
||||||
|
|
||||||
const ticket = await models.Ticket.findById(ticketId, null, options);
|
const ticket = await models.Ticket.findById(ticketId, null, options);
|
||||||
|
@ -85,7 +85,7 @@ describe('Claim createFromSales()', () => {
|
||||||
try {
|
try {
|
||||||
const options = {transaction: tx};
|
const options = {transaction: tx};
|
||||||
|
|
||||||
const todayMinusEightDays = new Date();
|
const todayMinusEightDays = Date.vnNew();
|
||||||
todayMinusEightDays.setDate(todayMinusEightDays.getDate() - 8);
|
todayMinusEightDays.setDate(todayMinusEightDays.getDate() - 8);
|
||||||
|
|
||||||
const ticket = await models.Ticket.findById(ticketId, null, options);
|
const ticket = await models.Ticket.findById(ticketId, null, options);
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
const app = require('vn-loopback/server/server');
|
const app = require('vn-loopback/server/server');
|
||||||
|
|
||||||
describe('Update Claim', () => {
|
describe('Update Claim', () => {
|
||||||
const newDate = new Date();
|
const newDate = Date.vnNew();
|
||||||
const originalData = {
|
const originalData = {
|
||||||
ticketFk: 3,
|
ticketFk: 3,
|
||||||
clientFk: 1101,
|
clientFk: 1101,
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
const app = require('vn-loopback/server/server');
|
const app = require('vn-loopback/server/server');
|
||||||
|
|
||||||
describe('Update Claim', () => {
|
describe('Update Claim', () => {
|
||||||
const newDate = new Date();
|
const newDate = Date.vnNew();
|
||||||
const original = {
|
const original = {
|
||||||
ticketFk: 3,
|
ticketFk: 3,
|
||||||
clientFk: 1101,
|
clientFk: 1101,
|
||||||
|
|
|
@ -32,7 +32,7 @@ module.exports = Self => {
|
||||||
c.id AS clientFk,
|
c.id AS clientFk,
|
||||||
c.email AS clientEmail,
|
c.email AS clientEmail,
|
||||||
eu.email salesPersonEmail
|
eu.email salesPersonEmail
|
||||||
FROM client c
|
FROM client c
|
||||||
JOIN account.emailUser eu ON eu.userFk = c.salesPersonFk
|
JOIN account.emailUser eu ON eu.userFk = c.salesPersonFk
|
||||||
JOIN ticket t ON t.clientFk = c.id
|
JOIN ticket t ON t.clientFk = c.id
|
||||||
JOIN sale s ON s.ticketFk = t.id
|
JOIN sale s ON s.ticketFk = t.id
|
||||||
|
@ -61,10 +61,10 @@ module.exports = Self => {
|
||||||
SET status = 'printed',
|
SET status = 'printed',
|
||||||
printed = ?
|
printed = ?
|
||||||
WHERE id = ?`,
|
WHERE id = ?`,
|
||||||
[new Date(), queue.id]);
|
[Date.vnNew(), queue.id]);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
await Self.rawSql(`
|
await Self.rawSql(`
|
||||||
UPDATE clientConsumptionQueue
|
UPDATE clientConsumptionQueue
|
||||||
SET status = ?
|
SET status = ?
|
||||||
WHERE id = ?`,
|
WHERE id = ?`,
|
||||||
[error.message, queue.id]);
|
[error.message, queue.id]);
|
||||||
|
|
|
@ -51,7 +51,7 @@ module.exports = function(Self) {
|
||||||
Self.createReceipt = async(ctx, options) => {
|
Self.createReceipt = async(ctx, options) => {
|
||||||
const models = Self.app.models;
|
const models = Self.app.models;
|
||||||
const args = ctx.args;
|
const args = ctx.args;
|
||||||
const date = new Date();
|
const date = Date.vnNew();
|
||||||
date.setHours(0, 0, 0, 0);
|
date.setHours(0, 0, 0, 0);
|
||||||
|
|
||||||
let tx;
|
let tx;
|
||||||
|
|
|
@ -74,7 +74,7 @@ module.exports = function(Self) {
|
||||||
]
|
]
|
||||||
}, myOptions);
|
}, myOptions);
|
||||||
|
|
||||||
const date = new Date();
|
const date = Date.vnNew();
|
||||||
date.setHours(0, 0, 0, 0);
|
date.setHours(0, 0, 0, 0);
|
||||||
const query = `SELECT vn.clientGetDebt(?, ?) AS debt`;
|
const query = `SELECT vn.clientGetDebt(?, ?) AS debt`;
|
||||||
const data = await Self.rawSql(query, [id, date], myOptions);
|
const data = await Self.rawSql(query, [id, date], myOptions);
|
||||||
|
|
|
@ -25,7 +25,7 @@ module.exports = Self => {
|
||||||
if (typeof options == 'object')
|
if (typeof options == 'object')
|
||||||
Object.assign(myOptions, options);
|
Object.assign(myOptions, options);
|
||||||
|
|
||||||
const date = new Date();
|
const date = Date.vnNew();
|
||||||
date.setHours(0, 0, 0, 0);
|
date.setHours(0, 0, 0, 0);
|
||||||
const query = `SELECT vn.clientGetDebt(?, ?) AS debt`;
|
const query = `SELECT vn.clientGetDebt(?, ?) AS debt`;
|
||||||
const [debt] = await Self.rawSql(query, [clientFk, date], myOptions);
|
const [debt] = await Self.rawSql(query, [clientFk, date], myOptions);
|
||||||
|
|
|
@ -32,14 +32,14 @@ module.exports = Self => {
|
||||||
if (typeof options == 'object')
|
if (typeof options == 'object')
|
||||||
Object.assign(myOptions, options);
|
Object.assign(myOptions, options);
|
||||||
|
|
||||||
const date = new Date();
|
const date = Date.vnNew();
|
||||||
date.setHours(0, 0, 0, 0);
|
date.setHours(0, 0, 0, 0);
|
||||||
const ticket = await Self.app.models.Ticket.findById(ticketId, null, myOptions);
|
const ticket = await Self.app.models.Ticket.findById(ticketId, null, myOptions);
|
||||||
const query = `
|
const query = `
|
||||||
SELECT
|
SELECT
|
||||||
t.id,
|
t.id,
|
||||||
t.shipped,
|
t.shipped,
|
||||||
a.name AS agencyName,
|
a.name AS agencyName,
|
||||||
w.name AS warehouseName,
|
w.name AS warehouseName,
|
||||||
ad.nickname AS nickname,
|
ad.nickname AS nickname,
|
||||||
ad.city AS city,
|
ad.city AS city,
|
||||||
|
@ -52,7 +52,7 @@ module.exports = Self => {
|
||||||
JOIN vn.warehouse w ON t.warehouseFk = w.id
|
JOIN vn.warehouse w ON t.warehouseFk = w.id
|
||||||
JOIN vn.address ad ON t.addressFk = ad.id
|
JOIN vn.address ad ON t.addressFk = ad.id
|
||||||
JOIN vn.province pr ON ad.provinceFk = pr.id
|
JOIN vn.province pr ON ad.provinceFk = pr.id
|
||||||
WHERE t.shipped >= ? AND t.clientFk = ? AND ts.alertLevel = 0
|
WHERE t.shipped >= ? AND t.clientFk = ? AND ts.alertLevel = 0
|
||||||
AND t.id <> ? AND t.warehouseFk = ?
|
AND t.id <> ? AND t.warehouseFk = ?
|
||||||
ORDER BY t.shipped
|
ORDER BY t.shipped
|
||||||
LIMIT 10`;
|
LIMIT 10`;
|
||||||
|
|
|
@ -125,7 +125,7 @@ module.exports = Self => {
|
||||||
async function getRecoveries(recoveryModel, clientId, options) {
|
async function getRecoveries(recoveryModel, clientId, options) {
|
||||||
const filter = {
|
const filter = {
|
||||||
where: {
|
where: {
|
||||||
and: [{clientFk: clientId}, {or: [{finished: null}, {finished: {gt: Date.now()}}]}]
|
and: [{clientFk: clientId}, {or: [{finished: null}, {finished: {gt: Date.vnNow()}}]}]
|
||||||
},
|
},
|
||||||
limit: 1
|
limit: 1
|
||||||
};
|
};
|
||||||
|
|
|
@ -23,7 +23,7 @@ describe('Client createWithInsurance', () => {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const options = {transaction: tx};
|
const options = {transaction: tx};
|
||||||
const data = {clientFk: 1101, started: Date.now(), credit: 999, grade: 255};
|
const data = {clientFk: 1101, started: Date.vnNow(), credit: 999, grade: 255};
|
||||||
|
|
||||||
const result = await models.CreditClassification.createWithInsurance(data, options);
|
const result = await models.CreditClassification.createWithInsurance(data, options);
|
||||||
|
|
||||||
|
|
|
@ -51,7 +51,7 @@ module.exports = Self => {
|
||||||
|
|
||||||
const stmts = [];
|
const stmts = [];
|
||||||
|
|
||||||
const date = new Date();
|
const date = Date.vnNew();
|
||||||
date.setHours(0, 0, 0, 0);
|
date.setHours(0, 0, 0, 0);
|
||||||
const stmt = new ParameterizedSQL(
|
const stmt = new ParameterizedSQL(
|
||||||
`SELECT *
|
`SELECT *
|
||||||
|
@ -65,14 +65,14 @@ module.exports = Self => {
|
||||||
co.created,
|
co.created,
|
||||||
co.text observation,
|
co.text observation,
|
||||||
uw.id workerFk,
|
uw.id workerFk,
|
||||||
uw.name workerName,
|
uw.name workerName,
|
||||||
c.creditInsurance,
|
c.creditInsurance,
|
||||||
d.defaulterSinced
|
d.defaulterSinced
|
||||||
FROM vn.defaulter d
|
FROM vn.defaulter d
|
||||||
JOIN vn.client c ON c.id = d.clientFk
|
JOIN vn.client c ON c.id = d.clientFk
|
||||||
LEFT JOIN vn.clientObservation co ON co.clientFk = c.id
|
LEFT JOIN vn.clientObservation co ON co.clientFk = c.id
|
||||||
LEFT JOIN account.user u ON u.id = c.salesPersonFk
|
LEFT JOIN account.user u ON u.id = c.salesPersonFk
|
||||||
LEFT JOIN account.user uw ON uw.id = co.workerFk
|
LEFT JOIN account.user uw ON uw.id = co.workerFk
|
||||||
WHERE
|
WHERE
|
||||||
d.created = ?
|
d.created = ?
|
||||||
AND d.amount > 0
|
AND d.amount > 0
|
||||||
|
|
|
@ -27,7 +27,7 @@ module.exports = Self => {
|
||||||
if (typeof options == 'object')
|
if (typeof options == 'object')
|
||||||
Object.assign(myOptions, options);
|
Object.assign(myOptions, options);
|
||||||
|
|
||||||
const date = new Date();
|
const date = Date.vnNew();
|
||||||
date.setHours(0, 0, 0, 0);
|
date.setHours(0, 0, 0, 0);
|
||||||
const query = `
|
const query = `
|
||||||
SELECT count(*) AS hasActiveRecovery
|
SELECT count(*) AS hasActiveRecovery
|
||||||
|
|
|
@ -0,0 +1,76 @@
|
||||||
|
const UserError = require('vn-loopback/util/user-error');
|
||||||
|
const base64url = require('base64url');
|
||||||
|
|
||||||
|
module.exports = Self => {
|
||||||
|
Self.remoteMethod('confirm', {
|
||||||
|
description: 'Confirms electronic payment transaction',
|
||||||
|
accessType: 'WRITE',
|
||||||
|
accepts: [
|
||||||
|
{
|
||||||
|
arg: 'Ds_SignatureVersion',
|
||||||
|
type: 'string',
|
||||||
|
required: false,
|
||||||
|
}, {
|
||||||
|
arg: 'Ds_MerchantParameters',
|
||||||
|
type: 'string',
|
||||||
|
required: true,
|
||||||
|
}, {
|
||||||
|
arg: 'Ds_Signature',
|
||||||
|
type: 'string',
|
||||||
|
required: true,
|
||||||
|
}
|
||||||
|
],
|
||||||
|
returns: {
|
||||||
|
type: 'Boolean',
|
||||||
|
root: true
|
||||||
|
},
|
||||||
|
http: {
|
||||||
|
path: `/confirm`,
|
||||||
|
verb: 'POST'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Self.confirm = async(signatureVersion, merchantParameters, signature) => {
|
||||||
|
const $ = Self.app.models;
|
||||||
|
|
||||||
|
const decodedParams = JSON.parse(
|
||||||
|
base64url.decode(merchantParameters, 'utf8'));
|
||||||
|
const params = {};
|
||||||
|
|
||||||
|
for (const param in decodedParams)
|
||||||
|
params[param] = decodeURIComponent(decodedParams[param]);
|
||||||
|
|
||||||
|
const orderId = params['Ds_Order'];
|
||||||
|
const merchantId = parseInt(params['Ds_MerchantCode']);
|
||||||
|
|
||||||
|
if (!orderId)
|
||||||
|
throw new UserError('Order id not found');
|
||||||
|
if (!merchantId)
|
||||||
|
throw new UserError('Mechant id not found');
|
||||||
|
|
||||||
|
const merchant = await $.TpvMerchant.findById(merchantId, {
|
||||||
|
fields: ['id', 'secretKey']
|
||||||
|
});
|
||||||
|
|
||||||
|
const base64hmac = Self.createSignature(
|
||||||
|
orderId,
|
||||||
|
merchant.secretKey,
|
||||||
|
merchantParameters
|
||||||
|
);
|
||||||
|
|
||||||
|
if (base64hmac !== base64url.toBase64(signature))
|
||||||
|
throw new UserError('Invalid signature');
|
||||||
|
|
||||||
|
await Self.rawSql(
|
||||||
|
'CALL hedera.tpvTransaction_confirm(?, ?, ?, ?, ?, ?)', [
|
||||||
|
params['Ds_Amount'],
|
||||||
|
orderId,
|
||||||
|
merchantId,
|
||||||
|
params['Ds_Currency'],
|
||||||
|
params['Ds_Response'],
|
||||||
|
params['Ds_ErrorCode']
|
||||||
|
]);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
};
|
|
@ -0,0 +1,39 @@
|
||||||
|
const UserError = require('vn-loopback/util/user-error');
|
||||||
|
|
||||||
|
module.exports = Self => {
|
||||||
|
Self.remoteMethodCtx('end', {
|
||||||
|
description: 'Ends electronic payment transaction',
|
||||||
|
accessType: 'WRITE',
|
||||||
|
accepts: [
|
||||||
|
{
|
||||||
|
arg: 'orderId',
|
||||||
|
type: 'string',
|
||||||
|
required: true,
|
||||||
|
}, {
|
||||||
|
arg: 'status',
|
||||||
|
type: 'string',
|
||||||
|
required: true,
|
||||||
|
}
|
||||||
|
],
|
||||||
|
http: {
|
||||||
|
path: `/end`,
|
||||||
|
verb: 'POST'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Self.end = async(ctx, orderId, status) => {
|
||||||
|
const userId = ctx.req.accessToken.userId;
|
||||||
|
const transaction = await Self.findById(orderId, {
|
||||||
|
fields: ['id', 'clientFk']
|
||||||
|
});
|
||||||
|
|
||||||
|
if (transaction?.clientFk != userId)
|
||||||
|
throw new UserError('Transaction not owned by user');
|
||||||
|
|
||||||
|
await Self.rawSql(
|
||||||
|
'CALL hedera.tpvTransaction_end(?, ?)', [
|
||||||
|
orderId,
|
||||||
|
status
|
||||||
|
]);
|
||||||
|
};
|
||||||
|
};
|
|
@ -0,0 +1,85 @@
|
||||||
|
const UserError = require('vn-loopback/util/user-error');
|
||||||
|
|
||||||
|
module.exports = Self => {
|
||||||
|
Self.remoteMethodCtx('start', {
|
||||||
|
description: 'Starts electronic payment transaction',
|
||||||
|
accessType: 'WRITE',
|
||||||
|
accepts: [
|
||||||
|
{
|
||||||
|
arg: 'amount',
|
||||||
|
type: 'Number',
|
||||||
|
required: true,
|
||||||
|
}, {
|
||||||
|
arg: 'companyId',
|
||||||
|
type: 'Number',
|
||||||
|
required: false,
|
||||||
|
}, {
|
||||||
|
arg: 'urlOk',
|
||||||
|
type: 'String',
|
||||||
|
required: false,
|
||||||
|
}, {
|
||||||
|
arg: 'urlKo',
|
||||||
|
type: 'String',
|
||||||
|
required: false,
|
||||||
|
}
|
||||||
|
],
|
||||||
|
returns: {
|
||||||
|
type: 'Object',
|
||||||
|
root: true
|
||||||
|
},
|
||||||
|
http: {
|
||||||
|
path: `/start`,
|
||||||
|
verb: 'POST'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Self.start = async(ctx, amount, companyId, urlOk, urlKo) => {
|
||||||
|
const userId = ctx.req.accessToken.userId;
|
||||||
|
const [[row]] = await Self.rawSql(
|
||||||
|
'CALL hedera.tpvTransaction_start(?, ?, ?)', [
|
||||||
|
amount,
|
||||||
|
companyId,
|
||||||
|
userId
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (!row)
|
||||||
|
throw new UserError('Transaction error');
|
||||||
|
|
||||||
|
const orderId = row.transactionId.padStart(12, '0');
|
||||||
|
const merchantUrl = row.merchantUrl ? row.merchantUrl : '';
|
||||||
|
urlOk = urlOk ? urlOk.replace('_transactionId_', orderId) : '';
|
||||||
|
urlKo = urlKo ? urlKo.replace('_transactionId_', orderId) : '';
|
||||||
|
|
||||||
|
const params = {
|
||||||
|
'Ds_Merchant_Amount': amount,
|
||||||
|
'Ds_Merchant_Order': orderId,
|
||||||
|
'Ds_Merchant_MerchantCode': row.merchant,
|
||||||
|
'Ds_Merchant_Currency': row.currency,
|
||||||
|
'Ds_Merchant_TransactionType': row.transactionType,
|
||||||
|
'Ds_Merchant_Terminal': row.terminal,
|
||||||
|
'Ds_Merchant_MerchantURL': merchantUrl,
|
||||||
|
'Ds_Merchant_UrlOK': urlOk,
|
||||||
|
'Ds_Merchant_UrlKO': urlKo
|
||||||
|
};
|
||||||
|
for (const param in params)
|
||||||
|
params[param] = encodeURIComponent(params[param]);
|
||||||
|
|
||||||
|
const json = JSON.stringify(params);
|
||||||
|
const merchantParameters = Buffer.from(json).toString('base64');
|
||||||
|
|
||||||
|
const signature = Self.createSignature(
|
||||||
|
orderId,
|
||||||
|
row.secretKey,
|
||||||
|
merchantParameters
|
||||||
|
);
|
||||||
|
|
||||||
|
return {
|
||||||
|
url: row.url,
|
||||||
|
postValues: {
|
||||||
|
'Ds_SignatureVersion': 'HMAC_SHA256_V1',
|
||||||
|
'Ds_MerchantParameters': merchantParameters,
|
||||||
|
'Ds_Signature': signature
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
|
@ -41,7 +41,7 @@ module.exports = Self => {
|
||||||
|
|
||||||
// Disable old mandate
|
// Disable old mandate
|
||||||
if (oldMandate)
|
if (oldMandate)
|
||||||
oldMandate.updateAttribute('finished', new Date());
|
oldMandate.updateAttribute('finished', Date.vnNew());
|
||||||
|
|
||||||
// Create a new mandate
|
// Create a new mandate
|
||||||
await models.Mandate.create({
|
await models.Mandate.create({
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue