Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix into 2790-dialog_shortcuts
gitea/salix/pipeline/head This commit looks good
Details
gitea/salix/pipeline/head This commit looks good
Details
This commit is contained in:
commit
780524c139
|
@ -1 +0,0 @@
|
|||
Delete me
|
|
@ -0,0 +1 @@
|
|||
Delete this
|
|
@ -1,8 +1,7 @@
|
|||
import selectors from '../../helpers/selectors.js';
|
||||
import getBrowser from '../../helpers/puppeteer';
|
||||
|
||||
// #2833 Refactor account.basicData
|
||||
xdescribe('Account create and basic data path', () => {
|
||||
describe('Account create and basic data path', () => {
|
||||
let browser;
|
||||
let page;
|
||||
|
||||
|
@ -37,40 +36,23 @@ xdescribe('Account create and basic data path', () => {
|
|||
await page.waitForState('account.card.basicData');
|
||||
});
|
||||
|
||||
it('should edit the basic data', async() => {
|
||||
await page.overwrite(selectors.accountBasicData.name, 'Anna');
|
||||
await page.overwrite(selectors.accountBasicData.nickname, 'Rogue');
|
||||
await page.overwrite(selectors.accountBasicData.email, 'AnnaMarieLeBeau@verdnatura.es');
|
||||
await page.autocompleteSearch(selectors.accountBasicData.language, 'english');
|
||||
await page.waitToClick(selectors.accountBasicData.save);
|
||||
const message = await page.waitForSnackbar();
|
||||
|
||||
expect(message.text).toContain('Data saved!');
|
||||
});
|
||||
|
||||
it('should reload the section and check the name was edited successfully', async() => {
|
||||
it('should reload the section and check the name is as expected', async() => {
|
||||
await page.reloadSection('account.card.basicData');
|
||||
const result = await page.waitToGetProperty(selectors.accountBasicData.name, 'value');
|
||||
|
||||
expect(result).toEqual('Anna');
|
||||
expect(result).toEqual('Remy');
|
||||
});
|
||||
|
||||
it('should check the nickname was edited successfully', async() => {
|
||||
it('should check the nickname is as expected', async() => {
|
||||
const result = await page.waitToGetProperty(selectors.accountBasicData.nickname, 'value');
|
||||
|
||||
expect(result).toEqual('Rogue');
|
||||
expect(result).toEqual('Gambit');
|
||||
});
|
||||
|
||||
it('should check the email was edited successfully', async() => {
|
||||
it('should check the email is as expected', async() => {
|
||||
const result = await page.waitToGetProperty(selectors.accountBasicData.email, 'value');
|
||||
|
||||
expect(result).toEqual('AnnaMarieLeBeau@verdnatura.es');
|
||||
});
|
||||
|
||||
it('should check the language was edited successfully', async() => {
|
||||
const result = await page.waitToGetProperty(selectors.accountBasicData.language, 'value');
|
||||
|
||||
expect(result).toEqual('English');
|
||||
expect(result).toEqual('RemyEtienneLeBeau@verdnatura.es');
|
||||
});
|
||||
|
||||
it('should navigate to the roles section to check the roles are correct', async() => {
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
<div ng-transclude="before"></div>
|
||||
<div class="body">
|
||||
<div class="top">
|
||||
<h5>{{$ctrl.description}}</h5>
|
||||
<h5 title="{{$ctrl.description}}">{{$ctrl.description}}</h5>
|
||||
<div>
|
||||
{{$ctrl.descriptor.id | id}}
|
||||
</div>
|
||||
|
|
|
@ -42,7 +42,7 @@ Travels: Envíos
|
|||
Workers: Trabajadores
|
||||
Routes: Rutas
|
||||
Locator: Localizador
|
||||
Invoices out: Facturas emitidas
|
||||
Invoices out: Fact. emitidas
|
||||
Invoices in: Fact. recibidas
|
||||
Entries: Entradas
|
||||
Users: Usuarios
|
||||
|
|
|
@ -25,8 +25,8 @@ module.exports = function(Self) {
|
|||
|
||||
if (ctx.data) {
|
||||
const changes = pick(ctx.currentInstance, Object.keys(ctx.data));
|
||||
newInstance = await fkToValue(ctx.data, ctx);
|
||||
oldInstance = await fkToValue(changes, ctx);
|
||||
newInstance = ctx.data;
|
||||
oldInstance = changes;
|
||||
|
||||
if (ctx.where && !ctx.currentInstance) {
|
||||
const fields = Object.keys(ctx.data);
|
||||
|
@ -41,7 +41,7 @@ module.exports = function(Self) {
|
|||
|
||||
// Get changes from created instance
|
||||
if (ctx.isNewInstance)
|
||||
newInstance = await fkToValue(ctx.instance.__data, ctx);
|
||||
newInstance = ctx.instance.__data;
|
||||
|
||||
ctx.hookState.oldInstance = oldInstance;
|
||||
ctx.hookState.newInstance = newInstance;
|
||||
|
@ -261,6 +261,9 @@ module.exports = function(Self) {
|
|||
removeUnloggable(definition, oldInstance);
|
||||
removeUnloggable(definition, newInstance);
|
||||
|
||||
oldInstance = await fkToValue(oldInstance, ctx);
|
||||
newInstance = await fkToValue(newInstance, ctx);
|
||||
|
||||
// Prevent log with no new changes
|
||||
const hasNewChanges = Object.keys(newInstance).length;
|
||||
if (!hasNewChanges) return;
|
||||
|
|
|
@ -93,5 +93,7 @@
|
|||
"New ticket request has been created": "New ticket request has been created *'{{description}}'* for day *{{shipped}}*, with a quantity of *{{quantity}}*",
|
||||
"There's a new urgent ticket": "There's a new urgent ticket: [{{title}}](https://cau.verdnatura.es/WorkOrder.do?woMode=viewWO&woID={{issueId}})",
|
||||
"Swift / BIC cannot be empty": "Swift / BIC cannot be empty",
|
||||
"Role name must be written in camelCase": "Role name must be written in camelCase"
|
||||
"Role name must be written in camelCase": "Role name must be written in camelCase",
|
||||
"Client assignment has changed": "I did change the salesperson ~*\"<{{previousWorkerName}}>\"*~ by *\"<{{currentWorkerName}}>\"* from the client [{{clientName}} ({{clientId}})]({{{url}}})",
|
||||
"None": "None"
|
||||
}
|
|
@ -176,5 +176,7 @@
|
|||
"Invalid account": "Cuenta inválida",
|
||||
"Compensation account is empty": "La cuenta para compensar está vacia",
|
||||
"This genus already exist": "Este genus ya existe",
|
||||
"This specie already exist": "Esta especie ya existe"
|
||||
"This specie already exist": "Esta especie ya existe",
|
||||
"Client assignment has changed": "He cambiado el comercial ~*\"<{{previousWorkerName}}>\"*~ por *\"<{{currentWorkerName}}>\"* del cliente [{{clientName}} ({{clientId}})]({{{url}}})",
|
||||
"None": "Ninguno"
|
||||
}
|
|
@ -227,36 +227,6 @@ module.exports = Self => {
|
|||
await Self.app.models.ClientCredit.create(newCredit);
|
||||
}
|
||||
});
|
||||
const app = require('vn-loopback/server/server');
|
||||
|
||||
app.on('started', function() {
|
||||
let account = app.models.Account;
|
||||
|
||||
account.observe('before save', async ctx => {
|
||||
if (ctx.isNewInstance) return;
|
||||
ctx.hookState.oldInstance = JSON.parse(JSON.stringify(ctx.currentInstance));
|
||||
});
|
||||
|
||||
account.observe('after save', async ctx => {
|
||||
let changes = ctx.data || ctx.instance;
|
||||
if (!ctx.isNewInstance && changes) {
|
||||
let oldData = ctx.hookState.oldInstance;
|
||||
let hasChanges = oldData.name != changes.name || oldData.active != changes.active;
|
||||
if (!hasChanges) return;
|
||||
|
||||
let userId = ctx.options.accessToken.userId;
|
||||
let logRecord = {
|
||||
originFk: oldData.id,
|
||||
userFk: userId,
|
||||
action: 'update',
|
||||
changedModel: 'Account',
|
||||
oldInstance: {name: oldData.name, active: oldData.active},
|
||||
newInstance: {name: changes.name, active: changes.active}
|
||||
};
|
||||
await Self.app.models.ClientLog.create(logRecord);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
Self.observe('after save', async ctx => {
|
||||
if (ctx.isNewInstance) return;
|
||||
|
@ -303,8 +273,58 @@ module.exports = Self => {
|
|||
query: params
|
||||
});
|
||||
}
|
||||
|
||||
const workerIdBefore = oldInstance.salesPersonFk;
|
||||
const workerIdAfter = newInstance.salesPersonFk;
|
||||
const assignmentChanged = workerIdBefore != workerIdAfter;
|
||||
if (assignmentChanged)
|
||||
await Self.notifyAssignment(instance, workerIdBefore, workerIdAfter);
|
||||
});
|
||||
|
||||
// Send notification on client worker assignment
|
||||
Self.notifyAssignment = async function notifyAssignment(client, previousWorkerId, currentWorkerId) {
|
||||
const loopBackContext = LoopBackContext.getCurrentContext();
|
||||
const httpCtx = {req: loopBackContext.active};
|
||||
const httpRequest = httpCtx.req.http.req;
|
||||
const $t = httpRequest.__;
|
||||
const headers = httpRequest.headers;
|
||||
const origin = headers.origin;
|
||||
const models = Self.app.models;
|
||||
|
||||
let previousWorker = {name: $t('None')};
|
||||
let currentWorker = {name: $t('None')};
|
||||
if (previousWorkerId) {
|
||||
const worker = await models.Worker.findById(previousWorkerId, {
|
||||
include: {relation: 'user'}
|
||||
});
|
||||
previousWorker.user = worker && worker.user().name;
|
||||
previousWorker.name = worker && worker.user().nickname;
|
||||
}
|
||||
|
||||
if (currentWorkerId) {
|
||||
const worker = await models.Worker.findById(currentWorkerId, {
|
||||
include: {relation: 'user'}
|
||||
});
|
||||
currentWorker.user = worker && worker.user().name;
|
||||
currentWorker.name = worker && worker.user().nickname;
|
||||
}
|
||||
|
||||
const fullUrl = `${origin}/#!/client/${client.id}/basic-data`;
|
||||
const message = $t('Client assignment has changed', {
|
||||
clientId: client.id,
|
||||
clientName: client.name,
|
||||
url: fullUrl,
|
||||
previousWorkerName: previousWorker.name,
|
||||
currentWorkerName: currentWorker.name
|
||||
});
|
||||
|
||||
if (previousWorkerId)
|
||||
await models.Chat.send(httpCtx, `@${previousWorker.user}`, message);
|
||||
|
||||
if (currentWorkerId)
|
||||
await models.Chat.send(httpCtx, `@${currentWorker.user}`, message);
|
||||
};
|
||||
|
||||
async function validateCreditChange(ctx, finalState) {
|
||||
let models = Self.app.models;
|
||||
let userId = ctx.options.accessToken.userId;
|
||||
|
@ -341,4 +361,34 @@ module.exports = Self => {
|
|||
if (count <= 0)
|
||||
throw new UserError('The role cannot set this credit amount');
|
||||
}
|
||||
|
||||
const app = require('vn-loopback/server/server');
|
||||
app.on('started', function() {
|
||||
let account = app.models.Account;
|
||||
|
||||
account.observe('before save', async ctx => {
|
||||
if (ctx.isNewInstance) return;
|
||||
ctx.hookState.oldInstance = JSON.parse(JSON.stringify(ctx.currentInstance));
|
||||
});
|
||||
|
||||
account.observe('after save', async ctx => {
|
||||
let changes = ctx.data || ctx.instance;
|
||||
if (!ctx.isNewInstance && changes) {
|
||||
let oldData = ctx.hookState.oldInstance;
|
||||
let hasChanges = oldData.name != changes.name || oldData.active != changes.active;
|
||||
if (!hasChanges) return;
|
||||
|
||||
let userId = ctx.options.accessToken.userId;
|
||||
let logRecord = {
|
||||
originFk: oldData.id,
|
||||
userFk: userId,
|
||||
action: 'update',
|
||||
changedModel: 'Account',
|
||||
oldInstance: {name: oldData.name, active: oldData.active},
|
||||
newInstance: {name: changes.name, active: changes.active}
|
||||
};
|
||||
await Self.app.models.ClientLog.create(logRecord);
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
|
|
|
@ -0,0 +1,54 @@
|
|||
const app = require('vn-loopback/server/server');
|
||||
const LoopBackContext = require('loopback-context');
|
||||
|
||||
describe('Client Model', () => {
|
||||
const activeCtx = {
|
||||
accessToken: {userId: 9},
|
||||
http: {
|
||||
req: {
|
||||
headers: {origin: 'http://localhost'},
|
||||
[`__`]: value => {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
const ctx = {req: activeCtx};
|
||||
const chatModel = app.models.Chat;
|
||||
const client = {id: 101, name: 'Bruce Banner'};
|
||||
const previousWorkerId = 106; // DavidCharlesHaller
|
||||
const currentWorkerId = 107; // HankPym
|
||||
|
||||
beforeEach(() => {
|
||||
spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
|
||||
active: activeCtx
|
||||
});
|
||||
});
|
||||
|
||||
describe('notifyAssignment()', () => {
|
||||
it('should call to the Chat send() method for both workers', async() => {
|
||||
spyOn(chatModel, 'send').and.callThrough();
|
||||
|
||||
await app.models.Client.notifyAssignment(client, previousWorkerId, currentWorkerId);
|
||||
|
||||
expect(chatModel.send).toHaveBeenCalledWith(ctx, '@DavidCharlesHaller', `Client assignment has changed`);
|
||||
expect(chatModel.send).toHaveBeenCalledWith(ctx, '@HankPym', `Client assignment has changed`);
|
||||
});
|
||||
|
||||
it('should call to the Chat send() method for the previous worker', async() => {
|
||||
spyOn(chatModel, 'send').and.callThrough();
|
||||
|
||||
await app.models.Client.notifyAssignment(client, null, currentWorkerId);
|
||||
|
||||
expect(chatModel.send).toHaveBeenCalledWith(ctx, '@HankPym', `Client assignment has changed`);
|
||||
});
|
||||
|
||||
it('should call to the Chat send() method for the current worker', async() => {
|
||||
spyOn(chatModel, 'send').and.callThrough();
|
||||
|
||||
await app.models.Client.notifyAssignment(client, previousWorkerId, null);
|
||||
|
||||
expect(chatModel.send).toHaveBeenCalledWith(ctx, '@DavidCharlesHaller', `Client assignment has changed`);
|
||||
});
|
||||
});
|
||||
});
|
|
@ -2,4 +2,5 @@ reference: Referencia
|
|||
Observation: Observación
|
||||
Box: Embalaje
|
||||
Import buys: Importar compras
|
||||
Some of the imported buys doesn't have an item: Algunas de las compras importadas no tienen un artículo
|
||||
Some of the imported buys doesn't have an item: Algunas de las compras importadas no tienen un artículo
|
||||
JSON files only: Solo ficheros JSON
|
Loading…
Reference in New Issue